diff --git a/e2e/pages/shared-lending-platform/NonAssociatedUserProfile.spec.ts b/e2e/pages/shared-lending-platform/NonAssociatedUserProfile.spec.ts index 6959113c..e93fe637 100644 --- a/e2e/pages/shared-lending-platform/NonAssociatedUserProfile.spec.ts +++ b/e2e/pages/shared-lending-platform/NonAssociatedUserProfile.spec.ts @@ -1,5 +1,6 @@ import { expect } from '@playwright/test'; import { test } from '../../fixtures/testFixture'; +import { controlUnicode } from '../../utils/unicodeConstants'; const expectedNoAssociationsSummaryUrl = /\/profile\/complete\/summary\/submitted$/; @@ -31,3 +32,70 @@ test('Complete User Profile -- No Associations -- process', async ({ await expect(page.locator('#Summary div').first()).toBeVisible(); }); }); + +test('Complete User Profile with Bad Unicode -- No Associations -- process', async ({ + page, +}) => { + test.slow(); + + await test.step('Fillout Complete User Profile (No Associations) with bad unicode and verify values', async () => { + const expectedValues = { + firstField: controlUnicode.slice(0, 255), + lastField: controlUnicode.slice(0, 255), + // TODO: Update with correct value after char limit in place, see: + // https://github.com/cfpb/sbl-frontend/issues/972 + finField: controlUnicode, + // TODO: Update with correct value after char limit in place, see: + // https://github.com/cfpb/sbl-frontend/issues/972 + leiField: controlUnicode, + }; + const unexpectedValues = { + firstField: controlUnicode, + lastField: controlUnicode, + // TODO: Change to controlUnicode after char limit in place, see: + // https://github.com/cfpb/sbl-frontend/issues/972 + finField: '', + // TODO: Change to controlUnicode after char limit in place, see: + // https://github.com/cfpb/sbl-frontend/issues/972 + leiField: '', + }; + + await page.getByLabel('First name').click(); + await page.getByLabel('First name').fill(controlUnicode); + + await page.getByLabel('Last name').click(); + await page.getByLabel('Last name').fill(controlUnicode); + + await page.getByLabel('Financial institution name').click(); + await page.getByLabel('Financial institution name').fill(controlUnicode); + + await page.getByLabel('Legal Entity Identifier (LEI)').click(); + await page.getByLabel('Legal Entity Identifier (LEI)').fill(controlUnicode); + + await expect(page.getByLabel('First name')).not.toHaveValue( + unexpectedValues.firstField, + ); + await expect(page.getByLabel('Last name')).not.toHaveValue( + unexpectedValues.lastField, + ); + await expect(page.getByLabel('Financial institution name')).not.toHaveValue( + unexpectedValues.finField, + ); + await expect( + page.getByLabel('Legal Entity Identifier (LEI)'), + ).not.toHaveValue(unexpectedValues.leiField); + + await expect(page.getByLabel('First name')).toHaveValue( + expectedValues.firstField, + ); + await expect(page.getByLabel('Last name')).toHaveValue( + expectedValues.lastField, + ); + await expect(page.getByLabel('Financial institution name')).toHaveValue( + expectedValues.finField, + ); + await expect(page.getByLabel('Legal Entity Identifier (LEI)')).toHaveValue( + expectedValues.leiField, + ); + }); +}); diff --git a/e2e/utils/unicodeConstants.ts b/e2e/utils/unicodeConstants.ts new file mode 100644 index 00000000..f9d976d3 --- /dev/null +++ b/e2e/utils/unicodeConstants.ts @@ -0,0 +1,4 @@ +// Test string that contains +// 'invisible' unicode +// control characters +export const controlUnicode = 'ȃ̸̡̡̡̛̛̛̛̛̛̛̮̝̫͓͚͎̘͉̞͙̯̲̬̖͕̥̦̼͈̳͔̟̥̜͕̯͚͈̩̼̪̤̝͉͙͕̭̃̔̈̂̇̅̀͊̀̓͋̽͊̍̄͆́̈́͛͒̈̉̇̑̓̊̋̔̒͆́͋͋̎̄͑̂̌̓̔̀͑̈́̀̑̈̔̊̾͂́̓̐͐͆́͐̀̋̓̄͛͊͗͊̒̿͗́͌̂̀̆̈́̈́͑̑͑̽̌̎́̏̓̈̎͐́̍̽̈͐̈́̃̔̒͒͛̎͆͋̆̈́͒͗̔̿̃͂͑͆͌͐̇̔́̅̄̄͆͋̆̇̀͊́̐̈́̽́̉͆̋͒̍́̊̈͐̐͊́̑͑̌̌́̐̽̇̂̓̆̿͒́̅͛̓͋̏̏̃̆͋͒͐͑̆͛͒́̋̄̈́́̾̍͗͆͊̈́̍͛͗̉̄̓̀̏͋͌͐́̿͌̿͆͂̀̈́̀͑́͆̎͐̾̊̅̅͑̎̆̈́̕͘̚̕̕̕͘̚̚̕͘͘̕̕̕̕͝͝͠͝͠͠͝͝͠͠͝͝͝͠ͅͅs̴̡̡̡̢̨̡̢̨̨̢̧̢̢̨̧̢̨̛̛̬̲̤̙̬̟͎͈̫̬̬̗͙̬̻͕̰̖͈͈͎͓̻̝̻͇̭̙̭̣̳͎͈̪̻̖͇̰̜̤̺̺̩͖̘̲̳̻͓͎̰̞̰͙̰̮̣͇̘̖̟͉̯̦̝̖͉̜̫̝͉̘͎̯̗̗͇̲̯̗̰̯͔̩̦̰̥̗͔̙̟̪̲̼̞̹̦̺̤̻͈̱̥̥͕̟͓̝͉̖̜̫̤̮̘͉͈̥̪͔͇̖̝͚̹̬̤̹̥̲̞̣̤̟͇͇̰͖̟̘̠̘͇̜̩̺̻̰͚̘̯̹͕̺̠̪̻̗̱̜̞̙̺̩̟̩̰̫͉̦̟̰̼͉͎̲̜̠̈̌͆͑̒̐́͌̏̍̑̃͊͋̾̈́̔̑̋̍̃̍͐̾̋̐̈̌͑̈́̍́͋͂͌̅̋͊͊̑̃̉̉̒͒̿͗̋̋̓͐̾͑͗́̇̎̾͑́̉͐͊̂̾̋̇͐̅̈́̏̓͗͐̀̏͗̔̍̇́͐̈̑̐̍̈́͑̇̓̾̈́̓̍͂́̏̋̋͂̅̅͊̓̆̈́̉̿̂͆̊̀͛͆̔̄̂̈́̌͒̍́̾̅̑͒̀̃̓̅̆̊̾̾̂͒̎̅̅̿̌́̊̃̾̍̾̍͒̉́̆̉̓͑͊͊̎̓̈́́̍̓̿͐̅̋̅́̃̒́̉̇̈́̏͒̒̅̅͊̈́͑̇̿̾̏̊̂̽̃̈́̃̈́̀̿̐̍͌̅͑̋͂̓̎̎͛̃̾͒͋̆̃́́͂͋̑̍̈̌̊̋̈̋̾̈͋̎͗̇̌̈́̀̂̇̚͘̕͘̕̚̚̕̕̕̕͘̕͘͘̚̕͜͜͜͜͜͜͜͝͝͝͝͝͝͝͝͝͠͠͝͝͝͠͠ͅͅͅͅͅḑ̶̡̡̨̧̡̨̧̧̡̡̢̡̡̨̡̢̧̛̭͔̦̱̖̰̲̼̥͔̙͓͎͇̗̣̞̘̯̜̟͙̘̫̘̹̲͈̩͈̙̻͚̺͓̭̤̣̣̩̗̬̳̜̜̣̤̥̯̬͙̗̬̩̲̮̱̝͖̱̥̭̙̖̰̻̱̗͖̲̮̬̺͔̞̬͎̫͕̖͇̹̩̳̟̹̯͍̤̥̗̼̩̝̱͉̹̦̣̬̖̜͓̖̘̖̣̳̻͙͓͍̮̥͕͚͉̼̤̤͍̰͖͙̭̫̠̠͓̫͚̯̝̘̰̤͛͊͒́̇̓̅̈́̃̉͂̾͐́̊̑̃̔̈́͋̈́̆̇̎̈͐̽͌̕̕͜͜͜͜͜͜͜͠͝͝ͅͅͅͅͅf̸̨̨̧̨̧̢̨̧̢̧̢̛̛̛̛̬̥̥͚͕̟̻̣͚͖̲̖̥̣͔̩͇̹̦̮͓̰̥̭͔̠̙͙͇̼̣͓̻͕̯̱͉̼̲͔̜͔͇͔̠̝̩̲͕̺̞͇̼̺̹̞̪̯̦̫̯̰̫̥͙̮̺̣̰̜̖͓̗̯̳͕͓̞̭̜̘̘̯̹̠̖̘̮̪̪͈̰̣̤̙̯͖͚͎̖̭͔̗͕͇̹̹̗̬̮̪͔̲̯͚̠͔̫͎͍͔̍̅̌͆͒͌́̐͑̌̏̇̒̌͋̂̃̀̑͒̅̔̔͗͒̾̃͊̆̔̿̀̓̋̀͑̅̒͑̎̔̑̉̍͊͑̂̉͒̔̈́͗̀̈̀̅͛̅̃͂͂͑̋͐͑̄͂͛̅̈͗̀͛̓̉̌̓͛͋̅̄̒̄́̈́̋̓̂̐̄̄́̂̄͊̌͛́̉̈́̃́̂̈́̈́͂̈́̏̋̇͆́̂̒̿̅̈̇͒̍͋̏͆͐̀͌͊͊͒̽̑̽̈́̀͆̎̔́̒̀̇͂́̐͆̊̀͋̓̈́̽̍̀͆̇͐̋̊̆̀͛̌͂̀̒̓̓̔̑͐̈́̿́̊̑̈̿̎̍̍͐̿̇̃͌̀̈́̉͐̓̋͊̇̓͊̄̔͆̍͐̀̎͌͋̓̀̅́̐͌͂̔̀̈̽̀̎͛̕̚̚̕̕͘͘̚͘͘̕̚̕̚̕̚̚̚͘̚͘̕͜͠͠͝͠͝͝͝͝͝͝͝͠͝͠͝ͅͅͅͅͅͅs̷̢̧̧̡̢̡̡̧̧̧̧̡̡̡̨̡̨̧̢̡̡̡̧̢̨̨̛̭̱̹̖͔̦̠̰͇͓͙̖̝̖̝͍̳̟̠͕̫̫͖̦͈̩̳͖̮̗̳̩̼̼̞̘͉͉͚̭̮͎̗͍̤̦͔̮̣̖͇͍͎̝̞̰̥̘̭̙͙͚̥̦̥̗̣̹̫̦̬̖̝̞̳̦̳̰̜̼̘̞͈̙̣̱̟̪̲̼̟̭͈̯̠̰͔̣͎͈̝̗͚͈͕̯̼͇͔͔̬̹͍̥̜͖͍̘̟͈̳͕̙͈̝̜̰͈̗͖̖̻͎̝̝͕͍͕͇̦̫͈͔̞̪̠̻͎̘̲̳̝̺̻̰̙͙̘̪͙̟͖͓̫̘̲͙͖̥͙̫̮̺̪̟̝͍͈̭͍͎͔͕̠̠̤̞͉̘̺̺͉̙͍͕̹̰̦̙̟̯̘̠͍̺̱͇̥͈̗̲̹̤̦̹̟̠̝͚̮̹͉͈͔̤̪̫͕͕͈͎̭̯̣̖̞̰͎̟̤̻̖̠͓̞̹͖͚̋͑́̈̎͌͋̀͗́̑̓̀̿̏̽̐͆͆̿̇̍́̌͗͘͘̕͘̕͜͜͜͜͜͠ͅͅḑ̸̢̧̧̧̢̨̨̢̧̧̢̨̧̡̨̢̧̡̡̨̨̢̨̧̛̛̛̛̛̛̫̩̳̖̘̪͚̭͖̱̥͙̹̖̞̗̫̘͕̲͎͍̖̣͍͈̜̮̤̮̩͍̖̜͉̼̮͙͎̤̪͇̗͚̥̟̺̘̗͉̱̟̼̥̞̜̤̫̫͉͇̳̻͇̣͎͔͇̤̼̭̠̗̭̻̘͈͔̣̞͕̜̗͇͓̥̩͖͎͔̪̝̳̦͖̙͕̟̘̜̝̫̥͈̣̬͎̻͈̝̹̼̱͇̞̬̩̹͓̠͇̩̱̗̰͕̖̺̹̪̗̙̞̱̫̻̩̮̣̳̗̣̣̦̖͚̠̝̗͖̯̣̦̜͈̻̫̟̙͎̳̻͕͎̝̥̭͙̰̻̖̲̜̪͔̼̖̰̠̖̙͓͎̬̼̫̙͂̿̇́̓̔͆́̀͐̂͒͛̀̀̃́̌̔̇͑͊́̌͛̎̓̒̈́̐͗̓̀̎̓̊̊̉̓̇̓̊̅̈́̉̈́͑̌̑͐̔͗̉̑̈́̈́͆́̍͂̋̈́̐̋̋͋̀̾͗̓̐͐̍͊͌͆̔̈́̓̒̂̀͋̀͛͌̆͋̒̀̀͌̾̈̉̇̅̀̀̋̃͆͗̕͜͜͜͜͝͝͝͝͝͝͝͝͝͠͝͝͝͝͠ͅͅͅͅf̵̨̧̨̢̧̡̢̨̢̨̡̡̛̛̛̭͎̜̰̩̞̣̣͕͈̤̟̪̥̗̻̹̳͍̝͓͈̲͙̦͈̰͎̣̖̹̥̪̼̜̻̞̫̘͔͙̞͖̝̣̳̖͚͔̺̳͉̳̞͎͉̼̬̠̝̼͙̖̠̯̼̭̙̞̲̙̟̙̺̖̙̻̥̘͎͕͕͍̠̳͉̰̣̺̩͖̦̼͔̪͉͓̹̳̤̦̆̽͒͗͆̓͛̐̉͑͛́͌̃̉̓͒̍̊͑̋̽̓̂̾̉͐͋͌̿͑͒̋̉̆́͋̄̎̓̅̈́̇̇̔͛̀̽̇̔͋̌̈́͌̇̌̈̈́̅̎̓̇̐͘͘̚̚̚͘͝͝͝͠͠͠͠ͅͅͅg̶̢̡̡̨̧̡̨̢̢̧̢̢̡̡̧̧̡̧̧̢̧̧̨̡̡̛̛̛̛̛̠̟͇̝̟̣̤̮̘̞̫̹͙̳̬̤̼̣͎̖̟͉̺̫͙̟̳͎̝̜̩̫͉̱̹͙̲̤̩̯̻̖̱͇̖̥̗̫̻̘̯̥̤̥̘̜̱̣͚̳͓̹̭̫̹̟̠͈̤̰̩̳͎̖͍̗̹͉͔̗͎̯͚̮̩̥̙͔̥͎̹̯͔̖̣͈͍͙̜̺̤̻̤̥̰͇̖̙̙̦̪̙̞̝͓̠͉̭̦͕̟̱͎̝͚̙̰͕̫̙̤̜̬̲̳̳͈̯̹͉̩̬͎̻͖̠͔̮̦͕̙̳̰̹̭̤̳̟̗̺͈̳̦͙̖͖͔̖̱̱̦̱̖͔̦̟̗͈̖̦̯̫͈̤̬̮͈̞͔̼͇̱͔̹̩̺̬̝̜̬͖͕̦̹̪͔̤̼͖̬̪͈̤̥̪̦̞̰̗̲̤̜̳̯̣̲͍̥̩͔͉̗̠̻̻̬͉̦̯̩̤̦͎̟̗͇̠͓͙̤͎̰̝̙͚͖̜̽͛̎̀͛̇̎̒̿̊͂̑̽͋̍͌͋̓̎̄͌͆̍͑͗̈̅͒̀̃̌̃̈͂̃̊̍̊͊̌̃̌́͗͆̀̿̃̀̈̂̐̈͑̍͊̂̓̍̎͒̐̔̔̀̏̇̄̈̓͊͒̽̓̏͌͆̐̍͛̑̌́̀̌̄͛̽̈́̒̉̋̈́̓̉̅̅̈́̋̓͂͌̌̀̽̿͋̈̾͂̉̌͆͛̄̋̏̓̍͌̈́̍̊̀̂͒̐̅̇̌̈́́̊̓̀̋͊̾̈́͌͌̌͌͋͐̓̍̂̔̾͑̿̿̏̇́̂͐́̈͑̑͛̆͌͐̄̒̽̌͌̈̅̀̉̈́̈́͆̏̍̅̈́͆̓́͆̈̅̓̄̍̉̋͌̀͊̐́́̀̓͐̀͌̀͛͂̏͆̽͌̐̅̈̃͌̌̏͒̍̾̈͛̾̆̊͑̃̿̾̃́͘͘̕̕̚͘̚͘̕̚̕̚͜͜͜͜͜͜͜͜͜͜͜͜͜͝͠͝͝͠͝͝͝͝͝͠͠͝͝͝͝ͅͅͅͅͅḑ̶̨̧̡̢̧̨̨̨̡̨̧̡̡̨̢̢̡̧̨̧̧̨̛̛͈͍̲̻͇̟̬̝̺̱͇͖̻͎͙̘̗̰̭͉͔̪͍̬̯͉̰̞̝̩̙̰͎̻̟͚̗̫͓̮̫̱͕͖̠̼̩̜͖̹͕͍͚̭̜̭͍͇͚̤̼͚̠͕̙͙̞̙͇̘͕̻͕͔̻̪̥͉̳̞̮̲̜̠̗͇̤͖̭̤͉͔̮͚͖̦̫̘̙̱͔̖̩̪̠̼͔̻͔͙͔̰̘̠̪̣͉̫̻̪͉͉͈͖̞̮͇͓͖͎͉̼̺̮̼̣̜̩̩̠̯̭̤̠̦̳͙̱͉̺͈̱̙̖̘̠̳̤̼̬̗̠̮͙͈̠̣̜̰̘̣͓̙̗̞̪͍̺̮͙͓̪̭͉̙̳͙̩̟̖̪̬̹̦̮͇̌̽͑̈̐͛̉͛͐̂̿͆́̏́͛̊͂̊̋́̄̅͌́͗͑̓͂͑̐̎̐͛͐̈́̅̓͊̈́̊͊̽̽̒̈́̇̊͒́̓̉̓̀̋͋̃̉̑͌̃͂̿͐̅̊͌̊̓̚̚̕̚͜͜͜͜͜͝͠͠͠͝͝͝͠͝͝ͅͅͅͅͅͅf̴̢̧̢̢̡̡̢̧̧̢̡̡̢̡̡̧̨̛̛̛̛̙͚̭̥͖̜̘̪͉̭̘̱̖̲̘̝̤̣̙̲̙͍̣̤͇̘͔͖̦̥͔͍͎̟͍͎̤̩̘̘͈͕͖̜̲̱̩̭̬̣̪̦͔͚͇͙͎͔͍͈̪͚̝̭͖̰̥̪͕̫̩̼̘͎͔̺̱̙̖̱̲͕̭̯̖͔̞̪̗̤̼̬̟̳̣͓̱̖̟̮̫͙̦̲̙̯͇͎̯̲̲̼̰̱̼͓̣̮̤͇̗̙̫̗̫͓̟̹͖̹͈̠̱̥̩͔͉̐̄͆͑̉̆̅̀̎͛̑̐̆̅̀̓̓͆̿̍̈͆̄̀̍̐͗͂̈́́̾͛͂̊̋͒͆̅̈͂̑͆̅̃̀̇̅̿̍̈̓̈́́̀̉͒̆̾̀́͌̓́̑̈́̓̀̋̈́͌̈̀̾̄̊̑̉̔̓̈͆̾́̊͋̆̓͐́̊̑̌͗͐͌̋̃́̀͗̋̐̄̂͆̾̂̀͑͗̇̐̋͊͂̄̏͊͐̎͆͗̽̐̀̀̃͛̽͆́́̃͌̉̾͊̋͊͌͗͋͒̃́̇͋̉͒̈͆͗͊̐̀̓̈́͗̈́͌͂͋̉͋̔͌̏̈́̊́͂͐́̆̏̅͑͗͌̎͘͘̚̕͘̕̕̕̚͘̚̚̕͘͘̕͜͜͝͠͝͠͝͝͠͠͝͝͠͠͠͝͝ͅͅͅͅġ̶̡̢̢̧̧̧̛̛̛̛͕̮͉̝̜̬̰̙͉̙̺̳͔̺͚̝̝̳̫͖̹̩͓̠̘͕̮̙͎͖̘̜̞̱̙̩͙͇̦̖͓̼̫͔̭̰͔̣̯̗͉̠̭̭̹̼͓̥̤̪̥̖͚̟̱͍͍͚͈̞͎͖̞̝̮̘̺͓̩̼͚̺̩̯̈́͛̃͌̆͋̀͌̽̐̐̏͂̒̐̈́͗̾͆̆̿̉̈̔̂̌̌̀̽̂͐̆̂̂̈̇̎̓̾͗̆͒̒̄̽̅̀̑̿̔̃̇̈́̈́̀̐͋̋͋̔̅̈́́̽̓̈́̇̓̉̀̑͋͑́̅̿͊̊͒̂̊̂̔͛͆͋̎͌͛̃̽̇̀͗͒́̍̓̊̊̓̅́̒͗́̍̃̉͊̓̃̋͗̈̀͌͐̊̊̋͐̓̍́̊̄͛̍͊̐͒͑͑̀͗̈͒̾́͆̊̓̒̆͂̊́̈́͛̾̿̏̽̐̇̎͛̊̾̽͆̅̓̈́̉̋̋́̈́́͑̐̀̽̃̽͂́͛́̿̓̿̀̉̓̈̒̂̈́̿̔͂̐͋͛̀̃̆̐̂͌͑̐͊͗̍̌̒̽͑̚̕͘̕̕͘͘̚̚̕̕͘̚͘̕͘̕͜͜͝͝͝͝͝͝͝͝͝͝͠͝͝͝͝h̷̡̡̨̨̧̨̢̨̢̧̧̧̢̢̡̡̡̡̢̡̢̡̡̡̨̡̨̡̨̛̛̛̛͎̠͚͙̗͍̯͈̻̘̰̖͕̗͎̭̤̬͙̱̙͖̩͇̱͇̠̺̠̫͈̗͔͚̭̹͕̹͕̫̭̳̰͚̪̰̗̘̻̩͕̟̩̲̪̲̞͖̜̹̪̩̟̫̤̯͖͇̹͉̰͎̫̪̲̞̰̰̳̗̲̗̦͔͈̳̟̻̦̤͕̳̞̯̳͉̫̭̰̲̗̟̰͈̼̥̞̖̪̳̯̠͎̭͇̩̠͈̙͙͕͕̖̗͖͓̜̫̪̺̗̟̗̭̣͔̝̳̮̠̭̘̰͙͈̗͕̲̫̘̬͙͓͎̖̱͇͙̯̳͖̜̪̤̝̟̮͓̖̝̠͓̟͇̺̘̗̠̘̺̘̱͓̮̩̤̺̜̬̦̺͍̩͎̱̰͍̜͔̜̖̝̩͔̯̤͚̤̣̬͙̳͎̪̯͙͙̮͔̲͕̩̩͈͚͓̣̞̫͖̼͈͙̪͈̻̹͍̱͚͎̬̹͉͎͔̫̜͖͙̉͆̈́̄͆́̌͋̀̊̏͑͗́̐̄̓̉͋̍͋̒̔͗̿̂̈́͑͆͆̏̌̋̃͊̆̃̏́͒̑́̎͆͆͂̾̒̈̒͆̐̃́͆̽̐́͌̏͛̔̾͌̓͛̊͆̑̊̾̔̍̊̔͊́̅̾́̓̓̏̌̈́̔̄͒̑͆̾͐͂̾͐͂͗̒̀̉̒̀̑̄̽̄͛͗͛͒̋̑̂͛̌̓͂̾̔͑̎̾̂̑̒̎͌̔̽̑̓̿̍̆̃̽̉͗̽̓̐̾̆́͗͌̏̏͗̽̿̈́̽̈́͗̌̋̄̈́̽̚͘̕̕̕̚̕̕͘̕͘͘͘͜͜͜͜͜͜͜͜͝͠͠͝͠͝͝͝͠͝ͅͅͅͅͅf̴̨̧̡̛͔̹̯̠̜̦̩̞̳͉͉̳̳̙̥̜̤̗̞̗͚̮̱̻͆͌̈́̈́̊̍̎̍̓̄͐̓̉͌͆͐̃̀̈́̌̉̿̈́́̇̀̈͆̌̇͊͛̿͂́̎̐̊́̂͆̿̅͘͜͝g̸̡̧̡̧̢̡̨̧̨̧̧̡̨̡̨̧̨̢̨̨͔̻͈͇̦͕͔̘̖̪̞̠̜͕͚͇̗͙̫̗͔̫̝̲̟͖̫͈̜̮̪̣̰̰̯̤͍͚̗̗̼͔͈̜̼̹̱͓͔̱͔͓͍̥̘̱̫̬̥̜̩̤͈͈̙͙̘̮̣̟͖̯͓͖̥̫͉͇̬̻̝͉̯̳̲̬̗̥̟͎̻̭̣̺̥͔͕̟͙̹̪̞͚̖͔̥̗͖̭̞̫͎̯̟͉̱̫͇̱͙̮̞͕̱͎̜̙̭̻̰̮̝̳̹̗͉͔͓̦̖̘̙͉͉̘̟̖̞̥͕͍̲̜̀̂̿͋́̿͗̽͒̍́̊͑̐̏̿́̊͌̽́͑̌͗̎̌̎̉̃͋͘̕͜͜͜͠͝͠͠ͅͅͅh̸̨̧̢̡̡̧̡̛͎͚̗͕͖̣̰̞̬̺̠̖͖̰̪̬͕̮͙̦̖̰̟̪̖̳̩̖̜̱̺̭̪̮̩̬̹̬̞̭̰̺̦͙̝̠̠͎̪̥̗̣̖̭̤͔̮͉͈͎̣͛͑̉̂͐͊͋̒̾͊́͗̌̔̈́̏͊̆́͋̀͛̋̎̓̈̿͊̊̃̉̂̌̎̍͗̅͘͜͜͠͠͝͝͝͠ͅj̸̧̡̡̡̢̢̡̢̨̨̨̨̧̡̡̡̧̧̢̧̨̨̛̛̛̛͖̼̥̰̠͍̳͈͎̟͓̲̬͉͎͖̖̳͔̝͈͇̘̦̭͙͈̳͖̪̦͚̞͕̜̬̥̦̮̟͚̹̗͈̫̠̮͉̩̥̲̪͎̭͖̜̣͙͖͓̦̱̻̲̖͉̖̮͙̦͔̣̬̤̠̙̖̤͈͕͓̙͉͈̮̭̝̪͉̯̖̤̤̭̭͚̱̪̬͙̱̞͙̪͉̺͍̮̘̩̱̬̳̞̱͙̯̣̯̜̗͕̯̖̬̬͉̠̠̪͉͚͙̤̫̱̪̳̤̤͙̝̳̮͓̼̪̜̳̦̫͓̩̤̞̜̲̣̘̜̖̠̠͚̟̤̳͓͙͈̥̪͕̼͇͔͔͉͔̮͇̹̰̥̳̰̺̼̘̟̗̦̳͍̪̬̤͕̠̭͓͚͓̝̼̙̘͍͉̯͕̬̳̋͛̽̀͑̈́̑͌̀͛̓̈́̈́̂̒̈͆̇̒̔̾̍̍̾̉͒̄̊̆̏̈́͑̇̏͊̿͂̂̊͌̈́͗͐͐̌̃͌̽̋̔̍̏͒̐̑̈́̏͊̃̀̈̈́̎̂̈́͛͂̽́̈̉̆̀̍̏̉́̃͛͊̓̿͛͂̋̃̍̔̏̅̍̄̏͒̋̊̋͗͆̓͌̄̈́̄̀̄̒͗̀̎͊̆̑̐͆̿͗̎́͆̕̕͘͘͜͜͜͜͜͜͜͜͜͜͠͝͝ͅͅͅͅͅͅͅǵ̶̢̧̧̨̧̧̨̢̡̧̡̢̢̢̨̨̡̧̢̛̛̛̤̜͈͇̟̼͖̞̫̫͕̻̞̰̞̹͈̜̜̰͙̳͖̙̝̹͉̭͓͖̹̼̮̳͔̗̮̖͈͙͍̭͎̩̮̼͚̝̱̜̭̠̣̤̤̣̺̰̪͕̤̣̖̣̳̻͙̯̤͉̠̮̜̪̳̦̤̫͕͍͕̺̪̘̰̣̹̹͖͍̹̱̲̣̗͉̙̟̟͈̦͇̘̭̥͈͖̬̙̜̝̦͎̣̗͍̯͉̦͙̫̞̙̹̙̝̣̹̪̝͚̱̝͍͓̜̭͉͎̭̹͎̖̮̙͓̝̱̭̠̯̖͈̯̟̟͈̥̲͖̜͎̠͎̟̩̻̻̗̹͕͙̟̳̘͉͕̪͈̙̞̙͇̬̺̟̻̯̘͚͕̬̝͈͉̣̬͚̻͓͔̩̳̣̜̯̬̳͎̺͖̣̗͇̦͇̞͐͂̽̑̍͛̀̒͛͊͑̀̾̃̔̏̌̐̐̉́̆͋̈́̈̆̐͊̒̽̂̐̓͐̓͋͒̐̈́̀̈́̓̄̿́͊̒̇̒̌̑͗͛̊̇̎̀͒͊̌̒̂̓̆͌̎̔͊̆͋͛̓̾͑̈́̓͋̀̄́͆͒̓̀̉̈́̀̌̊͐̀̀̅͑̿̾̾̿̽͂̈̊̌̔̿̿͗̂̊̊̓̋͂̇͋͛͛̚̕̚̕̚̕̕̚̕̕̕͘̕͘͘͜͜͜͜͜͜͜͝͠͝͝͠͝͝͠͝͝͠ͅͅͅḩ̷̡̢̡̡̢̡̡̡̢̧̢̡̡̛̛̛̞̞̙̦̹͉̭͉͎̯̘̤̤̖̬̦̼̻̮̬͖̟̤̥̤͉̫̲̲͍͚͕̥̹͚̺͚̞̝͖̳̗̬̤̱̜̰̞͇̬͈̣͚͉̜̲̲̱̭̟̰̠̥̜̦̦̤̞͇͇̼̹͉̟̝̼̹̦͙͔̹͈͉̞͖̯̘͈̼̗̦̖͇̭͚͔͖̻̮̞̗͖̟͎̠̦̰͙̯͉̪̘̩̠̻͍͚̻̲̠͓̠̗͙̖̻̯͙͈̖̯̟̦͚̘̹̮̦̲̮̱̩̻̫̫̮̰̥̠̩͍̙̺͇̱̘̝͓̭̱̜̯͎͎̱͕̥͇̬̫͉͕̣̬̩̮̮̮̲̪͈͔̱̬̱̖͓̳͚̥̃̃̓̌͐̾̊̉̔͊̂̍̃͛̈́̃̏́̉̾̓̔̅́̑̎̃́͑͂̑̉̈́́̈̄̾̾̎͆͗͑̆̈̊̋̋̅̌̓̀͋̈́͋͛̈͛̀͗̌̓̈͐͐̿̔̅͒̈́̎̈́̃̒̃͋͗͆̿̏͗̑̈́̎͗̾̆̔͊̓́̾͒͑̆̑̍̑̽̈͋͒̑͆͐̇͌̇̾̈́̏̂͛͆̄͗̌̍̒̈́̄̈́̽͊̂̈́̐̽́̈͌̍̌̄̄̔̅̇̑̃́̄͊̔͗̏̌̀̆̍̍̎̑̓̔̐͆̋̿͆̈́̌̔̓̇́͗̿͗̎͂̋̾͆͛̃̆̔͌̓̌̅̃͊͛̎̔̋̈́͌͊̍̽͌͋́̈̿̆̿̆̔̉̋́́̂̚̚̚̚̕̕̚̕̚͘̕̕͜͜͜͜͜͜͝͝͝͝͝͠͝͠͠͝͠͝͝͝͝ͅͅj̴̢̨̨̨̧̧̛̛̛̛̛̖̥̲̟͔̝̰̘͓̲̜̼̪̦̩̝̲͇̣͓͉̼̦̙͍͇͚̩͇̩̖͍͉̦͎̤̯͉̬̺̜̣̰̪̹͔̜̻̝̹͎̖̝̱̰͔̙̺̤͖̩̤̱̫̞͔̝̖̱̠̬̳̺̘̘̬̗̙̹̗͚̦̥̱̜͇̹̻̻͚̪̞̥̼̜̙̟̼̰͕̣̖͖̗͚͓͚̦͈̣̭͓̳̲̦̜̖̖̣̼̠̩͓̣͕̞̱̤̻̮̳̺̠̗̝̮̦̗̩͔̪̦̤̬̺̦̻̼͌̏̐͗̅́̄̌͌̑͆͂́̆̈́̒͋̔̑͌̔͒̋̀͐̑̓͑̃̍́̿͑͗̐͒̍͐̏̽͆̐̈̒̊́̒̑͑̑̃̓̿͗͗̀͒͋̂̏̽̏̇̉̀͊̽̃̆̔̅͆͊͆͋̆̍̅̃̍̆͑̓͐̌̈́̈̀̒̿̈́̈́̃̀́̈̃́̌́̏̎͆̓̒̆̉̓͋̉̿͛̐̀̈́̀̊̿̈́̒̽́̑͊̍̐̋̉̾̈́́͂̈́̒͆͗̈́̽́͒͛̑̀̽͊̽͋͋̀͊̎̌͂̆̌̎̓̄̓͌̾̾̒̆̋̂́͊̄̉͌̑̇͂̋̔̎͌͊͂̀͂͑̃͛̽̿͌̂̈́̀͑̏̆̈̒̈̅͂̋̌̎̌̅̾̈́̓̒̍̊̆͛͛͒̀̀̽͂̈́͊̆̍̅̐̿̽͑͌͂͆͐̿̍͂̏̌̈́̈́̇́͊͗̃̆̑͐͛̑͗͗̇͐̍̀̽͆̍̚͘̚͘̕͘̕͘̚̚͘͘̚͜͜͜͜͜͝͠͝͝͠͠͝͝͝͠͠͝͠͠͠͝͠ͅͅk̵̨̧̢̢̧̨̨̧̡̧̧̡̨̨̢̨̧̨̨̛̬̖̰̦̟̟̘̠͙͙̗̮̙̤̞̭͇̟̖̘̦͎̹̠̭̘͙̝̹̳̫͇̠̺̠̪̤͍͉̘̲̞̣̦͉͉̻͉͖͍̝̻̤͈͕̼̼͍͙͖͙̤̯̙̟̪̰̤̻͎͙̹̱̩̭̲̱̰͇͙͖̝̩͇͉̲͉͈̱̝͈̫̲͚̣͙̘͔̩̥̝̮̳̭̤͍̘̤̪͈̮̮͉̘̰͕̖̻̦͕̝̭̘̙͇͔̘̥͓̱̪͖̺͍̭͚̹͉̼͙̫̭̜͇̲̯̘̙̹̘͚͔̹͖̟̯͓͍̣̜̮͈͈̥̱̖͙̲̤͓͈̪̰͕̼̍̄͋́̌́̏̀̐̽̑̎̋́̑̐͛͊̂͊̔̉͒̒͑͜͜͜͜͜ͅͅͅ';