prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Adding ABA Routing Number to Bank Provider
  * Faker version:8.1.2
  
  
  Is there any interest in adding ABA routing numbers to the Bank provider? https://en.wikipedia.org/wiki/ABA_routing_transit_number
  
  This would be helpful for my use case and have code to generate but wanted to check before putting more effort in.
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `faker/providers/bank/__init__.py`
  Content:
  ```
  1 import re
  2 import string
  3 
  4 from string import ascii_uppercase
  5 
  6 from .. import BaseProvider
  7 
  8 localized = True
  9 default_locale = 'en_GB'
  10 
  11 
  12 class Provider(BaseProvider):
  13     """Implement default bank provider for Faker.
  14 
  15     .. important::
  16        Bank codes, account numbers, and other ID's generated by this provider
  17        are only valid in form, i.e. they conform to some standard/format, are
  18        of the expected lengths, and have valid checksums (where applicable).
  19        Results generated that turn out to be valid in real life are purely
  20        coincidental.
  21 
  22     Sources:
  23 
  24     - https://en.wikipedia.org/wiki/International_Bank_Account_Number
  25     - https://www.theswiftcodes.com/swift-code-checker/
  26     """
  27 
  28     ALPHA = {c: str(ord(c) % 55) for c in string.ascii_uppercase}
  29     bban_format = '????#############'
  30     country_code = 'GB'
  31 
  32     def bank_country(self):
  33         """Generate the bank provider's ISO 3166-1 alpha-2 country code."""
  34         return self.country_code
  35 
  36     def bban(self):
  37         """Generate a Basic Bank Account Number (BBAN)."""
  38         temp = re.sub(r'\?',
  39                       lambda x: self.random_element(ascii_uppercase),
  40                       self.bban_format)
  41         return self.numerify(temp)
  42 
  43     def iban(self):
  44         """Generate an International Bank Account Number (IBAN)."""
  45         bban = self.bban()
  46 
  47         check = bban + self.country_code + '00'
  48         check = int(''.join(self.ALPHA.get(c, c) for c in check))
  49         check = 98 - (check % 97)
  50         check = str(check).zfill(2)
  51 
  52         return self.country_code + check + bban
  53 
  54     def swift8(self, use_dataset=False):
  55         """Generate an 8-digit SWIFT code.
  56 
  57         This method uses |swift| under the hood with the ``length`` argument set
  58         to ``8`` and with the ``primary`` argument omitted. All 8-digit SWIFT
  59         codes already refer to the primary branch/office.
  60 
  61         :sample:
  62         :sample: use_dataset=True
  63         """
  64         return self.swift(length=8, use_dataset=use_dataset)
  65 
  66     def swift11(self, primary=None, use_dataset=False):
  67         """Generate an 11-digit SWIFT code.
  68 
  69         This method uses |swift| under the hood with the ``length`` argument set
  70         to ``11``. If ``primary`` is set to ``True``, the SWIFT code will always
  71         end with ``'XXX'``. All 11-digit SWIFT codes use this convention to
  72         refer to the primary branch/office.
  73 
  74         :sample:
  75         :sample: use_dataset=True
  76         """
  77         return self.swift(length=11, primary=primary, use_dataset=use_dataset)
  78 
  79     def swift(self, length=None, primary=None, use_dataset=False):
  80         """Generate a SWIFT code.
  81 
  82         SWIFT codes, reading from left to right, are composed of a 4 alphabet
  83         character bank code, a 2 alphabet character country code, a 2
  84         alphanumeric location code, and an optional 3 alphanumeric branch code.
  85         This means SWIFT codes can only have 8 or 11 characters, so the value of
  86         ``length`` can only be ``None`` or the integers ``8`` or ``11``. If the
  87         value is ``None``, then a value of ``8`` or ``11`` will randomly be
  88         assigned.
  89 
  90         Because all 8-digit SWIFT codes already refer to the primary branch or
  91         office, the ``primary`` argument only has an effect if the value of
  92         ``length`` is ``11``. If ``primary`` is ``True`` and ``length`` is
  93         ``11``, the 11-digit SWIFT codes generated will always end in ``'XXX'``
  94         to denote that they belong to primary branches/offices.
  95 
  96         For extra authenticity, localized providers may opt to include SWIFT
  97         bank codes, location codes, and branch codes used in their respective
  98         locales. If ``use_dataset`` is ``True``, this method will generate SWIFT
  99         codes based on those locale-specific codes if included. If those codes
  100         were not included, then it will behave as if ``use_dataset`` were
  101         ``False``, and in that mode, all those codes will just be randomly
  102         generated as per the specification.
  103 
  104         :sample:
  105         :sample: length=8
  106         :sample: length=8, use_dataset=True
  107         :sample: length=11
  108         :sample: length=11, primary=True
  109         :sample: length=11, use_dataset=True
  110         :sample: length=11, primary=True, use_dataset=True
  111         """
  112         if length is None:
  113             length = self.random_element((8, 11))
  114         if length not in (8, 11):
  115             raise AssertionError('length can only be 8 or 11')
  116 
  117         if use_dataset and hasattr(self, 'swift_bank_codes'):
  118             bank_code = self.random_element(self.swift_bank_codes)
  119         else:
  120             bank_code = self.lexify('????', letters=string.ascii_uppercase)
  121 
  122         if use_dataset and hasattr(self, 'swift_location_codes'):
  123             location_code = self.random_element(self.swift_location_codes)
  124         else:
  125             location_code = self.lexify('??', letters=string.ascii_uppercase + string.digits)
  126 
  127         if length == 8:
  128             return bank_code + self.country_code + location_code
  129 
  130         if primary:
  131             branch_code = 'XXX'
  132         elif use_dataset and hasattr(self, 'swift_branch_codes'):
  133             branch_code = self.random_element(self.swift_branch_codes)
  134         else:
  135             branch_code = self.lexify('???', letters=string.ascii_uppercase + string.digits)
  136 
  137         return bank_code + self.country_code + location_code + branch_code
  138
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/faker/providers/bank/__init__.py b/faker/providers/bank/__init__.py
  --- a/faker/providers/bank/__init__.py
  +++ b/faker/providers/bank/__init__.py
  @@ -1,6 +1,7 @@
   import re
   import string
   
  +from math import ceil
   from string import ascii_uppercase
   
   from .. import BaseProvider
  @@ -29,6 +30,19 @@
       bban_format = '????#############'
       country_code = 'GB'
   
  +    def aba(self):
  +        """Generate an ABA routing transit number."""
  +        fed_num = self.random_int(min=1, max=12)
  +        rand = self.numerify('######')
  +        aba = f"{fed_num:02}{rand}"
  +
  +        # calculate check digit
  +        d = [int(n) for n in aba]
  +        chk_digit = 3*(d[0] + d[3] + d[6]) + 7*(d[1] + d[4] + d[7]) + d[2] + d[5]
  +        chk_digit = ceil(chk_digit/10)*10 - chk_digit
  +
  +        return f"{aba}{chk_digit}"
  +
       def bank_country(self):
           """Generate the bank provider's ISO 3166-1 alpha-2 country code."""
           return self.country_code
  
verification_info: {"golden_diff": "diff --git a/faker/providers/bank/__init__.py b/faker/providers/bank/__init__.py\n--- a/faker/providers/bank/__init__.py\n+++ b/faker/providers/bank/__init__.py\n@@ -1,6 +1,7 @@\n import re\n import string\n \n+from math import ceil\n from string import ascii_uppercase\n \n from .. import BaseProvider\n@@ -29,6 +30,19 @@\n     bban_format = '????#############'\n     country_code = 'GB'\n \n+    def aba(self):\n+        \"\"\"Generate an ABA routing transit number.\"\"\"\n+        fed_num = self.random_int(min=1, max=12)\n+        rand = self.numerify('######')\n+        aba = f\"{fed_num:02}{rand}\"\n+\n+        # calculate check digit\n+        d = [int(n) for n in aba]\n+        chk_digit = 3*(d[0] + d[3] + d[6]) + 7*(d[1] + d[4] + d[7]) + d[2] + d[5]\n+        chk_digit = ceil(chk_digit/10)*10 - chk_digit\n+\n+        return f\"{aba}{chk_digit}\"\n+\n     def bank_country(self):\n         \"\"\"Generate the bank provider's ISO 3166-1 alpha-2 country code.\"\"\"\n         return self.country_code\n", "issue": "Adding ABA Routing Number to Bank Provider\n* Faker version:8.1.2\r\n\r\n\r\nIs there any interest in adding ABA routing numbers to the Bank provider? https://en.wikipedia.org/wiki/ABA_routing_transit_number\r\n\r\nThis would be helpful for my use case and have code to generate but wanted to check before putting more effort in.\n", "before_files": [{"content": "import re\nimport string\n\nfrom string import ascii_uppercase\n\nfrom .. import BaseProvider\n\nlocalized = True\ndefault_locale = 'en_GB'\n\n\nclass Provider(BaseProvider):\n    \"\"\"Implement default bank provider for Faker.\n\n    .. important::\n       Bank codes, account numbers, and other ID's generated by this provider\n       are only valid in form, i.e. they conform to some standard/format, are\n       of the expected lengths, and have valid checksums (where applicable).\n       Results generated that turn out to be valid in real life are purely\n       coincidental.\n\n    Sources:\n\n    - https://en.wikipedia.org/wiki/International_Bank_Account_Number\n    - https://www.theswiftcodes.com/swift-code-checker/\n    \"\"\"\n\n    ALPHA = {c: str(ord(c) % 55) for c in string.ascii_uppercase}\n    bban_format = '????#############'\n    country_code = 'GB'\n\n    def bank_country(self):\n        \"\"\"Generate the bank provider's ISO 3166-1 alpha-2 country code.\"\"\"\n        return self.country_code\n\n    def bban(self):\n        \"\"\"Generate a Basic Bank Account Number (BBAN).\"\"\"\n        temp = re.sub(r'\\?',\n                      lambda x: self.random_element(ascii_uppercase),\n                      self.bban_format)\n        return self.numerify(temp)\n\n    def iban(self):\n        \"\"\"Generate an International Bank Account Number (IBAN).\"\"\"\n        bban = self.bban()\n\n        check = bban + self.country_code + '00'\n        check = int(''.join(self.ALPHA.get(c, c) for c in check))\n        check = 98 - (check % 97)\n        check = str(check).zfill(2)\n\n        return self.country_code + check + bban\n\n    def swift8(self, use_dataset=False):\n        \"\"\"Generate an 8-digit SWIFT code.\n\n        This method uses |swift| under the hood with the ``length`` argument set\n        to ``8`` and with the ``primary`` argument omitted. All 8-digit SWIFT\n        codes already refer to the primary branch/office.\n\n        :sample:\n        :sample: use_dataset=True\n        \"\"\"\n        return self.swift(length=8, use_dataset=use_dataset)\n\n    def swift11(self, primary=None, use_dataset=False):\n        \"\"\"Generate an 11-digit SWIFT code.\n\n        This method uses |swift| under the hood with the ``length`` argument set\n        to ``11``. If ``primary`` is set to ``True``, the SWIFT code will always\n        end with ``'XXX'``. All 11-digit SWIFT codes use this convention to\n        refer to the primary branch/office.\n\n        :sample:\n        :sample: use_dataset=True\n        \"\"\"\n        return self.swift(length=11, primary=primary, use_dataset=use_dataset)\n\n    def swift(self, length=None, primary=None, use_dataset=False):\n        \"\"\"Generate a SWIFT code.\n\n        SWIFT codes, reading from left to right, are composed of a 4 alphabet\n        character bank code, a 2 alphabet character country code, a 2\n        alphanumeric location code, and an optional 3 alphanumeric branch code.\n        This means SWIFT codes can only have 8 or 11 characters, so the value of\n        ``length`` can only be ``None`` or the integers ``8`` or ``11``. If the\n        value is ``None``, then a value of ``8`` or ``11`` will randomly be\n        assigned.\n\n        Because all 8-digit SWIFT codes already refer to the primary branch or\n        office, the ``primary`` argument only has an effect if the value of\n        ``length`` is ``11``. If ``primary`` is ``True`` and ``length`` is\n        ``11``, the 11-digit SWIFT codes generated will always end in ``'XXX'``\n        to denote that they belong to primary branches/offices.\n\n        For extra authenticity, localized providers may opt to include SWIFT\n        bank codes, location codes, and branch codes used in their respective\n        locales. If ``use_dataset`` is ``True``, this method will generate SWIFT\n        codes based on those locale-specific codes if included. If those codes\n        were not included, then it will behave as if ``use_dataset`` were\n        ``False``, and in that mode, all those codes will just be randomly\n        generated as per the specification.\n\n        :sample:\n        :sample: length=8\n        :sample: length=8, use_dataset=True\n        :sample: length=11\n        :sample: length=11, primary=True\n        :sample: length=11, use_dataset=True\n        :sample: length=11, primary=True, use_dataset=True\n        \"\"\"\n        if length is None:\n            length = self.random_element((8, 11))\n        if length not in (8, 11):\n            raise AssertionError('length can only be 8 or 11')\n\n        if use_dataset and hasattr(self, 'swift_bank_codes'):\n            bank_code = self.random_element(self.swift_bank_codes)\n        else:\n            bank_code = self.lexify('????', letters=string.ascii_uppercase)\n\n        if use_dataset and hasattr(self, 'swift_location_codes'):\n            location_code = self.random_element(self.swift_location_codes)\n        else:\n            location_code = self.lexify('??', letters=string.ascii_uppercase + string.digits)\n\n        if length == 8:\n            return bank_code + self.country_code + location_code\n\n        if primary:\n            branch_code = 'XXX'\n        elif use_dataset and hasattr(self, 'swift_branch_codes'):\n            branch_code = self.random_element(self.swift_branch_codes)\n        else:\n            branch_code = self.lexify('???', letters=string.ascii_uppercase + string.digits)\n\n        return bank_code + self.country_code + location_code + branch_code\n", "path": "faker/providers/bank/__init__.py"}], "after_files": [{"content": "import re\nimport string\n\nfrom math import ceil\nfrom string import ascii_uppercase\n\nfrom .. import BaseProvider\n\nlocalized = True\ndefault_locale = 'en_GB'\n\n\nclass Provider(BaseProvider):\n    \"\"\"Implement default bank provider for Faker.\n\n    .. important::\n       Bank codes, account numbers, and other ID's generated by this provider\n       are only valid in form, i.e. they conform to some standard/format, are\n       of the expected lengths, and have valid checksums (where applicable).\n       Results generated that turn out to be valid in real life are purely\n       coincidental.\n\n    Sources:\n\n    - https://en.wikipedia.org/wiki/International_Bank_Account_Number\n    - https://www.theswiftcodes.com/swift-code-checker/\n    \"\"\"\n\n    ALPHA = {c: str(ord(c) % 55) for c in string.ascii_uppercase}\n    bban_format = '????#############'\n    country_code = 'GB'\n\n    def aba(self):\n        \"\"\"Generate an ABA routing transit number.\"\"\"\n        fed_num = self.random_int(min=1, max=12)\n        rand = self.numerify('######')\n        aba = f\"{fed_num:02}{rand}\"\n\n        # calculate check digit\n        d = [int(n) for n in aba]\n        chk_digit = 3*(d[0] + d[3] + d[6]) + 7*(d[1] + d[4] + d[7]) + d[2] + d[5]\n        chk_digit = ceil(chk_digit/10)*10 - chk_digit\n\n        return f\"{aba}{chk_digit}\"\n\n    def bank_country(self):\n        \"\"\"Generate the bank provider's ISO 3166-1 alpha-2 country code.\"\"\"\n        return self.country_code\n\n    def bban(self):\n        \"\"\"Generate a Basic Bank Account Number (BBAN).\"\"\"\n        temp = re.sub(r'\\?',\n                      lambda x: self.random_element(ascii_uppercase),\n                      self.bban_format)\n        return self.numerify(temp)\n\n    def iban(self):\n        \"\"\"Generate an International Bank Account Number (IBAN).\"\"\"\n        bban = self.bban()\n\n        check = bban + self.country_code + '00'\n        check = int(''.join(self.ALPHA.get(c, c) for c in check))\n        check = 98 - (check % 97)\n        check = str(check).zfill(2)\n\n        return self.country_code + check + bban\n\n    def swift8(self, use_dataset=False):\n        \"\"\"Generate an 8-digit SWIFT code.\n\n        This method uses |swift| under the hood with the ``length`` argument set\n        to ``8`` and with the ``primary`` argument omitted. All 8-digit SWIFT\n        codes already refer to the primary branch/office.\n\n        :sample:\n        :sample: use_dataset=True\n        \"\"\"\n        return self.swift(length=8, use_dataset=use_dataset)\n\n    def swift11(self, primary=None, use_dataset=False):\n        \"\"\"Generate an 11-digit SWIFT code.\n\n        This method uses |swift| under the hood with the ``length`` argument set\n        to ``11``. If ``primary`` is set to ``True``, the SWIFT code will always\n        end with ``'XXX'``. All 11-digit SWIFT codes use this convention to\n        refer to the primary branch/office.\n\n        :sample:\n        :sample: use_dataset=True\n        \"\"\"\n        return self.swift(length=11, primary=primary, use_dataset=use_dataset)\n\n    def swift(self, length=None, primary=None, use_dataset=False):\n        \"\"\"Generate a SWIFT code.\n\n        SWIFT codes, reading from left to right, are composed of a 4 alphabet\n        character bank code, a 2 alphabet character country code, a 2\n        alphanumeric location code, and an optional 3 alphanumeric branch code.\n        This means SWIFT codes can only have 8 or 11 characters, so the value of\n        ``length`` can only be ``None`` or the integers ``8`` or ``11``. If the\n        value is ``None``, then a value of ``8`` or ``11`` will randomly be\n        assigned.\n\n        Because all 8-digit SWIFT codes already refer to the primary branch or\n        office, the ``primary`` argument only has an effect if the value of\n        ``length`` is ``11``. If ``primary`` is ``True`` and ``length`` is\n        ``11``, the 11-digit SWIFT codes generated will always end in ``'XXX'``\n        to denote that they belong to primary branches/offices.\n\n        For extra authenticity, localized providers may opt to include SWIFT\n        bank codes, location codes, and branch codes used in their respective\n        locales. If ``use_dataset`` is ``True``, this method will generate SWIFT\n        codes based on those locale-specific codes if included. If those codes\n        were not included, then it will behave as if ``use_dataset`` were\n        ``False``, and in that mode, all those codes will just be randomly\n        generated as per the specification.\n\n        :sample:\n        :sample: length=8\n        :sample: length=8, use_dataset=True\n        :sample: length=11\n        :sample: length=11, primary=True\n        :sample: length=11, use_dataset=True\n        :sample: length=11, primary=True, use_dataset=True\n        \"\"\"\n        if length is None:\n            length = self.random_element((8, 11))\n        if length not in (8, 11):\n            raise AssertionError('length can only be 8 or 11')\n\n        if use_dataset and hasattr(self, 'swift_bank_codes'):\n            bank_code = self.random_element(self.swift_bank_codes)\n        else:\n            bank_code = self.lexify('????', letters=string.ascii_uppercase)\n\n        if use_dataset and hasattr(self, 'swift_location_codes'):\n            location_code = self.random_element(self.swift_location_codes)\n        else:\n            location_code = self.lexify('??', letters=string.ascii_uppercase + string.digits)\n\n        if length == 8:\n            return bank_code + self.country_code + location_code\n\n        if primary:\n            branch_code = 'XXX'\n        elif use_dataset and hasattr(self, 'swift_branch_codes'):\n            branch_code = self.random_element(self.swift_branch_codes)\n        else:\n            branch_code = self.lexify('???', letters=string.ascii_uppercase + string.digits)\n\n        return bank_code + self.country_code + location_code + branch_code\n", "path": "faker/providers/bank/__init__.py"}]}