Skip to content

Instantly share code, notes, and snippets.

@unnitallman
Created March 30, 2026 08:48
Show Gist options
  • Select an option

  • Save unnitallman/473f6a85e155f5348b41f11fd71681ed to your computer and use it in GitHub Desktop.

Select an option

Save unnitallman/473f6a85e155f5348b41f11fd71681ed to your computer and use it in GitHub Desktop.
NeetoDeploy Rate Limiting Architecture Diagrams
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="0.7.1" preserveAspectRatio="xMinYMin meet" viewBox="0 0 7189 859"><svg class="d2-4253079425 d2-svg" width="7189" height="859" viewBox="47 -222 7189 859"><rect x="47.000000" y="-222.000000" width="7189.000000" height="859.000000" rx="0.000000" fill="#1E1E2E" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-4253079425 .text {
font-family: "d2-4253079425-font-regular";
}
@font-face {
font-family: d2-4253079425-font-regular;
src: url("data:application/font-woff;base64,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");
}
@font-face {
font-family: d2-4253079425-font-semibold;
src: url("data:application/font-woff;base64,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");
}
.d2-4253079425 .text-bold {
font-family: "d2-4253079425-font-bold";
}
@font-face {
font-family: d2-4253079425-font-bold;
src: url("data:application/font-woff;base64,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");
}
.d2-4253079425 .text-italic {
font-family: "d2-4253079425-font-italic";
}
@font-face {
font-family: d2-4253079425-font-italic;
src: url("data:application/font-woff;base64,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");
}
.d2-4253079425 .text-mono {
font-family: "d2-4253079425-font-mono";
}
@font-face {
font-family: d2-4253079425-font-mono;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-4253079425 .fill-N1{fill:#CDD6F4;}
.d2-4253079425 .fill-N2{fill:#BAC2DE;}
.d2-4253079425 .fill-N3{fill:#A6ADC8;}
.d2-4253079425 .fill-N4{fill:#585B70;}
.d2-4253079425 .fill-N5{fill:#45475A;}
.d2-4253079425 .fill-N6{fill:#313244;}
.d2-4253079425 .fill-N7{fill:#1E1E2E;}
.d2-4253079425 .fill-B1{fill:#CBA6f7;}
.d2-4253079425 .fill-B2{fill:#CBA6f7;}
.d2-4253079425 .fill-B3{fill:#6C7086;}
.d2-4253079425 .fill-B4{fill:#585B70;}
.d2-4253079425 .fill-B5{fill:#45475A;}
.d2-4253079425 .fill-B6{fill:#313244;}
.d2-4253079425 .fill-AA2{fill:#f38BA8;}
.d2-4253079425 .fill-AA4{fill:#45475A;}
.d2-4253079425 .fill-AA5{fill:#313244;}
.d2-4253079425 .fill-AB4{fill:#45475A;}
.d2-4253079425 .fill-AB5{fill:#313244;}
.d2-4253079425 .stroke-N1{stroke:#CDD6F4;}
.d2-4253079425 .stroke-N2{stroke:#BAC2DE;}
.d2-4253079425 .stroke-N3{stroke:#A6ADC8;}
.d2-4253079425 .stroke-N4{stroke:#585B70;}
.d2-4253079425 .stroke-N5{stroke:#45475A;}
.d2-4253079425 .stroke-N6{stroke:#313244;}
.d2-4253079425 .stroke-N7{stroke:#1E1E2E;}
.d2-4253079425 .stroke-B1{stroke:#CBA6f7;}
.d2-4253079425 .stroke-B2{stroke:#CBA6f7;}
.d2-4253079425 .stroke-B3{stroke:#6C7086;}
.d2-4253079425 .stroke-B4{stroke:#585B70;}
.d2-4253079425 .stroke-B5{stroke:#45475A;}
.d2-4253079425 .stroke-B6{stroke:#313244;}
.d2-4253079425 .stroke-AA2{stroke:#f38BA8;}
.d2-4253079425 .stroke-AA4{stroke:#45475A;}
.d2-4253079425 .stroke-AA5{stroke:#313244;}
.d2-4253079425 .stroke-AB4{stroke:#45475A;}
.d2-4253079425 .stroke-AB5{stroke:#313244;}
.d2-4253079425 .background-color-N1{background-color:#CDD6F4;}
.d2-4253079425 .background-color-N2{background-color:#BAC2DE;}
.d2-4253079425 .background-color-N3{background-color:#A6ADC8;}
.d2-4253079425 .background-color-N4{background-color:#585B70;}
.d2-4253079425 .background-color-N5{background-color:#45475A;}
.d2-4253079425 .background-color-N6{background-color:#313244;}
.d2-4253079425 .background-color-N7{background-color:#1E1E2E;}
.d2-4253079425 .background-color-B1{background-color:#CBA6f7;}
.d2-4253079425 .background-color-B2{background-color:#CBA6f7;}
.d2-4253079425 .background-color-B3{background-color:#6C7086;}
.d2-4253079425 .background-color-B4{background-color:#585B70;}
.d2-4253079425 .background-color-B5{background-color:#45475A;}
.d2-4253079425 .background-color-B6{background-color:#313244;}
.d2-4253079425 .background-color-AA2{background-color:#f38BA8;}
.d2-4253079425 .background-color-AA4{background-color:#45475A;}
.d2-4253079425 .background-color-AA5{background-color:#313244;}
.d2-4253079425 .background-color-AB4{background-color:#45475A;}
.d2-4253079425 .background-color-AB5{background-color:#313244;}
.d2-4253079425 .color-N1{color:#CDD6F4;}
.d2-4253079425 .color-N2{color:#BAC2DE;}
.d2-4253079425 .color-N3{color:#A6ADC8;}
.d2-4253079425 .color-N4{color:#585B70;}
.d2-4253079425 .color-N5{color:#45475A;}
.d2-4253079425 .color-N6{color:#313244;}
.d2-4253079425 .color-N7{color:#1E1E2E;}
.d2-4253079425 .color-B1{color:#CBA6f7;}
.d2-4253079425 .color-B2{color:#CBA6f7;}
.d2-4253079425 .color-B3{color:#6C7086;}
.d2-4253079425 .color-B4{color:#585B70;}
.d2-4253079425 .color-B5{color:#45475A;}
.d2-4253079425 .color-B6{color:#313244;}
.d2-4253079425 .color-AA2{color:#f38BA8;}
.d2-4253079425 .color-AA4{color:#45475A;}
.d2-4253079425 .color-AA5{color:#313244;}
.d2-4253079425 .color-AB4{color:#45475A;}
.d2-4253079425 .color-AB5{color:#313244;}.appendix text.text{fill:#CDD6F4}.md{--color-fg-default:#CDD6F4;--color-fg-muted:#BAC2DE;--color-fg-subtle:#A6ADC8;--color-canvas-default:#1E1E2E;--color-canvas-subtle:#313244;--color-border-default:#CBA6f7;--color-border-muted:#CBA6f7;--color-neutral-muted:#313244;--color-accent-fg:#CBA6f7;--color-accent-emphasis:#CBA6f7;--color-attention-subtle:#BAC2DE;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-normal-d2-4253079425);mix-blend-mode:color-burn}.sketch-overlay-B2{fill:url(#streaks-normal-d2-4253079425);mix-blend-mode:color-burn}.sketch-overlay-B3{fill:url(#streaks-dark-d2-4253079425);mix-blend-mode:overlay}.sketch-overlay-B4{fill:url(#streaks-dark-d2-4253079425);mix-blend-mode:overlay}.sketch-overlay-B5{fill:url(#streaks-darker-d2-4253079425);mix-blend-mode:lighten}.sketch-overlay-B6{fill:url(#streaks-darker-d2-4253079425);mix-blend-mode:lighten}.sketch-overlay-AA2{fill:url(#streaks-normal-d2-4253079425);mix-blend-mode:color-burn}.sketch-overlay-AA4{fill:url(#streaks-darker-d2-4253079425);mix-blend-mode:lighten}.sketch-overlay-AA5{fill:url(#streaks-darker-d2-4253079425);mix-blend-mode:lighten}.sketch-overlay-AB4{fill:url(#streaks-darker-d2-4253079425);mix-blend-mode:lighten}.sketch-overlay-AB5{fill:url(#streaks-darker-d2-4253079425);mix-blend-mode:lighten}.sketch-overlay-N1{fill:url(#streaks-normal-d2-4253079425);mix-blend-mode:color-burn}.sketch-overlay-N2{fill:url(#streaks-normal-d2-4253079425);mix-blend-mode:color-burn}.sketch-overlay-N3{fill:url(#streaks-normal-d2-4253079425);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-dark-d2-4253079425);mix-blend-mode:overlay}.sketch-overlay-N5{fill:url(#streaks-darker-d2-4253079425);mix-blend-mode:lighten}.sketch-overlay-N6{fill:url(#streaks-darker-d2-4253079425);mix-blend-mode:lighten}.sketch-overlay-N7{fill:url(#streaks-darker-d2-4253079425);mix-blend-mode:lighten}.light-code{display: none}.dark-code{display: block}]]></style><style type="text/css">.d2-4253079425 .md em,
.d2-4253079425 .md dfn {
font-family: "d2-4253079425-font-italic";
}
.d2-4253079425 .md b,
.d2-4253079425 .md strong {
font-family: "d2-4253079425-font-bold";
}
.d2-4253079425 .md code,
.d2-4253079425 .md kbd,
.d2-4253079425 .md pre,
.d2-4253079425 .md samp {
font-family: "d2-4253079425-font-mono";
font-size: 1em;
}
.d2-4253079425 .md {
tab-size: 4;
}
/* variables are provided in d2renderers/d2svg/d2svg.go */
.d2-4253079425 .md {
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
margin: 0;
background-color: transparent; /* we don't want to define the background color */
font-family: "d2-4253079425-font-regular";
font-size: 16px;
line-height: 1.5;
word-wrap: break-word;
}
.d2-4253079425 .md details,
.d2-4253079425 .md figcaption,
.d2-4253079425 .md figure {
display: block;
}
.d2-4253079425 .md summary {
display: list-item;
}
.d2-4253079425 .md [hidden] {
display: none !important;
}
.d2-4253079425 .md a {
background-color: transparent;
color: var(--color-accent-fg);
text-decoration: none;
}
.d2-4253079425 .md a:active,
.d2-4253079425 .md a:hover {
outline-width: 0;
}
.d2-4253079425 .md abbr[title] {
border-bottom: none;
text-decoration: underline dotted;
}
.d2-4253079425 .md dfn {
font-style: italic;
}
.d2-4253079425 .md h1 {
margin: 0.67em 0;
padding-bottom: 0.3em;
font-size: 2em;
border-bottom: 1px solid var(--color-border-muted);
}
.d2-4253079425 .md mark {
background-color: var(--color-attention-subtle);
color: var(--color-text-primary);
}
.d2-4253079425 .md small {
font-size: 90%;
}
.d2-4253079425 .md sub,
.d2-4253079425 .md sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
.d2-4253079425 .md sub {
bottom: -0.25em;
}
.d2-4253079425 .md sup {
top: -0.5em;
}
.d2-4253079425 .md img {
border-style: none;
max-width: 100%;
box-sizing: content-box;
background-color: var(--color-canvas-default);
}
.d2-4253079425 .md figure {
margin: 1em 40px;
}
.d2-4253079425 .md hr {
box-sizing: content-box;
overflow: hidden;
background: transparent;
border-bottom: 1px solid var(--color-border-muted);
height: 0.25em;
padding: 0;
margin: 24px 0;
background-color: var(--color-border-default);
border: 0;
}
.d2-4253079425 .md input {
font: inherit;
margin: 0;
overflow: visible;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
.d2-4253079425 .md [type="button"],
.d2-4253079425 .md [type="reset"],
.d2-4253079425 .md [type="submit"] {
-webkit-appearance: button;
}
.d2-4253079425 .md [type="button"]::-moz-focus-inner,
.d2-4253079425 .md [type="reset"]::-moz-focus-inner,
.d2-4253079425 .md [type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
.d2-4253079425 .md [type="button"]:-moz-focusring,
.d2-4253079425 .md [type="reset"]:-moz-focusring,
.d2-4253079425 .md [type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
.d2-4253079425 .md [type="checkbox"],
.d2-4253079425 .md [type="radio"] {
box-sizing: border-box;
padding: 0;
}
.d2-4253079425 .md [type="number"]::-webkit-inner-spin-button,
.d2-4253079425 .md [type="number"]::-webkit-outer-spin-button {
height: auto;
}
.d2-4253079425 .md [type="search"] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
.d2-4253079425 .md [type="search"]::-webkit-search-cancel-button,
.d2-4253079425 .md [type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
.d2-4253079425 .md ::-webkit-input-placeholder {
color: inherit;
opacity: 0.54;
}
.d2-4253079425 .md ::-webkit-file-upload-button {
-webkit-appearance: button;
font: inherit;
}
.d2-4253079425 .md a:hover {
text-decoration: underline;
}
.d2-4253079425 .md hr::before {
display: table;
content: "";
}
.d2-4253079425 .md hr::after {
display: table;
clear: both;
content: "";
}
.d2-4253079425 .md table {
border-spacing: 0;
border-collapse: collapse;
display: block;
width: max-content;
max-width: 100%;
overflow: auto;
}
.d2-4253079425 .md td,
.d2-4253079425 .md th {
padding: 0;
}
.d2-4253079425 .md details summary {
cursor: pointer;
}
.d2-4253079425 .md details:not([open]) > *:not(summary) {
display: none !important;
}
.d2-4253079425 .md kbd {
display: inline-block;
padding: 3px 5px;
color: var(--color-fg-default);
vertical-align: middle;
background-color: var(--color-canvas-subtle);
border: solid 1px var(--color-neutral-muted);
border-bottom-color: var(--color-neutral-muted);
border-radius: 6px;
box-shadow: inset 0 -1px 0 var(--color-neutral-muted);
}
.d2-4253079425 .md h1,
.d2-4253079425 .md h2,
.d2-4253079425 .md h3,
.d2-4253079425 .md h4,
.d2-4253079425 .md h5,
.d2-4253079425 .md h6 {
margin-top: 24px;
margin-bottom: 16px;
font-weight: 400;
line-height: 1.25;
font-family: "d2-4253079425-font-semibold";
}
.d2-4253079425 .md h2 {
padding-bottom: 0.3em;
font-size: 1.5em;
border-bottom: 1px solid var(--color-border-muted);
}
.d2-4253079425 .md h3 {
font-size: 1.25em;
}
.d2-4253079425 .md h4 {
font-size: 1em;
}
.d2-4253079425 .md h5 {
font-size: 0.875em;
}
.d2-4253079425 .md h6 {
font-size: 0.85em;
color: var(--color-fg-muted);
}
.d2-4253079425 .md p {
margin-top: 0;
margin-bottom: 10px;
}
.d2-4253079425 .md blockquote {
margin: 0;
padding: 0 1em;
color: var(--color-fg-muted);
border-left: 0.25em solid var(--color-border-default);
}
.d2-4253079425 .md ul,
.d2-4253079425 .md ol {
margin-top: 0;
margin-bottom: 0;
padding-left: 2em;
}
.d2-4253079425 .md ol ol,
.d2-4253079425 .md ul ol {
list-style-type: lower-roman;
}
.d2-4253079425 .md ul ul ol,
.d2-4253079425 .md ul ol ol,
.d2-4253079425 .md ol ul ol,
.d2-4253079425 .md ol ol ol {
list-style-type: lower-alpha;
}
.d2-4253079425 .md dd {
margin-left: 0;
}
.d2-4253079425 .md pre {
margin-top: 0;
margin-bottom: 0;
word-wrap: normal;
}
.d2-4253079425 .md ::placeholder {
color: var(--color-fg-subtle);
opacity: 1;
}
.d2-4253079425 .md input::-webkit-outer-spin-button,
.d2-4253079425 .md input::-webkit-inner-spin-button {
margin: 0;
-webkit-appearance: none;
appearance: none;
}
.d2-4253079425 .md::before {
display: table;
content: "";
}
.d2-4253079425 .md::after {
display: table;
clear: both;
content: "";
}
.d2-4253079425 .md > *:first-child {
margin-top: 0 !important;
}
.d2-4253079425 .md > *:last-child {
margin-bottom: 0 !important;
}
.d2-4253079425 .md a:not([href]) {
color: inherit;
text-decoration: none;
}
.d2-4253079425 .md .absent {
color: var(--color-danger-fg);
}
.d2-4253079425 .md .anchor {
float: left;
padding-right: 4px;
margin-left: -20px;
line-height: 1;
}
.d2-4253079425 .md .anchor:focus {
outline: none;
}
.d2-4253079425 .md p,
.d2-4253079425 .md blockquote,
.d2-4253079425 .md ul,
.d2-4253079425 .md ol,
.d2-4253079425 .md dl,
.d2-4253079425 .md table,
.d2-4253079425 .md pre,
.d2-4253079425 .md details {
margin-top: 0;
margin-bottom: 16px;
}
.d2-4253079425 .md blockquote > :first-child {
margin-top: 0;
}
.d2-4253079425 .md blockquote > :last-child {
margin-bottom: 0;
}
.d2-4253079425 .md sup > a::before {
content: "[";
}
.d2-4253079425 .md sup > a::after {
content: "]";
}
.d2-4253079425 .md h1:hover .anchor,
.d2-4253079425 .md h2:hover .anchor,
.d2-4253079425 .md h3:hover .anchor,
.d2-4253079425 .md h4:hover .anchor,
.d2-4253079425 .md h5:hover .anchor,
.d2-4253079425 .md h6:hover .anchor {
text-decoration: none;
}
.d2-4253079425 .md h1 tt,
.d2-4253079425 .md h1 code,
.d2-4253079425 .md h2 tt,
.d2-4253079425 .md h2 code,
.d2-4253079425 .md h3 tt,
.d2-4253079425 .md h3 code,
.d2-4253079425 .md h4 tt,
.d2-4253079425 .md h4 code,
.d2-4253079425 .md h5 tt,
.d2-4253079425 .md h5 code,
.d2-4253079425 .md h6 tt,
.d2-4253079425 .md h6 code {
padding: 0 0.2em;
font-size: inherit;
}
.d2-4253079425 .md ul.no-list,
.d2-4253079425 .md ol.no-list {
padding: 0;
list-style-type: none;
}
.d2-4253079425 .md ol[type="1"] {
list-style-type: decimal;
}
.d2-4253079425 .md ol[type="a"] {
list-style-type: lower-alpha;
}
.d2-4253079425 .md ol[type="i"] {
list-style-type: lower-roman;
}
.d2-4253079425 .md div > ol:not([type]) {
list-style-type: decimal;
}
.d2-4253079425 .md ul ul,
.d2-4253079425 .md ul ol,
.d2-4253079425 .md ol ol,
.d2-4253079425 .md ol ul {
margin-top: 0;
margin-bottom: 0;
}
.d2-4253079425 .md li > p {
margin-top: 16px;
}
.d2-4253079425 .md li + li {
margin-top: 0.25em;
}
.d2-4253079425 .md dl {
padding: 0;
}
.d2-4253079425 .md dl dt {
padding: 0;
margin-top: 16px;
font-size: 1em;
font-style: italic;
font-family: "d2-4253079425-font-semibold";
}
.d2-4253079425 .md dl dd {
padding: 0 16px;
margin-bottom: 16px;
}
.d2-4253079425 .md table th {
font-family: "d2-4253079425-font-semibold";
}
.d2-4253079425 .md table th,
.d2-4253079425 .md table td {
padding: 6px 13px;
border: 1px solid var(--color-border-default);
}
.d2-4253079425 .md table tr {
background-color: var(--color-canvas-default);
border-top: 1px solid var(--color-border-muted);
}
.d2-4253079425 .md table tr:nth-child(2n) {
background-color: var(--color-canvas-subtle);
}
.d2-4253079425 .md table img {
background-color: transparent;
}
.d2-4253079425 .md img[align="right"] {
padding-left: 20px;
}
.d2-4253079425 .md img[align="left"] {
padding-right: 20px;
}
.d2-4253079425 .md span.frame {
display: block;
overflow: hidden;
}
.d2-4253079425 .md span.frame > span {
display: block;
float: left;
width: auto;
padding: 7px;
margin: 13px 0 0;
overflow: hidden;
border: 1px solid var(--color-border-default);
}
.d2-4253079425 .md span.frame span img {
display: block;
float: left;
}
.d2-4253079425 .md span.frame span span {
display: block;
padding: 5px 0 0;
clear: both;
color: var(--color-fg-default);
}
.d2-4253079425 .md span.align-center {
display: block;
overflow: hidden;
clear: both;
}
.d2-4253079425 .md span.align-center > span {
display: block;
margin: 13px auto 0;
overflow: hidden;
text-align: center;
}
.d2-4253079425 .md span.align-center span img {
margin: 0 auto;
text-align: center;
}
.d2-4253079425 .md span.align-right {
display: block;
overflow: hidden;
clear: both;
}
.d2-4253079425 .md span.align-right > span {
display: block;
margin: 13px 0 0;
overflow: hidden;
text-align: right;
}
.d2-4253079425 .md span.align-right span img {
margin: 0;
text-align: right;
}
.d2-4253079425 .md span.float-left {
display: block;
float: left;
margin-right: 13px;
overflow: hidden;
}
.d2-4253079425 .md span.float-left span {
margin: 13px 0 0;
}
.d2-4253079425 .md span.float-right {
display: block;
float: right;
margin-left: 13px;
overflow: hidden;
}
.d2-4253079425 .md span.float-right > span {
display: block;
margin: 13px auto 0;
overflow: hidden;
text-align: right;
}
.d2-4253079425 .md code,
.d2-4253079425 .md tt {
padding: 0.2em 0.4em;
margin: 0;
font-size: 85%;
background-color: var(--color-neutral-muted);
border-radius: 6px;
}
.d2-4253079425 .md code br,
.d2-4253079425 .md tt br {
display: none;
}
.d2-4253079425 .md del code {
text-decoration: inherit;
}
.d2-4253079425 .md pre code {
font-size: 100%;
}
.d2-4253079425 .md pre > code {
padding: 0;
margin: 0;
word-break: normal;
white-space: pre;
background: transparent;
border: 0;
}
.d2-4253079425 .md .highlight {
margin-bottom: 16px;
}
.d2-4253079425 .md .highlight pre {
margin-bottom: 0;
word-break: normal;
}
.d2-4253079425 .md .highlight pre,
.d2-4253079425 .md pre {
padding: 16px;
overflow: auto;
font-size: 85%;
line-height: 1.45;
background-color: var(--color-canvas-subtle);
border-radius: 6px;
}
.d2-4253079425 .md pre code,
.d2-4253079425 .md pre tt {
display: inline;
max-width: auto;
padding: 0;
margin: 0;
overflow: visible;
line-height: inherit;
word-wrap: normal;
background-color: transparent;
border: 0;
}
.d2-4253079425 .md .csv-data td,
.d2-4253079425 .md .csv-data th {
padding: 5px;
overflow: hidden;
font-size: 12px;
line-height: 1;
text-align: left;
white-space: nowrap;
}
.d2-4253079425 .md .csv-data .blob-num {
padding: 10px 8px 9px;
text-align: right;
background: var(--color-canvas-default);
border: 0;
}
.d2-4253079425 .md .csv-data tr {
border-top: 0;
}
.d2-4253079425 .md .csv-data th {
font-family: "d2-4253079425-font-semibold";
background: var(--color-canvas-subtle);
border-top: 0;
}
.d2-4253079425 .md .footnotes {
font-size: 12px;
color: var(--color-fg-muted);
border-top: 1px solid var(--color-border-default);
}
.d2-4253079425 .md .footnotes ol {
padding-left: 16px;
}
.d2-4253079425 .md .footnotes li {
position: relative;
}
.d2-4253079425 .md .footnotes li:target::before {
position: absolute;
top: -8px;
right: -8px;
bottom: -8px;
left: -24px;
pointer-events: none;
content: "";
border: 2px solid var(--color-accent-emphasis);
border-radius: 6px;
}
.d2-4253079425 .md .footnotes li:target {
color: var(--color-fg-default);
}
.d2-4253079425 .md .task-list-item {
list-style-type: none;
}
.d2-4253079425 .md .task-list-item label {
font-weight: 400;
}
.d2-4253079425 .md .task-list-item.enabled label {
cursor: pointer;
}
.d2-4253079425 .md .task-list-item + .task-list-item {
margin-top: 3px;
}
.d2-4253079425 .md .task-list-item .handle {
display: none;
}
.d2-4253079425 .md .task-list-item-checkbox {
margin: 0 0.2em 0.25em -1.6em;
vertical-align: middle;
}
.d2-4253079425 .md .contains-task-list:dir(rtl) .task-list-item-checkbox {
margin: 0 -1.6em 0.25em 0.2em;
}
</style><g class="dGl0bGU="><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="3219.000000" y="-181.000000" width="845" height="119"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1" style="font-size:22px"><h1>Control Plane: Rate Limit Configuration Flow</h1>
<p>From dashboard toggle to Traefik enforcement</p>
</div></foreignObject></g></g><g class="ZGVwbG95X3dlYg=="><g class="shape" ><rect x="88.000000" y="328.000000" width="2911.000000" height="232.000000" rx="10.000000" stroke="#283593" fill="#E8EAF6" style="stroke-width:2;" /></g><text x="1543.500000" y="287.000000" fill="#CDD6F4" class="text fill-N1" style="text-anchor:middle;font-size:28px"><tspan x="1543.500000" dy="0.000000">neeto-deploy-web</tspan><tspan x="1543.500000" dy="32.000000">(Rails Application)</tspan></text></g><g class="ZHlub19tZ3I="><g class="shape" ><rect x="3558.000000" y="27.000000" width="1556.000000" height="569.000000" rx="10.000000" stroke="#E65100" fill="#FFF3E0" style="stroke-width:2;" /></g><text x="4336.000000" y="-14.000000" fill="#CDD6F4" class="text fill-N1" style="text-anchor:middle;font-size:28px"><tspan x="4336.000000" dy="0.000000">neeto-deploy-dyno-manager</tspan><tspan x="4336.000000" dy="32.000000">(Kubernetes Operator)</tspan></text></g><g class="azhz"><g class="shape" ><rect x="5685.000000" y="248.000000" width="766.000000" height="303.000000" rx="10.000000" stroke="#2E7D32" fill="#E8F5E9" style="stroke-width:2;" /></g><text x="6068.000000" y="235.000000" fill="#CDD6F4" class="text fill-N1" style="text-anchor:middle;font-size:28px">Kubernetes API</text></g><g class="ZW5mb3JjZW1lbnQ="><g class="shape" ><rect x="6918.000000" y="317.000000" width="277.000000" height="184.000000" rx="10.000000" stroke="#C62828" fill="#FCE4EC" style="stroke-width:2;" /></g><text x="7056.500000" y="304.000000" fill="#CDD6F4" class="text fill-N1" style="text-anchor:middle;font-size:28px">Request Handling</text></g><g class="ZGVwbG95X3dlYi5kYXNoYm9hcmQ="><g class="shape" ><path d="M 119 443 H 313 C 314 443 315 443 316 444 L 333 460 C 334 461 334 462 334 463 V 530 C 334 530 334 530 334 530 H 119 C 118 530 118 530 118 530 V 444 C 118 443 118 443 119 443 Z" stroke="#CBA6f7" fill="#C5CAE9" class=" stroke-B1" style="stroke-width:2;" /><path d="M 333 530 H 119 C 118 530 118 530 118 529 V 444 C 118 443 118 443 119 443 H 312 C 313 443 313 443 313 444 V 461 C 313 462 314 463 315 463 H 333 C 334 463 334 463 334 464 V 529 C 333 530 334 530 333 530 Z" stroke="#CBA6f7" fill="#C5CAE9" class=" stroke-B1" style="stroke-width:2;" /></g><text x="226.000000" y="492.000000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">NeetoDeploy Dashboard</text></g><g class="ZGVwbG95X3dlYi5jb250cm9sbGVy"><g class="shape" ><rect x="677.000000" y="449.000000" width="179.000000" height="75.000000" stroke="#CBA6f7" fill="#9FA8DA" class=" stroke-B1" style="stroke-width:2;" /></g><text x="766.500000" y="484.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:13px"><tspan x="766.500000" dy="0.000000">AppsController</tspan><tspan x="766.500000" dy="15.000000">PATCH /api/v1/apps/:id</tspan></text></g><g class="ZGVwbG95X3dlYi5hcHBfbW9kZWw="><g class="shape" ><rect x="1231.000000" y="369.000000" width="659.000000" height="156.000000" stroke="#283593" fill="#7986CB" style="stroke-width:2;" /></g><text x="1560.500000" y="357.000000" fill="#FFF" class="text" style="text-anchor:middle;font-size:24px">App Model</text></g><g class="ZGVwbG95X3dlYi5qb2I="><g class="shape" ><rect x="2408.000000" y="449.000000" width="171.000000" height="75.000000" stroke="#CBA6f7" fill="#5C6BC0" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2493.500000" y="484.500000" fill="#FFF" class="text-bold" style="text-anchor:middle;font-size:13px"><tspan x="2493.500000" dy="0.000000">Apps::MiddlewareJob</tspan><tspan x="2493.500000" dy="15.000000">(Sidekiq async)</tspan></text></g><g class="ZGVwbG95X3dlYi5taWRkbGV3YXJlX3N2Yw=="><g class="shape" ><rect x="2814.000000" y="449.000000" width="155.000000" height="75.000000" stroke="#CBA6f7" fill="#3F51B5" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2891.500000" y="484.500000" fill="#FFF" class="text-bold" style="text-anchor:middle;font-size:13px"><tspan x="2891.500000" dy="0.000000">DynoManager::</tspan><tspan x="2891.500000" dy="15.000000">MiddlewareService</tspan></text></g><g class="ZHlub19tZ3IuYXBp"><g class="shape" ><rect x="3588.000000" y="455.000000" width="192.000000" height="62.000000" stroke="#CBA6f7" fill="#FFE0B2" class=" stroke-B1" style="stroke-width:2;" /></g><text x="3684.000000" y="490.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:13px">POST /api/v1/middleware</text></g><g class="ZHlub19tZ3IubWlkZGxld2FyZV9qb2I="><g class="shape" ><rect x="4015.000000" y="449.000000" width="134.000000" height="75.000000" stroke="#CBA6f7" fill="#FFCC80" class=" stroke-B1" style="stroke-width:2;" /></g><text x="4082.000000" y="484.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:13px"><tspan x="4082.000000" dy="0.000000">MiddlewareJob</tspan><tspan x="4082.000000" dy="15.000000">(Sidekiq)</tspan></text></g><g class="ZHlub19tZ3IucmF0ZV9saW1pdF9zdmM="><g class="shape" ><rect x="4384.000000" y="449.000000" width="166.000000" height="75.000000" stroke="#CBA6f7" fill="#FFB74D" class=" stroke-B1" style="stroke-width:2;" /></g><text x="4467.000000" y="484.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:13px"><tspan x="4467.000000" dy="0.000000">Kubectl::Middleware</tspan><tspan x="4467.000000" dy="15.000000">::RateLimit</tspan></text></g><g class="ZHlub19tZ3Iua3ViZWNsaWVudA=="><g class="shape" ><rect x="4872.000000" y="57.000000" width="212.000000" height="509.000000" stroke="#E65100" fill="#FFA726" style="stroke-width:2;" /></g><text x="4978.000000" y="48.000000" fill="#CDD6F4" class="text fill-N1" style="text-anchor:middle;font-size:13px">KubeclientInterface</text></g><g class="azhzLm1pZGRsZXdhcmVfY3Jk"><g class="shape" ><rect x="5737.000000" y="278.000000" width="215.000000" height="82.000000" stroke="#CBA6f7" fill="#A5D6A7" class=" stroke-B1" style="stroke-width:2;" /></g><text x="5844.500000" y="316.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="5844.500000" dy="0.000000">Traefik Middleware CRD</tspan><tspan x="5844.500000" dy="18.500000">{app}-rate-limit</tspan></text></g><g class="azhzLmluZ3Jlc3Nfcm91dGU="><g class="shape" ><rect x="5715.000000" y="439.000000" width="259.000000" height="82.000000" stroke="#CBA6f7" fill="#81C784" class=" stroke-B1" style="stroke-width:2;" /></g><text x="5844.500000" y="477.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="5844.500000" dy="0.000000">IngressRoute</tspan><tspan x="5844.500000" dy="18.500000">(patched with middleware ref)</tspan></text></g><g class="azhzLnRyYWVmaWs="><g class="shape" ><rect x="6249.000000" y="368.000000" width="172.000000" height="82.000000" stroke="#CBA6f7" fill="#66BB6A" class=" stroke-B1" style="stroke-width:2;" /></g><text x="6335.000000" y="406.500000" fill="#FFF" class="text-bold" style="text-anchor:middle;font-size:16px"><tspan x="6335.000000" dy="0.000000">Traefik Controller</tspan><tspan x="6335.000000" dy="18.500000">(watches CRDs)</tspan></text></g><g class="ZW5mb3JjZW1lbnQudG9rZW5fYnVja2V0"><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="6948.000000" y="347.000000" width="217" height="124"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1" style="font-size:13px"><p><strong>Token Bucket Algorithm</strong></p>
<ul>
<li>Bucket size = <code>burst</code> (max tokens)</li>
<li>Refill rate = <code>average</code> tokens/sec</li>
<li>Each request consumes 1 token</li>
<li>Empty bucket → <strong>HTTP 429</strong></li>
</ul>
</div></foreignObject></g></g><g class="ZGVwbG95X3dlYi5hcHBfbW9kZWwuZmllbGRz"><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="1261.000000" y="399.000000" width="599" height="18"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1" style="font-size:12px"><p><code>rate_limit: boolean (default: false)</code>
<code>average: integer (default: 5)</code>
<code>burst: integer (default: 10)</code></p>
</div></foreignObject></g></g><g class="ZGVwbG95X3dlYi5hcHBfbW9kZWwuY2FsbGJhY2s="><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="1344.000000" y="477.000000" width="434" height="18"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1" style="font-size:12px"><p><code>after_update_commit</code>
→ <code>handle_middleware_updates</code>
→ <code>rate_limit_updated</code></p>
</div></foreignObject></g></g><g class="ZHlub19tZ3Iua3ViZWNsaWVudC5jcmVhdGU="><g class="shape" ><rect x="4905.000000" y="87.000000" width="147.000000" height="59.000000" stroke="#CBA6f7" fill="#313244" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="4978.500000" y="120.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:11px">create_middleware()</text></g><g class="ZHlub19tZ3Iua3ViZWNsaWVudC5hdHRhY2g="><g class="shape" ><rect x="4903.000000" y="206.000000" width="150.000000" height="70.000000" stroke="#CBA6f7" fill="#313244" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="4978.000000" y="239.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:11px"><tspan x="4978.000000" dy="0.000000">add_middleware_to_</tspan><tspan x="4978.000000" dy="12.500000">ingress_route()</tspan></text></g><g class="ZHlub19tZ3Iua3ViZWNsaWVudC51cGRhdGU="><g class="shape" ><rect x="4903.000000" y="336.000000" width="150.000000" height="70.000000" stroke="#CBA6f7" fill="#313244" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="4978.000000" y="369.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:11px"><tspan x="4978.000000" dy="0.000000">update_middleware_</tspan><tspan x="4978.000000" dy="12.500000">values()</tspan></text></g><g class="ZHlub19tZ3Iua3ViZWNsaWVudC5yZW1vdmU="><g class="shape" ><rect x="4902.000000" y="466.000000" width="152.000000" height="70.000000" stroke="#CBA6f7" fill="#313244" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="4978.000000" y="499.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:11px"><tspan x="4978.000000" dy="0.000000">remove_middleware_</tspan><tspan x="4978.000000" dy="12.500000">from_ingress_route()</tspan></text></g><g class="ZGVwbG95X3dlYi4oZGFzaGJvYXJkIC0mZ3Q7IGNvbnRyb2xsZXIpWzBd"><marker id="mk-d2-4253079425-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#CBA6f7" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 336.000000 486.000000 C 470.799988 486.000000 539.299988 486.000000 672.500000 486.000000" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4253079425-3488378134)" mask="url(#d2-4253079425)" /><text x="505.000000" y="492.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">Toggle rate limit</text></g><g class="ZGVwbG95X3dlYi4oY29udHJvbGxlciAtJmd0OyBhcHBfbW9kZWwpWzBd"><path d="M 858.500000 486.000000 C 970.900024 486.000000 1161.099976 486.000000 1227.500000 486.000000" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4253079425-3488378134)" mask="url(#d2-4253079425)" /><text x="1044.500000" y="492.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">update!</text></g><g class="ZGVwbG95X3dlYi4oYXBwX21vZGVsIC0mZ3Q7IGpvYilbMF0="><path d="M 1892.500000 486.000000 C 2132.100098 486.000000 2235.500000 486.000000 2403.500000 486.000000" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4253079425-3488378134)" mask="url(#d2-4253079425)" /><text x="2149.500000" y="484.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="2149.500000" dy="0.000000">perform_async</tspan><tspan x="2149.500000" dy="18.500000">(app_id, &#39;rate_limit&#39;, &#39;enable&#39;)</tspan></text></g><g class="ZGVwbG95X3dlYi4oam9iIC0mZ3Q7IG1pZGRsZXdhcmVfc3ZjKVswXQ=="><path d="M 2581.500000 486.000000 C 2672.699951 486.000000 2719.500000 486.000000 2809.500000 486.000000" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4253079425-3488378134)" mask="url(#d2-4253079425)" /></g><g class="ZHlub19tZ3IuKGFwaSAtJmd0OyBtaWRkbGV3YXJlX2pvYilbMF0="><path d="M 3782.500000 486.000000 C 3873.699951 486.000000 3920.500000 486.000000 4010.500000 486.000000" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4253079425-3488378134)" mask="url(#d2-4253079425)" /></g><g class="ZHlub19tZ3IuKG1pZGRsZXdhcmVfam9iIC0mZ3Q7IHJhdGVfbGltaXRfc3ZjKVswXQ=="><path d="M 4151.500000 486.000000 C 4242.700195 486.000000 4289.500000 486.000000 4379.500000 486.000000" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4253079425-3488378134)" mask="url(#d2-4253079425)" /></g><g class="ZHlub19tZ3IuKHJhdGVfbGltaXRfc3ZjIC0mZ3Q7IGt1YmVjbGllbnQpWzBd"><path d="M 4552.500000 486.000000 C 4643.700195 486.000000 4801.899902 486.000000 4867.500000 486.000000" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4253079425-3488378134)" mask="url(#d2-4253079425)" /></g><g class="azhzLihtaWRkbGV3YXJlX2NyZCAtJmd0OyB0cmFlZmlrKVswXQ=="><path d="M 5954.500000 338.000000 C 6079.299805 338.000000 6138.500000 346.735992 6244.687737 380.468941" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4253079425-3488378134)" mask="url(#d2-4253079425)" /><text x="6103.000000" y="347.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">watch</text></g><g class="azhzLihpbmdyZXNzX3JvdXRlIC0mZ3Q7IHRyYWVmaWspWzBd"><path d="M 5976.500000 480.000000 C 6083.700195 480.000000 6138.500000 471.263000 6244.687737 437.530052" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4253079425-3488378134)" mask="url(#d2-4253079425)" /><text x="6114.000000" y="481.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">watch</text></g><g class="KGRlcGxveV93ZWIubWlkZGxld2FyZV9zdmMgLSZndDsgZHlub19tZ3IuYXBpKVswXQ=="><marker id="mk-d2-4253079425-1221330775" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#E65100" class="connection" stroke-width="2" /> </marker><path d="M 2971.500000 486.000000 C 3062.699951 486.000000 3124.399902 486.000000 3182.000000 486.000000 C 3239.600098 486.000000 3493.500000 486.000000 3583.500000 486.000000" stroke="#E65100" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-d2-4253079425-1221330775)" mask="url(#d2-4253079425)" /><text x="3278.500000" y="476.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="3278.500000" dy="0.000000">HTTP POST</tspan><tspan x="3278.500000" dy="17.666667">{rate_limit_average: 5,</tspan><tspan x="3278.500000" dy="17.666667">rate_limit_burst: 10}</tspan></text></g><g class="KGR5bm9fbWdyLmt1YmVjbGllbnQgLSZndDsgazhzLm1pZGRsZXdhcmVfY3JkKVswXQ=="><marker id="mk-d2-4253079425-487057793" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#2E7D32" class="connection" stroke-width="2" /> </marker><path d="M 5086.500000 319.000000 C 5248.100098 319.000000 5319.799805 319.000000 5366.000000 319.000000 C 5412.200195 319.000000 5624.899902 319.000000 5732.500000 319.000000" stroke="#2E7D32" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-d2-4253079425-487057793)" mask="url(#d2-4253079425)" /><text x="5410.500000" y="325.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">kubectl API</text></g><g class="KGR5bm9fbWdyLmt1YmVjbGllbnQgLSZndDsgazhzLmluZ3Jlc3Nfcm91dGUpWzBd"><path d="M 5086.500000 480.000000 C 5248.100098 480.000000 5319.799805 480.000000 5366.000000 480.000000 C 5412.200195 480.000000 5620.500000 480.000000 5710.500000 480.000000" stroke="#2E7D32" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-d2-4253079425-487057793)" mask="url(#d2-4253079425)" /><text x="5399.500000" y="486.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">patch</text></g><g class="KGs4cy50cmFlZmlrIC0mZ3Q7IGVuZm9yY2VtZW50KVswXQ=="><marker id="mk-d2-4253079425-1557190539" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#C62828" class="connection" stroke-width="2" /> </marker><path d="M 6423.500000 409.000000 C 6514.700195 409.000000 6730.799805 409.000000 6914.000000 409.000000" stroke="#C62828" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-d2-4253079425-1557190539)" mask="url(#d2-4253079425)" /><text x="6669.500000" y="415.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">Enforces</text></g><mask id="d2-4253079425" maskUnits="userSpaceOnUse" x="47" y="-222" width="7189" height="859">
<rect x="47" y="-222" width="7189" height="859" fill="white"></rect>
<rect x="449.000000" y="476.000000" width="112" height="21" fill="black"></rect>
<rect x="1016.000000" y="476.000000" width="57" height="21" fill="black"></rect>
<rect x="2050.000000" y="468.000000" width="199" height="37" fill="black"></rect>
<rect x="6081.000000" y="331.000000" width="44" height="21" fill="black"></rect>
<rect x="6092.000000" y="465.000000" width="44" height="21" fill="black"></rect>
<rect x="3202.000000" y="460.000000" width="153" height="53" fill="black"></rect>
<rect x="5372.000000" y="309.000000" width="77" height="21" fill="black"></rect>
<rect x="5378.000000" y="470.000000" width="43" height="21" fill="black"></rect>
<rect x="6639.000000" y="399.000000" width="61" height="21" fill="black"></rect>
</mask></svg></svg>
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment