talks/ifsc/index.html

997 lines
161 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang="en-US"><head><title>IFSC</title><meta property="og:title" content="IFSC"><meta charset="UTF-8"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1.0"><meta name="apple-mobile-web-app-capable" content="yes"><meta http-equiv="X-UA-Compatible" content="ie=edge"><meta property="og:type" content="website"><meta name="twitter:card" content="summary"><style>@media screen{body,html{background:#000;height:100%;margin:0;overflow:hidden}.bespoke-marp-osc{display:none;opacity:0}.bespoke-marp-parent{bottom:0;left:0;position:absolute;right:0;top:0}.bespoke-marp-parent>.bespoke-marp-osc{background:rgba(0,0,0,.65);border-radius:7px;bottom:50px;color:#fff;display:block;font-family:Helvetica,Arial,sans-serif;font-size:16px;left:50%;line-height:0;opacity:1;padding:12px;position:absolute;touch-action:manipulation;-webkit-transform:translateX(-50%);transform:translateX(-50%);transition:opacity .2s linear;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:1}.bespoke-marp-parent>.bespoke-marp-osc>*{margin-left:6px}.bespoke-marp-parent>.bespoke-marp-osc>:first-child{margin-left:0}.bespoke-marp-parent>.bespoke-marp-osc>span{opacity:.8}.bespoke-marp-parent>.bespoke-marp-osc>span[data-bespoke-marp-osc=page]{display:inline-block;min-width:140px;text-align:center}.bespoke-marp-parent>.bespoke-marp-osc>button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:0;color:inherit;cursor:pointer;font-size:inherit;opacity:.8;outline:none;padding:0;transition:opacity .2s linear;-webkit-tap-highlight-color:transparent}.bespoke-marp-parent>.bespoke-marp-osc>button:disabled{cursor:not-allowed;opacity:.15!important}.bespoke-marp-parent>.bespoke-marp-osc>button:hover{opacity:1}.bespoke-marp-parent>.bespoke-marp-osc>button:hover:active{opacity:.6}.bespoke-marp-parent>.bespoke-marp-osc>button:hover:not(:disabled){transition:none}.bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev]{background:transparent url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNNjggOTBMMjggNTBsNDAtNDAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;height:32px;overflow:hidden;text-indent:100%;white-space:nowrap;width:32px}.bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next]{background:transparent url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNMzIgOTBsNDAtNDAtNDAtNDAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;height:32px;overflow:hidden;text-indent:100%;white-space:nowrap;width:32px}.bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=fullscreen]{background:transparent url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48ZGVmcz48c3R5bGU+LmF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NXB4fTwvc3R5bGU+PC9kZWZzPjxyZWN0IGNsYXNzPSJhIiB4PSIxMCIgeT0iMjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI2MCIgcng9IjUuNjciLz48cGF0aCBjbGFzcz0iYSIgZD0iTTQwIDcwSDIwVjUwbTIwIDBMMjAgNzBtNDAtNDBoMjB2MjBtLTIwIDBsMjAtMjAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;height:32px;overflow:hidden;text-indent:100%;white-space:nowrap;width:32px}.bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=fullscreen].exit{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48ZGVmcz48c3R5bGU+LmF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NXB4fTwvc3R5bGU+PC9kZWZzPjxyZWN0IGNsYXNzPSJhIiB4PSIxMCIgeT0iMjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI2MCIgcng9IjUuNjciLz48cGF0aCBjbGFzcz0iYSIgZD0iTTIwIDUwaDIwdjIwbS0yMCAwbDIwLTIwbTQwIDBINjBWMzBtMjAgMEw2MCA1MCIvPjwvc3ZnPg==")}.bespoke-marp-parent.bespoke-marp-inactive{cursor:none}.bespoke-marp-parent.bespoke-marp-inactive>.bespoke-marp-osc{opacity:0;pointer-events:none}svg.bespoke-marp-slide{height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;z-index:-1}svg.bespoke-marp-slide.bespoke-marp-active{pointer-events:auto;z-index:0}.bespoke-progress-parent{background:#222;display:flex;height:5px;width:100%}.bespoke-progress-parent+.bespoke-marp-parent{top:5px}.bespoke-progress-parent .bespoke-progress-bar{flex:0 0 0;background:#0288d1;transition:flex-basis .2s cubic-bezier(0,1,1,1)}}@media print{.bespoke-marp-osc,.bespoke-progress-parent{display:none!important;transition:none!important}.bespoke-marp-parent{top:0}}</style><style>article#presentation > svg > foreignObject > section {
width: 1280px;
height: 720px;
box-sizing: border-box;
overflow: hidden;
position: relative;
scroll-snap-align: center center;
}article#presentation > svg > foreignObject > section::after {
bottom: 0;
content: attr(data-marpit-pagination);
padding: inherit;
pointer-events: none;
position: absolute;
right: 0;
}article#presentation > svg > foreignObject > section:not([data-marpit-pagination])::after {
display: none;
}/* Normalization */article#presentation > svg > foreignObject > section h1 {
font-size: 2em;
margin: 0.67em 0;
}@page {
size: 1280px 720px;
margin: 0;
}@media print {html, body {
background-color: #fff;
margin: 0;
page-break-inside: avoid;
break-inside: avoid-page;
}
article#presentation > svg > foreignObject > section {
page-break-before: always;
break-before: page;
}
article#presentation > svg > foreignObject > section, article#presentation > svg > foreignObject > section * {
-webkit-print-color-adjust: exact !important;
color-adjust: exact !important;
}
article#presentation > svg[data-marpit-svg] {
display: block;
height: 100vh;
width: 100vw;
}
}article#presentation > svg > foreignObject > section svg[data-marp-fitting=svg]{display:block;height:auto;width:100%}@supports (-ms-ime-align:auto){article#presentation > svg > foreignObject > section svg[data-marp-fitting=svg]{position:static}}article#presentation > svg > foreignObject > section svg[data-marp-fitting=svg].__reflow__{content:""}@supports (-ms-ime-align:auto){article#presentation > svg > foreignObject > section svg[data-marp-fitting=svg].__reflow__{position:relative}}article#presentation > svg > foreignObject > section [data-marp-fitting-svg-content]{display:table;white-space:nowrap}article#presentation > svg > foreignObject > section [data-marp-fitting-svg-content-wrap]{white-space:pre}article#presentation > svg > foreignObject > section img[data-marp-twemoji]{background:transparent;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em;width:1em}/*!
* Marp default theme.
*
* @theme default
*/@font-face{font-family:octicons-link;src:url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format("woff")}article#presentation > svg > foreignObject > section .markdown-body .octicon,article#presentation > svg > foreignObject > section .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}article#presentation > svg > foreignObject > section .markdown-body .anchor,article#presentation > svg > foreignObject > section .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}article#presentation > svg > foreignObject > section .markdown-body .anchor:focus,article#presentation > svg > foreignObject > section .anchor:focus{outline:none}article#presentation > svg > foreignObject > section .markdown-body h1 .octicon-link,article#presentation > svg > foreignObject > section .markdown-body h2 .octicon-link,article#presentation > svg > foreignObject > section .markdown-body h3 .octicon-link,article#presentation > svg > foreignObject > section .markdown-body h4 .octicon-link,article#presentation > svg > foreignObject > section .markdown-body h5 .octicon-link,article#presentation > svg > foreignObject > section .markdown-body h6 .octicon-link,article#presentation > svg > foreignObject > section h1 .octicon-link,article#presentation > svg > foreignObject > section h2 .octicon-link,article#presentation > svg > foreignObject > section h3 .octicon-link,article#presentation > svg > foreignObject > section h4 .octicon-link,article#presentation > svg > foreignObject > section h5 .octicon-link,article#presentation > svg > foreignObject > section h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}article#presentation > svg > foreignObject > section .markdown-body h1:hover .anchor,article#presentation > svg > foreignObject > section .markdown-body h2:hover .anchor,article#presentation > svg > foreignObject > section .markdown-body h3:hover .anchor,article#presentation > svg > foreignObject > section .markdown-body h4:hover .anchor,article#presentation > svg > foreignObject > section .markdown-body h5:hover .anchor,article#presentation > svg > foreignObject > section .markdown-body h6:hover .anchor,article#presentation > svg > foreignObject > section h1:hover .anchor,article#presentation > svg > foreignObject > section h2:hover .anchor,article#presentation > svg > foreignObject > section h3:hover .anchor,article#presentation > svg > foreignObject > section h4:hover .anchor,article#presentation > svg > foreignObject > section h5:hover .anchor,article#presentation > svg > foreignObject > section h6:hover .anchor{text-decoration:none}article#presentation > svg > foreignObject > section .markdown-body h1:hover .anchor .octicon-link,article#presentation > svg > foreignObject > section .markdown-body h2:hover .anchor .octicon-link,article#presentation > svg > foreignObject > section .markdown-body h3:hover .anchor .octicon-link,article#presentation > svg > foreignObject > section .markdown-body h4:hover .anchor .octicon-link,article#presentation > svg > foreignObject > section .markdown-body h5:hover .anchor .octicon-link,article#presentation > svg > foreignObject > section .markdown-body h6:hover .anchor .octicon-link,article#presentation > svg > foreignObject > section h1:hover .anchor .octicon-link,article#presentation > svg > foreignObject > section h2:hover .anchor .octicon-link,article#presentation > svg > foreignObject > section h3:hover .anchor .octicon-link,article#presentation > svg > foreignObject > section h4:hover .anchor .octicon-link,article#presentation > svg > foreignObject > section h5:hover .anchor .octicon-link,article#presentation > svg > foreignObject > section h6:hover .anchor .octicon-link{visibility:visible}article#presentation > svg > foreignObject > section .markdown-body,article#presentation > svg > foreignObject > section{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#24292e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;line-height:1.5;word-wrap:break-word}article#presentation > svg > foreignObject > section .markdown-body .pl-c,article#presentation > svg > foreignObject > section .pl-c{color:#6a737d}article#presentation > svg > foreignObject > section .markdown-body .pl-c1,article#presentation > svg > foreignObject > section .markdown-body .pl-s .pl-v,article#presentation > svg > foreignObject > section .pl-c1,article#presentation > svg > foreignObject > section .pl-s .pl-v{color:#005cc5}article#presentation > svg > foreignObject > section .markdown-body .pl-e,article#presentation > svg > foreignObject > section .markdown-body .pl-en,article#presentation > svg > foreignObject > section .pl-e,article#presentation > svg > foreignObject > section .pl-en{color:#6f42c1}article#presentation > svg > foreignObject > section .markdown-body .pl-s .pl-s1,article#presentation > svg > foreignObject > section .markdown-body .pl-smi,article#presentation > svg > foreignObject > section .pl-s .pl-s1,article#presentation > svg > foreignObject > section .pl-smi{color:#24292e}article#presentation > svg > foreignObject > section .markdown-body .pl-ent,article#presentation > svg > foreignObject > section .pl-ent{color:#22863a}article#presentation > svg > foreignObject > section .markdown-body .pl-k,article#presentation > svg > foreignObject > section .pl-k{color:#d73a49}article#presentation > svg > foreignObject > section .markdown-body .pl-pds,article#presentation > svg > foreignObject > section .markdown-body .pl-s,article#presentation > svg > foreignObject > section .markdown-body .pl-s .pl-pse .pl-s1,article#presentation > svg > foreignObject > section .markdown-body .pl-sr,article#presentation > svg > foreignObject > section .markdown-body .pl-sr .pl-cce,article#presentation > svg > foreignObject > section .markdown-body .pl-sr .pl-sra,article#presentation > svg > foreignObject > section .markdown-body .pl-sr .pl-sre,article#presentation > svg > foreignObject > section .pl-pds,article#presentation > svg > foreignObject > section .pl-s,article#presentation > svg > foreignObject > section .pl-s .pl-pse .pl-s1,article#presentation > svg > foreignObject > section .pl-sr,article#presentation > svg > foreignObject > section .pl-sr .pl-cce,article#presentation > svg > foreignObject > section .pl-sr .pl-sra,article#presentation > svg > foreignObject > section .pl-sr .pl-sre{color:#032f62}article#presentation > svg > foreignObject > section .markdown-body .pl-smw,article#presentation > svg > foreignObject > section .markdown-body .pl-v,article#presentation > svg > foreignObject > section .pl-smw,article#presentation > svg > foreignObject > section .pl-v{color:#e36209}article#presentation > svg > foreignObject > section .markdown-body .pl-bu,article#presentation > svg > foreignObject > section .pl-bu{color:#b31d28}article#presentation > svg > foreignObject > section .markdown-body .pl-ii,article#presentation > svg > foreignObject > section .pl-ii{background-color:#b31d28;color:#fafbfc}article#presentation > svg > foreignObject > section .markdown-body .pl-c2,article#presentation > svg > foreignObject > section .pl-c2{background-color:#d73a49;color:#fafbfc}article#presentation > svg > foreignObject > section .markdown-body .pl-c2:before,article#presentation > svg > foreignObject > section .pl-c2:before{content:"^M"}article#presentation > svg > foreignObject > section .markdown-body .pl-sr .pl-cce,article#presentation > svg > foreignObject > section .pl-sr .pl-cce{color:#22863a;font-weight:700}article#presentation > svg > foreignObject > section .markdown-body .pl-ml,article#presentation > svg > foreignObject > section .pl-ml{color:#735c0f}article#presentation > svg > foreignObject > section .markdown-body .pl-mh,article#presentation > svg > foreignObject > section .markdown-body .pl-mh .pl-en,article#presentation > svg > foreignObject > section .markdown-body .pl-ms,article#presentation > svg > foreignObject > section .pl-mh,article#presentation > svg > foreignObject > section .pl-mh .pl-en,article#presentation > svg > foreignObject > section .pl-ms{color:#005cc5;font-weight:700}article#presentation > svg > foreignObject > section .markdown-body .pl-mi,article#presentation > svg > foreignObject > section .pl-mi{color:#24292e;font-style:italic}article#presentation > svg > foreignObject > section .markdown-body .pl-mb,article#presentation > svg > foreignObject > section .pl-mb{color:#24292e;font-weight:700}article#presentation > svg > foreignObject > section .markdown-body .pl-md,article#presentation > svg > foreignObject > section .pl-md{background-color:#ffeef0;color:#b31d28}article#presentation > svg > foreignObject > section .markdown-body .pl-mi1,article#presentation > svg > foreignObject > section .pl-mi1{background-color:#f0fff4;color:#22863a}article#presentation > svg > foreignObject > section .markdown-body .pl-mc,article#presentation > svg > foreignObject > section .pl-mc{background-color:#ffebda;color:#e36209}article#presentation > svg > foreignObject > section .markdown-body .pl-mi2,article#presentation > svg > foreignObject > section .pl-mi2{background-color:#005cc5;color:#f6f8fa}article#presentation > svg > foreignObject > section .markdown-body .pl-mdr,article#presentation > svg > foreignObject > section .pl-mdr{color:#6f42c1;font-weight:700}article#presentation > svg > foreignObject > section .markdown-body .pl-ba,article#presentation > svg > foreignObject > section .pl-ba{color:#586069}article#presentation > svg > foreignObject > section .markdown-body .pl-sg,article#presentation > svg > foreignObject > section .pl-sg{color:#959da5}article#presentation > svg > foreignObject > section .markdown-body .pl-corl,article#presentation > svg > foreignObject > section .pl-corl{color:#032f62;text-decoration:underline}article#presentation > svg > foreignObject > section .markdown-body details,article#presentation > svg > foreignObject > section details{display:block}article#presentation > svg > foreignObject > section .markdown-body summary,article#presentation > svg > foreignObject > section summary{display:list-item}article#presentation > svg > foreignObject > section .markdown-body a,article#presentation > svg > foreignObject > section a{background-color:transparent}article#presentation > svg > foreignObject > section .markdown-body a:active,article#presentation > svg > foreignObject > section .markdown-body a:hover,article#presentation > svg > foreignObject > section a:active,article#presentation > svg > foreignObject > section a:hover{outline-width:0}article#presentation > svg > foreignObject > section .markdown-body strong,article#presentation > svg > foreignObject > section strong{font-weight:inherit;font-weight:bolder}article#presentation > svg > foreignObject > section .markdown-body h1,article#presentation > svg > foreignObject > section h1{margin:.67em 0}article#presentation > svg > foreignObject > section .markdown-body img,article#presentation > svg > foreignObject > section img{border-style:none}article#presentation > svg > foreignObject > section .markdown-body code,article#presentation > svg > foreignObject > section .markdown-body kbd,article#presentation > svg > foreignObject > section .markdown-body pre,article#presentation > svg > foreignObject > section code,article#presentation > svg > foreignObject > section kbd,article#presentation > svg > foreignObject > section pre{font-family:monospace,monospace;font-size:1em}article#presentation > svg > foreignObject > section .markdown-body hr,article#presentation > svg > foreignObject > section hr{box-sizing:content-box;overflow:visible}article#presentation > svg > foreignObject > section .markdown-body input,article#presentation > svg > foreignObject > section input{font:inherit;margin:0;overflow:visible}article#presentation > svg > foreignObject > section .markdown-body [type=checkbox],article#presentation > svg > foreignObject > section [type=checkbox]{box-sizing:border-box;padding:0}article#presentation > svg > foreignObject > section .markdown-body *,article#presentation > svg > foreignObject > section *{box-sizing:border-box}article#presentation > svg > foreignObject > section .markdown-body input,article#presentation > svg > foreignObject > section input{font-family:inherit;font-size:inherit;line-height:inherit}article#presentation > svg > foreignObject > section .markdown-body a,article#presentation > svg > foreignObject > section a{color:#0366d6;text-decoration:none}article#presentation > svg > foreignObject > section .markdown-body a:hover,article#presentation > svg > foreignObject > section a:hover{text-decoration:underline}article#presentation > svg > foreignObject > section .markdown-body strong,article#presentation > svg > foreignObject > section strong{font-weight:600}article#presentation > svg > foreignObject > section .markdown-body hr,article#presentation > svg > foreignObject > section hr{background:transparent;border-bottom:1px solid #dfe2e5;height:0;margin:15px 0;overflow:hidden}article#presentation > svg > foreignObject > section .markdown-body hr:before,article#presentation > svg > foreignObject > section hr:before{content:"";display:table}article#presentation > svg > foreignObject > section .markdown-body hr:after,article#presentation > svg > foreignObject > section hr:after{clear:both;content:"";display:table}article#presentation > svg > foreignObject > section .markdown-body table,article#presentation > svg > foreignObject > section table{border-collapse:collapse;border-spacing:0}article#presentation > svg > foreignObject > section .markdown-body td,article#presentation > svg > foreignObject > section .markdown-body th,article#presentation > svg > foreignObject > section td,article#presentation > svg > foreignObject > section th{padding:0}article#presentation > svg > foreignObject > section .markdown-body details summary,article#presentation > svg > foreignObject > section details summary{cursor:pointer}article#presentation > svg > foreignObject > section .markdown-body h1,article#presentation > svg > foreignObject > section .markdown-body h2,article#presentation > svg > foreignObject > section .markdown-body h3,article#presentation > svg > foreignObject > section .markdown-body h4,article#presentation > svg > foreignObject > section .markdown-body h5,article#presentation > svg > foreignObject > section .markdown-body h6,article#presentation > svg > foreignObject > section h1,article#presentation > svg > foreignObject > section h2,article#presentation > svg > foreignObject > section h3,article#presentation > svg > foreignObject > section h4,article#presentation > svg > foreignObject > section h5,article#presentation > svg > foreignObject > section h6{margin-bottom:0;margin-top:0}article#presentation > svg > foreignObject > section .markdown-body h1,article#presentation > svg > foreignObject > section h1{font-size:32px}article#presentation > svg > foreignObject > section .markdown-body h1,article#presentation > svg > foreignObject > section .markdown-body h2,article#presentation > svg > foreignObject > section h1,article#presentation > svg > foreignObject > section h2{font-weight:600}article#presentation > svg > foreignObject > section .markdown-body h2,article#presentation > svg > foreignObject > section h2{font-size:24px}article#presentation > svg > foreignObject > section .markdown-body h3,article#presentation > svg > foreignObject > section h3{font-size:20px}article#presentation > svg > foreignObject > section .markdown-body h3,article#presentation > svg > foreignObject > section .markdown-body h4,article#presentation > svg > foreignObject > section h3,article#presentation > svg > foreignObject > section h4{font-weight:600}article#presentation > svg > foreignObject > section .markdown-body h4,article#presentation > svg > foreignObject > section h4{font-size:16px}article#presentation > svg > foreignObject > section .markdown-body h5,article#presentation > svg > foreignObject > section h5{font-size:14px}article#presentation > svg > foreignObject > section .markdown-body h5,article#presentation > svg > foreignObject > section .markdown-body h6,article#presentation > svg > foreignObject > section h5,article#presentation > svg > foreignObject > section h6{font-weight:600}article#presentation > svg > foreignObject > section .markdown-body h6,article#presentation > svg > foreignObject > section h6{font-size:12px}article#presentation > svg > foreignObject > section .markdown-body p,article#presentation > svg > foreignObject > section p{margin-bottom:10px;margin-top:0}article#presentation > svg > foreignObject > section .markdown-body blockquote,article#presentation > svg > foreignObject > section blockquote{margin:0}article#presentation > svg > foreignObject > section .markdown-body ol,article#presentation > svg > foreignObject > section .markdown-body ul,article#presentation > svg > foreignObject > section ol,article#presentation > svg > foreignObject > section ul{margin-bottom:0;margin-top:0;padding-left:0}article#presentation > svg > foreignObject > section .markdown-body ol ol,article#presentation > svg > foreignObject > section .markdown-body ul ol,article#presentation > svg > foreignObject > section ol ol,article#presentation > svg > foreignObject > section ul ol{list-style-type:lower-roman}article#presentation > svg > foreignObject > section .markdown-body ol ol ol,article#presentation > svg > foreignObject > section .markdown-body ol ul ol,article#presentation > svg > foreignObject > section .markdown-body ul ol ol,article#presentation > svg > foreignObject > section .markdown-body ul ul ol,article#presentation > svg > foreignObject > section ol ol ol,article#presentation > svg > foreignObject > section ol ul ol,article#presentation > svg > foreignObject > section ul ol ol,article#presentation > svg > foreignObject > section ul ul ol{list-style-type:lower-alpha}article#presentation > svg > foreignObject > section .markdown-body dd,article#presentation > svg > foreignObject > section dd{margin-left:0}article#presentation > svg > foreignObject > section .markdown-body code,article#presentation > svg > foreignObject > section .markdown-body pre,article#presentation > svg > foreignObject > section code,article#presentation > svg > foreignObject > section pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px}article#presentation > svg > foreignObject > section .markdown-body pre,article#presentation > svg > foreignObject > section pre{margin-bottom:0;margin-top:0}article#presentation > svg > foreignObject > section .markdown-body input::-webkit-inner-spin-button,article#presentation > svg > foreignObject > section .markdown-body input::-webkit-outer-spin-button,article#presentation > svg > foreignObject > section input::-webkit-inner-spin-button,article#presentation > svg > foreignObject > section input::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}article#presentation > svg > foreignObject > section .markdown-body .border,article#presentation > svg > foreignObject > section .border{border:1px solid #e1e4e8!important}article#presentation > svg > foreignObject > section .markdown-body .border-0,article#presentation > svg > foreignObject > section .border-0{border:0!important}article#presentation > svg > foreignObject > section .markdown-body .border-bottom,article#presentation > svg > foreignObject > section .border-bottom{border-bottom:1px solid #e1e4e8!important}article#presentation > svg > foreignObject > section .markdown-body .rounded-1,article#presentation > svg > foreignObject > section .rounded-1{border-radius:3px!important}article#presentation > svg > foreignObject > section .markdown-body .bg-white,article#presentation > svg > foreignObject > section .bg-white{background-color:#fff!important}article#presentation > svg > foreignObject > section .markdown-body .bg-gray-light,article#presentation > svg > foreignObject > section .bg-gray-light{background-color:#fafbfc!important}article#presentation > svg > foreignObject > section .markdown-body .text-gray-light,article#presentation > svg > foreignObject > section .text-gray-light{color:#6a737d!important}article#presentation > svg > foreignObject > section .markdown-body .mb-0,article#presentation > svg > foreignObject > section .mb-0{margin-bottom:0!important}article#presentation > svg > foreignObject > section .markdown-body .my-2,article#presentation > svg > foreignObject > section .my-2{margin-bottom:8px!important;margin-top:8px!important}article#presentation > svg > foreignObject > section .markdown-body .py-0,article#presentation > svg > foreignObject > section .py-0{padding-bottom:0!important;padding-top:0!important}article#presentation > svg > foreignObject > section .markdown-body .py-2,article#presentation > svg > foreignObject > section .py-2{padding-bottom:8px!important;padding-top:8px!important}article#presentation > svg > foreignObject > section .markdown-body .pl-3,article#presentation > svg > foreignObject > section .markdown-body .px-3,article#presentation > svg > foreignObject > section .pl-3,article#presentation > svg > foreignObject > section .px-3{padding-left:16px!important}article#presentation > svg > foreignObject > section .markdown-body .px-3,article#presentation > svg > foreignObject > section .px-3{padding-right:16px!important}article#presentation > svg > foreignObject > section .markdown-body .f6,article#presentation > svg > foreignObject > section .f6{font-size:12px!important}article#presentation > svg > foreignObject > section .markdown-body .lh-condensed,article#presentation > svg > foreignObject > section .lh-condensed{line-height:1.25!important}article#presentation > svg > foreignObject > section .markdown-body .text-bold,article#presentation > svg > foreignObject > section .text-bold{font-weight:600!important}article#presentation > svg > foreignObject > section .markdown-body:before,article#presentation > svg > foreignObject > section:before{content:"";display:table}article#presentation > svg > foreignObject > section .markdown-body:after,article#presentation > svg > foreignObject > section:after{clear:both;/* content:""; */display:table}article#presentation > svg > foreignObject > section .markdown-body>:first-child,article#presentation > svg > foreignObject > section>:first-child{margin-top:0!important}article#presentation > svg > foreignObject > section .markdown-body>:last-child,article#presentation > svg > foreignObject > section>:last-child{margin-bottom:0!important}article#presentation > svg > foreignObject > section .markdown-body a:not([href]),article#presentation > svg > foreignObject > section a:not([href]){color:inherit;text-decoration:none}article#presentation > svg > foreignObject > section .markdown-body blockquote,article#presentation > svg > foreignObject > section .markdown-body dl,article#presentation > svg > foreignObject > section .markdown-body ol,article#presentation > svg > foreignObject > section .markdown-body p,article#presentation > svg > foreignObject > section .markdown-body pre,article#presentation > svg > foreignObject > section .markdown-body table,article#presentation > svg > foreignObject > section .markdown-body ul,article#presentation > svg > foreignObject > section blockquote,article#presentation > svg > foreignObject > section dl,article#presentation > svg > foreignObject > section ol,article#presentation > svg > foreignObject > section p,article#presentation > svg > foreignObject > section pre,article#presentation > svg > foreignObject > section table,article#presentation > svg > foreignObject > section ul{margin-bottom:16px;margin-top:0}article#presentation > svg > foreignObject > section .markdown-body hr,article#presentation > svg > foreignObject > section hr{background-color:#e1e4e8;border:0;height:.25em;margin:24px 0;padding:0}article#presentation > svg > foreignObject > section .markdown-body blockquote,article#presentation > svg > foreignObject > section blockquote{border-left:.25em solid #dfe2e5;color:#6a737d;padding:0 1em}article#presentation > svg > foreignObject > section .markdown-body blockquote>:first-child,article#presentation > svg > foreignObject > section blockquote>:first-child{margin-top:0}article#presentation > svg > foreignObject > section .markdown-body blockquote>:last-child,article#presentation > svg > foreignObject > section blockquote>:last-child{margin-bottom:0}article#presentation > svg > foreignObject > section .markdown-body kbd,article#presentation > svg > foreignObject > section kbd{border:1px solid #c6cbd1;border-bottom-color:#959da5;box-shadow:inset 0 -1px 0 #959da5;font-size:11px}article#presentation > svg > foreignObject > section .markdown-body h1,article#presentation > svg > foreignObject > section .markdown-body h2,article#presentation > svg > foreignObject > section .markdown-body h3,article#presentation > svg > foreignObject > section .markdown-body h4,article#presentation > svg > foreignObject > section .markdown-body h5,article#presentation > svg > foreignObject > section .markdown-body h6,article#presentation > svg > foreignObject > section h1,article#presentation > svg > foreignObject > section h2,article#presentation > svg > foreignObject > section h3,article#presentation > svg > foreignObject > section h4,article#presentation > svg > foreignObject > section h5,article#presentation > svg > foreignObject > section h6{font-weight:600;line-height:1.25;margin-bottom:16px;margin-top:24px}article#presentation > svg > foreignObject > section .markdown-body h1,article#presentation > svg > foreignObject > section h1{font-size:2em}article#presentation > svg > foreignObject > section .markdown-body h1,article#presentation > svg > foreignObject > section .markdown-body h2,article#presentation > svg > foreignObject > section h1,article#presentation > svg > foreignObject > section h2{border-bottom:1px solid #eaecef;padding-bottom:.3em}article#presentation > svg > foreignObject > section .markdown-body h2,article#presentation > svg > foreignObject > section h2{font-size:1.5em}article#presentation > svg > foreignObject > section .markdown-body h3,article#presentation > svg > foreignObject > section h3{font-size:1.25em}article#presentation > svg > foreignObject > section .markdown-body h4,article#presentation > svg > foreignObject > section h4{font-size:1em}article#presentation > svg > foreignObject > section .markdown-body h5,article#presentation > svg > foreignObject > section h5{font-size:.875em}article#presentation > svg > foreignObject > section .markdown-body h6,article#presentation > svg > foreignObject > section h6{color:#6a737d;font-size:.85em}article#presentation > svg > foreignObject > section .markdown-body ol,article#presentation > svg > foreignObject > section .markdown-body ul,article#presentation > svg > foreignObject > section ol,article#presentation > svg > foreignObject > section ul{padding-left:2em}article#presentation > svg > foreignObject > section .markdown-body ol ol,article#presentation > svg > foreignObject > section .markdown-body ol ul,article#presentation > svg > foreignObject > section .markdown-body ul ol,article#presentation > svg > foreignObject > section .markdown-body ul ul,article#presentation > svg > foreignObject > section ol ol,article#presentation > svg > foreignObject > section ol ul,article#presentation > svg > foreignObject > section ul ol,article#presentation > svg > foreignObject > section ul ul{margin-bottom:0;margin-top:0}article#presentation > svg > foreignObject > section .markdown-body li,article#presentation > svg > foreignObject > section li{word-wrap:break-all}article#presentation > svg > foreignObject > section .markdown-body li>p,article#presentation > svg > foreignObject > section li>p{margin-top:16px}article#presentation > svg > foreignObject > section .markdown-body li+li,article#presentation > svg > foreignObject > section li+li{margin-top:.25em}article#presentation > svg > foreignObject > section .markdown-body dl,article#presentation > svg > foreignObject > section dl{padding:0}article#presentation > svg > foreignObject > section .markdown-body dl dt,article#presentation > svg > foreignObject > section dl dt{font-size:1em;font-style:italic;font-weight:600;margin-top:16px;padding:0}article#presentation > svg > foreignObject > section .markdown-body dl dd,article#presentation > svg > foreignObject > section dl dd{margin-bottom:16px;padding:0 16px}article#presentation > svg > foreignObject > section .markdown-body table,article#presentation > svg > foreignObject > section table{display:block;overflow:auto;width:100%}article#presentation > svg > foreignObject > section .markdown-body table th,article#presentation > svg > foreignObject > section table th{font-weight:600}article#presentation > svg > foreignObject > section .markdown-body table td,article#presentation > svg > foreignObject > section .markdown-body table th,article#presentation > svg > foreignObject > section table td,article#presentation > svg > foreignObject > section table th{border:1px solid #dfe2e5;padding:6px 13px}article#presentation > svg > foreignObject > section .markdown-body table tr,article#presentation > svg > foreignObject > section table tr{background-color:#fff;border-top:1px solid #c6cbd1}article#presentation > svg > foreignObject > section .markdown-body table tr:nth-child(2n),article#presentation > svg > foreignObject > section table tr:nth-child(2n){background-color:#f6f8fa}article#presentation > svg > foreignObject > section .markdown-body img,article#presentation > svg > foreignObject > section img{background-color:#fff;box-sizing:content-box;max-width:100%}article#presentation > svg > foreignObject > section .markdown-body img[align=right],article#presentation > svg > foreignObject > section img[align=right]{padding-left:20px}article#presentation > svg > foreignObject > section .markdown-body img[align=left],article#presentation > svg > foreignObject > section img[align=left]{padding-right:20px}article#presentation > svg > foreignObject > section .markdown-body code,article#presentation > svg > foreignObject > section code{background-color:rgba(27,31,35,.05);border-radius:3px;font-size:85%;margin:0;padding:.2em .4em}article#presentation > svg > foreignObject > section .markdown-body pre,article#presentation > svg > foreignObject > section pre{word-wrap:normal}article#presentation > svg > foreignObject > section .markdown-body pre>code,article#presentation > svg > foreignObject > section pre>code{background:transparent;border:0;font-size:100%;margin:0;padding:0;white-space:pre;word-break:normal}article#presentation > svg > foreignObject > section .markdown-body .highlight,article#presentation > svg > foreignObject > section .highlight{margin-bottom:16px}article#presentation > svg > foreignObject > section .markdown-body .highlight pre,article#presentation > svg > foreignObject > section .highlight pre{margin-bottom:0;word-break:normal}article#presentation > svg > foreignObject > section .markdown-body .highlight pre,article#presentation > svg > foreignObject > section .markdown-body pre,article#presentation > svg > foreignObject > section .highlight pre,article#presentation > svg > foreignObject > section pre{background-color:#f6f8fa;border-radius:3px;font-size:85%;line-height:1.45;overflow:auto;padding:16px}article#presentation > svg > foreignObject > section .markdown-body pre code,article#presentation > svg > foreignObject > section pre code{background-color:transparent;border:0;display:inline;line-height:inherit;margin:0;max-width:auto;overflow:visible;padding:0;word-wrap:normal}article#presentation > svg > foreignObject > section .markdown-body .commit-tease-sha,article#presentation > svg > foreignObject > section .commit-tease-sha{color:#444d56;display:inline-block;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:90%}article#presentation > svg > foreignObject > section .markdown-body .blob-wrapper,article#presentation > svg > foreignObject > section .blob-wrapper{border-bottom-left-radius:3px;border-bottom-right-radius:3px;overflow-x:auto;overflow-y:hidden}article#presentation > svg > foreignObject > section .markdown-body .blob-wrapper-embedded,article#presentation > svg > foreignObject > section .blob-wrapper-embedded{max-height:240px;overflow-y:auto}article#presentation > svg > foreignObject > section .markdown-body .blob-num,article#presentation > svg > foreignObject > section .blob-num{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;color:rgba(27,31,35,.3);cursor:pointer;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px;line-height:20px;min-width:50px;padding-left:10px;padding-right:10px;text-align:right;user-select:none;vertical-align:top;white-space:nowrap;width:1%}article#presentation > svg > foreignObject > section .markdown-body .blob-num:hover,article#presentation > svg > foreignObject > section .blob-num:hover{color:rgba(27,31,35,.6)}article#presentation > svg > foreignObject > section .markdown-body .blob-num:before,article#presentation > svg > foreignObject > section .blob-num:before{content:attr(data-line-number)}article#presentation > svg > foreignObject > section .markdown-body .blob-code,article#presentation > svg > foreignObject > section .blob-code{line-height:20px;padding-left:10px;padding-right:10px;position:relative;vertical-align:top}article#presentation > svg > foreignObject > section .markdown-body .blob-code-inner,article#presentation > svg > foreignObject > section .blob-code-inner{color:#24292e;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px;overflow:visible;white-space:pre;word-wrap:normal}article#presentation > svg > foreignObject > section .markdown-body .pl-token.active,article#presentation > svg > foreignObject > section .markdown-body .pl-token:hover,article#presentation > svg > foreignObject > section .pl-token.active,article#presentation > svg > foreignObject > section .pl-token:hover{background:#ffea7f;cursor:pointer}article#presentation > svg > foreignObject > section .markdown-body kbd,article#presentation > svg > foreignObject > section kbd{background-color:#fafbfc;border:1px solid #d1d5da;border-bottom-color:#c6cbd1;border-radius:3px;box-shadow:inset 0 -1px 0 #c6cbd1;color:#444d56;display:inline-block;font:11px SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;line-height:10px;padding:3px 5px;vertical-align:middle}article#presentation > svg > foreignObject > section .markdown-body :checked+.radio-label,article#presentation > svg > foreignObject > section :checked+.radio-label{border-color:#0366d6;position:relative;z-index:1}article#presentation > svg > foreignObject > section .markdown-body .tab-size[data-tab-size="1"],article#presentation > svg > foreignObject > section .tab-size[data-tab-size="1"]{-moz-tab-size:1;-o-tab-size:1;tab-size:1}article#presentation > svg > foreignObject > section .markdown-body .tab-size[data-tab-size="2"],article#presentation > svg > foreignObject > section .tab-size[data-tab-size="2"]{-moz-tab-size:2;-o-tab-size:2;tab-size:2}article#presentation > svg > foreignObject > section .markdown-body .tab-size[data-tab-size="3"],article#presentation > svg > foreignObject > section .tab-size[data-tab-size="3"]{-moz-tab-size:3;-o-tab-size:3;tab-size:3}article#presentation > svg > foreignObject > section .markdown-body .tab-size[data-tab-size="4"],article#presentation > svg > foreignObject > section .tab-size[data-tab-size="4"]{-moz-tab-size:4;-o-tab-size:4;tab-size:4}article#presentation > svg > foreignObject > section .markdown-body .tab-size[data-tab-size="5"],article#presentation > svg > foreignObject > section .tab-size[data-tab-size="5"]{-moz-tab-size:5;-o-tab-size:5;tab-size:5}article#presentation > svg > foreignObject > section .markdown-body .tab-size[data-tab-size="6"],article#presentation > svg > foreignObject > section .tab-size[data-tab-size="6"]{-moz-tab-size:6;-o-tab-size:6;tab-size:6}article#presentation > svg > foreignObject > section .markdown-body .tab-size[data-tab-size="7"],article#presentation > svg > foreignObject > section .tab-size[data-tab-size="7"]{-moz-tab-size:7;-o-tab-size:7;tab-size:7}article#presentation > svg > foreignObject > section .markdown-body .tab-size[data-tab-size="8"],article#presentation > svg > foreignObject > section .tab-size[data-tab-size="8"]{-moz-tab-size:8;-o-tab-size:8;tab-size:8}article#presentation > svg > foreignObject > section .markdown-body .tab-size[data-tab-size="9"],article#presentation > svg > foreignObject > section .tab-size[data-tab-size="9"]{-moz-tab-size:9;-o-tab-size:9;tab-size:9}article#presentation > svg > foreignObject > section .markdown-body .tab-size[data-tab-size="10"],article#presentation > svg > foreignObject > section .tab-size[data-tab-size="10"]{-moz-tab-size:10;-o-tab-size:10;tab-size:10}article#presentation > svg > foreignObject > section .markdown-body .tab-size[data-tab-size="11"],article#presentation > svg > foreignObject > section .tab-size[data-tab-size="11"]{-moz-tab-size:11;-o-tab-size:11;tab-size:11}article#presentation > svg > foreignObject > section .markdown-body .tab-size[data-tab-size="12"],article#presentation > svg > foreignObject > section .tab-size[data-tab-size="12"]{-moz-tab-size:12;-o-tab-size:12;tab-size:12}article#presentation > svg > foreignObject > section .markdown-body .task-list-item,article#presentation > svg > foreignObject > section .task-list-item{list-style-type:none}article#presentation > svg > foreignObject > section .markdown-body .task-list-item+.task-list-item,article#presentation > svg > foreignObject > section .task-list-item+.task-list-item{margin-top:3px}article#presentation > svg > foreignObject > section .markdown-body .task-list-item input,article#presentation > svg > foreignObject > section .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}article#presentation > svg > foreignObject > section .markdown-body hr,article#presentation > svg > foreignObject > section hr{border-bottom-color:#eee}article#presentation > svg > foreignObject > section .markdown-body .pl-0,article#presentation > svg > foreignObject > section .pl-0{padding-left:0!important}article#presentation > svg > foreignObject > section .markdown-body .pl-1,article#presentation > svg > foreignObject > section .pl-1{padding-left:4px!important}article#presentation > svg > foreignObject > section .markdown-body .pl-2,article#presentation > svg > foreignObject > section .pl-2{padding-left:8px!important}article#presentation > svg > foreignObject > section .markdown-body .pl-3,article#presentation > svg > foreignObject > section .pl-3{padding-left:16px!important}article#presentation > svg > foreignObject > section .markdown-body .pl-4,article#presentation > svg > foreignObject > section .pl-4{padding-left:24px!important}article#presentation > svg > foreignObject > section .markdown-body .pl-5,article#presentation > svg > foreignObject > section .pl-5{padding-left:32px!important}article#presentation > svg > foreignObject > section .markdown-body .pl-6,article#presentation > svg > foreignObject > section .pl-6{padding-left:40px!important}article#presentation > svg > foreignObject > section .markdown-body .pl-7,article#presentation > svg > foreignObject > section .pl-7{padding-left:48px!important}article#presentation > svg > foreignObject > section .markdown-body .pl-8,article#presentation > svg > foreignObject > section .pl-8{padding-left:64px!important}article#presentation > svg > foreignObject > section .markdown-body .pl-9,article#presentation > svg > foreignObject > section .pl-9{padding-left:80px!important}article#presentation > svg > foreignObject > section .markdown-body .pl-10,article#presentation > svg > foreignObject > section .pl-10{padding-left:96px!important}article#presentation > svg > foreignObject > section .markdown-body .pl-11,article#presentation > svg > foreignObject > section .pl-11{padding-left:112px!important}article#presentation > svg > foreignObject > section .markdown-body .pl-12,article#presentation > svg > foreignObject > section .pl-12{padding-left:128px!important}article#presentation > svg > foreignObject > section .hljs{display:block;background:#fff;padding:.5em;color:#333;overflow-x:auto}article#presentation > svg > foreignObject > section .hljs-comment,article#presentation > svg > foreignObject > section .hljs-meta{color:#969896}article#presentation > svg > foreignObject > section .hljs-emphasis,article#presentation > svg > foreignObject > section .hljs-quote,article#presentation > svg > foreignObject > section .hljs-string,article#presentation > svg > foreignObject > section .hljs-strong,article#presentation > svg > foreignObject > section .hljs-template-variable,article#presentation > svg > foreignObject > section .hljs-variable{color:#df5000}article#presentation > svg > foreignObject > section .hljs-keyword,article#presentation > svg > foreignObject > section .hljs-selector-tag,article#presentation > svg > foreignObject > section .hljs-type{color:#a71d5d}article#presentation > svg > foreignObject > section .hljs-attribute,article#presentation > svg > foreignObject > section .hljs-bullet,article#presentation > svg > foreignObject > section .hljs-literal,article#presentation > svg > foreignObject > section .hljs-symbol{color:#0086b3}article#presentation > svg > foreignObject > section .hljs-name,article#presentation > svg > foreignObject > section .hljs-section{color:#63a35c}article#presentation > svg > foreignObject > section .hljs-tag{color:#333}article#presentation > svg > foreignObject > section .hljs-attr,article#presentation > svg > foreignObject > section .hljs-selector-attr,article#presentation > svg > foreignObject > section .hljs-selector-class,article#presentation > svg > foreignObject > section .hljs-selector-id,article#presentation > svg > foreignObject > section .hljs-selector-pseudo,article#presentation > svg > foreignObject > section .hljs-title{color:#795da3}article#presentation > svg > foreignObject > section .hljs-addition{color:#55a532;background-color:#eaffea}article#presentation > svg > foreignObject > section .hljs-deletion{color:#bd2c00;background-color:#ffecec}article#presentation > svg > foreignObject > section .hljs-link{text-decoration:underline}article#presentation > svg > foreignObject > section svg[data-marp-fitting=svg]{max-height:563px}article#presentation > svg > foreignObject > section h1{color:#246;font-size:1.6em}article#presentation > svg > foreignObject > section h1,article#presentation > svg > foreignObject > section h2{border-bottom:none}article#presentation > svg > foreignObject > section h2{font-size:1.3em}article#presentation > svg > foreignObject > section h3{font-size:1.1em}article#presentation > svg > foreignObject > section h4{font-size:1.05em}article#presentation > svg > foreignObject > section h5{font-size:1em}article#presentation > svg > foreignObject > section h6{font-size:.9em}article#presentation > svg > foreignObject > section h1 strong,article#presentation > svg > foreignObject > section h2 strong,article#presentation > svg > foreignObject > section h3 strong,article#presentation > svg > foreignObject > section h4 strong,article#presentation > svg > foreignObject > section h5 strong,article#presentation > svg > foreignObject > section h6 strong{font-weight:inherit;color:#48c}article#presentation > svg > foreignObject > section hr{height:0;padding-top:.25em}article#presentation > svg > foreignObject > section pre{border:1px solid #999;line-height:1.15;overflow:visible}article#presentation > svg > foreignObject > section pre code svg[data-marp-fitting=svg]{max-height:529px}article#presentation > svg > foreignObject > section footer,article#presentation > svg > foreignObject > section header{margin:0;position:absolute;left:30px;color:hsla(0,0%,40%,.75);font-size:18px}article#presentation > svg > foreignObject > section header{top:21px}article#presentation > svg > foreignObject > section footer{bottom:21px}article#presentation > svg > foreignObject > section{align-items:stretch;background:#fff;display:flex;flex-direction:column;flex-wrap:nowrap;font-size:29px;height:720px;justify-content:center;padding:78.5px;width:1280px}article#presentation > svg > foreignObject > section>:last-child,article#presentation > svg > foreignObject > section[data-footer]>:nth-last-child(2){margin-bottom:0}article#presentation > svg > foreignObject > section>:first-child,article#presentation > svg > foreignObject > section>header:first-child+*{margin-top:0}article#presentation > svg > foreignObject > section:after{position:absolute;padding:0;right:30px;bottom:21px;font-size:24px;color:#777}article#presentation > svg > foreignObject > section.invert{background-color:#222;color:#e6eaf0}article#presentation > svg > foreignObject > section.invert:after{color:#999}article#presentation > svg > foreignObject > section.invert img{background-color:transparent}article#presentation > svg > foreignObject > section.invert a{color:#50b3ff}article#presentation > svg > foreignObject > section.invert h1{color:#a3c5e7}article#presentation > svg > foreignObject > section.invert h2,article#presentation > svg > foreignObject > section.invert h3,article#presentation > svg > foreignObject > section.invert h4,article#presentation > svg > foreignObject > section.invert h5{color:#ebeff5}article#presentation > svg > foreignObject > section.invert blockquote,article#presentation > svg > foreignObject > section.invert h6{border-color:#3d3f43;color:#939699}article#presentation > svg > foreignObject > section.invert h1 strong,article#presentation > svg > foreignObject > section.invert h2 strong,article#presentation > svg > foreignObject > section.invert h3 strong,article#presentation > svg > foreignObject > section.invert h4 strong,article#presentation > svg > foreignObject > section.invert h5 strong,article#presentation > svg > foreignObject > section.invert h6 strong{color:#7bf}article#presentation > svg > foreignObject > section.invert hr{background-color:#3d3f43}article#presentation > svg > foreignObject > section.invert footer,article#presentation > svg > foreignObject > section.invert header{color:hsla(0,0%,60%,.75)}article#presentation > svg > foreignObject > section.invert code,article#presentation > svg > foreignObject > section.invert kbd{background-color:#111}article#presentation > svg > foreignObject > section.invert kbd{border-color:#666;box-shadow:inset 0 -1px 0 #555;color:#e6eaf0}article#presentation > svg > foreignObject > section.invert table tr{background-color:#12181d;border-color:#60657b}article#presentation > svg > foreignObject > section.invert table tr:nth-child(2n){background-color:#1b2024}article#presentation > svg > foreignObject > section.invert table td,article#presentation > svg > foreignObject > section.invert table th{border-color:#5b5e61}article#presentation > svg > foreignObject > section.invert pre{background-color:#0a0e12;border-color:#777}article#presentation > svg > foreignObject > section.invert pre code{background-color:transparent}article#presentation > svg > foreignObject > section[data-color] h1,article#presentation > svg > foreignObject > section[data-color] h2,article#presentation > svg > foreignObject > section[data-color] h3,article#presentation > svg > foreignObject > section[data-color] h4,article#presentation > svg > foreignObject > section[data-color] h5,article#presentation > svg > foreignObject > section[data-color] h6{color:currentColor}article#presentation > svg > foreignObject > section[data-marpit-advanced-background="background"] {
padding: 0 !important;
}article#presentation > svg > foreignObject > section[data-marpit-advanced-background="background"]::before,
article#presentation > svg > foreignObject > section[data-marpit-advanced-background="background"]::after,
article#presentation > svg > foreignObject > section[data-marpit-advanced-background="content"]::before,
article#presentation > svg > foreignObject > section[data-marpit-advanced-background="content"]::after {
display: none !important;
}article#presentation > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] {
all: initial;
display: flex;
flex-direction: row;
height: 100%;
overflow: hidden;
width: 100%;
}article#presentation > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction="vertical"] {
flex-direction: column;
}article#presentation > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split] > div[data-marpit-advanced-background-container] {
width: 50%;
}article#presentation > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split="right"] > div[data-marpit-advanced-background-container] {
margin-left: 50%;
}article#presentation > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure {
all: initial;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
flex: auto;
margin: 0;
}article#presentation > svg > foreignObject > section[data-marpit-advanced-background="content"],
article#presentation > svg > foreignObject > section[data-marpit-advanced-background="pseudo"] {
background: transparent !important;
}article#presentation > svg > foreignObject > section[data-marpit-advanced-background="pseudo"],
article#presentation > svg[data-marpit-svg] > foreignObject[data-marpit-advanced-background="pseudo"] {
pointer-events: none !important;
}article#presentation > svg > foreignObject > section[data-marpit-advanced-background-split] {
width: 100%;
height: 100%;
}</style></head><body><div class="bespoke-marp-osc"><button data-bespoke-marp-osc="prev" tabindex="-1" title="Previous slide">Previous slide</button><span data-bespoke-marp-osc="page"></span><button data-bespoke-marp-osc="next" tabindex="-1" title="Next slide">Next slide</button><button data-bespoke-marp-osc="fullscreen" tabindex="-1" title="Toggle fullscreen (f)">Toggle fullscreen</button></div><article id="presentation"><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="1" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="1" style="--paginate:true;">
<h1>IFSC</h1>
<p>-nemo<br />
- Payments &amp; Fintech deepdives</p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="2" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="2" style="--paginate:true;">
<h1>Q: What does IFSC stand for?</h1>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="3" style="--paginate:true;" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;https://fakeimg.pl/1920x800/ff4d4d/fff/?text=wrong&quot;);"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="3" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="3" style="--paginate:true;" data-marpit-advanced-background="content">
<h1></h1>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section style="" data-marpit-advanced-background="pseudo" data-marpit-pagination="3"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="4" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="4" style="--paginate:true;">
<h2><strong>International Financial Services Centre</strong></h2>
<p>(Only partly kidding: <a href="https://www.rbi.org.in/Scripts/NotificationUser.aspx?Id=9619&amp;Mode=0">https://www.rbi.org.in/Scripts/NotificationUser.aspx?Id=9619&amp;Mode=0</a>)</p>
<blockquote>
<p>In exercise of the powers conferred by section 47 of the Foreign Exchange Management Act, 1999 (42 of 1999), the Reserve Bank makes the following regulations relating to financial institutions set up in International Financial Services Centres, namely:-</p>
<blockquote>
<p>(f) International Financial Services Centre or IFSC shall have the same meaning given in Section 2 (q) of the Special Economic Zones Act, 2005 (28 of 2005).</p>
</blockquote>
</blockquote>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="5" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="5" style="--paginate:true;">
<h2>Fine!</h2>
<p><strong>Indian Financial System Code</strong></p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="6" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="6" style="--paginate:true;">
<h2>Agenda</h2>
<ol>
<li>The <a href="https://ifsc.razorpay.com">ifsc.razorpay.com</a> project.</li>
<li>IFSC in the background.</li>
<li>Future Scope / Collaboration ideas.</li>
</ol>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="7" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="7" style="--paginate:true;">
<h2>some metrics first</h2>
<ul>
<li>4 Years since first release (Feb 2016)</li>
<li>64 releases</li>
<li>72 tags</li>
</ul>
<pre><code><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
PHP <span class="hljs-number">13</span> <span class="hljs-number">175</span> <span class="hljs-number">68</span> <span class="hljs-number">2063</span>
Ruby <span class="hljs-number">9</span> <span class="hljs-number">111</span> <span class="hljs-number">23</span> <span class="hljs-number">2008</span>
JavaScript <span class="hljs-number">5</span> <span class="hljs-number">26</span> <span class="hljs-number">1</span> <span class="hljs-number">1548</span>
YAML <span class="hljs-number">5</span> <span class="hljs-number">4</span> <span class="hljs-number">24</span> <span class="hljs-number">1256</span>
Markdown <span class="hljs-number">4</span> <span class="hljs-number">157</span> <span class="hljs-number">0</span> <span class="hljs-number">383</span>
Elixir <span class="hljs-number">8</span> <span class="hljs-number">53</span> <span class="hljs-number">63</span> <span class="hljs-number">308</span>
Bourne Shell <span class="hljs-number">2</span> <span class="hljs-number">10</span> <span class="hljs-number">13</span> <span class="hljs-number">31</span>
-------------------------------------------------------------------------------
SUM: <span class="hljs-number">47</span> <span class="hljs-number">536</span> <span class="hljs-number">192</span> <span class="hljs-number">7613</span>
-------------------------------------------------------------------------------
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="8" style="--paginate:true;" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;0.1.7.png&quot;);background-size:80%;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="8" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="8" style="--paginate:true;" data-marpit-advanced-background="content">
<h2>0.1.7</h2>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section style="" data-marpit-advanced-background="pseudo" data-marpit-pagination="8"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="9" style="--paginate:true;" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;google-image-search.jpg&quot;);background-size:100%;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="9" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="9" style="--paginate:true;" data-marpit-advanced-background="content"><footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section style="" data-marpit-advanced-background="pseudo" data-marpit-pagination="9"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="10" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="10" style="--paginate:true;">
<h1>the IFSC wall of cuteness</h1>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="11" style="--paginate:true;" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;cute-collage.jpg&quot;);background-size:100%;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="11" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="11" style="--paginate:true;" data-marpit-advanced-background="content"><footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section style="" data-marpit-advanced-background="pseudo" data-marpit-pagination="11"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="12" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="12" style="--paginate:true;">
<h1>what is it?</h1>
<p>The IFSC Toolkit includes:</p>
<ol>
<li>An API, served publicly at <a href="https://ifsc.razorpay.com">https://ifsc.razorpay.com</a></li>
<li>A dataset, attached to every release in multiple formats</li>
<li>An SDK that does multiple things:
<ul>
<li>Offline IFSC validations</li>
<li>Requests to the API</li>
<li>Offline Bank checks</li>
</ul>
</li>
<li>In various languages: Node.JS/PHP/Ruby/Elixir</li>
</ol>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="13" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="13" style="--paginate:true;">
<h1>what's the source?</h1>
<h2>3 Primary Sources: RBI/NPCI/RTI</h2>
<p>RBI publishes a list of all RTGS/NEFT branches as excel sheets:</p>
<ul>
<li>NEFT: <a href="https://rbidocs.rbi.org.in/rdocs/content/docs/68774.xlsx">rbidocs.rbi.org.in/rdocs/content/docs/68774.xlsx</a></li>
<li>RTGS: <a href="https://rbidocs.rbi.org.in/rdocs/RTGS/DOCs/RTGEB0815.xlsx">rbidocs.rbi.org.in/rdocs/RTGS/DOCs/RTGEB0815.xlsx</a></li>
</ul>
<p>NPCI publishes a few lists:</p>
<ul>
<li>All Live ACH member banks: <a href="https://www.npci.org.in/national-automated-clearing-live-members-1">npci.org.in/national-automated-clearing-live-members-1</a></li>
<li>All UPI live member banks: <a href="https://www.npci.org.in/upi-live-members">npci.org.in/upi-live-members</a></li>
<li><a href="https://docplayer.net/25942453-Imps-procedural-guidelines.html">NBIN codes</a>, published in IMPS Procedural guidelines v1.7</li>
</ul>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="14" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="14" style="--paginate:true;">
<h2>Additional Sources</h2>
<ul>
<li>Any interim RBI circulars</li>
<li>Any guidelines from NPCI</li>
<li>A few RBI/NCPI circulars</li>
</ul>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="15" style="--paginate:true;" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;https://fakeimg.pl/1920x800/c56cf0/fff/?text=what's+the+data&quot;);"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="15" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="15" style="--paginate:true;" data-marpit-advanced-background="content"><footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section style="" data-marpit-advanced-background="pseudo" data-marpit-pagination="15"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="16" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="16" style="--paginate:true;">
<h2><code>banks.json</code></h2>
<p>List of all Banks in India* with the following details:</p>
<ul>
<li>Bank Code (4 characters)</li>
<li>Bank Type</li>
<li>Primary IFSC (Usually of the IMPS HO Branch)</li>
<li>Primary MICR (Used on Cheques)</li>
<li>IIN (First 6 digits of issued cards)</li>
<li>ABPS Support (true/false)</li>
<li>NACH/ACH Credit/Debit Support (true/false)</li>
<li>UPI Support (true)</li>
</ul>
<p>* - Based on all members listed in the NPCI ACH list.</p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="17" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="17" style="--paginate:true;">
<h2><code>banks.json</code></h2>
<pre><code class="language-json"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>{
<span class="hljs-attr">"SBIN"</span>: {
// Bank Code
<span class="hljs-attr">"code"</span>: <span class="hljs-string">"SBIN"</span>,
// Bank Type
<span class="hljs-attr">"type"</span>: <span class="hljs-string">"PSB"</span>,
// Primary IMPS IFSC
<span class="hljs-attr">"ifsc"</span>: <span class="hljs-string">"SBIN0004343"</span>,
<span class="hljs-attr">"micr"</span>: <span class="hljs-string">"400002000"</span>,
// IIN = BIN
<span class="hljs-attr">"iin"</span>: <span class="hljs-string">"508548"</span>,
// Aadhaar Payments Bridge System
<span class="hljs-attr">"apbs"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"ach_credit"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"ach_debit"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"nach_debit"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"upi"</span>: <span class="hljs-literal">true</span>
}
}
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="18" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="18" style="--paginate:true;">
<h1><code>by-bank.tar.gz</code> (8.4MB)</h1>
<p>A tar.gz file containing one JSON file for each bank, with a list of all known branches with the following details for every branch:</p>
<ul>
<li>IFSC</li>
<li>Branch name</li>
<li>Address (Centre/District/State/Address/Contact)</li>
<li>Bank Name</li>
<li>UPI/RTGS/NEFT/IMPS Support (<code>true/false</code>)</li>
<li>MICR</li>
</ul>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="19" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="19" style="--paginate:true;">
<h1><code>by-bank/PYTM.json</code></h1>
<p>Same as the data at <a href="https://ifsc.razorpay.com/PYTM0000001">https://ifsc.razorpay.com/PYTM0000001</a></p>
<pre><code class="language-json"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>{
<span class="hljs-attr">"PYTM0000001"</span>: {
<span class="hljs-attr">"BANK"</span>: <span class="hljs-string">"PAYTM PAYMENTS BANK LTD"</span>,
<span class="hljs-attr">"IFSC"</span>: <span class="hljs-string">"PYTM0000001"</span>,
<span class="hljs-attr">"BRANCH"</span>: <span class="hljs-string">"RTGS-HO"</span>,
<span class="hljs-attr">"CENTRE"</span>: <span class="hljs-string">"NOIDA"</span>,
<span class="hljs-attr">"DISTRICT"</span>: <span class="hljs-string">"NOIDA"</span>,
<span class="hljs-attr">"STATE"</span>: <span class="hljs-string">"UTTAR PRADESH"</span>,
<span class="hljs-attr">"ADDRESS"</span>: <span class="hljs-string">"B-121,Sector-5,Noida-201301"</span>,
<span class="hljs-attr">"CONTACT"</span>: <span class="hljs-string">"33996699"</span>,
<span class="hljs-attr">"IMPS"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"RTGS"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"CITY"</span>: <span class="hljs-string">"Gautam Buddh Nagar"</span>,
<span class="hljs-attr">"NEFT"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"MICR"</span>: <span class="hljs-literal">null</span>
}
}
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="20" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="20" style="--paginate:true;">
<h1><code>IFSC-list.json</code> (4MB)</h1>
<p>A single JSON file with every known IFSC code inside it.</p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="21" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="21" style="--paginate:true;">
<h1><code>IFSC.csv</code> (25MB)</h1>
<p>Single CSV file containing the same fields as the by-bank JSON file. Covers all banks.</p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="22" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="22" style="--paginate:true;">
<h1><code>IFSC.json</code> (1.7MB)</h1>
<p>A somewhat-compressed, human-readable JSON file containing all valid IFSCs for a bank, with leading zeroes removed.</p>
<pre><code><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-string">"ADCC"</span>: [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">7</span>,<span class="hljs-number">8</span>,<span class="hljs-number">9</span>,<span class="hljs-number">10</span>,<span class="hljs-number">11</span>,<span class="hljs-number">12</span>,<span class="hljs-number">13</span>,<span class="hljs-number">14</span>,<span class="hljs-number">15</span>,<span class="hljs-number">16</span>,<span class="hljs-number">17</span>,<span class="hljs-number">18</span>,<span class="hljs-number">19</span>,<span class="hljs-number">20</span>
<span class="hljs-number">21</span>,<span class="hljs-number">22</span>,<span class="hljs-number">23</span>,<span class="hljs-number">24</span>,<span class="hljs-number">25</span>,<span class="hljs-number">26</span>,<span class="hljs-number">28</span>,<span class="hljs-number">29</span>,<span class="hljs-number">30</span>,<span class="hljs-number">31</span>,<span class="hljs-number">32</span>,<span class="hljs-number">33</span>,<span class="hljs-number">34</span>,<span class="hljs-number">35</span>,<span class="hljs-number">36</span>,<span class="hljs-number">37</span>,<span class="hljs-number">38</span>
<span class="hljs-number">39</span>,<span class="hljs-number">40</span>,<span class="hljs-number">41</span>,<span class="hljs-number">42</span>,<span class="hljs-number">43</span>,<span class="hljs-number">44</span>,<span class="hljs-number">45</span>,<span class="hljs-number">46</span>,<span class="hljs-number">47</span>,<span class="hljs-number">48</span>,<span class="hljs-number">49</span>,<span class="hljs-number">50</span>,<span class="hljs-number">51</span>,<span class="hljs-number">52</span>,<span class="hljs-number">53</span>,<span class="hljs-number">54</span>,<span class="hljs-number">55</span>
<span class="hljs-number">56</span>,<span class="hljs-number">57</span>,<span class="hljs-number">58</span>,<span class="hljs-number">59</span>,<span class="hljs-number">60</span>,<span class="hljs-number">61</span>,<span class="hljs-number">62</span>,<span class="hljs-number">64</span>,<span class="hljs-number">65</span>,<span class="hljs-number">66</span>,<span class="hljs-number">67</span>,<span class="hljs-number">68</span>,<span class="hljs-number">110</span>,<span class="hljs-number">114</span>,<span class="hljs-number">70</span>,<span class="hljs-number">71</span>
<span class="hljs-number">72</span>,<span class="hljs-number">73</span>,<span class="hljs-number">74</span>,<span class="hljs-number">75</span>,<span class="hljs-number">76</span>,<span class="hljs-number">77</span>,<span class="hljs-number">78</span>,<span class="hljs-number">79</span>,<span class="hljs-number">80</span>,<span class="hljs-number">81</span>,<span class="hljs-number">82</span>,<span class="hljs-number">83</span>,<span class="hljs-number">84</span>,<span class="hljs-number">85</span>,<span class="hljs-number">86</span>,<span class="hljs-number">87</span>
<span class="hljs-number">88</span>,<span class="hljs-number">89</span>,<span class="hljs-number">90</span>,<span class="hljs-number">91</span>,<span class="hljs-number">92</span>,<span class="hljs-number">93</span>,<span class="hljs-number">94</span>,<span class="hljs-number">95</span>,<span class="hljs-number">96</span>,<span class="hljs-number">97</span>,<span class="hljs-number">98</span>,<span class="hljs-number">99</span>,<span class="hljs-number">100</span>,<span class="hljs-number">101</span>,<span class="hljs-number">102</span>
<span class="hljs-number">103</span>,<span class="hljs-number">104</span>,<span class="hljs-number">105</span>,<span class="hljs-number">106</span>,<span class="hljs-number">107</span>,<span class="hljs-number">108</span>,<span class="hljs-number">109</span>,<span class="hljs-number">111</span>,<span class="hljs-number">112</span>,<span class="hljs-number">113</span>,<span class="hljs-number">115</span>,<span class="hljs-number">116</span>]
</span></span></foreignObject></svg></code></pre>
<p><code>ADCC0000001</code> to <code>ADCC0000116</code> are all valid branches.</p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="23" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="23" style="--paginate:true;">
<h1><code>banknames.json</code></h1>
<p>A manually curated human-readable list of all banknames against 4 letter bank codes. Currently at 1437 entries.</p>
<pre><code class="language-json"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap> <span class="hljs-string">"CCOB"</span>: <span class="hljs-string">"City Co-operative Bank"</span>,
<span class="hljs-string">"CCUX"</span>: <span class="hljs-string">"Chengelpattu Co-operative Urban Bank"</span>,
<span class="hljs-string">"CDCX"</span>: <span class="hljs-string">"Cuddalore District Central Co-operative Bank"</span>,
<span class="hljs-string">"CEBX"</span>: <span class="hljs-string">"Central Co-operative Bank Bikaner"</span>,
<span class="hljs-string">"CGBX"</span>: <span class="hljs-string">"Chhattisgarh Gramin Bank"</span>,
<span class="hljs-string">"CGGX"</span>: <span class="hljs-string">"Chaitanya Godavari Grameena Bank"</span>,
<span class="hljs-string">"CHAS"</span>: <span class="hljs-string">"JP Morgan Chase Bank"</span>,
<span class="hljs-string">"CHAX"</span>: <span class="hljs-string">"Chamoli Zila Sahkari Bank"</span>,
<span class="hljs-string">"CHBX"</span>: <span class="hljs-string">"Chamba Urban Co-operative Bank"</span>,
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="24" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="24" style="--paginate:true;">
<h1>The API</h1>
<p>Has a single <code>/:ifsc</code> endpoint that returns all the information about the branch from the IFSC code. <a href="https://ifsc.razorpay.com/PUNB0026200">https://ifsc.razorpay.com/PUNB0026200</a></p>
<pre><code class="language-json"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>{
<span class="hljs-attr">"BRANCH"</span>: <span class="hljs-string">"KASHIPUR"</span>,
<span class="hljs-attr">"CENTRE"</span>: <span class="hljs-string">"KASHIPUR"</span>,
<span class="hljs-attr">"DISTRICT"</span>: <span class="hljs-string">"KASHIPUR (UTTARANCHAL)"</span>,
<span class="hljs-attr">"STATE"</span>: <span class="hljs-string">"UTTARAKHAND"</span>,
<span class="hljs-attr">"ADDRESS"</span>: <span class="hljs-string">"MATA MANDIR ROAD,DISTT. UDHAM SINGH NAGAR"</span>,
<span class="hljs-attr">"CONTACT"</span>: <span class="hljs-string">""</span>,
<span class="hljs-attr">"UPI"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"RTGS"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"CITY"</span>: <span class="hljs-string">"KASHIPUR (UTTARANCHAL)"</span>,
<span class="hljs-attr">"NEFT"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"IMPS"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"MICR"</span>: <span class="hljs-string">""</span>,
<span class="hljs-attr">"BANK"</span>: <span class="hljs-string">"Punjab National Bank"</span>,
<span class="hljs-attr">"BANKCODE"</span>: <span class="hljs-string">"PUNB"</span>,
<span class="hljs-attr">"IFSC"</span>: <span class="hljs-string">"PUNB0026200"</span>
}
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="25" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="25" style="--paginate:true;">
<h2>Code Examples</h2>
<h3>PHP</h3>
<pre><code class="language-php"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>IFSC::validate(<span class="hljs-string">'KKBK0000261'</span>); <span class="hljs-comment">// true</span>
IFSC::validateBankCode(<span class="hljs-string">'PUNB'</span>); <span class="hljs-comment">// true</span>
IFSC::getBankName(<span class="hljs-string">'PUNB'</span>); <span class="hljs-comment">// Returns 'Punjab National Bank'</span>
IFSC::getBankName(<span class="hljs-string">'ABCD'</span>); <span class="hljs-comment">// Returns null</span>
IFSC::getBankName(Bank::PUNB); <span class="hljs-comment">//Returns Punjab National Bank</span>
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="26" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="26" style="--paginate:true;">
<pre><code class="language-php"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>Bank::getDetails(Bank::PUNB);
Bank::getDetails(<span class="hljs-string">'PUNB'</span>);
<span class="hljs-comment">// Returns an array:</span>
<span class="hljs-comment">// [</span>
<span class="hljs-comment">// 'code' =&gt; 'PUNB',</span>
<span class="hljs-comment">// 'type' =&gt; 'PSB',</span>
<span class="hljs-comment">// 'ifsc' =&gt; 'PUNB0244200',</span>
<span class="hljs-comment">// 'micr' =&gt; '110024001',</span>
<span class="hljs-comment">// 'iin' =&gt; '508568',</span>
<span class="hljs-comment">// 'apbs' =&gt; true,</span>
<span class="hljs-comment">// 'ach_credit' =&gt; true,</span>
<span class="hljs-comment">// 'ach_debit' =&gt; true,</span>
<span class="hljs-comment">// 'nach_debit' =&gt; true,</span>
<span class="hljs-comment">// 'name' =&gt; 'Punjab National Bank',</span>
<span class="hljs-comment">// 'bank_code' =&gt; '024',</span>
<span class="hljs-comment">// 'upi' =&gt; true</span>
<span class="hljs-comment">// ]</span>
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="27" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="27" style="--paginate:true;">
<h2>lookups</h2>
<pre><code class="language-php"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>$client = <span class="hljs-keyword">new</span> Client();
$res = $client-&gt;lookupIFSC(<span class="hljs-string">'KKBK0000261'</span>);
<span class="hljs-keyword">echo</span> $res-&gt;bank; <span class="hljs-comment">// 'KOTAK MAHINDRA BANK LIMITED'</span>
<span class="hljs-keyword">echo</span> $res-&gt;branch; <span class="hljs-comment">// 'GURGAON'</span>
<span class="hljs-keyword">echo</span> $res-&gt;address; <span class="hljs-comment">// 'JMD REGENT SQUARE,MEHRAULI GURGAON ROAD,OPPOSITE BRISTOL HOTEL,'</span>
<span class="hljs-keyword">echo</span> $res-&gt;contact; <span class="hljs-comment">// '4131000'</span>
<span class="hljs-keyword">echo</span> $res-&gt;city; <span class="hljs-comment">// 'GURGAON'</span>
<span class="hljs-keyword">echo</span> $res-&gt;district; <span class="hljs-comment">// 'GURGAON'</span>
<span class="hljs-keyword">echo</span> $res-&gt;state; <span class="hljs-comment">// 'HARYANA'</span>
<span class="hljs-keyword">echo</span> $res-&gt;getBankCode(); <span class="hljs-comment">// KKBK</span>
<span class="hljs-keyword">echo</span> $res-&gt;getBankName(); <span class="hljs-comment">// 'Kotak Mahindra Bank'</span>
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="28" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="28" style="--paginate:true;">
<h1>Node.js</h1>
<pre><code class="language-js"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>ifsc.validate(<span class="hljs-string">'BOTM0XEEMRA'</span>); <span class="hljs-comment">// returns false</span>
<span class="hljs-comment">// Look ma, promises!</span>
ifsc.fetchDetails(<span class="hljs-string">'KKBK0000261'</span>).then(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">res</span>) </span>{
<span class="hljs-built_in">console</span>.log(res);
});
<span class="hljs-built_in">console</span>.log(ifsc.bank.PUNB); <span class="hljs-comment">// Prints 'PUNB'</span>
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="29" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="29" style="--paginate:true;">
<h1>Ruby</h1>
<pre><code class="language-ruby"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>Razorpay::IFSC::IFSC.validate! <span class="hljs-string">'KKBK0000261'</span> <span class="hljs-comment"># =&gt; true</span>
<span class="hljs-comment"># Fetches details over API, constants as well</span>
Razorpay::IFSC::Bank.get_details Razorpay::IFSC::Bank::PUNB
{
<span class="hljs-symbol">code:</span> <span class="hljs-string">'PUNB'</span>,
<span class="hljs-symbol">type:</span> <span class="hljs-string">'PSB'</span>,
<span class="hljs-symbol">ifsc:</span> <span class="hljs-string">'PUNB0244200'</span>,
<span class="hljs-symbol">micr:</span> <span class="hljs-string">'110024001'</span>,
<span class="hljs-symbol">bank_code:</span> <span class="hljs-string">'024'</span>,
<span class="hljs-symbol">iin:</span> <span class="hljs-string">'508568'</span>,
<span class="hljs-symbol">apbs:</span> <span class="hljs-literal">true</span>,
<span class="hljs-symbol">ach_credit:</span> <span class="hljs-literal">true</span>,
<span class="hljs-symbol">ach_debit:</span> <span class="hljs-literal">true</span>,
<span class="hljs-symbol">nach_debit:</span> <span class="hljs-literal">true</span>
}
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="30" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="30" style="--paginate:true;">
<h1>Support Matrix</h1>
<table>
<thead>
<tr>
<th>Language</th>
<th>Validation</th>
<th>API Client</th>
<th>Sublet Support (Custom)</th>
<th>Bank Constants</th>
</tr>
</thead>
<tbody>
<tr>
<td>PHP</td>
<td><img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/></td>
<td><img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/></td>
<td><img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/> (<img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/>)</td>
<td><img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/></td>
</tr>
<tr>
<td>Ruby</td>
<td><img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/></td>
<td><img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/></td>
<td><img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/> (<img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/>)</td>
<td><img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/></td>
</tr>
<tr>
<td>Elixir</td>
<td><img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/></td>
<td><img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/></td>
<td><img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/> (<img class="emoji" draggable="false" alt="❎" src="https://twemoji.maxcdn.com/2/svg/274e.svg" data-marp-twemoji=""/>)</td>
<td><img class="emoji" draggable="false" alt="❎" src="https://twemoji.maxcdn.com/2/svg/274e.svg" data-marp-twemoji=""/></td>
</tr>
<tr>
<td>Node.js</td>
<td><img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/></td>
<td><img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/></td>
<td><img class="emoji" draggable="false" alt="❎" src="https://twemoji.maxcdn.com/2/svg/274e.svg" data-marp-twemoji=""/> (<img class="emoji" draggable="false" alt="❎" src="https://twemoji.maxcdn.com/2/svg/274e.svg" data-marp-twemoji=""/>)</td>
<td><img class="emoji" draggable="false" alt="✅" src="https://twemoji.maxcdn.com/2/svg/2705.svg" data-marp-twemoji=""/></td>
</tr>
</tbody>
</table>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="31" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="31" style="--paginate:true;">
<h1>Growth Chart</h1>
<p><img src="chart.png" alt="" /></p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="32" style="--paginate:true;" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;https://fakeimg.pl/1920x800/c56cf0/fff/?text=planned+learnings&quot;);"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="32" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="32" style="--paginate:true;" data-marpit-advanced-background="content"><footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section style="" data-marpit-advanced-background="pseudo" data-marpit-pagination="32"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="33" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="33" style="--paginate:true;">
<h1>planned learnings</h1>
<ul>
<li>polyglot-single-repo-packages</li>
<li>open-data-superfast-public-APIs</li>
<li>scapegoat-application for random tests</li>
</ul>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="34" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="34" style="--paginate:true;">
<h1>polyglot</h1>
<pre><code><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>src/banknames<span class="hljs-selector-class">.json</span>
src/ruby
src/banks<span class="hljs-selector-class">.json</span>
src/patches
src/custom-sublets<span class="hljs-selector-class">.json</span>
src/elixir
src/node
src/IFSC<span class="hljs-selector-class">.json</span>
src/sublet<span class="hljs-selector-class">.json</span>
src/php
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="35" style="--paginate:true;" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;https://fakeimg.pl/1920x800/c56cf0/fff/?text=unplanned+learnings&quot;);"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="35" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="35" style="--paginate:true;" data-marpit-advanced-background="content"><footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section style="" data-marpit-advanced-background="pseudo" data-marpit-pagination="35"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="36" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="36" style="--paginate:true;">
<h1>1. There are too many banks in India</h1>
<ul>
<li><code>banknames.json</code> holds 1400+ named banks</li>
<li>Adding sublets, it adds up to atleast 2500+</li>
<li>Not all banks are recognized by RBI (with a 4 letter code)</li>
</ul>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="37" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="37" style="--paginate:true;">
<h1>2. There are 11 kinds of banks in India:</h1>
<ul>
<li>DCCB (District Co-operative Central Bank)</li>
<li>Foreign Bank</li>
<li>LAB (Local Area Bank)</li>
<li>O-UCB (Urban Co-operative Bank)</li>
<li>PB (Payment Bank)</li>
<li>Private (Private Sector Banks)</li>
<li>PSB (Public Sector Bank)</li>
<li>RRB (Regional Rural Bank)</li>
<li>S-UCB (State Urban Co-operative Banks)</li>
<li>SCB (State Co-operative Bank)</li>
<li>SFB (Small Finance Bank)</li>
</ul>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="38" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="38" style="--paginate:true;">
<h1>3. RBI has no idea what its doing.</h1>
<pre><code><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-string">"IPOS"</span>: <span class="hljs-string">"India Post Payments Bank"</span>,
<span class="hljs-string">"IPPB"</span>: <span class="hljs-string">"India Post Payments Bank"</span>,
</span></span></foreignObject></svg></code></pre>
<h2><code>IPOS0000001</code></h2>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="39" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="39" style="--paginate:true;">
<h1>3.1 AJAR/AJUX</h1>
<pre><code><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-string">"AJAR"</span>: <span class="hljs-string">"Ajara Urban Co-operative Bank"</span>,
<span class="hljs-string">"AJUX"</span>: <span class="hljs-string">"Ajara Urban Co-operative Bank"</span>,
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="40" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="40" style="--paginate:true;">
<h2>3.2 CXBX (Chartered Sahakari Bank Niyamitha)</h2>
<p><code>CSBX0CSB001</code> (Supports only IMPS, not listed by RBI)</p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="41" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="41" style="--paginate:true;">
<h2>3.3 KOEX (KEB Hana Bank)</h2>
<pre><code><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-string">KOEX0000001:</span> RTGS<span class="hljs-regexp">/NEFT/</span>IMPS
<span class="hljs-string">KOEX0000002:</span> RTGS<span class="hljs-regexp">/NEFT/</span>IMPS
<span class="hljs-string">KOEX00000SC:</span> RTGS/IMPS
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="42" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="42" style="--paginate:true;">
<h1>4. The NPCI doesn't come under RTI</h1>
<blockquote>
<p>The contention arises from the fact that while it is incorporated as a non-profit organisation, 57 percent of its shares are held by public sector banks.</p>
</blockquote>
<blockquote>
<p>“In a reply to an RTI, we found that AP Hota, the chief general manager of the RBI, was deputed by the Bank for two years to the management. Moreover, the RTI also revealed that RBI had provided office space as well as an inventory list of items to NPCI.”</p>
</blockquote>
<h2>Judgement:</h2>
<blockquote>
<p>Commission is also of the view that it may be open to the complainantto seek information through public authority for NPCI i.e. RBI or Ministry of Financeas the case may be. That being so, the complaint of the complainant is unfounded and the same is rejected. <a href="https://bit.ly/39dsFK6">https://bit.ly/39dsFK6</a> (Dec 2019)</p>
</blockquote>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="43" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="43" style="--paginate:true;">
<h1>5. Companies still use MICR</h1>
<p>(Magnetic Ink Character Recognition code)</p>
<pre><code><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-number">000</span> <span class="hljs-number">000</span> <span class="hljs-number">000</span>
City Bank Branch
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="44" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="44" style="--paginate:true;">
<h1>6. IBAN</h1>
<h2>International Bank Account Number</h2>
<blockquote>
<p>the Committee felt that longest IBAN is most suitable for the country. Longest IBAN envisages 26 digits IBAN for the banks in India with 18 digit account number, 4 digit bank code, 2 digit country code and 2 check digits. Under this system, banks can continue to use the existing account numbers, and where necessary the number will be padded with zeros to make the length of 18 digits as required.</p>
</blockquote>
<p><code>IN</code> + Check Digit + Bank Code + Account Number</p>
<ul>
<li>Bank Code: <code>[:alpha:]{4}</code></li>
<li>Check Digit: <code>[:digit:]{2}</code></li>
<li>Account Number: <code>[:alphanum:]{18}</code></li>
</ul>
<p>Source: <a href="https://www.iban.in/structure.html">https://www.iban.in/structure.html</a></p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="45" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="45" style="--paginate:true;">
<h1>7. Bank Mergers are fun!</h1>
<blockquote>
<p>After merger, for all outward IMPS transactions of associate banks the IFS Code will changeand will be intimated to customer. However for all the inward IMPS transaction bank will support old IFSC number till 1 Month from the date of merger.</p>
<ul>
<li><a href="https://bank.sbi/webfiles/uploads/files/mergerofassociatebanks/IMPS%20Merger%20FAQ.pdf">SBI</a></li>
</ul>
</blockquote>
<p>But every merger is handled differently.</p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="46" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="46" style="--paginate:true;">
<h1>8. Naming banks is hard</h1>
<ul>
<li>20 different ways to write &quot;Co-operative&quot;</li>
<li>Zhilla, Zila, Jila, Jhila, District</li>
<li>Sahkari, Sahakari, Sah.,</li>
</ul>
<p>This was so problematic, that I ended up writing <a href="https://github.com/razorpay/ifsc/blob/master/CONTRIBUTING.md#bank-names-guidelines">Guidelines on how to keep bank names consistent</a>.</p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="47" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="47" style="--paginate:true;">
<h1>8.5 Guiding Principles</h1>
<ol>
<li>Keep &quot;dataset&quot; current (no dead IFSCs).</li>
<li>Keep list of banks comprehensive (include dead banks).</li>
<li>Only use official upstream sources.</li>
</ol>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="48" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="48" style="--paginate:true;">
<h1>9. IFSC Issuance Process</h1>
<ul>
<li>RBI issues 4 letter Bank Codes.</li>
<li>They end in &quot;X&quot; for banks not connected to RBI payment/settlement systems</li>
<li>Banks inform RBI of IFSCs for each branch via <a href="http://www.idrbt.ac.in/sfms.html">SFMS</a></li>
<li>Banks inform NPCI separately of IFSCs for each branch via NFS (?)</li>
<li>Issuance of each branch code is entirely owned by the bank.</li>
</ul>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="49" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="49" style="--paginate:true;">
<h1>10. So many codes</h1>
<ul>
<li>IFSC code for IMPS</li>
<li>IFSC code for NEFT/RTGS</li>
<li>MICR code for cheques</li>
<li>SWIFT/SWIFT-BIC/BIC code for International inbound transfers</li>
<li>IBAN (International Bank Account Number)</li>
<li>NBIN (National Bank Identification) `[:digit:]{4}``</li>
<li>MMID <code>[:digit:]{7}</code> (NBIN+MAS (Mobile Account Selector, <code>[:digit:]{3}</code>))</li>
</ul>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="50" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="50" style="--paginate:true;">
<h1>11. I have no idea what I'm doing</h1>
<ul>
<li>NBIN format</li>
<li>Compression/Bloom Filter attempts</li>
</ul>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="51" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="51" style="--paginate:true;">
<h1>12. NPCI has no idea what it's doing</h1>
<p><code>@jio,@ezeepay,@lime,@purz,@s2b,@srcb,@upi</code></p>
<p>UPI handles with unknown issuing bank.</p>
<p>What happens to MDR?</p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="52" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="52" style="--paginate:true;">
<h1>13. RBI doesn't care about data sanity</h1>
<h2>13.1 Encoding Issues</h2>
<p><code>&quot;CHENNAI - CENOTAPH ROAD &quot;</code><br />
<code>&quot;1, CENOTAPH ROAD, CHENNAI. &quot;</code></p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="53" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="53" style="--paginate:true;">
<h2>13.2 RBI Excel Sheets are broken</h2>
<pre><code><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>[<span class="hljs-meta">WARN</span>] IFSC code longer than <span class="hljs-number">11</span> characters: IOBA0003378 RO-TIRUPATHI, <span class="hljs-keyword">using</span> IOBA0003378
[<span class="hljs-meta">WARN</span>] IFSC code longer than <span class="hljs-number">11</span> characters: BANK OF BARODA, <span class="hljs-keyword">using</span> BANKOFBAROD
[<span class="hljs-meta">WARN</span>] Second Entry found <span class="hljs-keyword">for</span> HDFC0000917, discarding
[<span class="hljs-meta">WARN</span>] Second Entry found <span class="hljs-keyword">for</span> FDRL0001808, discarding
[<span class="hljs-meta">WARN</span>] Second Entry found <span class="hljs-keyword">for</span> ICIC0000248, discarding
[<span class="hljs-meta">WARN</span>] Second Entry found <span class="hljs-keyword">for</span> ICIC0000557, discarding
[<span class="hljs-meta">WARN</span>] Second Entry found <span class="hljs-keyword">for</span> ICIC0006252, discarding
[<span class="hljs-meta">WARN</span>] Second Entry found <span class="hljs-keyword">for</span> CNRB0006822, discarding
[<span class="hljs-meta">WARN</span>] Second Entry found <span class="hljs-keyword">for</span> DBSS0IN0901, discarding
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="54" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="54" style="--paginate:true;">
<h1>13.3 RBI Excel Sheets are very broken</h1>
<pre><code><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>[<span class="hljs-meta">WARN</span>] Second Entry found <span class="hljs-keyword">for</span> ICIC0002261, discarding
[<span class="hljs-meta">WARN</span>] Second Entry found <span class="hljs-keyword">for</span> IDFB0040138, discarding
[<span class="hljs-meta">WARN</span>] Second Entry found <span class="hljs-keyword">for</span> CBIN0284329, discarding
[<span class="hljs-meta">WARN</span>] Second Entry found <span class="hljs-keyword">for</span> UTIB0002805, discarding
[<span class="hljs-meta">WARN</span>] Second Entry found <span class="hljs-keyword">for</span> DCBL0000126, discarding
[<span class="hljs-meta">WARN</span>] Second Entry found <span class="hljs-keyword">for</span> ICIC0000276, discarding
[<span class="hljs-meta">WARN</span>] Second Entry found <span class="hljs-keyword">for</span> ICIC0006033, discarding
[<span class="hljs-meta">WARN</span>] IFSC code longer than <span class="hljs-number">11</span> characters: IOBA0003379 RO-NAGERCOIL, <span class="hljs-keyword">using</span> IOBA0003379
[<span class="hljs-meta">WARN</span>] IFSC code longer than <span class="hljs-number">11</span> characters: IOBA0003392
[<span class="hljs-meta">INFO</span>] Removed BANKOFBAROD <span class="hljs-keyword">from</span> the list
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="55" style="--paginate:true;" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;rbi-issues.jpg&quot;);background-size:80%;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="55" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="55" style="--paginate:true;" data-marpit-advanced-background="content"><footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section style="" data-marpit-advanced-background="pseudo" data-marpit-pagination="55"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="56" style="--paginate:true;" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;rbi-response.png&quot;);background-size:70%;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="56" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="56" style="--paginate:true;" data-marpit-advanced-background="content"><footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section style="" data-marpit-advanced-background="pseudo" data-marpit-pagination="56"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="57" style="--paginate:true;" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;rbi-email-1.png&quot;);background-size:80%;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="57" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="57" style="--paginate:true;" data-marpit-advanced-background="content"><footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section style="" data-marpit-advanced-background="pseudo" data-marpit-pagination="57"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="58" style="--paginate:true;" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;rbi-email-2.png&quot;);background-size:80%;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="58" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="58" style="--paginate:true;" data-marpit-advanced-background="content"><footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section style="" data-marpit-advanced-background="pseudo" data-marpit-pagination="58"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="59" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="59" style="--paginate:true;">
<h1>14. <a href="https://github.com/razorpay/ifsc/issues/154">NEFT blocks</a></h1>
<blockquote>
<p>the below following banks have been temporarily kept out of NEFT system (only) due to technical non-compliance, as such these bank will not be in a position to receive or make payments through NEFT till further orders.</p>
</blockquote>
<blockquote>
<p>The NEFT payments will be REJECTED by RBI with reason as “SENDER OR BENEFICIARY BANK NOT PARTICIPANT OF NEFT”, if we received and sent for settlement.</p>
</blockquote>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="60" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="60" style="--paginate:true;">
<h1>NEFT Blocks</h1>
<table>
<thead>
<tr>
<th>Bank Name</th>
<th>IFSC Main Code</th>
<th>Total Branches</th>
</tr>
</thead>
<tbody>
<tr>
<td>BANK OF CEYLON</td>
<td>BCEY</td>
<td>3</td>
</tr>
<tr>
<td>KAVERI GRAMEENA BANK</td>
<td>KGRB</td>
<td>488</td>
</tr>
<tr>
<td>KERALA GRAMIN BANK</td>
<td>KLGB</td>
<td>650</td>
</tr>
<tr>
<td>KRUNG THAI BANK PCL</td>
<td>KRTH</td>
<td>2</td>
</tr>
<tr>
<td>PRAGATHI KRISHNA GRAMIN BANK</td>
<td>PKGB</td>
<td>1160</td>
</tr>
<tr>
<td>SBM BANK MAURITIUS LTD</td>
<td>STCB</td>
<td>2</td>
</tr>
</tbody>
</table>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="61" style="--paginate:true;" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;https://fakeimg.pl/1920x800/ff4d4d/fff/?text=HDFC0CSSUCB&amp;font=bebas&quot;);"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="61" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="61" style="--paginate:true;" data-marpit-advanced-background="content">
<h1></h1>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section style="" data-marpit-advanced-background="pseudo" data-marpit-pagination="61"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="62" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="62" style="--paginate:true;">
<h1>15. Sublet Branches</h1>
<pre><code class="language-json"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>{
<span class="hljs-attr">"RTGS"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"CONTACT"</span>: <span class="hljs-string">"9890960146"</span>,
<span class="hljs-attr">"CITY"</span>: <span class="hljs-string">"SOLAPUR"</span>,
<span class="hljs-attr">"IMPS"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"ADDRESS"</span>: <span class="hljs-string">"6151 1 SIDDHESHWAR SHOPING CENTER SHOP NO 18 19 SIDHESHWAR PETH SOLAPUR"</span>,
<span class="hljs-attr">"DISTRICT"</span>: <span class="hljs-string">"SOLAPUR"</span>,
<span class="hljs-attr">"CENTRE"</span>: <span class="hljs-string">"SOLAPUR"</span>,
<span class="hljs-attr">"STATE"</span>: <span class="hljs-string">"MAHARASHTRA"</span>,
<span class="hljs-attr">"NEFT"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"BRANCH"</span>: <span class="hljs-string">"Solapur Social Urban Co-operative Bank IMPS"</span>,
<span class="hljs-attr">"MICR"</span>: <span class="hljs-string">"413590002"</span>,
<span class="hljs-attr">"UPI"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"BANK"</span>: <span class="hljs-string">"Solapur Social Urban Co-operative Bank"</span>,
<span class="hljs-attr">"BANKCODE"</span>: <span class="hljs-string">"SSLX"</span>,
<span class="hljs-attr">"IFSC"</span>: <span class="hljs-string">"HDFC0CSSUCB"</span>
}
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="63" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="63" style="--paginate:true;">
<h1>Sublet Identification</h1>
<ol>
<li><a href="https://www.npci.org.in/national-automated-clearing-live-members-1">NPCI ACH List</a> documents the IFSC that each bank provides for their IMPS setup</li>
<li>The Excel sheets provided by RBI have a bank name in the &quot;branch name&quot; field.</li>
</ol>
<p>Becomes much harder because bank names submitted to RBI may be different from what's submitted to NPCI, and doing exact matches for bank names is impossible.</p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="64" style="--paginate:true;" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;https://fakeimg.pl/1920x800/ff4d4d/fff/?text=the+tech&quot;);"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="64" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="64" style="--paginate:true;" data-marpit-advanced-background="content">
<h1></h1>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section style="" data-marpit-advanced-background="pseudo" data-marpit-pagination="64"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="65" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="65" style="--paginate:true;">
<h1>tech</h1>
<ol>
<li>scraper, written in ruby/bash (~400 lines)</li>
<li>release notes generator script, written in PHP</li>
<li>A patch manager to &quot;fix&quot; issues</li>
</ol>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="66" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="66" style="--paginate:true;">
<h1>run it yourselves:</h1>
<pre><code class="language-sh"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>git <span class="hljs-built_in">clone</span> https://github.com/razorpay/ifsc.git
<span class="hljs-built_in">cd</span> ifsc/scraper
bundle install
<span class="hljs-built_in">cd</span> scripts
./bootstrap.sh
</span></span></foreignObject></svg></code></pre>
<p>Check the <code>ifsc/scraper/scripts/data</code> directory once it finishes.</p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="67" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="67" style="--paginate:true;">
<pre><code class="language-yaml"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-meta">---</span>
<span class="hljs-comment"># https://github.com/razorpay/ifsc/issues/154</span>
<span class="hljs-attr">action:</span> <span class="hljs-string">patch</span>
<span class="hljs-attr">patch:</span>
<span class="hljs-attr"> NEFT:</span> <span class="hljs-literal">false</span>
<span class="hljs-attr">ifsc:</span>
<span class="hljs-comment"># - KRTH0INBB00</span>
<span class="hljs-bullet"> -</span> <span class="hljs-string">BCEY0000001</span>
<span class="hljs-bullet"> -</span> <span class="hljs-string">BCEY0CHEN01</span>
<span class="hljs-bullet"> -</span> <span class="hljs-string">KGRB0000001</span>
<span class="hljs-bullet"> -</span> <span class="hljs-string">KGRB0000002</span>
<span class="hljs-bullet"> -</span> <span class="hljs-string">KGRB0000004</span>
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="68" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="68" style="--paginate:true;">
<pre><code class="language-yaml"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-meta">---</span>
<span class="hljs-comment"># https://github.com/razorpay/ifsc/issues/126</span>
<span class="hljs-comment"># Source: https://www.npci.org.in/upi-live-members</span>
<span class="hljs-comment"># Last Updated: Jan 2020 (Count = 143)</span>
<span class="hljs-attr">action:</span> <span class="hljs-string">patch</span>
<span class="hljs-attr">patch:</span>
<span class="hljs-string">:upi:</span> <span class="hljs-literal">true</span>
<span class="hljs-attr">banks:</span>
<span class="hljs-bullet"> -</span> <span class="hljs-string">ABHY</span>
<span class="hljs-bullet"> -</span> <span class="hljs-string">ACBX</span>
<span class="hljs-bullet"> -</span> <span class="hljs-string">ADBX</span>
<span class="hljs-bullet"> -</span> <span class="hljs-string">AGVX</span>
<span class="hljs-bullet"> -</span> <span class="hljs-string">AIRP</span>
<span class="hljs-bullet"> -</span> <span class="hljs-string">ALLA</span>
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="69" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="69" style="--paginate:true;">
<h1>Rigorous Tests</h1>
<h2>Ensure Coverage between datasets</h2>
<pre><code><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-attribute">testNames
testConstants
testCoverageAgainstBankNames
testConstantsAgainstNames
testSubletsAgainstConstants
testConstantsAgainstCompleteBanksList
testSubletCoverage
testValidateJsonFormat
testNpciListAgainstRbi
testPatches</span>
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="70" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="70" style="--paginate:true;">
<h2>Ensure common tests between languages</h2>
<pre><code class="language-json"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap> <span class="hljs-string">"testBasicValidator"</span>: {
<span class="hljs-attr">"KKBK0000261"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"HDFC0002854"</span>: <span class="hljs-literal">true</span>,
},
<span class="hljs-string">"testValidateStringLookup"</span>: {
<span class="hljs-attr">"BOTM0NEEMRA"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"BARB0ZOOTIN"</span>: <span class="hljs-literal">true</span>
},
<span class="hljs-string">"testValidateInvalidCode"</span>: {
<span class="hljs-attr">"BOTM0XEEMRA"</span>: <span class="hljs-literal">false</span>,
},
<span class="hljs-string">"testHPSC"</span>: {
<span class="hljs-attr">"HPSC0000406"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">"HPSC0000300"</span>: <span class="hljs-literal">false</span>
},
<span class="hljs-string">"testEdgeCases"</span>: {
<span class="hljs-attr">"SBMY0040704"</span>: <span class="hljs-literal">false</span>
},
<span class="hljs-string">"testSBIOldCodes"</span>: {
<span class="hljs-attr">"SBBJ0010004"</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">"SBBJ0010006"</span>: <span class="hljs-literal">false</span>,
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="71" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="71" style="--paginate:true;">
<h2>Ensure coverage across languages</h2>
<pre><code class="language-ruby"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap>it <span class="hljs-string">'should match all constants defined in PHP'</span> <span class="hljs-keyword">do</span>
constants_file = File.readlines(<span class="hljs-string">'src/php/Bank.php'</span>)
bank_constants = constants_file
.select { <span class="hljs-params">|e|</span> e.match(<span class="hljs-regexp">/const/</span>) }
.map { <span class="hljs-params">|e|</span> e[<span class="hljs-regexp">/\s+const (\w{4})/</span>, <span class="hljs-number">1</span>] }
bank_constants.each <span class="hljs-keyword">do</span> <span class="hljs-params">|c|</span>
expect(described_class::const_get(c)).to eq c.to_sym
<span class="hljs-keyword">end</span>
<span class="hljs-keyword">end</span>
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="72" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="72" style="--paginate:true;">
<h2>Ensure coverage across languages</h2>
<pre><code class="language-js"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-comment">// Validates that all constants defined in PHP are also defined in Node</span>
<span class="hljs-keyword">let</span> file = fs
.readFileSync(<span class="hljs-string">'src/php/Bank.php'</span>)
.toString()
.split(<span class="hljs-string">'\n'</span>)
.filter(<span class="hljs-function">(<span class="hljs-params">l</span>) =&gt;</span> {
<span class="hljs-keyword">return</span> l.indexOf(<span class="hljs-string">'const'</span>) &gt; <span class="hljs-number">-1</span>;
})
.map(<span class="hljs-function">(<span class="hljs-params">l</span>) =&gt;</span> {
<span class="hljs-keyword">return</span> l.match(<span class="hljs-regexp">/\s+const (\w{4})/</span>)[<span class="hljs-number">1</span>];
})
.forEach(<span class="hljs-function">(<span class="hljs-params">code</span>) =&gt;</span> {
assert.equal(BANK[code], code);
assert.equal(IFSC.bank[code], code);
});
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="73" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="73" style="--paginate:true;">
<h2>The API (<a href="https://github.com/razorpay/ifsc-api/">https://github.com/razorpay/ifsc-api/</a>)</h2>
<ol>
<li>Has all the data committed (huge repo, split-off)</li>
<li>Multi-stage docker build (150MB)</li>
<li>Uses Ruby/Sinatra/Redis for serving requests</li>
</ol>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="74" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="74" style="--paginate:true;">
<h1>Future Scope</h1>
<ol>
<li><a href="https://github.com/razorpay/ifsc/issues/125">SWIFT code</a> for every bank branch. (<a href="https://github.com/razorpay/ifsc/pull/176">In Progress</a>)</li>
<li><a href="https://github.com/razorpay/ifsc/issues/186">AePS Membership Status</a></li>
<li>Document <em>all sublet branches, even the undeclared ones</em>. (<a href="https://github.com/razorpay/ifsc/pull/166">WIP</a>)</li>
<li>Document <em>all banks, even the undeclared/dead ones</em> (<a href="https://github.com/razorpay/ifsc/pull/166">WIP</a>)</li>
<li>Support for more languages. Contributions welcome.</li>
<li>Improve API to support usecases with free-text search.</li>
<li>Add support for hotlinking bank logos (<code>https://ifsc.razorpay.com/PUNB.svg</code>)</li>
</ol>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="75" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="75" style="--paginate:true;">
<h1>Special Sublet Work</h1>
<pre><code class="language-yaml"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-attr">HDFC0CSLABK:</span> <span class="hljs-string">Subhadra</span> <span class="hljs-string">Local</span> <span class="hljs-string">Area</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSLCBL:</span> <span class="hljs-string">Shree</span> <span class="hljs-string">Laxmi</span> <span class="hljs-string">Co-operative</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSLKUB:</span> <span class="hljs-string">Shri</span> <span class="hljs-string">Laxmikrupa</span> <span class="hljs-string">Urban</span> <span class="hljs-string">Co-operative</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSMCBL:</span> <span class="hljs-string">Satana</span> <span class="hljs-string">Merchants</span> <span class="hljs-string">Co-operative</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSMLCB:</span> <span class="hljs-string">Shree</span> <span class="hljs-string">Mahayogi</span> <span class="hljs-string">Lakshmamma</span> <span class="hljs-string">Co-operative</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSMNSB:</span> <span class="hljs-string">Sanmitra</span> <span class="hljs-string">Mahila</span> <span class="hljs-string">Nag</span> <span class="hljs-string">Sahakari</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSMPAY:</span> <span class="hljs-string">Sangamner</span> <span class="hljs-string">Merch</span> <span class="hljs-string">Co-operative</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSMPBA:</span> <span class="hljs-string">Shankarrao</span> <span class="hljs-string">Mohite</span> <span class="hljs-string">Patil</span> <span class="hljs-string">Sah.bank</span>
<span class="hljs-attr">HDFC0CSMRTB:</span> <span class="hljs-string">Smriti</span> <span class="hljs-string">Nagrik</span> <span class="hljs-string">Sahakari</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSMSSB:</span> <span class="hljs-string">Shri</span> <span class="hljs-string">Mahila</span> <span class="hljs-string">Sewa</span> <span class="hljs-string">Sahakari</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSMUCB:</span> <span class="hljs-string">Shri</span> <span class="hljs-string">Mahavir</span> <span class="hljs-string">Urb</span> <span class="hljs-string">Co-operative</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSNCBL:</span> <span class="hljs-string">Saraspur</span> <span class="hljs-string">Nagarik</span> <span class="hljs-string">Co.</span> <span class="hljs-string">Op.</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSNCBR:</span> <span class="hljs-string">Surat</span> <span class="hljs-string">National</span> <span class="hljs-string">Co-operative</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSNSB0:</span> <span class="hljs-string">Sankheda</span> <span class="hljs-string">Nagrik</span> <span class="hljs-string">Sahakari</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSNSBB:</span> <span class="hljs-string">Sarakari</span> <span class="hljs-string">Naukarara</span> <span class="hljs-string">Sahakari</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSNSBH:</span> <span class="hljs-string">Sihor</span> <span class="hljs-string">Nagarik</span> <span class="hljs-string">Sahakari</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSNSBL:</span> <span class="hljs-string">Sonbhadra</span> <span class="hljs-string">Nagar</span> <span class="hljs-string">Sahakari</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSNSBM:</span> <span class="hljs-string">Sadguru</span> <span class="hljs-string">Nagrik</span> <span class="hljs-string">Sahakari</span> <span class="hljs-string">Bank</span>
<span class="hljs-attr">HDFC0CSNSBS:</span> <span class="hljs-string">Sehore</span> <span class="hljs-string">Nagrik</span> <span class="hljs-string">Sahakari</span> <span class="hljs-string">Bank</span>
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="76" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="76" style="--paginate:true;">
<h1>RBI</h1>
<p>List of all <a href="https://rbidocs.rbi.org.in/rdocs/Content/pdfs/nonschedulecoop.pdf">Non-scheduled Urban Co-operative Banks</a>(PDF):</p>
<pre><code class="language-yaml"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-attr">Name:</span> <span class="hljs-string">Shankerrao</span> <span class="hljs-string">Mohite-Patil</span> <span class="hljs-string">Sahakari</span> <span class="hljs-string">Bank</span> <span class="hljs-string">Ltd</span>
<span class="hljs-string">RO</span> <span class="hljs-attr">Name:</span> <span class="hljs-string">NAGPUR</span>
<span class="hljs-string">HO</span> <span class="hljs-attr">Address:</span> <span class="hljs-string">"Sahakar Mandir"</span><span class="hljs-string">,</span> <span class="hljs-string">Mahaveer</span> <span class="hljs-string">Path,</span> <span class="hljs-string">Akluj,</span> <span class="hljs-string">Solapur,</span> <span class="hljs-string">Maharashtra</span>
<span class="hljs-attr">Pincode:</span> <span class="hljs-number">413101</span>
</span></span></foreignObject></svg></code></pre>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="77" data-paginate="true" data-footer="Slides: [captnemo.in/talks/ifsc](https://captnemo.in/talks/ifsc/)" data-marpit-pagination="77" style="--paginate:true;">
<h2><a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc/</a></h2>
<p>Source : <a href="https://github.com/captn3m0/talks/tree/gh-pages/ifsc">https://github.com/captn3m0/talks/tree/gh-pages/ifsc</a></p>
<footer>Slides: <a href="https://captnemo.in/talks/ifsc/">captnemo.in/talks/ifsc</a></footer>
</section>
</foreignObject></svg></article><script>!function(){"use strict";var e,t,o=(function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var o=function(e,t,o){this.name=e,this.version=t,this.os=o};t.BrowserInfo=o;var n=function(e){this.version=e,this.name="node",this.os=process.platform};t.NodeInfo=n;var r=function(){this.bot=!0,this.name="bot",this.version=null,this.os=null};t.BotInfo=r;var i=3,s=[["aol",/AOLShield\/([0-9\._]+)/],["edge",/Edge\/([0-9\._]+)/],["yandexbrowser",/YaBrowser\/([0-9\._]+)/],["vivaldi",/Vivaldi\/([0-9\.]+)/],["kakaotalk",/KAKAOTALK\s([0-9\.]+)/],["samsung",/SamsungBrowser\/([0-9\.]+)/],["silk",/\bSilk\/([0-9._-]+)\b/],["chrome",/(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],["phantomjs",/PhantomJS\/([0-9\.]+)(:?\s|$)/],["crios",/CriOS\/([0-9\.]+)(:?\s|$)/],["firefox",/Firefox\/([0-9\.]+)(?:\s|$)/],["fxios",/FxiOS\/([0-9\.]+)/],["opera-mini",/Opera Mini.*Version\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)(?:\s|$)/],["opera",/OPR\/([0-9\.]+)(:?\s|$)$/],["ie",/Trident\/7\.0.*rv\:([0-9\.]+).*\).*Gecko$/],["ie",/MSIE\s([0-9\.]+);.*Trident\/[4-7].0/],["ie",/MSIE\s(7\.0)/],["bb10",/BB10;\sTouch.*Version\/([0-9\.]+)/],["android",/Android\s([0-9\.]+)/],["ios",/Version\/([0-9\._]+).*Mobile.*Safari.*/],["safari",/Version\/([0-9\._]+).*Safari/],["facebook",/FBAV\/([0-9\.]+)/],["instagram",/Instagram\s([0-9\.]+)/],["ios-webview",/AppleWebKit\/([0-9\.]+).*Mobile/],["searchbot",/alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/]],a=[["iOS",/iP(hone|od|ad)/],["Android OS",/Android/],["BlackBerry OS",/BlackBerry|BB10/],["Windows Mobile",/IEMobile/],["Amazon OS",/Kindle/],["Windows 3.11",/Win16/],["Windows 95",/(Windows 95)|(Win95)|(Windows_95)/],["Windows 98",/(Windows 98)|(Win98)/],["Windows 2000",/(Windows NT 5.0)|(Windows 2000)/],["Windows XP",/(Windows NT 5.1)|(Windows XP)/],["Windows Server 2003",/(Windows NT 5.2)/],["Windows Vista",/(Windows NT 6.0)/],["Windows 7",/(Windows NT 6.1)/],["Windows 8",/(Windows NT 6.2)/],["Windows 8.1",/(Windows NT 6.3)/],["Windows 10",/(Windows NT 10.0)/],["Windows ME",/Windows ME/],["Open BSD",/OpenBSD/],["Sun OS",/SunOS/],["Chrome OS",/CrOS/],["Linux",/(Linux)|(X11)/],["Mac OS",/(Mac_PowerPC)|(Macintosh)/],["QNX",/QNX/],["BeOS",/BeOS/],["OS/2",/OS\/2/],["Search Bot",/(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves\/Teoma)|(ia_archiver)/]];function l(e){var t=""!==e&&s.reduce(function(t,o){var n=o[0],r=o[1];if(t)return t;var i=r.exec(e);return!!i&&[n,i]},!1);if(!t)return null;var n=t[0],a=t[1];if("searchbot"===n)return new r;var l=a[1]&&a[1].split(/[._]/).slice(0,3);return l?l.length<i&&(l=l.concat(function(e){for(var t=[],o=0;o<e;o++)t.push("0");return t}(i-l.length))):l=[],new o(n,l.join("."),d(e))}function d(e){for(var t=0,o=a.length;t<o;t++){var n=a[t],r=n[0];if(n[1].test(e))return r}return null}function c(){return"undefined"!=typeof process&&process.version?new n(process.version.slice(1)):null}t.detect=function(){return"undefined"!=typeof navigator?l(navigator.userAgent):c()},t.parseUserAgent=l,t.detectOS=d,t.getNodeVersion=c}(e={exports:{}},e.exports),e.exports);(t=o)&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")&&t.default,o.BrowserInfo,o.NodeInfo,o.BotInfo;var n=o.detect;let r;o.parseUserAgent,o.detectOS,o.getNodeVersion;const i=["android","bb10","crios","facebook","fxios","instagram","ios-webview","ios","phantomjs","safari"];function s(e){Array.from(document.getElementsByTagName("svg"),t=>{if(t.hasAttribute("data-marpit-svg")){const{clientHeight:o,clientWidth:n}=t;t.style.transform||(t.style.transform="translateZ(0)");const r=e||t.currentScale||1,i=t.viewBox.baseVal.width/r,s=t.viewBox.baseVal.height/r,a=Math.min(o/s,n/i);Array.from(t.querySelectorAll(":scope > foreignObject"),e=>{const t=e.x.baseVal.value,r=e.y.baseVal.value;Array.from(e.querySelectorAll(":scope > section"),e=>{e.style.transformOrigin||(e.style.transformOrigin="0 0");const l=(n-a*i)/2-t,d=(o-a*s)/2-r;e.style.transform=`translate3d(${l}px,${d}px,0) scale(${a}) translate(${t}px,${r}px)`})})}})}const a="data-marp-fitting",l="data-marp-fitting-code",d="data-marp-fitting-math",c=(e,t,o)=>{if(e.getAttribute(t)!==o)return e.setAttribute(t,o),!0};!function(e=!0){const t=()=>{for(const e of function(){if(!r){r=[];const{name:e}=n()||{};i.includes(e)&&r.push(s)}return r}())e();Array.from(document.querySelectorAll(`svg[${a}="svg"]`),e=>{const t=e.firstChild,o=t.firstChild,{scrollWidth:n,scrollHeight:r}=o;let i,s=1;if(e.hasAttribute(l)&&(i=e.parentElement.parentElement),e.hasAttribute(d)&&(i=e.parentElement),i){const e=getComputedStyle(i),t=Math.ceil(i.clientWidth-parseFloat(e.paddingLeft)-parseFloat(e.paddingRight));t&&(s=t)}const a=Math.max(n,s),u=Math.max(r,1),f=`0 0 ${a} ${u}`;c(t,"width",`${a}`),c(t,"height",`${u}`),c(e,"preserveAspectRatio",getComputedStyle(e).getPropertyValue("--preserve-aspect-ratio")||"xMinYMin meet"),c(e,"viewBox",f)&&e.classList.toggle("__reflow__")}),e&&window.requestAnimationFrame(t)};t()}()}();
</script><script>!function(){"use strict";var e={from:function(e,n){var t=1===(e.parent||e).nodeType?e.parent||e:document.querySelector(e.parent||e),r=[].filter.call("string"==typeof e.slides?t.querySelectorAll(e.slides):e.slides||t.children,function(e){return"SCRIPT"!==e.nodeName}),i=r[0],l={},o=function(e,n){r[e]&&(a("deactivate",u(i,n)),i=r[e],a("activate",u(i,n)))},s=function(e,n){var t=r.indexOf(i)+e;a(e>0?"next":"prev",u(i,n))&&o(t,n)},c=function(e,n){l[e]=(l[e]||[]).filter(function(e){return e!==n})},a=function(e,n){return(l[e]||[]).reduce(function(e,t){return e&&!1!==t(n)},!0)},u=function(e,n){return(n=n||{}).index=r.indexOf(e),n.slide=e,n},d={on:function(e,n){return(l[e]||(l[e]=[])).push(n),c.bind(null,e,n)},off:c,fire:a,slide:function(e,n){if(!arguments.length)return r.indexOf(i);a("slide",u(r[e],n))&&o(e,n)},next:s.bind(null,1),prev:s.bind(null,-1),parent:t,slides:r};return(n||[]).forEach(function(e){e(d)}),o(0),d}},n=function(){return function(e){e.slides.forEach(function(e){e.addEventListener("keydown",function(e){(/INPUT|TEXTAREA|SELECT/.test(e.target.nodeName)||"true"===e.target.contentEditable)&&e.stopPropagation()})})}};function t(e){e.parent.classList.add("bespoke-marp-parent"),e.slides.map(e=>e.classList.add("bespoke-marp-slide")),e.on("activate",n=>{e.slides.map(e=>e.classList.remove("bespoke-marp-active")),n.slide.classList.add("bespoke-marp-active")})}function r(e=2e3){return n=>{let t;function r(){t&&clearTimeout(t),t=setTimeout(()=>{n.parent.classList.add("bespoke-marp-inactive")},e),n.parent.classList.remove("bespoke-marp-inactive")}document.addEventListener("mousedown",r),document.addEventListener("mousemove",r),document.addEventListener("touchend",r),setTimeout(r,0)}}var i,l=(function(e){var n,t,r,i,l,o;n="undefined"!=typeof window&&void 0!==window.document?window.document:{},t=e.exports,r="undefined"!=typeof Element&&"ALLOW_KEYBOARD_INPUT"in Element,i=function(){for(var e,t=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],r=0,i=t.length,l={};r<i;r++)if((e=t[r])&&e[1]in n){for(r=0;r<e.length;r++)l[t[0][r]]=e[r];return l}return!1}(),l={change:i.fullscreenchange,error:i.fullscreenerror},o={request:function(e){return new Promise(function(t){var l=i.requestFullscreen,o=function(){this.off("change",o),t()}.bind(this);e=e||n.documentElement,/ Version\/5\.1(?:\.\d+)? Safari\//.test(navigator.userAgent)?e[l]():e[l](r?Element.ALLOW_KEYBOARD_INPUT:{}),this.on("change",o)}.bind(this))},exit:function(){return new Promise(function(e){if(this.isFullscreen){var t=function(){this.off("change",t),e()}.bind(this);n[i.exitFullscreen](),this.on("change",t)}else e()}.bind(this))},toggle:function(e){return this.isFullscreen?this.exit():this.request(e)},onchange:function(e){this.on("change",e)},onerror:function(e){this.on("error",e)},on:function(e,t){var r=l[e];r&&n.addEventListener(r,t,!1)},off:function(e,t){var r=l[e];r&&n.removeEventListener(r,t,!1)},raw:i},i?(Object.defineProperties(o,{isFullscreen:{get:function(){return Boolean(n[i.fullscreenElement])}},element:{enumerable:!0,get:function(){return n[i.fullscreenElement]}},enabled:{enumerable:!0,get:function(){return Boolean(n[i.fullscreenEnabled])}}}),t?e.exports=o:window.screenfull=o):t?e.exports=!1:window.screenfull=!1}(i={exports:{}},i.exports),i.exports);function o(e){e.fullscreen=(()=>l.toggle(document.body)),document.addEventListener("keydown",n=>{70!==n.which&&122!==n.which||n.altKey||n.ctrlKey||n.metaKey||!l.enabled||(e.fullscreen(),n.preventDefault())})}function s(e={}){const n=Object.assign({history:!0},e);return e=>{function t(){const n=parseInt(window.location.hash.slice(1),10);Number.isNaN(n)||function(n){const t=Math.max(0,Math.min(n,e.slides.length-1));t!==e.slide()&&e.slide(t)}(n-1)}setTimeout(()=>{t(),e.on("activate",e=>{n.history?window.location.hash=e.index+1:window.location.replace(`#${e.index+1}`)}),window.addEventListener("hashchange",t)},0)}}var c,a=function(e){return function(n){var t="vertical"!==e;document.addEventListener("keydown",function(e){(34==e.which||32==e.which&&!e.shiftKey||t&&39==e.which||!t&&40==e.which)&&n.next(),(33==e.which||32==e.which&&e.shiftKey||t&&37==e.which||!t&&38==e.which)&&n.prev()})}};function u(e={}){const n=Object.assign({interval:200},e);return e=>{a()(e),document.addEventListener("keydown",n=>{35===n.which&&e.slide(e.slides.length-1),36===n.which&&e.slide(0),38===n.which&&e.prev(),40===n.which&&e.next()});let t,r,i=0;e.parent.addEventListener("wheel",l=>{let o=!1;const s=(e,n)=>{e&&(o=o||function(e,n){return function(e,n){const t=n===c.X?"Width":"Height";return e[`client${t}`]<e[`scroll${t}`]}(e,n)&&function(e,n){const{overflow:t}=e,r=e[`overflow${n}`];return"auto"===t||"scroll"===t||"auto"===r||"scroll"===r}(getComputedStyle(e),n)}(e,n)),e&&e.parentElement&&s(e.parentElement,n)};if(0!==l.deltaX&&s(l.target,c.X),0!==l.deltaY&&s(l.target,c.Y),o)return;l.preventDefault(),r&&clearTimeout(r),r=setTimeout(()=>{t=0},n.interval);const a=Date.now()-i<n.interval,u=Math.sqrt(Math.pow(l.deltaX,2)+Math.pow(l.deltaY,2)),d=u<=t;if(t=u,a||d)return;let f;(l.deltaX>0||l.deltaY>0)&&(f="next"),(l.deltaX<0||l.deltaY<0)&&(f="prev"),f&&(e[f](),i=Date.now())})}}function d(e=".bespoke-marp-osc"){const n=document.querySelector(e);if(!n)return()=>{};const t=(e,t)=>{n.querySelectorAll(`[data-bespoke-marp-osc=${JSON.stringify(e)}]`).forEach(t)};return l.enabled||t("fullscreen",e=>e.style.display="none"),e=>{n.addEventListener("click",n=>{if(n.target instanceof HTMLElement)switch(n.target.dataset.bespokeMarpOsc){case"next":e.next();break;case"prev":e.prev();break;case"fullscreen":"function"==typeof e.fullscreen&&l.enabled&&e.fullscreen()}}),e.parent.appendChild(n),e.on("activate",({index:n})=>{t("page",t=>t.textContent=`Page ${n+1} of ${e.slides.length}`),t("prev",e=>e.disabled=0===n),t("next",t=>t.disabled=n===e.slides.length-1)}),l.onchange(()=>t("fullscreen",e=>e.classList.toggle("exit",l.isFullscreen)))}}!function(e){e.X="X",e.Y="Y"}(c||(c={}));const f=".bespoke-progress-bar";function h(e){e.on("activate",n=>{document.querySelectorAll(f).forEach(t=>{t.style.flexBasis=`${100*n.index/(e.slides.length-1)}%`})})}function p(e={}){const n=Object.assign({slope:Math.tan(-35*Math.PI/180),swipeThreshold:30},e);return e=>{let t;const r=e.parent,i=e=>{const n=r.getBoundingClientRect();return{x:e.pageX-(n.left+n.right)/2,y:e.pageY-(n.top+n.bottom)/2}};r.addEventListener("touchstart",e=>{t=1===e.touches.length?i(e.touches[0]):void 0}),r.addEventListener("touchmove",e=>{if(t)if(1===e.touches.length){e.preventDefault();const n=i(e.touches[0]),r=n.x-t.x,l=n.y-t.y;t.delta=Math.sqrt(Math.pow(Math.abs(r),2)+Math.pow(Math.abs(l),2)),t.radian=Math.atan2(r,l)}else t=void 0}),r.addEventListener("touchend",r=>{if(t){if(t.delta&&t.delta>=n.swipeThreshold){let i=t.radian-n.slope;i=(i+Math.PI)%(2*Math.PI)-Math.PI,e[i<0?"next":"prev"](),r.stopPropagation()}t=void 0}})}}e.from(document.getElementById("presentation"),[n(),t,r(),s({history:!1}),u(),o,h,p(),d()])}();
</script></body></html>