From f2976aed6915f7f40725d66ba4f0e624898cb585 Mon Sep 17 00:00:00 2001 From: Jared Bain Date: Tue, 9 Jan 2024 12:42:33 -0500 Subject: [PATCH] ruby version 3 updates --- Gemfile.lock | 16 +- _config.yml | 21 + _includes/meta.html | 2 +- _projects/diu-tech-transfer.md | 2 +- _projects/diux-startups.md | 2 +- ...-equitable-and-efficient-infrastructure.md | 2 +- _projects/fbi-risk-management.md | 2 +- ...ating-telehealth-awareness-and-adoption.md | 2 +- _projects/nasa-asteroid-grand-challenge.md | 2 +- _projects/nci-cancer-moonshot.md | 2 +- .../nih-uniting-communications-and-science.md | 2 +- _projects/onc-blue-button-initiative.md | 2 +- .../smithsonian-digitizing-the-herbarium.md | 2 +- _projects/usmc-logistics.md | 2 +- _projects/va-cto-benefits.md | 2 +- _projects/va-cto.md | 2 +- ...ing-to-deliver-veterans-benefits-faster.md | 2 +- {assets/css/_sass => _sass}/_mixins.scss | 0 .../css/_sass => _sass}/_uswds-settings.scss | 0 {assets/css/_sass => _sass}/_utilities.scss | 0 .../css/_sass => _sass}/custom/_anchor.scss | 4 +- .../_sass => _sass}/custom/_breadcrumb.scss | 0 .../css/_sass => _sass}/custom/_filters.scss | 4 +- .../custom/_footer-tagline.scss | 2 +- .../css/_sass => _sass}/custom/_image.scss | 0 .../_sass => _sass}/custom/_list-fellows.scss | 0 .../_sass => _sass}/custom/_pagination.scss | 0 .../css/_sass => _sass}/custom/_partner.scss | 0 .../_sass => _sass}/custom/_project-item.scss | 0 .../_sass => _sass}/custom/_project-team.scss | 0 .../css/_sass => _sass}/custom/_project.scss | 2 +- .../css/_sass => _sass}/custom/_quote.scss | 0 .../_sass => _sass}/custom/_site-card.scss | 0 .../css/_sass => _sass}/custom/_skipnav.scss | 0 .../story.scss => _sass/custom/_story.scss | 0 .../_sass => _sass}/custom/_typography.scss | 0 .../css/_sass => _sass}/custom/_work-box.scss | 0 .../css/_sass => _sass}/searchgov/_form.scss | 4 +- .../uswds-overrides/_banner.scss | 0 .../uswds-overrides/_button.scss | 0 .../uswds-overrides/_footer.scss | 0 .../uswds-overrides/_form.scss | 0 .../uswds-overrides/_graphic-list.scss | 0 .../uswds-overrides/_hero.scss | 14 +- .../uswds-overrides/_intro.scss | 0 .../uswds-overrides/_list.scss | 0 .../uswds-overrides/_logo.scss | 0 .../uswds-overrides/_menu.scss | 0 .../_sass => _sass}/uswds-overrides/_nav.scss | 0 .../uswds-overrides/_section.scss | 0 .../uswds-overrides/_social-link.scss | 2 +- assets/css/{_sass => }/index.scss | 0 assets/css/styles.scss | 129 + assets/js/uswds-init.js | 40 + assets/js/uswds-init.min.js | 2 + assets/js/uswds-init.min.js.map | 1 + assets/js/uswds.js | 6542 +++++++++++++++++ assets/js/uswds.min.js | 2 + assets/js/uswds.min.js.map | 1 + assets/uswds/alerts/emergency.svg | 4 + assets/uswds/alerts/error-white.svg | 1 + assets/uswds/alerts/error.svg | 4 + assets/uswds/alerts/info.svg | 4 + assets/uswds/alerts/success.svg | 1 + assets/uswds/alerts/warning.svg | 4 + assets/uswds/angle-arrow-down-gray-90.svg | 1 + assets/uswds/angle-arrow-down-hover.svg | 1 + .../uswds/angle-arrow-down-primary-hover.svg | 1 + assets/uswds/angle-arrow-down-primary.svg | 1 + assets/uswds/angle-arrow-down-white.svg | 1 + assets/uswds/angle-arrow-down.svg | 1 + assets/uswds/angle-arrow-right-white.svg | 1 + assets/uswds/angle-arrow-right.svg | 1 + assets/uswds/angle-arrow-up-primary-hover.svg | 1 + assets/uswds/angle-arrow-up-primary.svg | 1 + assets/uswds/angle-arrow-up-white.svg | 1 + assets/uswds/angle-double-left-solid.svg | 1 + assets/uswds/angle-double-right-solid.svg | 1 + assets/uswds/angle-left-solid.svg | 1 + assets/uswds/angle-right-solid.svg | 1 + assets/uswds/arrow-both.svg | 1 + assets/uswds/arrow-down-gray-60.svg | 1 + assets/uswds/arrow-down.svg | 1 + assets/uswds/arrow-left-indigo-cool-50v.svg | 1 + assets/uswds/arrow-left-white.svg | 1 + assets/uswds/arrow-left.svg | 1 + assets/uswds/arrow-right.svg | 1 + assets/uswds/calendar-alt-solid.svg | 1 + assets/uswds/checkbox-check-print.svg | 1 + assets/uswds/chevron-right-white.svg | 1 + assets/uswds/chevron-right.svg | 1 + assets/uswds/chevron-white.svg | 1 + assets/uswds/chevron.svg | 1 + assets/uswds/circle-124.png | Bin 0 -> 2232 bytes assets/uswds/circle-gray-20.svg | 1 + assets/uswds/close-alt-blue-60v.svg | 3 + assets/uswds/close-alt.svg | 3 + assets/uswds/close-blue-30-alt.svg | 3 + assets/uswds/close-blue-40v-alt.svg | 3 + assets/uswds/close-blue-50-alt.svg | 3 + assets/uswds/close-blue-50v-alt.svg | 3 + assets/uswds/close-blue-60-alt.svg | 3 + assets/uswds/close-blue-60v-alt.svg | 3 + assets/uswds/close-gray-60.svg | 1 + assets/uswds/close-gray-90-alt.svg | 3 + assets/uswds/close-primary.svg | 1 + assets/uswds/close-white-alt.svg | 3 + assets/uswds/close-white.svg | 3 + assets/uswds/close.svg | 1 + assets/uswds/correct8-alt.png | Bin 0 -> 211 bytes assets/uswds/correct8-alt.svg | 1 + assets/uswds/correct8.svg | 1 + assets/uswds/correct9.svg | 1 + assets/uswds/external-link-alt-hover.svg | 1 + assets/uswds/external-link-alt.svg | 1 + assets/uswds/external-link-hover.svg | 1 + assets/uswds/external-link.svg | 1 + assets/uswds/favicons/favicon-114.png | Bin 0 -> 5564 bytes assets/uswds/favicons/favicon-144.png | Bin 0 -> 7118 bytes assets/uswds/favicons/favicon-16.png | Bin 0 -> 616 bytes assets/uswds/favicons/favicon-192.png | Bin 0 -> 9747 bytes assets/uswds/favicons/favicon-40.png | Bin 0 -> 1785 bytes assets/uswds/favicons/favicon-57.png | Bin 0 -> 2657 bytes assets/uswds/favicons/favicon-72.png | Bin 0 -> 3370 bytes assets/uswds/favicons/favicon.ico | Bin 0 -> 15086 bytes assets/uswds/favicons/favicon.png | Bin 0 -> 12642 bytes assets/uswds/file-excel.svg | 1 + assets/uswds/file-pdf.svg | 1 + assets/uswds/file-video.svg | 1 + assets/uswds/file-word.svg | 1 + assets/uswds/file.svg | 1 + .../merriweather/Latin-Merriweather-Black.ttf | Bin 0 -> 47828 bytes .../Latin-Merriweather-Black.woff | Bin 0 -> 26568 bytes .../Latin-Merriweather-Black.woff2 | Bin 0 -> 21036 bytes .../Latin-Merriweather-BlackItalic.ttf | Bin 0 -> 41000 bytes .../Latin-Merriweather-BlackItalic.woff | Bin 0 -> 24324 bytes .../Latin-Merriweather-BlackItalic.woff2 | Bin 0 -> 19384 bytes .../merriweather/Latin-Merriweather-Bold.ttf | Bin 0 -> 47228 bytes .../merriweather/Latin-Merriweather-Bold.woff | Bin 0 -> 26892 bytes .../Latin-Merriweather-Bold.woff2 | Bin 0 -> 21308 bytes .../Latin-Merriweather-BoldItalic.ttf | Bin 0 -> 40472 bytes .../Latin-Merriweather-BoldItalic.woff | Bin 0 -> 24464 bytes .../Latin-Merriweather-BoldItalic.woff2 | Bin 0 -> 19568 bytes .../Latin-Merriweather-Italic.ttf | Bin 0 -> 39480 bytes .../Latin-Merriweather-Italic.woff | Bin 0 -> 24152 bytes .../Latin-Merriweather-Italic.woff2 | Bin 0 -> 19252 bytes .../merriweather/Latin-Merriweather-Light.ttf | Bin 0 -> 49164 bytes .../Latin-Merriweather-Light.woff | Bin 0 -> 26988 bytes .../Latin-Merriweather-Light.woff2 | Bin 0 -> 21260 bytes .../Latin-Merriweather-LightItalic.ttf | Bin 0 -> 39456 bytes .../Latin-Merriweather-LightItalic.woff | Bin 0 -> 23808 bytes .../Latin-Merriweather-LightItalic.woff2 | Bin 0 -> 18976 bytes .../Latin-Merriweather-Regular.ttf | Bin 0 -> 49484 bytes .../Latin-Merriweather-Regular.woff | Bin 0 -> 27512 bytes .../Latin-Merriweather-Regular.woff2 | Bin 0 -> 21692 bytes .../fonts/public-sans/PublicSans-Black.ttf | Bin 0 -> 79168 bytes .../fonts/public-sans/PublicSans-Black.woff | Bin 0 -> 38904 bytes .../fonts/public-sans/PublicSans-Black.woff2 | Bin 0 -> 31584 bytes .../public-sans/PublicSans-BlackItalic.ttf | Bin 0 -> 79016 bytes .../public-sans/PublicSans-BlackItalic.woff | Bin 0 -> 39580 bytes .../public-sans/PublicSans-BlackItalic.woff2 | Bin 0 -> 32192 bytes .../fonts/public-sans/PublicSans-Bold.ttf | Bin 0 -> 79468 bytes .../fonts/public-sans/PublicSans-Bold.woff | Bin 0 -> 40048 bytes .../fonts/public-sans/PublicSans-Bold.woff2 | Bin 0 -> 32404 bytes .../public-sans/PublicSans-BoldItalic.ttf | Bin 0 -> 79272 bytes .../public-sans/PublicSans-BoldItalic.woff | Bin 0 -> 40672 bytes .../public-sans/PublicSans-BoldItalic.woff2 | Bin 0 -> 33212 bytes .../public-sans/PublicSans-ExtraBold.ttf | Bin 0 -> 79904 bytes .../public-sans/PublicSans-ExtraBold.woff | Bin 0 -> 40144 bytes .../public-sans/PublicSans-ExtraBold.woff2 | Bin 0 -> 32700 bytes .../PublicSans-ExtraBoldItalic.ttf | Bin 0 -> 79768 bytes .../PublicSans-ExtraBoldItalic.woff | Bin 0 -> 40660 bytes .../PublicSans-ExtraBoldItalic.woff2 | Bin 0 -> 33160 bytes .../public-sans/PublicSans-ExtraLight.ttf | Bin 0 -> 80400 bytes .../public-sans/PublicSans-ExtraLight.woff | Bin 0 -> 40036 bytes .../public-sans/PublicSans-ExtraLight.woff2 | Bin 0 -> 32480 bytes .../PublicSans-ExtraLightItalic.ttf | Bin 0 -> 80296 bytes .../PublicSans-ExtraLightItalic.woff | Bin 0 -> 40504 bytes .../PublicSans-ExtraLightItalic.woff2 | Bin 0 -> 33044 bytes .../fonts/public-sans/PublicSans-Italic.ttf | Bin 0 -> 79568 bytes .../fonts/public-sans/PublicSans-Italic.woff | Bin 0 -> 40524 bytes .../fonts/public-sans/PublicSans-Italic.woff2 | Bin 0 -> 33036 bytes .../fonts/public-sans/PublicSans-Light.ttf | Bin 0 -> 79784 bytes .../fonts/public-sans/PublicSans-Light.woff | Bin 0 -> 40168 bytes .../fonts/public-sans/PublicSans-Light.woff2 | Bin 0 -> 32608 bytes .../public-sans/PublicSans-LightItalic.ttf | Bin 0 -> 79296 bytes .../public-sans/PublicSans-LightItalic.woff | Bin 0 -> 40480 bytes .../public-sans/PublicSans-LightItalic.woff2 | Bin 0 -> 32916 bytes .../fonts/public-sans/PublicSans-Medium.ttf | Bin 0 -> 79904 bytes .../fonts/public-sans/PublicSans-Medium.woff | Bin 0 -> 40244 bytes .../fonts/public-sans/PublicSans-Medium.woff2 | Bin 0 -> 32688 bytes .../public-sans/PublicSans-MediumItalic.ttf | Bin 0 -> 79372 bytes .../public-sans/PublicSans-MediumItalic.woff | Bin 0 -> 40500 bytes .../public-sans/PublicSans-MediumItalic.woff2 | Bin 0 -> 33088 bytes .../fonts/public-sans/PublicSans-Regular.ttf | Bin 0 -> 79904 bytes .../fonts/public-sans/PublicSans-Regular.woff | Bin 0 -> 40112 bytes .../public-sans/PublicSans-Regular.woff2 | Bin 0 -> 32548 bytes .../fonts/public-sans/PublicSans-SemiBold.ttf | Bin 0 -> 79296 bytes .../public-sans/PublicSans-SemiBold.woff | Bin 0 -> 40084 bytes .../public-sans/PublicSans-SemiBold.woff2 | Bin 0 -> 32588 bytes .../public-sans/PublicSans-SemiBoldItalic.ttf | Bin 0 -> 79352 bytes .../PublicSans-SemiBoldItalic.woff | Bin 0 -> 40532 bytes .../PublicSans-SemiBoldItalic.woff2 | Bin 0 -> 33060 bytes .../fonts/public-sans/PublicSans-Thin.ttf | Bin 0 -> 77708 bytes .../fonts/public-sans/PublicSans-Thin.woff | Bin 0 -> 38480 bytes .../fonts/public-sans/PublicSans-Thin.woff2 | Bin 0 -> 31120 bytes .../public-sans/PublicSans-ThinItalic.ttf | Bin 0 -> 76964 bytes .../public-sans/PublicSans-ThinItalic.woff | Bin 0 -> 38908 bytes .../public-sans/PublicSans-ThinItalic.woff2 | Bin 0 -> 31608 bytes .../roboto-mono/roboto-mono-v5-latin-100.ttf | Bin 0 -> 31836 bytes .../roboto-mono/roboto-mono-v5-latin-100.woff | Bin 0 -> 20080 bytes .../roboto-mono-v5-latin-100.woff2 | Bin 0 -> 16656 bytes .../roboto-mono-v5-latin-100italic.ttf | Bin 0 -> 31808 bytes .../roboto-mono-v5-latin-100italic.woff | Bin 0 -> 20716 bytes .../roboto-mono-v5-latin-100italic.woff2 | Bin 0 -> 17008 bytes .../roboto-mono/roboto-mono-v5-latin-300.ttf | Bin 0 -> 32160 bytes .../roboto-mono/roboto-mono-v5-latin-300.woff | Bin 0 -> 19884 bytes .../roboto-mono-v5-latin-300.woff2 | Bin 0 -> 16380 bytes .../roboto-mono-v5-latin-300italic.ttf | Bin 0 -> 32596 bytes .../roboto-mono-v5-latin-300italic.woff | Bin 0 -> 21052 bytes .../roboto-mono-v5-latin-300italic.woff2 | Bin 0 -> 17340 bytes .../roboto-mono/roboto-mono-v5-latin-500.ttf | Bin 0 -> 31168 bytes .../roboto-mono/roboto-mono-v5-latin-500.woff | Bin 0 -> 19656 bytes .../roboto-mono-v5-latin-500.woff2 | Bin 0 -> 16016 bytes .../roboto-mono-v5-latin-500italic.ttf | Bin 0 -> 32816 bytes .../roboto-mono-v5-latin-500italic.woff | Bin 0 -> 21128 bytes .../roboto-mono-v5-latin-500italic.woff2 | Bin 0 -> 17480 bytes .../roboto-mono/roboto-mono-v5-latin-700.ttf | Bin 0 -> 31092 bytes .../roboto-mono/roboto-mono-v5-latin-700.woff | Bin 0 -> 19564 bytes .../roboto-mono-v5-latin-700.woff2 | Bin 0 -> 15956 bytes .../roboto-mono-v5-latin-700italic.ttf | Bin 0 -> 32564 bytes .../roboto-mono-v5-latin-700italic.woff | Bin 0 -> 21132 bytes .../roboto-mono-v5-latin-700italic.woff2 | Bin 0 -> 17336 bytes .../roboto-mono-v5-latin-italic.ttf | Bin 0 -> 32336 bytes .../roboto-mono-v5-latin-italic.woff | Bin 0 -> 21096 bytes .../roboto-mono-v5-latin-italic.woff2 | Bin 0 -> 17312 bytes .../roboto-mono-v5-latin-regular.ttf | Bin 0 -> 31052 bytes .../roboto-mono-v5-latin-regular.woff | Bin 0 -> 19576 bytes .../roboto-mono-v5-latin-regular.woff2 | Bin 0 -> 16028 bytes .../sourcesanspro-black-webfont.ttf | Bin 0 -> 54096 bytes .../sourcesanspro-black-webfont.woff | Bin 0 -> 24888 bytes .../sourcesanspro-black-webfont.woff2 | Bin 0 -> 19560 bytes .../sourcesanspro-blackitalic-webfont.ttf | Bin 0 -> 38784 bytes .../sourcesanspro-blackitalic-webfont.woff | Bin 0 -> 19540 bytes .../sourcesanspro-blackitalic-webfont.woff2 | Bin 0 -> 15636 bytes .../sourcesanspro-bold-webfont.ttf | Bin 0 -> 54340 bytes .../sourcesanspro-bold-webfont.woff | Bin 0 -> 26040 bytes .../sourcesanspro-bold-webfont.woff2 | Bin 0 -> 20368 bytes .../sourcesanspro-bolditalic-webfont.ttf | Bin 0 -> 38760 bytes .../sourcesanspro-bolditalic-webfont.woff | Bin 0 -> 20164 bytes .../sourcesanspro-bolditalic-webfont.woff2 | Bin 0 -> 16416 bytes .../sourcesanspro-extralight-webfont.ttf | Bin 0 -> 53996 bytes .../sourcesanspro-extralight-webfont.woff | Bin 0 -> 25184 bytes .../sourcesanspro-extralight-webfont.woff2 | Bin 0 -> 19772 bytes ...sourcesanspro-extralightitalic-webfont.ttf | Bin 0 -> 39120 bytes ...ourcesanspro-extralightitalic-webfont.woff | Bin 0 -> 19548 bytes ...urcesanspro-extralightitalic-webfont.woff2 | Bin 0 -> 15728 bytes .../sourcesanspro-italic-webfont.ttf | Bin 0 -> 38848 bytes .../sourcesanspro-italic-webfont.woff | Bin 0 -> 20204 bytes .../sourcesanspro-italic-webfont.woff2 | Bin 0 -> 16372 bytes .../sourcesanspro-light-webfont.ttf | Bin 0 -> 54504 bytes .../sourcesanspro-light-webfont.woff | Bin 0 -> 25956 bytes .../sourcesanspro-light-webfont.woff2 | Bin 0 -> 20412 bytes .../sourcesanspro-lightitalic-webfont.ttf | Bin 0 -> 39144 bytes .../sourcesanspro-lightitalic-webfont.woff | Bin 0 -> 20256 bytes .../sourcesanspro-lightitalic-webfont.woff2 | Bin 0 -> 16316 bytes .../sourcesanspro-regular-webfont.ttf | Bin 0 -> 54432 bytes .../sourcesanspro-regular-webfont.woff | Bin 0 -> 26140 bytes .../sourcesanspro-regular-webfont.woff2 | Bin 0 -> 20540 bytes .../sourcesanspro-semibold-webfont.ttf | Bin 0 -> 54400 bytes .../sourcesanspro-semibold-webfont.woff | Bin 0 -> 26144 bytes .../sourcesanspro-semibold-webfont.woff2 | Bin 0 -> 20500 bytes .../sourcesanspro-semibolditalic-webfont.ttf | Bin 0 -> 38848 bytes .../sourcesanspro-semibolditalic-webfont.woff | Bin 0 -> 20084 bytes ...sourcesanspro-semibolditalic-webfont.woff2 | Bin 0 -> 16404 bytes assets/uswds/hero.png | Bin 0 -> 689079 bytes assets/uswds/icon-dot-gov.svg | 1 + assets/uswds/icon-https.svg | 1 + assets/uswds/img/alerts/emergency.svg | 4 + assets/uswds/img/alerts/error-white.svg | 1 + assets/uswds/img/alerts/error.svg | 4 + assets/uswds/img/alerts/info.svg | 4 + assets/uswds/img/alerts/success.svg | 1 + assets/uswds/img/alerts/warning.svg | 4 + assets/uswds/img/angle-arrow-down-gray-90.svg | 1 + assets/uswds/img/angle-arrow-down-hover.svg | 1 + .../img/angle-arrow-down-primary-hover.svg | 1 + assets/uswds/img/angle-arrow-down-primary.svg | 1 + assets/uswds/img/angle-arrow-down-white.svg | 1 + assets/uswds/img/angle-arrow-down.svg | 1 + assets/uswds/img/angle-arrow-right-white.svg | 1 + assets/uswds/img/angle-arrow-right.svg | 1 + .../img/angle-arrow-up-primary-hover.svg | 1 + assets/uswds/img/angle-arrow-up-primary.svg | 1 + assets/uswds/img/angle-arrow-up-white.svg | 1 + assets/uswds/img/angle-double-left-solid.svg | 1 + assets/uswds/img/angle-double-right-solid.svg | 1 + assets/uswds/img/angle-left-solid.svg | 1 + assets/uswds/img/angle-right-solid.svg | 1 + assets/uswds/img/arrow-both.svg | 1 + assets/uswds/img/arrow-down-gray-60.svg | 1 + assets/uswds/img/arrow-down.svg | 1 + .../uswds/img/arrow-left-indigo-cool-50v.svg | 1 + assets/uswds/img/arrow-left-white.svg | 1 + assets/uswds/img/arrow-left.svg | 1 + assets/uswds/img/arrow-right.svg | 1 + assets/uswds/img/calendar-alt-solid.svg | 1 + assets/uswds/img/checkbox-check-print.svg | 1 + assets/uswds/img/chevron-right-white.svg | 1 + assets/uswds/img/chevron-right.svg | 1 + assets/uswds/img/chevron-white.svg | 1 + assets/uswds/img/chevron.svg | 1 + assets/uswds/img/circle-124.png | Bin 0 -> 2232 bytes assets/uswds/img/circle-gray-20.svg | 1 + assets/uswds/img/close-alt-blue-60v.svg | 3 + assets/uswds/img/close-alt.svg | 3 + assets/uswds/img/close-blue-30-alt.svg | 3 + assets/uswds/img/close-blue-40v-alt.svg | 3 + assets/uswds/img/close-blue-50-alt.svg | 3 + assets/uswds/img/close-blue-50v-alt.svg | 3 + assets/uswds/img/close-blue-60-alt.svg | 3 + assets/uswds/img/close-blue-60v-alt.svg | 3 + assets/uswds/img/close-gray-60.svg | 1 + assets/uswds/img/close-gray-90-alt.svg | 3 + assets/uswds/img/close-primary.svg | 1 + assets/uswds/img/close-white-alt.svg | 3 + assets/uswds/img/close-white.svg | 3 + assets/uswds/img/close.svg | 1 + assets/uswds/img/correct8-alt.png | Bin 0 -> 211 bytes assets/uswds/img/correct8-alt.svg | 1 + assets/uswds/img/correct8.svg | 1 + assets/uswds/img/correct9.svg | 1 + assets/uswds/img/external-link-alt-hover.svg | 1 + assets/uswds/img/external-link-alt.svg | 1 + assets/uswds/img/external-link-hover.svg | 1 + assets/uswds/img/external-link.svg | 1 + assets/uswds/img/favicons/favicon-114.png | Bin 0 -> 5564 bytes assets/uswds/img/favicons/favicon-144.png | Bin 0 -> 7118 bytes assets/uswds/img/favicons/favicon-16.png | Bin 0 -> 616 bytes assets/uswds/img/favicons/favicon-192.png | Bin 0 -> 9747 bytes assets/uswds/img/favicons/favicon-40.png | Bin 0 -> 1785 bytes assets/uswds/img/favicons/favicon-57.png | Bin 0 -> 2657 bytes assets/uswds/img/favicons/favicon-72.png | Bin 0 -> 3370 bytes assets/uswds/img/favicons/favicon.ico | Bin 0 -> 15086 bytes assets/uswds/img/favicons/favicon.png | Bin 0 -> 12642 bytes assets/uswds/img/file-excel.svg | 1 + assets/uswds/img/file-pdf.svg | 1 + assets/uswds/img/file-video.svg | 1 + assets/uswds/img/file-word.svg | 1 + assets/uswds/img/file.svg | 1 + assets/uswds/img/hero.png | Bin 0 -> 689079 bytes assets/uswds/img/icon-dot-gov.svg | 1 + assets/uswds/img/icon-https.svg | 1 + assets/uswds/img/loader.gif | Bin 0 -> 11437 bytes assets/uswds/img/loader.svg | 1 + assets/uswds/img/lock.svg | 1 + assets/uswds/img/logo-img.png | Bin 0 -> 1022 bytes assets/uswds/img/material-icons/10k.svg | 1 + assets/uswds/img/material-icons/10mp.svg | 1 + assets/uswds/img/material-icons/11mp.svg | 1 + assets/uswds/img/material-icons/12mp.svg | 1 + assets/uswds/img/material-icons/13mp.svg | 1 + assets/uswds/img/material-icons/14mp.svg | 1 + assets/uswds/img/material-icons/15mp.svg | 1 + assets/uswds/img/material-icons/16mp.svg | 1 + assets/uswds/img/material-icons/17mp.svg | 1 + assets/uswds/img/material-icons/18mp.svg | 1 + assets/uswds/img/material-icons/19mp.svg | 1 + assets/uswds/img/material-icons/1k.svg | 1 + assets/uswds/img/material-icons/1k_plus.svg | 1 + assets/uswds/img/material-icons/20mp.svg | 1 + assets/uswds/img/material-icons/21mp.svg | 1 + assets/uswds/img/material-icons/22mp.svg | 1 + assets/uswds/img/material-icons/23mp.svg | 1 + assets/uswds/img/material-icons/24mp.svg | 1 + assets/uswds/img/material-icons/2k.svg | 1 + assets/uswds/img/material-icons/2k_plus.svg | 1 + assets/uswds/img/material-icons/2mp.svg | 1 + assets/uswds/img/material-icons/360.svg | 1 + .../uswds/img/material-icons/3d_rotation.svg | 1 + assets/uswds/img/material-icons/3k.svg | 1 + assets/uswds/img/material-icons/3k_plus.svg | 1 + assets/uswds/img/material-icons/3mp.svg | 1 + assets/uswds/img/material-icons/4k.svg | 1 + assets/uswds/img/material-icons/4k_plus.svg | 1 + assets/uswds/img/material-icons/4mp.svg | 1 + assets/uswds/img/material-icons/5g.svg | 1 + assets/uswds/img/material-icons/5k.svg | 1 + assets/uswds/img/material-icons/5k_plus.svg | 1 + assets/uswds/img/material-icons/5mp.svg | 1 + .../uswds/img/material-icons/6_ft_apart.svg | 1 + assets/uswds/img/material-icons/6k.svg | 1 + assets/uswds/img/material-icons/6k_plus.svg | 1 + assets/uswds/img/material-icons/6mp.svg | 1 + assets/uswds/img/material-icons/7k.svg | 1 + assets/uswds/img/material-icons/7k_plus.svg | 1 + assets/uswds/img/material-icons/7mp.svg | 1 + assets/uswds/img/material-icons/8k.svg | 1 + assets/uswds/img/material-icons/8k_plus.svg | 1 + assets/uswds/img/material-icons/8mp.svg | 1 + assets/uswds/img/material-icons/9k.svg | 1 + assets/uswds/img/material-icons/9k_plus.svg | 1 + assets/uswds/img/material-icons/9mp.svg | 1 + assets/uswds/img/material-icons/ac_unit.svg | 1 + .../uswds/img/material-icons/access_alarm.svg | 1 + .../img/material-icons/access_alarms.svg | 1 + .../uswds/img/material-icons/access_time.svg | 1 + .../img/material-icons/accessibility.svg | 1 + .../img/material-icons/accessibility_new.svg | 1 + .../uswds/img/material-icons/accessible.svg | 1 + .../img/material-icons/accessible_forward.svg | 1 + .../img/material-icons/account_balance.svg | 1 + .../material-icons/account_balance_wallet.svg | 1 + .../uswds/img/material-icons/account_box.svg | 1 + .../img/material-icons/account_circle.svg | 1 + .../uswds/img/material-icons/account_tree.svg | 1 + assets/uswds/img/material-icons/ad_units.svg | 1 + assets/uswds/img/material-icons/adb.svg | 1 + assets/uswds/img/material-icons/add.svg | 1 + .../uswds/img/material-icons/add_a_photo.svg | 1 + assets/uswds/img/material-icons/add_alarm.svg | 1 + assets/uswds/img/material-icons/add_alert.svg | 1 + assets/uswds/img/material-icons/add_box.svg | 1 + .../uswds/img/material-icons/add_business.svg | 1 + assets/uswds/img/material-icons/add_call.svg | 1 + assets/uswds/img/material-icons/add_chart.svg | 1 + .../uswds/img/material-icons/add_circle.svg | 1 + .../img/material-icons/add_circle_outline.svg | 1 + .../uswds/img/material-icons/add_comment.svg | 1 + .../uswds/img/material-icons/add_ic_call.svg | 1 + assets/uswds/img/material-icons/add_link.svg | 1 + .../uswds/img/material-icons/add_location.svg | 1 + .../img/material-icons/add_location_alt.svg | 1 + .../img/material-icons/add_moderator.svg | 1 + .../material-icons/add_photo_alternate.svg | 1 + assets/uswds/img/material-icons/add_road.svg | 1 + .../img/material-icons/add_shopping_cart.svg | 1 + assets/uswds/img/material-icons/add_task.svg | 1 + .../uswds/img/material-icons/add_to_drive.svg | 1 + .../img/material-icons/add_to_home_screen.svg | 1 + .../img/material-icons/add_to_photos.svg | 1 + .../uswds/img/material-icons/add_to_queue.svg | 1 + assets/uswds/img/material-icons/addchart.svg | 1 + assets/uswds/img/material-icons/adjust.svg | 1 + .../material-icons/admin_panel_settings.svg | 1 + .../uswds/img/material-icons/agriculture.svg | 1 + .../img/material-icons/airline_seat_flat.svg | 1 + .../airline_seat_flat_angled.svg | 1 + .../airline_seat_individual_suite.svg | 1 + .../airline_seat_legroom_extra.svg | 1 + .../airline_seat_legroom_normal.svg | 1 + .../airline_seat_legroom_reduced.svg | 1 + .../airline_seat_recline_extra.svg | 1 + .../airline_seat_recline_normal.svg | 1 + .../material-icons/airplanemode_active.svg | 1 + .../material-icons/airplanemode_inactive.svg | 1 + assets/uswds/img/material-icons/airplay.svg | 1 + .../img/material-icons/airport_shuttle.svg | 1 + assets/uswds/img/material-icons/alarm.svg | 1 + assets/uswds/img/material-icons/alarm_add.svg | 1 + assets/uswds/img/material-icons/alarm_off.svg | 1 + assets/uswds/img/material-icons/alarm_on.svg | 1 + assets/uswds/img/material-icons/album.svg | 1 + .../align_horizontal_center.svg | 1 + .../material-icons/align_horizontal_left.svg | 1 + .../material-icons/align_horizontal_right.svg | 1 + .../material-icons/align_vertical_bottom.svg | 1 + .../material-icons/align_vertical_center.svg | 1 + .../img/material-icons/align_vertical_top.svg | 1 + assets/uswds/img/material-icons/all_inbox.svg | 1 + .../img/material-icons/all_inclusive.svg | 1 + assets/uswds/img/material-icons/all_out.svg | 1 + assets/uswds/img/material-icons/alt_route.svg | 1 + .../img/material-icons/alternate_email.svg | 1 + .../uswds/img/material-icons/amp_stories.svg | 1 + assets/uswds/img/material-icons/analytics.svg | 1 + assets/uswds/img/material-icons/anchor.svg | 1 + assets/uswds/img/material-icons/android.svg | 1 + assets/uswds/img/material-icons/animation.svg | 1 + .../uswds/img/material-icons/announcement.svg | 1 + assets/uswds/img/material-icons/apartment.svg | 1 + assets/uswds/img/material-icons/api.svg | 1 + .../uswds/img/material-icons/app_blocking.svg | 1 + .../img/material-icons/app_registration.svg | 1 + .../img/material-icons/app_settings_alt.svg | 1 + assets/uswds/img/material-icons/approval.svg | 1 + assets/uswds/img/material-icons/apps.svg | 1 + .../uswds/img/material-icons/architecture.svg | 1 + assets/uswds/img/material-icons/archive.svg | 1 + .../uswds/img/material-icons/arrow_back.svg | 1 + .../img/material-icons/arrow_back_ios.svg | 1 + .../img/material-icons/arrow_circle_down.svg | 1 + .../img/material-icons/arrow_circle_up.svg | 1 + .../img/material-icons/arrow_downward.svg | 1 + .../img/material-icons/arrow_drop_down.svg | 1 + .../material-icons/arrow_drop_down_circle.svg | 1 + .../img/material-icons/arrow_drop_up.svg | 1 + .../img/material-icons/arrow_forward.svg | 1 + .../img/material-icons/arrow_forward_ios.svg | 1 + .../uswds/img/material-icons/arrow_left.svg | 1 + .../uswds/img/material-icons/arrow_right.svg | 1 + .../img/material-icons/arrow_right_alt.svg | 1 + .../uswds/img/material-icons/arrow_upward.svg | 1 + assets/uswds/img/material-icons/art_track.svg | 1 + assets/uswds/img/material-icons/article.svg | 1 + .../uswds/img/material-icons/aspect_ratio.svg | 1 + .../uswds/img/material-icons/assessment.svg | 1 + .../uswds/img/material-icons/assignment.svg | 1 + .../img/material-icons/assignment_ind.svg | 1 + .../img/material-icons/assignment_late.svg | 1 + .../img/material-icons/assignment_return.svg | 1 + .../material-icons/assignment_returned.svg | 1 + .../material-icons/assignment_turned_in.svg | 1 + assets/uswds/img/material-icons/assistant.svg | 1 + .../material-icons/assistant_direction.svg | 1 + .../material-icons/assistant_navigation.svg | 1 + .../img/material-icons/assistant_photo.svg | 1 + assets/uswds/img/material-icons/atm.svg | 1 + .../uswds/img/material-icons/attach_email.svg | 1 + .../uswds/img/material-icons/attach_file.svg | 1 + .../uswds/img/material-icons/attach_money.svg | 1 + .../uswds/img/material-icons/attachment.svg | 1 + .../uswds/img/material-icons/attractions.svg | 1 + .../uswds/img/material-icons/audiotrack.svg | 1 + .../uswds/img/material-icons/auto_awesome.svg | 1 + .../material-icons/auto_awesome_mosaic.svg | 1 + .../material-icons/auto_awesome_motion.svg | 1 + .../uswds/img/material-icons/auto_delete.svg | 1 + .../img/material-icons/auto_fix_high.svg | 1 + .../img/material-icons/auto_fix_normal.svg | 1 + .../uswds/img/material-icons/auto_fix_off.svg | 1 + .../uswds/img/material-icons/auto_stories.svg | 1 + assets/uswds/img/material-icons/autorenew.svg | 1 + assets/uswds/img/material-icons/av_timer.svg | 1 + .../material-icons/baby_changing_station.svg | 1 + assets/uswds/img/material-icons/backpack.svg | 1 + assets/uswds/img/material-icons/backspace.svg | 1 + assets/uswds/img/material-icons/backup.svg | 1 + .../uswds/img/material-icons/backup_table.svg | 1 + assets/uswds/img/material-icons/badge.svg | 1 + .../img/material-icons/bakery_dining.svg | 1 + assets/uswds/img/material-icons/ballot.svg | 1 + assets/uswds/img/material-icons/bar_chart.svg | 1 + .../img/material-icons/batch_prediction.svg | 1 + assets/uswds/img/material-icons/bathtub.svg | 1 + .../img/material-icons/battery_alert.svg | 1 + .../material-icons/battery_charging_full.svg | 1 + .../uswds/img/material-icons/battery_full.svg | 1 + .../uswds/img/material-icons/battery_std.svg | 1 + .../img/material-icons/battery_unknown.svg | 1 + .../uswds/img/material-icons/beach_access.svg | 1 + assets/uswds/img/material-icons/bedtime.svg | 1 + assets/uswds/img/material-icons/beenhere.svg | 1 + assets/uswds/img/material-icons/bento.svg | 1 + .../uswds/img/material-icons/bike_scooter.svg | 1 + assets/uswds/img/material-icons/biotech.svg | 1 + assets/uswds/img/material-icons/block.svg | 1 + .../img/material-icons/block_flipped.svg | 1 + assets/uswds/img/material-icons/bluetooth.svg | 1 + .../img/material-icons/bluetooth_audio.svg | 1 + .../material-icons/bluetooth_connected.svg | 1 + .../img/material-icons/bluetooth_disabled.svg | 1 + .../material-icons/bluetooth_searching.svg | 1 + .../img/material-icons/blur_circular.svg | 1 + .../uswds/img/material-icons/blur_linear.svg | 1 + assets/uswds/img/material-icons/blur_off.svg | 1 + assets/uswds/img/material-icons/blur_on.svg | 1 + assets/uswds/img/material-icons/bolt.svg | 1 + assets/uswds/img/material-icons/book.svg | 1 + .../uswds/img/material-icons/book_online.svg | 1 + assets/uswds/img/material-icons/bookmark.svg | 1 + .../img/material-icons/bookmark_border.svg | 1 + assets/uswds/img/material-icons/bookmarks.svg | 1 + .../uswds/img/material-icons/border_all.svg | 1 + .../img/material-icons/border_bottom.svg | 1 + .../uswds/img/material-icons/border_clear.svg | 1 + .../uswds/img/material-icons/border_color.svg | 1 + .../img/material-icons/border_horizontal.svg | 1 + .../uswds/img/material-icons/border_inner.svg | 1 + .../uswds/img/material-icons/border_left.svg | 1 + .../uswds/img/material-icons/border_outer.svg | 1 + .../uswds/img/material-icons/border_right.svg | 1 + .../uswds/img/material-icons/border_style.svg | 1 + .../uswds/img/material-icons/border_top.svg | 1 + .../img/material-icons/border_vertical.svg | 1 + .../img/material-icons/branding_watermark.svg | 1 + .../img/material-icons/breakfast_dining.svg | 1 + .../uswds/img/material-icons/brightness_1.svg | 1 + .../uswds/img/material-icons/brightness_2.svg | 1 + .../uswds/img/material-icons/brightness_3.svg | 1 + .../uswds/img/material-icons/brightness_4.svg | 1 + .../uswds/img/material-icons/brightness_5.svg | 1 + .../uswds/img/material-icons/brightness_6.svg | 1 + .../uswds/img/material-icons/brightness_7.svg | 1 + .../img/material-icons/brightness_auto.svg | 1 + .../img/material-icons/brightness_high.svg | 1 + .../img/material-icons/brightness_low.svg | 1 + .../img/material-icons/brightness_medium.svg | 1 + .../uswds/img/material-icons/broken_image.svg | 1 + .../material-icons/browser_not_supported.svg | 1 + .../img/material-icons/brunch_dining.svg | 1 + assets/uswds/img/material-icons/brush.svg | 1 + .../uswds/img/material-icons/bubble_chart.svg | 1 + .../uswds/img/material-icons/bug_report.svg | 1 + assets/uswds/img/material-icons/build.svg | 1 + .../uswds/img/material-icons/build_circle.svg | 1 + .../uswds/img/material-icons/burst_mode.svg | 1 + assets/uswds/img/material-icons/bus_alert.svg | 1 + assets/uswds/img/material-icons/business.svg | 1 + .../img/material-icons/business_center.svg | 1 + assets/uswds/img/material-icons/cached.svg | 1 + assets/uswds/img/material-icons/cake.svg | 1 + assets/uswds/img/material-icons/calculate.svg | 1 + .../img/material-icons/calendar_today.svg | 1 + .../img/material-icons/calendar_view_day.svg | 1 + assets/uswds/img/material-icons/call.svg | 1 + assets/uswds/img/material-icons/call_end.svg | 1 + assets/uswds/img/material-icons/call_made.svg | 1 + .../uswds/img/material-icons/call_merge.svg | 1 + .../uswds/img/material-icons/call_missed.svg | 1 + .../material-icons/call_missed_outgoing.svg | 1 + .../img/material-icons/call_received.svg | 1 + .../uswds/img/material-icons/call_split.svg | 1 + .../img/material-icons/call_to_action.svg | 1 + assets/uswds/img/material-icons/camera.svg | 1 + .../uswds/img/material-icons/camera_alt.svg | 1 + .../img/material-icons/camera_enhance.svg | 1 + .../uswds/img/material-icons/camera_front.svg | 1 + .../uswds/img/material-icons/camera_rear.svg | 1 + .../uswds/img/material-icons/camera_roll.svg | 1 + assets/uswds/img/material-icons/campaign.svg | 1 + assets/uswds/img/material-icons/cancel.svg | 1 + .../material-icons/cancel_presentation.svg | 1 + .../material-icons/cancel_schedule_send.svg | 1 + .../uswds/img/material-icons/car_rental.svg | 1 + .../uswds/img/material-icons/car_repair.svg | 1 + .../img/material-icons/card_giftcard.svg | 1 + .../img/material-icons/card_membership.svg | 1 + .../uswds/img/material-icons/card_travel.svg | 1 + assets/uswds/img/material-icons/carpenter.svg | 1 + assets/uswds/img/material-icons/cases.svg | 1 + assets/uswds/img/material-icons/casino.svg | 1 + assets/uswds/img/material-icons/cast.svg | 1 + .../img/material-icons/cast_connected.svg | 1 + .../img/material-icons/cast_for_education.svg | 1 + assets/uswds/img/material-icons/category.svg | 1 + .../uswds/img/material-icons/celebration.svg | 1 + assets/uswds/img/material-icons/cell_wifi.svg | 1 + .../material-icons/center_focus_strong.svg | 1 + .../img/material-icons/center_focus_weak.svg | 1 + .../img/material-icons/change_history.svg | 1 + .../img/material-icons/charging_station.svg | 1 + assets/uswds/img/material-icons/chat.svg | 1 + .../uswds/img/material-icons/chat_bubble.svg | 1 + .../material-icons/chat_bubble_outline.svg | 1 + assets/uswds/img/material-icons/check.svg | 1 + assets/uswds/img/material-icons/check_box.svg | 1 + .../check_box_outline_blank.svg | 1 + .../uswds/img/material-icons/check_circle.svg | 1 + .../material-icons/check_circle_outline.svg | 1 + assets/uswds/img/material-icons/checkroom.svg | 1 + .../uswds/img/material-icons/chevron_left.svg | 1 + .../img/material-icons/chevron_right.svg | 1 + .../uswds/img/material-icons/child_care.svg | 1 + .../img/material-icons/child_friendly.svg | 1 + .../img/material-icons/chrome_reader_mode.svg | 1 + assets/uswds/img/material-icons/circle.svg | 1 + .../material-icons/circle_notifications.svg | 1 + assets/uswds/img/material-icons/class.svg | 1 + .../uswds/img/material-icons/clean_hands.svg | 1 + .../img/material-icons/cleaning_services.svg | 1 + assets/uswds/img/material-icons/clear.svg | 1 + assets/uswds/img/material-icons/clear_all.svg | 1 + assets/uswds/img/material-icons/close.svg | 1 + .../img/material-icons/close_fullscreen.svg | 1 + .../img/material-icons/closed_caption.svg | 1 + .../closed_caption_disabled.svg | 1 + .../img/material-icons/closed_caption_off.svg | 1 + assets/uswds/img/material-icons/cloud.svg | 1 + .../uswds/img/material-icons/cloud_circle.svg | 1 + .../uswds/img/material-icons/cloud_done.svg | 1 + .../img/material-icons/cloud_download.svg | 1 + assets/uswds/img/material-icons/cloud_off.svg | 1 + .../uswds/img/material-icons/cloud_queue.svg | 1 + .../uswds/img/material-icons/cloud_upload.svg | 1 + assets/uswds/img/material-icons/code.svg | 1 + .../uswds/img/material-icons/collections.svg | 1 + .../material-icons/collections_bookmark.svg | 1 + .../uswds/img/material-icons/color_lens.svg | 1 + assets/uswds/img/material-icons/colorize.svg | 1 + assets/uswds/img/material-icons/comment.svg | 1 + .../uswds/img/material-icons/comment_bank.svg | 1 + assets/uswds/img/material-icons/commute.svg | 1 + assets/uswds/img/material-icons/compare.svg | 1 + .../img/material-icons/compare_arrows.svg | 1 + .../material-icons/compass_calibration.svg | 1 + assets/uswds/img/material-icons/compress.svg | 1 + assets/uswds/img/material-icons/computer.svg | 1 + .../material-icons/confirmation_number.svg | 1 + .../connect_without_contact.svg | 1 + .../uswds/img/material-icons/connected_tv.svg | 1 + .../uswds/img/material-icons/construction.svg | 1 + .../uswds/img/material-icons/contact_mail.svg | 1 + .../uswds/img/material-icons/contact_page.svg | 1 + .../img/material-icons/contact_phone.svg | 1 + .../img/material-icons/contact_support.svg | 1 + .../uswds/img/material-icons/contactless.svg | 1 + assets/uswds/img/material-icons/contacts.svg | 1 + .../uswds/img/material-icons/content_copy.svg | 1 + .../uswds/img/material-icons/content_cut.svg | 1 + .../img/material-icons/content_paste.svg | 1 + .../img/material-icons/control_camera.svg | 1 + .../img/material-icons/control_point.svg | 1 + .../control_point_duplicate.svg | 1 + assets/uswds/img/material-icons/copyright.svg | 1 + .../uswds/img/material-icons/coronavirus.svg | 1 + .../img/material-icons/corporate_fare.svg | 1 + .../uswds/img/material-icons/countertops.svg | 1 + assets/uswds/img/material-icons/create.svg | 1 + .../img/material-icons/create_new_folder.svg | 1 + .../uswds/img/material-icons/credit_card.svg | 1 + assets/uswds/img/material-icons/crop.svg | 1 + assets/uswds/img/material-icons/crop_16_9.svg | 1 + assets/uswds/img/material-icons/crop_3_2.svg | 1 + assets/uswds/img/material-icons/crop_5_4.svg | 1 + assets/uswds/img/material-icons/crop_7_5.svg | 1 + assets/uswds/img/material-icons/crop_din.svg | 1 + assets/uswds/img/material-icons/crop_free.svg | 1 + .../img/material-icons/crop_landscape.svg | 1 + .../img/material-icons/crop_original.svg | 1 + .../img/material-icons/crop_portrait.svg | 1 + .../uswds/img/material-icons/crop_rotate.svg | 1 + .../uswds/img/material-icons/crop_square.svg | 1 + assets/uswds/img/material-icons/dangerous.svg | 1 + assets/uswds/img/material-icons/dashboard.svg | 1 + .../material-icons/dashboard_customize.svg | 1 + .../uswds/img/material-icons/data_usage.svg | 1 + .../uswds/img/material-icons/date_range.svg | 1 + assets/uswds/img/material-icons/deck.svg | 1 + assets/uswds/img/material-icons/dehaze.svg | 1 + assets/uswds/img/material-icons/delete.svg | 1 + .../img/material-icons/delete_forever.svg | 1 + .../img/material-icons/delete_outline.svg | 1 + .../uswds/img/material-icons/delete_sweep.svg | 1 + .../img/material-icons/delivery_dining.svg | 1 + .../img/material-icons/departure_board.svg | 1 + .../uswds/img/material-icons/description.svg | 1 + .../img/material-icons/design_services.svg | 1 + .../desktop_access_disabled.svg | 1 + .../uswds/img/material-icons/desktop_mac.svg | 1 + .../img/material-icons/desktop_windows.svg | 1 + assets/uswds/img/material-icons/details.svg | 1 + .../img/material-icons/developer_board.svg | 1 + .../img/material-icons/developer_mode.svg | 1 + .../uswds/img/material-icons/device_hub.svg | 1 + .../img/material-icons/device_thermostat.svg | 1 + .../img/material-icons/device_unknown.svg | 1 + assets/uswds/img/material-icons/devices.svg | 1 + .../img/material-icons/devices_other.svg | 1 + .../uswds/img/material-icons/dialer_sip.svg | 1 + assets/uswds/img/material-icons/dialpad.svg | 1 + .../img/material-icons/dinner_dining.svg | 1 + .../uswds/img/material-icons/directions.svg | 1 + .../img/material-icons/directions_bike.svg | 1 + .../img/material-icons/directions_boat.svg | 1 + .../img/material-icons/directions_bus.svg | 1 + .../img/material-icons/directions_car.svg | 1 + .../img/material-icons/directions_off.svg | 1 + .../img/material-icons/directions_railway.svg | 1 + .../img/material-icons/directions_run.svg | 1 + .../img/material-icons/directions_subway.svg | 1 + .../img/material-icons/directions_transit.svg | 1 + .../img/material-icons/directions_walk.svg | 1 + .../uswds/img/material-icons/dirty_lens.svg | 1 + .../material-icons/disabled_by_default.svg | 1 + assets/uswds/img/material-icons/disc_full.svg | 1 + assets/uswds/img/material-icons/dns.svg | 1 + .../img/material-icons/do_not_disturb.svg | 1 + .../img/material-icons/do_not_disturb_alt.svg | 1 + .../img/material-icons/do_not_disturb_off.svg | 1 + .../img/material-icons/do_not_disturb_on.svg | 1 + .../uswds/img/material-icons/do_not_step.svg | 1 + .../uswds/img/material-icons/do_not_touch.svg | 1 + assets/uswds/img/material-icons/dock.svg | 1 + assets/uswds/img/material-icons/domain.svg | 1 + .../img/material-icons/domain_disabled.svg | 1 + .../material-icons/domain_verification.svg | 1 + assets/uswds/img/material-icons/done.svg | 1 + assets/uswds/img/material-icons/done_all.svg | 1 + .../uswds/img/material-icons/done_outline.svg | 1 + .../uswds/img/material-icons/donut_large.svg | 1 + .../uswds/img/material-icons/donut_small.svg | 1 + .../uswds/img/material-icons/double_arrow.svg | 1 + assets/uswds/img/material-icons/drafts.svg | 1 + .../uswds/img/material-icons/drag_handle.svg | 1 + .../img/material-icons/drag_indicator.svg | 1 + assets/uswds/img/material-icons/drive_eta.svg | 1 + .../img/material-icons/drive_file_move.svg | 1 + .../drive_file_move_outline.svg | 1 + .../drive_file_rename_outline.svg | 1 + .../material-icons/drive_folder_upload.svg | 1 + assets/uswds/img/material-icons/dry.svg | 1 + .../uswds/img/material-icons/dry_cleaning.svg | 1 + assets/uswds/img/material-icons/duo.svg | 1 + assets/uswds/img/material-icons/dvr.svg | 1 + .../uswds/img/material-icons/dynamic_feed.svg | 1 + .../uswds/img/material-icons/dynamic_form.svg | 1 + assets/uswds/img/material-icons/east.svg | 1 + assets/uswds/img/material-icons/eco.svg | 1 + assets/uswds/img/material-icons/edit.svg | 1 + .../img/material-icons/edit_attributes.svg | 1 + .../img/material-icons/edit_location.svg | 1 + assets/uswds/img/material-icons/edit_off.svg | 1 + assets/uswds/img/material-icons/edit_road.svg | 1 + assets/uswds/img/material-icons/eject.svg | 1 + assets/uswds/img/material-icons/elderly.svg | 1 + .../img/material-icons/electric_bike.svg | 1 + .../uswds/img/material-icons/electric_car.svg | 1 + .../img/material-icons/electric_moped.svg | 1 + .../img/material-icons/electric_rickshaw.svg | 1 + .../img/material-icons/electric_scooter.svg | 1 + .../material-icons/electrical_services.svg | 1 + assets/uswds/img/material-icons/elevator.svg | 1 + assets/uswds/img/material-icons/email.svg | 1 + .../img/material-icons/emoji_emotions.svg | 1 + .../uswds/img/material-icons/emoji_events.svg | 1 + .../uswds/img/material-icons/emoji_flags.svg | 1 + .../material-icons/emoji_food_beverage.svg | 1 + .../uswds/img/material-icons/emoji_nature.svg | 1 + .../img/material-icons/emoji_objects.svg | 1 + .../uswds/img/material-icons/emoji_people.svg | 1 + .../img/material-icons/emoji_symbols.svg | 1 + .../material-icons/emoji_transportation.svg | 1 + .../uswds/img/material-icons/engineering.svg | 1 + .../material-icons/enhanced_encryption.svg | 1 + assets/uswds/img/material-icons/equalizer.svg | 1 + assets/uswds/img/material-icons/error.svg | 1 + .../img/material-icons/error_outline.svg | 1 + assets/uswds/img/material-icons/escalator.svg | 1 + .../img/material-icons/escalator_warning.svg | 1 + assets/uswds/img/material-icons/euro.svg | 1 + .../uswds/img/material-icons/euro_symbol.svg | 1 + .../uswds/img/material-icons/ev_station.svg | 1 + assets/uswds/img/material-icons/event.svg | 1 + .../img/material-icons/event_available.svg | 1 + .../uswds/img/material-icons/event_busy.svg | 1 + .../uswds/img/material-icons/event_note.svg | 1 + .../uswds/img/material-icons/event_seat.svg | 1 + .../uswds/img/material-icons/exit_to_app.svg | 1 + assets/uswds/img/material-icons/expand.svg | 1 + .../uswds/img/material-icons/expand_less.svg | 1 + .../uswds/img/material-icons/expand_more.svg | 1 + assets/uswds/img/material-icons/explicit.svg | 1 + assets/uswds/img/material-icons/explore.svg | 1 + .../uswds/img/material-icons/explore_off.svg | 1 + assets/uswds/img/material-icons/exposure.svg | 1 + .../img/material-icons/exposure_neg_1.svg | 1 + .../img/material-icons/exposure_neg_2.svg | 1 + .../img/material-icons/exposure_plus_1.svg | 1 + .../img/material-icons/exposure_plus_2.svg | 1 + .../img/material-icons/exposure_zero.svg | 1 + assets/uswds/img/material-icons/extension.svg | 1 + assets/uswds/img/material-icons/face.svg | 1 + .../face_retouching_natural.svg | 1 + assets/uswds/img/material-icons/facebook.svg | 1 + .../uswds/img/material-icons/fact_check.svg | 1 + .../img/material-icons/family_restroom.svg | 1 + .../uswds/img/material-icons/fast_forward.svg | 1 + .../uswds/img/material-icons/fast_rewind.svg | 1 + assets/uswds/img/material-icons/fastfood.svg | 1 + assets/uswds/img/material-icons/favorite.svg | 1 + .../img/material-icons/favorite_border.svg | 1 + .../img/material-icons/featured_play_list.svg | 1 + .../img/material-icons/featured_video.svg | 1 + assets/uswds/img/material-icons/feedback.svg | 1 + assets/uswds/img/material-icons/fence.svg | 1 + assets/uswds/img/material-icons/festival.svg | 1 + assets/uswds/img/material-icons/fiber_dvr.svg | 1 + .../material-icons/fiber_manual_record.svg | 1 + assets/uswds/img/material-icons/fiber_new.svg | 1 + assets/uswds/img/material-icons/fiber_pin.svg | 1 + .../img/material-icons/fiber_smart_record.svg | 1 + assets/uswds/img/material-icons/file_copy.svg | 1 + .../img/material-icons/file_download.svg | 1 + .../img/material-icons/file_download_done.svg | 1 + .../uswds/img/material-icons/file_present.svg | 1 + .../uswds/img/material-icons/file_upload.svg | 1 + assets/uswds/img/material-icons/filter.svg | 1 + assets/uswds/img/material-icons/filter_1.svg | 1 + assets/uswds/img/material-icons/filter_2.svg | 1 + assets/uswds/img/material-icons/filter_3.svg | 1 + assets/uswds/img/material-icons/filter_4.svg | 1 + assets/uswds/img/material-icons/filter_5.svg | 1 + assets/uswds/img/material-icons/filter_6.svg | 1 + assets/uswds/img/material-icons/filter_7.svg | 1 + assets/uswds/img/material-icons/filter_8.svg | 1 + assets/uswds/img/material-icons/filter_9.svg | 1 + .../img/material-icons/filter_9_plus.svg | 1 + .../uswds/img/material-icons/filter_alt.svg | 1 + .../img/material-icons/filter_b_and_w.svg | 1 + .../material-icons/filter_center_focus.svg | 1 + .../uswds/img/material-icons/filter_drama.svg | 1 + .../img/material-icons/filter_frames.svg | 1 + .../uswds/img/material-icons/filter_hdr.svg | 1 + .../uswds/img/material-icons/filter_list.svg | 1 + .../img/material-icons/filter_list_alt.svg | 1 + .../uswds/img/material-icons/filter_none.svg | 1 + .../img/material-icons/filter_tilt_shift.svg | 1 + .../img/material-icons/filter_vintage.svg | 1 + .../uswds/img/material-icons/find_in_page.svg | 1 + .../uswds/img/material-icons/find_replace.svg | 1 + .../uswds/img/material-icons/fingerprint.svg | 1 + .../img/material-icons/fire_extinguisher.svg | 1 + assets/uswds/img/material-icons/fireplace.svg | 1 + .../uswds/img/material-icons/first_page.svg | 1 + .../uswds/img/material-icons/fit_screen.svg | 1 + .../img/material-icons/fitness_center.svg | 1 + assets/uswds/img/material-icons/flag.svg | 1 + assets/uswds/img/material-icons/flaky.svg | 1 + assets/uswds/img/material-icons/flare.svg | 1 + .../uswds/img/material-icons/flash_auto.svg | 1 + assets/uswds/img/material-icons/flash_off.svg | 1 + assets/uswds/img/material-icons/flash_on.svg | 1 + assets/uswds/img/material-icons/flight.svg | 1 + .../uswds/img/material-icons/flight_land.svg | 1 + .../img/material-icons/flight_takeoff.svg | 1 + assets/uswds/img/material-icons/flip.svg | 1 + .../material-icons/flip_camera_android.svg | 1 + .../img/material-icons/flip_camera_ios.svg | 1 + .../uswds/img/material-icons/flip_to_back.svg | 1 + .../img/material-icons/flip_to_front.svg | 1 + assets/uswds/img/material-icons/folder.svg | 1 + .../uswds/img/material-icons/folder_open.svg | 1 + .../img/material-icons/folder_shared.svg | 1 + .../img/material-icons/folder_special.svg | 1 + .../img/material-icons/follow_the_signs.svg | 1 + .../img/material-icons/font_download.svg | 1 + assets/uswds/img/material-icons/food_bank.svg | 1 + .../material-icons/format_align_center.svg | 1 + .../material-icons/format_align_justify.svg | 1 + .../img/material-icons/format_align_left.svg | 1 + .../img/material-icons/format_align_right.svg | 1 + .../uswds/img/material-icons/format_bold.svg | 1 + .../uswds/img/material-icons/format_clear.svg | 1 + .../img/material-icons/format_color_fill.svg | 1 + .../img/material-icons/format_color_reset.svg | 1 + .../img/material-icons/format_color_text.svg | 1 + .../material-icons/format_indent_decrease.svg | 1 + .../material-icons/format_indent_increase.svg | 1 + .../img/material-icons/format_italic.svg | 1 + .../material-icons/format_line_spacing.svg | 1 + .../material-icons/format_list_bulleted.svg | 1 + .../material-icons/format_list_numbered.svg | 1 + .../format_list_numbered_rtl.svg | 1 + .../uswds/img/material-icons/format_paint.svg | 1 + .../uswds/img/material-icons/format_quote.svg | 1 + .../img/material-icons/format_shapes.svg | 1 + .../uswds/img/material-icons/format_size.svg | 1 + .../material-icons/format_strikethrough.svg | 1 + .../format_textdirection_l_to_r.svg | 1 + .../format_textdirection_r_to_l.svg | 1 + .../img/material-icons/format_underlined.svg | 1 + assets/uswds/img/material-icons/forum.svg | 1 + assets/uswds/img/material-icons/forward.svg | 1 + .../uswds/img/material-icons/forward_10.svg | 1 + .../uswds/img/material-icons/forward_30.svg | 1 + assets/uswds/img/material-icons/forward_5.svg | 1 + .../img/material-icons/forward_to_inbox.svg | 1 + .../uswds/img/material-icons/foundation.svg | 1 + .../img/material-icons/free_breakfast.svg | 1 + .../uswds/img/material-icons/fullscreen.svg | 1 + .../img/material-icons/fullscreen_exit.svg | 1 + assets/uswds/img/material-icons/functions.svg | 1 + .../uswds/img/material-icons/g_translate.svg | 1 + assets/uswds/img/material-icons/gamepad.svg | 1 + assets/uswds/img/material-icons/games.svg | 1 + assets/uswds/img/material-icons/gavel.svg | 1 + assets/uswds/img/material-icons/gesture.svg | 1 + assets/uswds/img/material-icons/get_app.svg | 1 + assets/uswds/img/material-icons/gif.svg | 1 + .../uswds/img/material-icons/golf_course.svg | 1 + assets/uswds/img/material-icons/gps_fixed.svg | 1 + .../img/material-icons/gps_not_fixed.svg | 1 + assets/uswds/img/material-icons/gps_off.svg | 1 + assets/uswds/img/material-icons/grade.svg | 1 + assets/uswds/img/material-icons/gradient.svg | 1 + assets/uswds/img/material-icons/grading.svg | 1 + assets/uswds/img/material-icons/grain.svg | 1 + .../uswds/img/material-icons/graphic_eq.svg | 1 + assets/uswds/img/material-icons/grass.svg | 1 + assets/uswds/img/material-icons/grid_off.svg | 1 + assets/uswds/img/material-icons/grid_on.svg | 1 + assets/uswds/img/material-icons/grid_view.svg | 1 + assets/uswds/img/material-icons/group.svg | 1 + assets/uswds/img/material-icons/group_add.svg | 1 + .../uswds/img/material-icons/group_work.svg | 1 + assets/uswds/img/material-icons/groups.svg | 1 + assets/uswds/img/material-icons/hail.svg | 1 + assets/uswds/img/material-icons/handyman.svg | 1 + assets/uswds/img/material-icons/hardware.svg | 1 + assets/uswds/img/material-icons/hd.svg | 1 + .../material-icons/hdr_enhanced_select.svg | 1 + assets/uswds/img/material-icons/hdr_off.svg | 1 + assets/uswds/img/material-icons/hdr_on.svg | 1 + .../uswds/img/material-icons/hdr_strong.svg | 1 + assets/uswds/img/material-icons/hdr_weak.svg | 1 + assets/uswds/img/material-icons/headset.svg | 1 + .../uswds/img/material-icons/headset_mic.svg | 1 + .../uswds/img/material-icons/headset_off.svg | 1 + assets/uswds/img/material-icons/healing.svg | 1 + assets/uswds/img/material-icons/hearing.svg | 1 + .../img/material-icons/hearing_disabled.svg | 1 + assets/uswds/img/material-icons/height.svg | 1 + assets/uswds/img/material-icons/help.svg | 1 + .../uswds/img/material-icons/help_center.svg | 1 + .../uswds/img/material-icons/help_outline.svg | 1 + .../uswds/img/material-icons/high_quality.svg | 1 + assets/uswds/img/material-icons/highlight.svg | 1 + .../img/material-icons/highlight_alt.svg | 1 + .../img/material-icons/highlight_off.svg | 1 + assets/uswds/img/material-icons/history.svg | 1 + .../uswds/img/material-icons/history_edu.svg | 1 + .../img/material-icons/history_toggle_off.svg | 1 + assets/uswds/img/material-icons/home.svg | 1 + .../uswds/img/material-icons/home_filled.svg | 1 + .../material-icons/home_repair_service.svg | 1 + assets/uswds/img/material-icons/home_work.svg | 1 + .../material-icons/horizontal_distribute.svg | 1 + .../img/material-icons/horizontal_rule.svg | 1 + .../img/material-icons/horizontal_split.svg | 1 + assets/uswds/img/material-icons/hot_tub.svg | 1 + assets/uswds/img/material-icons/hotel.svg | 1 + .../img/material-icons/hourglass_bottom.svg | 1 + .../img/material-icons/hourglass_disabled.svg | 1 + .../img/material-icons/hourglass_empty.svg | 1 + .../img/material-icons/hourglass_full.svg | 1 + .../img/material-icons/hourglass_top.svg | 1 + assets/uswds/img/material-icons/house.svg | 1 + .../uswds/img/material-icons/house_siding.svg | 1 + .../uswds/img/material-icons/how_to_reg.svg | 1 + .../uswds/img/material-icons/how_to_vote.svg | 1 + assets/uswds/img/material-icons/http.svg | 1 + assets/uswds/img/material-icons/https.svg | 1 + assets/uswds/img/material-icons/hvac.svg | 1 + assets/uswds/img/material-icons/icecream.svg | 1 + assets/uswds/img/material-icons/image.svg | 1 + .../img/material-icons/image_aspect_ratio.svg | 1 + .../material-icons/image_not_supported.svg | 1 + .../uswds/img/material-icons/image_search.svg | 1 + .../img/material-icons/imagesearch_roller.svg | 1 + .../img/material-icons/import_contacts.svg | 1 + .../img/material-icons/import_export.svg | 1 + .../img/material-icons/important_devices.svg | 1 + assets/uswds/img/material-icons/inbox.svg | 1 + .../indeterminate_check_box.svg | 1 + assets/uswds/img/material-icons/info.svg | 1 + .../uswds/img/material-icons/info_outline.svg | 1 + assets/uswds/img/material-icons/input.svg | 1 + .../uswds/img/material-icons/insert_chart.svg | 1 + .../material-icons/insert_chart_outlined.svg | 1 + .../img/material-icons/insert_comment.svg | 1 + .../img/material-icons/insert_drive_file.svg | 1 + .../img/material-icons/insert_emoticon.svg | 1 + .../img/material-icons/insert_invitation.svg | 1 + .../uswds/img/material-icons/insert_link.svg | 1 + .../uswds/img/material-icons/insert_photo.svg | 1 + assets/uswds/img/material-icons/insights.svg | 1 + .../integration_instructions.svg | 1 + assets/uswds/img/material-icons/inventory.svg | 1 + .../img/material-icons/invert_colors.svg | 1 + .../img/material-icons/invert_colors_off.svg | 1 + assets/uswds/img/material-icons/ios_share.svg | 1 + assets/uswds/img/material-icons/iso.svg | 1 + assets/uswds/img/material-icons/keyboard.svg | 1 + .../material-icons/keyboard_arrow_down.svg | 1 + .../material-icons/keyboard_arrow_left.svg | 1 + .../material-icons/keyboard_arrow_right.svg | 1 + .../img/material-icons/keyboard_arrow_up.svg | 1 + .../img/material-icons/keyboard_backspace.svg | 1 + .../img/material-icons/keyboard_capslock.svg | 1 + .../img/material-icons/keyboard_hide.svg | 1 + .../img/material-icons/keyboard_return.svg | 1 + .../uswds/img/material-icons/keyboard_tab.svg | 1 + .../img/material-icons/keyboard_voice.svg | 1 + assets/uswds/img/material-icons/king_bed.svg | 1 + assets/uswds/img/material-icons/kitchen.svg | 1 + assets/uswds/img/material-icons/label.svg | 1 + .../img/material-icons/label_important.svg | 1 + .../label_important_outline.svg | 1 + assets/uswds/img/material-icons/label_off.svg | 1 + .../img/material-icons/label_outline.svg | 1 + assets/uswds/img/material-icons/landscape.svg | 1 + assets/uswds/img/material-icons/language.svg | 1 + assets/uswds/img/material-icons/laptop.svg | 1 + .../img/material-icons/laptop_chromebook.svg | 1 + .../uswds/img/material-icons/laptop_mac.svg | 1 + .../img/material-icons/laptop_windows.svg | 1 + assets/uswds/img/material-icons/last_page.svg | 1 + assets/uswds/img/material-icons/launch.svg | 1 + assets/uswds/img/material-icons/layers.svg | 1 + .../uswds/img/material-icons/layers_clear.svg | 1 + .../uswds/img/material-icons/leaderboard.svg | 1 + assets/uswds/img/material-icons/leak_add.svg | 1 + .../uswds/img/material-icons/leak_remove.svg | 1 + .../img/material-icons/legend_toggle.svg | 1 + assets/uswds/img/material-icons/lens.svg | 1 + .../uswds/img/material-icons/library_add.svg | 1 + .../img/material-icons/library_add_check.svg | 1 + .../img/material-icons/library_books.svg | 1 + .../img/material-icons/library_music.svg | 1 + assets/uswds/img/material-icons/lightbulb.svg | 1 + .../img/material-icons/lightbulb_outline.svg | 1 + .../uswds/img/material-icons/line_style.svg | 1 + .../uswds/img/material-icons/line_weight.svg | 1 + .../uswds/img/material-icons/linear_scale.svg | 1 + assets/uswds/img/material-icons/link.svg | 1 + assets/uswds/img/material-icons/link_off.svg | 1 + .../img/material-icons/linked_camera.svg | 1 + assets/uswds/img/material-icons/liquor.svg | 1 + assets/uswds/img/material-icons/list.svg | 1 + assets/uswds/img/material-icons/list_alt.svg | 1 + assets/uswds/img/material-icons/live_help.svg | 1 + assets/uswds/img/material-icons/live_tv.svg | 1 + .../img/material-icons/local_activity.svg | 1 + .../img/material-icons/local_airport.svg | 1 + assets/uswds/img/material-icons/local_atm.svg | 1 + assets/uswds/img/material-icons/local_bar.svg | 1 + .../uswds/img/material-icons/local_cafe.svg | 1 + .../img/material-icons/local_car_wash.svg | 1 + .../local_convenience_store.svg | 1 + .../uswds/img/material-icons/local_dining.svg | 1 + .../uswds/img/material-icons/local_drink.svg | 1 + .../material-icons/local_fire_department.svg | 1 + .../img/material-icons/local_florist.svg | 1 + .../img/material-icons/local_gas_station.svg | 1 + .../material-icons/local_grocery_store.svg | 1 + .../img/material-icons/local_hospital.svg | 1 + .../uswds/img/material-icons/local_hotel.svg | 1 + .../material-icons/local_laundry_service.svg | 1 + .../img/material-icons/local_library.svg | 1 + .../uswds/img/material-icons/local_mall.svg | 1 + .../uswds/img/material-icons/local_movies.svg | 1 + .../uswds/img/material-icons/local_offer.svg | 1 + .../img/material-icons/local_parking.svg | 1 + .../img/material-icons/local_pharmacy.svg | 1 + .../uswds/img/material-icons/local_phone.svg | 1 + .../uswds/img/material-icons/local_pizza.svg | 1 + .../uswds/img/material-icons/local_play.svg | 1 + .../uswds/img/material-icons/local_police.svg | 1 + .../img/material-icons/local_post_office.svg | 1 + .../img/material-icons/local_printshop.svg | 1 + assets/uswds/img/material-icons/local_see.svg | 1 + .../img/material-icons/local_shipping.svg | 1 + .../uswds/img/material-icons/local_taxi.svg | 1 + .../img/material-icons/location_city.svg | 1 + .../img/material-icons/location_disabled.svg | 1 + .../uswds/img/material-icons/location_off.svg | 1 + .../uswds/img/material-icons/location_on.svg | 1 + .../uswds/img/material-icons/location_pin.svg | 1 + .../img/material-icons/location_searching.svg | 1 + assets/uswds/img/material-icons/lock.svg | 1 + .../uswds/img/material-icons/lock_clock.svg | 1 + assets/uswds/img/material-icons/lock_open.svg | 1 + .../uswds/img/material-icons/lock_outline.svg | 1 + assets/uswds/img/material-icons/login.svg | 1 + assets/uswds/img/material-icons/logout.svg | 1 + assets/uswds/img/material-icons/looks.svg | 1 + assets/uswds/img/material-icons/looks_3.svg | 1 + assets/uswds/img/material-icons/looks_4.svg | 1 + assets/uswds/img/material-icons/looks_5.svg | 1 + assets/uswds/img/material-icons/looks_6.svg | 1 + assets/uswds/img/material-icons/looks_one.svg | 1 + assets/uswds/img/material-icons/looks_two.svg | 1 + assets/uswds/img/material-icons/loop.svg | 1 + assets/uswds/img/material-icons/loupe.svg | 1 + .../uswds/img/material-icons/low_priority.svg | 1 + assets/uswds/img/material-icons/loyalty.svg | 1 + assets/uswds/img/material-icons/luggage.svg | 1 + .../uswds/img/material-icons/lunch_dining.svg | 1 + assets/uswds/img/material-icons/mail.svg | 1 + .../uswds/img/material-icons/mail_outline.svg | 1 + assets/uswds/img/material-icons/map.svg | 1 + assets/uswds/img/material-icons/maps_ugc.svg | 1 + assets/uswds/img/material-icons/margin.svg | 1 + .../img/material-icons/mark_as_unread.svg | 1 + .../img/material-icons/mark_chat_read.svg | 1 + .../img/material-icons/mark_chat_unread.svg | 1 + .../img/material-icons/mark_email_read.svg | 1 + .../img/material-icons/mark_email_unread.svg | 1 + .../uswds/img/material-icons/markunread.svg | 1 + .../img/material-icons/markunread_mailbox.svg | 1 + assets/uswds/img/material-icons/masks.svg | 1 + assets/uswds/img/material-icons/maximize.svg | 1 + assets/uswds/img/material-icons/mediation.svg | 1 + .../img/material-icons/medical_services.svg | 1 + .../uswds/img/material-icons/meeting_room.svg | 1 + assets/uswds/img/material-icons/memory.svg | 1 + assets/uswds/img/material-icons/menu.svg | 1 + assets/uswds/img/material-icons/menu_book.svg | 1 + assets/uswds/img/material-icons/menu_open.svg | 1 + .../uswds/img/material-icons/merge_type.svg | 1 + assets/uswds/img/material-icons/message.svg | 1 + assets/uswds/img/material-icons/mic.svg | 1 + .../img/material-icons/mic_external_off.svg | 1 + .../img/material-icons/mic_external_on.svg | 1 + assets/uswds/img/material-icons/mic_none.svg | 1 + assets/uswds/img/material-icons/mic_off.svg | 1 + assets/uswds/img/material-icons/microwave.svg | 1 + .../img/material-icons/military_tech.svg | 1 + assets/uswds/img/material-icons/minimize.svg | 1 + .../material-icons/miscellaneous_services.svg | 1 + .../img/material-icons/missed_video_call.svg | 1 + assets/uswds/img/material-icons/mms.svg | 1 + .../img/material-icons/mobile_friendly.svg | 1 + .../uswds/img/material-icons/mobile_off.svg | 1 + .../material-icons/mobile_screen_share.svg | 1 + .../uswds/img/material-icons/mode_comment.svg | 1 + assets/uswds/img/material-icons/mode_edit.svg | 1 + .../img/material-icons/model_training.svg | 1 + .../img/material-icons/monetization_on.svg | 1 + assets/uswds/img/material-icons/money.svg | 1 + assets/uswds/img/material-icons/money_off.svg | 1 + assets/uswds/img/material-icons/monitor.svg | 1 + .../img/material-icons/monochrome_photos.svg | 1 + assets/uswds/img/material-icons/mood.svg | 1 + assets/uswds/img/material-icons/mood_bad.svg | 1 + assets/uswds/img/material-icons/moped.svg | 1 + assets/uswds/img/material-icons/more.svg | 1 + .../uswds/img/material-icons/more_horiz.svg | 1 + assets/uswds/img/material-icons/more_time.svg | 1 + assets/uswds/img/material-icons/more_vert.svg | 1 + .../img/material-icons/motion_photos_off.svg | 1 + .../img/material-icons/motion_photos_on.svg | 1 + .../material-icons/motion_photos_pause.svg | 1 + .../material-icons/motion_photos_paused.svg | 1 + assets/uswds/img/material-icons/mouse.svg | 1 + .../img/material-icons/move_to_inbox.svg | 1 + assets/uswds/img/material-icons/movie.svg | 1 + .../img/material-icons/movie_creation.svg | 1 + .../uswds/img/material-icons/movie_filter.svg | 1 + assets/uswds/img/material-icons/mp.svg | 1 + .../img/material-icons/multiline_chart.svg | 1 + .../img/material-icons/multiple_stop.svg | 1 + assets/uswds/img/material-icons/museum.svg | 1 + .../uswds/img/material-icons/music_note.svg | 1 + assets/uswds/img/material-icons/music_off.svg | 1 + .../uswds/img/material-icons/music_video.svg | 1 + .../uswds/img/material-icons/my_location.svg | 1 + assets/uswds/img/material-icons/nat.svg | 1 + assets/uswds/img/material-icons/nature.svg | 1 + .../img/material-icons/nature_people.svg | 1 + .../img/material-icons/navigate_before.svg | 1 + .../img/material-icons/navigate_next.svg | 1 + .../uswds/img/material-icons/navigation.svg | 1 + assets/uswds/img/material-icons/near_me.svg | 1 + .../img/material-icons/near_me_disabled.svg | 1 + .../uswds/img/material-icons/network_cell.svg | 1 + .../img/material-icons/network_check.svg | 1 + .../img/material-icons/network_locked.svg | 1 + .../uswds/img/material-icons/network_wifi.svg | 1 + .../uswds/img/material-icons/new_releases.svg | 1 + assets/uswds/img/material-icons/next_plan.svg | 1 + assets/uswds/img/material-icons/next_week.svg | 1 + assets/uswds/img/material-icons/nfc.svg | 1 + .../img/material-icons/night_shelter.svg | 1 + assets/uswds/img/material-icons/nightlife.svg | 1 + .../img/material-icons/nightlight_round.svg | 1 + .../uswds/img/material-icons/nights_stay.svg | 1 + .../uswds/img/material-icons/no_backpack.svg | 1 + assets/uswds/img/material-icons/no_cell.svg | 1 + assets/uswds/img/material-icons/no_drinks.svg | 1 + .../img/material-icons/no_encryption.svg | 1 + assets/uswds/img/material-icons/no_flash.svg | 1 + assets/uswds/img/material-icons/no_food.svg | 1 + .../uswds/img/material-icons/no_luggage.svg | 1 + assets/uswds/img/material-icons/no_meals.svg | 1 + .../img/material-icons/no_meals_ouline.svg | 1 + .../img/material-icons/no_meeting_room.svg | 1 + .../img/material-icons/no_photography.svg | 1 + assets/uswds/img/material-icons/no_sim.svg | 1 + .../uswds/img/material-icons/no_stroller.svg | 1 + .../uswds/img/material-icons/no_transfer.svg | 1 + assets/uswds/img/material-icons/north.svg | 1 + .../uswds/img/material-icons/north_east.svg | 1 + .../uswds/img/material-icons/north_west.svg | 1 + .../img/material-icons/not_accessible.svg | 1 + .../img/material-icons/not_interested.svg | 1 + .../material-icons/not_listed_location.svg | 1 + .../uswds/img/material-icons/not_started.svg | 1 + assets/uswds/img/material-icons/note.svg | 1 + assets/uswds/img/material-icons/note_add.svg | 1 + assets/uswds/img/material-icons/notes.svg | 1 + .../material-icons/notification_important.svg | 1 + .../img/material-icons/notifications.svg | 1 + .../material-icons/notifications_active.svg | 1 + .../img/material-icons/notifications_none.svg | 1 + .../img/material-icons/notifications_off.svg | 1 + .../material-icons/notifications_paused.svg | 1 + .../uswds/img/material-icons/offline_bolt.svg | 1 + .../uswds/img/material-icons/offline_pin.svg | 1 + .../img/material-icons/offline_share.svg | 1 + .../img/material-icons/ondemand_video.svg | 1 + .../img/material-icons/online_prediction.svg | 1 + assets/uswds/img/material-icons/opacity.svg | 1 + .../img/material-icons/open_in_browser.svg | 1 + .../uswds/img/material-icons/open_in_full.svg | 1 + .../uswds/img/material-icons/open_in_new.svg | 1 + assets/uswds/img/material-icons/open_with.svg | 1 + assets/uswds/img/material-icons/outbond.svg | 1 + assets/uswds/img/material-icons/outbox.svg | 1 + .../img/material-icons/outdoor_grill.svg | 1 + .../img/material-icons/outgoing_mail.svg | 1 + assets/uswds/img/material-icons/outlet.svg | 1 + .../img/material-icons/outlined_flag.svg | 1 + assets/uswds/img/material-icons/padding.svg | 1 + assets/uswds/img/material-icons/pages.svg | 1 + assets/uswds/img/material-icons/pageview.svg | 1 + assets/uswds/img/material-icons/palette.svg | 1 + assets/uswds/img/material-icons/pan_tool.svg | 1 + assets/uswds/img/material-icons/panorama.svg | 1 + .../img/material-icons/panorama_fish_eye.svg | 1 + .../material-icons/panorama_horizontal.svg | 1 + .../panorama_horizontal_select.svg | 1 + .../material-icons/panorama_photosphere.svg | 1 + .../panorama_photosphere_select.svg | 1 + .../img/material-icons/panorama_vertical.svg | 1 + .../panorama_vertical_select.svg | 1 + .../material-icons/panorama_wide_angle.svg | 1 + .../panorama_wide_angle_select.svg | 1 + assets/uswds/img/material-icons/park.svg | 1 + .../uswds/img/material-icons/party_mode.svg | 1 + assets/uswds/img/material-icons/pause.svg | 1 + .../material-icons/pause_circle_filled.svg | 1 + .../material-icons/pause_circle_outline.svg | 1 + .../img/material-icons/pause_presentation.svg | 1 + assets/uswds/img/material-icons/payment.svg | 1 + assets/uswds/img/material-icons/payments.svg | 1 + .../uswds/img/material-icons/pedal_bike.svg | 1 + assets/uswds/img/material-icons/pending.svg | 1 + .../img/material-icons/pending_actions.svg | 1 + assets/uswds/img/material-icons/people.svg | 1 + .../uswds/img/material-icons/people_alt.svg | 1 + .../img/material-icons/people_outline.svg | 1 + .../img/material-icons/perm_camera_mic.svg | 1 + .../material-icons/perm_contact_calendar.svg | 1 + .../img/material-icons/perm_data_setting.svg | 1 + .../perm_device_information.svg | 1 + .../img/material-icons/perm_identity.svg | 1 + .../uswds/img/material-icons/perm_media.svg | 1 + .../img/material-icons/perm_phone_msg.svg | 1 + .../img/material-icons/perm_scan_wifi.svg | 1 + assets/uswds/img/material-icons/person.svg | 1 + .../uswds/img/material-icons/person_add.svg | 1 + .../img/material-icons/person_add_alt.svg | 1 + .../img/material-icons/person_add_alt_1.svg | 1 + .../material-icons/person_add_disabled.svg | 1 + .../img/material-icons/person_outline.svg | 1 + .../uswds/img/material-icons/person_pin.svg | 1 + .../img/material-icons/person_pin_circle.svg | 1 + .../img/material-icons/person_remove.svg | 1 + .../material-icons/person_remove_alt_1.svg | 1 + .../img/material-icons/person_search.svg | 1 + .../img/material-icons/personal_video.svg | 1 + .../uswds/img/material-icons/pest_control.svg | 1 + .../material-icons/pest_control_rodent.svg | 1 + assets/uswds/img/material-icons/pets.svg | 1 + assets/uswds/img/material-icons/phone.svg | 1 + .../img/material-icons/phone_android.svg | 1 + .../phone_bluetooth_speaker.svg | 1 + .../img/material-icons/phone_callback.svg | 1 + .../img/material-icons/phone_disabled.svg | 1 + .../img/material-icons/phone_enabled.svg | 1 + .../img/material-icons/phone_forwarded.svg | 1 + .../img/material-icons/phone_in_talk.svg | 1 + .../uswds/img/material-icons/phone_iphone.svg | 1 + .../uswds/img/material-icons/phone_locked.svg | 1 + .../uswds/img/material-icons/phone_missed.svg | 1 + .../uswds/img/material-icons/phone_paused.svg | 1 + assets/uswds/img/material-icons/phonelink.svg | 1 + .../img/material-icons/phonelink_erase.svg | 1 + .../img/material-icons/phonelink_lock.svg | 1 + .../img/material-icons/phonelink_off.svg | 1 + .../img/material-icons/phonelink_ring.svg | 1 + .../img/material-icons/phonelink_setup.svg | 1 + assets/uswds/img/material-icons/photo.svg | 1 + .../uswds/img/material-icons/photo_album.svg | 1 + .../uswds/img/material-icons/photo_camera.svg | 1 + .../img/material-icons/photo_camera_back.svg | 1 + .../img/material-icons/photo_camera_front.svg | 1 + .../uswds/img/material-icons/photo_filter.svg | 1 + .../img/material-icons/photo_library.svg | 1 + .../photo_size_select_actual.svg | 1 + .../photo_size_select_large.svg | 1 + .../photo_size_select_small.svg | 1 + .../img/material-icons/picture_as_pdf.svg | 1 + .../img/material-icons/picture_in_picture.svg | 1 + .../material-icons/picture_in_picture_alt.svg | 1 + assets/uswds/img/material-icons/pie_chart.svg | 1 + .../img/material-icons/pie_chart_outlined.svg | 1 + assets/uswds/img/material-icons/pin_drop.svg | 1 + .../img/material-icons/pivot_table_chart.svg | 1 + assets/uswds/img/material-icons/place.svg | 1 + .../uswds/img/material-icons/plagiarism.svg | 1 + .../uswds/img/material-icons/play_arrow.svg | 1 + .../img/material-icons/play_circle_filled.svg | 1 + .../material-icons/play_circle_outline.svg | 1 + .../img/material-icons/play_disabled.svg | 1 + .../img/material-icons/play_for_work.svg | 1 + .../uswds/img/material-icons/playlist_add.svg | 1 + .../img/material-icons/playlist_add_check.svg | 1 + .../img/material-icons/playlist_play.svg | 1 + assets/uswds/img/material-icons/plumbing.svg | 1 + assets/uswds/img/material-icons/plus_one.svg | 1 + .../img/material-icons/point_of_sale.svg | 1 + assets/uswds/img/material-icons/policy.svg | 1 + assets/uswds/img/material-icons/poll.svg | 1 + assets/uswds/img/material-icons/polymer.svg | 1 + assets/uswds/img/material-icons/pool.svg | 1 + .../img/material-icons/portable_wifi_off.svg | 1 + assets/uswds/img/material-icons/portrait.svg | 1 + assets/uswds/img/material-icons/post_add.svg | 1 + assets/uswds/img/material-icons/power.svg | 1 + .../uswds/img/material-icons/power_input.svg | 1 + assets/uswds/img/material-icons/power_off.svg | 1 + .../img/material-icons/power_settings_new.svg | 1 + .../img/material-icons/pregnant_woman.svg | 1 + .../img/material-icons/present_to_all.svg | 1 + assets/uswds/img/material-icons/preview.svg | 1 + assets/uswds/img/material-icons/print.svg | 1 + .../img/material-icons/print_disabled.svg | 1 + .../img/material-icons/priority_high.svg | 1 + .../uswds/img/material-icons/privacy_tip.svg | 1 + .../uswds/img/material-icons/psychology.svg | 1 + assets/uswds/img/material-icons/public.svg | 1 + .../uswds/img/material-icons/public_off.svg | 1 + assets/uswds/img/material-icons/publish.svg | 1 + .../material-icons/published_with_changes.svg | 1 + assets/uswds/img/material-icons/push_pin.svg | 1 + assets/uswds/img/material-icons/qr_code.svg | 1 + assets/uswds/img/material-icons/qr_code_2.svg | 1 + .../img/material-icons/qr_code_scanner.svg | 1 + .../img/material-icons/query_builder.svg | 1 + .../img/material-icons/question_answer.svg | 1 + assets/uswds/img/material-icons/queue.svg | 1 + .../uswds/img/material-icons/queue_music.svg | 1 + .../img/material-icons/queue_play_next.svg | 1 + .../uswds/img/material-icons/quickreply.svg | 1 + assets/uswds/img/material-icons/radio.svg | 1 + .../material-icons/radio_button_checked.svg | 1 + .../material-icons/radio_button_unchecked.svg | 1 + .../img/material-icons/railway_alert.svg | 1 + .../uswds/img/material-icons/ramen_dining.svg | 1 + .../uswds/img/material-icons/rate_review.svg | 1 + assets/uswds/img/material-icons/read_more.svg | 1 + assets/uswds/img/material-icons/receipt.svg | 1 + .../uswds/img/material-icons/receipt_long.svg | 1 + .../img/material-icons/recent_actors.svg | 1 + assets/uswds/img/material-icons/recommend.svg | 1 + .../img/material-icons/record_voice_over.svg | 1 + assets/uswds/img/material-icons/redeem.svg | 1 + assets/uswds/img/material-icons/redo.svg | 1 + .../img/material-icons/reduce_capacity.svg | 1 + assets/uswds/img/material-icons/refresh.svg | 1 + assets/uswds/img/material-icons/remove.svg | 1 + .../img/material-icons/remove_circle.svg | 1 + .../material-icons/remove_circle_outline.svg | 1 + .../uswds/img/material-icons/remove_done.svg | 1 + .../img/material-icons/remove_from_queue.svg | 1 + .../img/material-icons/remove_moderator.svg | 1 + .../img/material-icons/remove_red_eye.svg | 1 + .../material-icons/remove_shopping_cart.svg | 1 + assets/uswds/img/material-icons/reorder.svg | 1 + assets/uswds/img/material-icons/repeat.svg | 1 + assets/uswds/img/material-icons/repeat_on.svg | 1 + .../uswds/img/material-icons/repeat_one.svg | 1 + .../img/material-icons/repeat_one_on.svg | 1 + assets/uswds/img/material-icons/replay.svg | 1 + assets/uswds/img/material-icons/replay_10.svg | 1 + assets/uswds/img/material-icons/replay_30.svg | 1 + assets/uswds/img/material-icons/replay_5.svg | 1 + .../material-icons/replay_circle_filled.svg | 1 + assets/uswds/img/material-icons/reply.svg | 1 + assets/uswds/img/material-icons/reply_all.svg | 1 + assets/uswds/img/material-icons/report.svg | 1 + .../uswds/img/material-icons/report_off.svg | 1 + .../img/material-icons/report_problem.svg | 1 + .../uswds/img/material-icons/request_page.svg | 1 + .../img/material-icons/request_quote.svg | 1 + assets/uswds/img/material-icons/reset_tv.svg | 1 + .../uswds/img/material-icons/restaurant.svg | 1 + .../img/material-icons/restaurant_menu.svg | 1 + assets/uswds/img/material-icons/restore.svg | 1 + .../img/material-icons/restore_from_trash.svg | 1 + .../uswds/img/material-icons/restore_page.svg | 1 + assets/uswds/img/material-icons/rice_bowl.svg | 1 + .../uswds/img/material-icons/ring_volume.svg | 1 + assets/uswds/img/material-icons/roofing.svg | 1 + assets/uswds/img/material-icons/room.svg | 1 + .../img/material-icons/room_preferences.svg | 1 + .../uswds/img/material-icons/room_service.svg | 1 + .../material-icons/rotate_90_degrees_ccw.svg | 1 + .../uswds/img/material-icons/rotate_left.svg | 1 + .../uswds/img/material-icons/rotate_right.svg | 1 + .../img/material-icons/rounded_corner.svg | 1 + assets/uswds/img/material-icons/router.svg | 1 + assets/uswds/img/material-icons/rowing.svg | 1 + assets/uswds/img/material-icons/rss_feed.svg | 1 + assets/uswds/img/material-icons/rtt.svg | 1 + assets/uswds/img/material-icons/rule.svg | 1 + .../uswds/img/material-icons/rule_folder.svg | 1 + .../uswds/img/material-icons/run_circle.svg | 1 + assets/uswds/img/material-icons/rv_hookup.svg | 1 + .../img/material-icons/safety_divider.svg | 1 + assets/uswds/img/material-icons/sanitizer.svg | 1 + assets/uswds/img/material-icons/satellite.svg | 1 + assets/uswds/img/material-icons/save.svg | 1 + assets/uswds/img/material-icons/save_alt.svg | 1 + .../uswds/img/material-icons/saved_search.svg | 1 + assets/uswds/img/material-icons/scanner.svg | 1 + .../uswds/img/material-icons/scatter_plot.svg | 1 + assets/uswds/img/material-icons/schedule.svg | 1 + .../img/material-icons/schedule_send.svg | 1 + assets/uswds/img/material-icons/school.svg | 1 + assets/uswds/img/material-icons/science.svg | 1 + assets/uswds/img/material-icons/score.svg | 1 + .../material-icons/screen_lock_landscape.svg | 1 + .../material-icons/screen_lock_portrait.svg | 1 + .../material-icons/screen_lock_rotation.svg | 1 + .../img/material-icons/screen_rotation.svg | 1 + .../material-icons/screen_search_desktop.svg | 1 + .../uswds/img/material-icons/screen_share.svg | 1 + assets/uswds/img/material-icons/sd.svg | 1 + assets/uswds/img/material-icons/sd_card.svg | 1 + .../uswds/img/material-icons/sd_storage.svg | 1 + assets/uswds/img/material-icons/search.svg | 1 + .../uswds/img/material-icons/search_off.svg | 1 + assets/uswds/img/material-icons/security.svg | 1 + assets/uswds/img/material-icons/segment.svg | 1 + .../uswds/img/material-icons/select_all.svg | 1 + .../img/material-icons/self_improvement.svg | 1 + assets/uswds/img/material-icons/send.svg | 1 + .../img/material-icons/send_and_archive.svg | 1 + .../img/material-icons/send_to_mobile.svg | 1 + .../uswds/img/material-icons/sensor_door.svg | 1 + .../img/material-icons/sensor_window.svg | 1 + .../material-icons/sentiment_dissatisfied.svg | 1 + .../img/material-icons/sentiment_neutral.svg | 1 + .../material-icons/sentiment_satisfied.svg | 1 + .../sentiment_satisfied_alt.svg | 1 + .../sentiment_very_dissatisfied.svg | 1 + .../sentiment_very_satisfied.svg | 1 + assets/uswds/img/material-icons/set_meal.svg | 1 + assets/uswds/img/material-icons/settings.svg | 1 + .../material-icons/settings_applications.svg | 1 + .../settings_backup_restore.svg | 1 + .../img/material-icons/settings_bluetooth.svg | 1 + .../material-icons/settings_brightness.svg | 1 + .../img/material-icons/settings_cell.svg | 1 + .../img/material-icons/settings_ethernet.svg | 1 + .../material-icons/settings_input_antenna.svg | 1 + .../settings_input_component.svg | 1 + .../settings_input_composite.svg | 1 + .../material-icons/settings_input_hdmi.svg | 1 + .../material-icons/settings_input_svideo.svg | 1 + .../img/material-icons/settings_overscan.svg | 1 + .../img/material-icons/settings_phone.svg | 1 + .../img/material-icons/settings_power.svg | 1 + .../img/material-icons/settings_remote.svg | 1 + .../settings_system_daydream.svg | 1 + .../img/material-icons/settings_voice.svg | 1 + assets/uswds/img/material-icons/share.svg | 1 + assets/uswds/img/material-icons/shield.svg | 1 + assets/uswds/img/material-icons/shop.svg | 1 + assets/uswds/img/material-icons/shop_two.svg | 1 + .../uswds/img/material-icons/shopping_bag.svg | 1 + .../img/material-icons/shopping_basket.svg | 1 + .../img/material-icons/shopping_cart.svg | 1 + .../uswds/img/material-icons/short_text.svg | 1 + .../uswds/img/material-icons/show_chart.svg | 1 + assets/uswds/img/material-icons/shuffle.svg | 1 + .../uswds/img/material-icons/shuffle_on.svg | 1 + .../img/material-icons/shutter_speed.svg | 1 + assets/uswds/img/material-icons/sick.svg | 1 + .../material-icons/signal_cellular_0_bar.svg | 1 + .../material-icons/signal_cellular_4_bar.svg | 1 + .../material-icons/signal_cellular_alt.svg | 1 + ...l_cellular_connected_no_internet_4_bar.svg | 1 + .../material-icons/signal_cellular_no_sim.svg | 1 + .../material-icons/signal_cellular_null.svg | 1 + .../material-icons/signal_cellular_off.svg | 1 + .../img/material-icons/signal_wifi_0_bar.svg | 1 + .../img/material-icons/signal_wifi_4_bar.svg | 1 + .../material-icons/signal_wifi_4_bar_lock.svg | 1 + .../img/material-icons/signal_wifi_off.svg | 1 + assets/uswds/img/material-icons/sim_card.svg | 1 + .../img/material-icons/sim_card_alert.svg | 1 + .../uswds/img/material-icons/single_bed.svg | 1 + assets/uswds/img/material-icons/skip_next.svg | 1 + .../img/material-icons/skip_previous.svg | 1 + assets/uswds/img/material-icons/slideshow.svg | 1 + .../img/material-icons/slow_motion_video.svg | 1 + .../uswds/img/material-icons/smart_button.svg | 1 + .../uswds/img/material-icons/smartphone.svg | 1 + .../uswds/img/material-icons/smoke_free.svg | 1 + .../img/material-icons/smoking_rooms.svg | 1 + assets/uswds/img/material-icons/sms.svg | 1 + .../uswds/img/material-icons/sms_failed.svg | 1 + .../img/material-icons/snippet_folder.svg | 1 + assets/uswds/img/material-icons/snooze.svg | 1 + assets/uswds/img/material-icons/soap.svg | 1 + .../img/material-icons/social_distance.svg | 1 + assets/uswds/img/material-icons/sort.svg | 1 + .../img/material-icons/sort_by_alpha.svg | 1 + assets/uswds/img/material-icons/source.svg | 1 + assets/uswds/img/material-icons/south.svg | 1 + .../uswds/img/material-icons/south_east.svg | 1 + .../uswds/img/material-icons/south_west.svg | 1 + assets/uswds/img/material-icons/spa.svg | 1 + assets/uswds/img/material-icons/space_bar.svg | 1 + assets/uswds/img/material-icons/speaker.svg | 1 + .../img/material-icons/speaker_group.svg | 1 + .../img/material-icons/speaker_notes.svg | 1 + .../img/material-icons/speaker_notes_off.svg | 1 + .../img/material-icons/speaker_phone.svg | 1 + assets/uswds/img/material-icons/speed.svg | 1 + .../uswds/img/material-icons/spellcheck.svg | 1 + assets/uswds/img/material-icons/sports.svg | 1 + .../uswds/img/material-icons/sports_bar.svg | 1 + .../img/material-icons/sports_baseball.svg | 1 + .../img/material-icons/sports_basketball.svg | 1 + .../img/material-icons/sports_cricket.svg | 1 + .../img/material-icons/sports_esports.svg | 1 + .../img/material-icons/sports_football.svg | 1 + .../uswds/img/material-icons/sports_golf.svg | 1 + .../img/material-icons/sports_handball.svg | 1 + .../img/material-icons/sports_hockey.svg | 1 + .../img/material-icons/sports_kabaddi.svg | 1 + .../uswds/img/material-icons/sports_mma.svg | 1 + .../img/material-icons/sports_motorsports.svg | 1 + .../uswds/img/material-icons/sports_rugby.svg | 1 + .../img/material-icons/sports_soccer.svg | 1 + .../img/material-icons/sports_tennis.svg | 1 + .../img/material-icons/sports_volleyball.svg | 1 + .../uswds/img/material-icons/square_foot.svg | 1 + .../img/material-icons/stacked_bar_chart.svg | 1 + .../img/material-icons/stacked_line_chart.svg | 1 + assets/uswds/img/material-icons/stairs.svg | 1 + assets/uswds/img/material-icons/star.svg | 1 + .../uswds/img/material-icons/star_border.svg | 1 + assets/uswds/img/material-icons/star_half.svg | 1 + .../uswds/img/material-icons/star_outline.svg | 1 + assets/uswds/img/material-icons/star_rate.svg | 1 + assets/uswds/img/material-icons/stars.svg | 1 + .../material-icons/stay_current_landscape.svg | 1 + .../material-icons/stay_current_portrait.svg | 1 + .../material-icons/stay_primary_landscape.svg | 1 + .../material-icons/stay_primary_portrait.svg | 1 + .../img/material-icons/sticky_note_2.svg | 1 + assets/uswds/img/material-icons/stop.svg | 1 + .../uswds/img/material-icons/stop_circle.svg | 1 + .../img/material-icons/stop_screen_share.svg | 1 + assets/uswds/img/material-icons/storage.svg | 1 + assets/uswds/img/material-icons/store.svg | 1 + .../material-icons/store_mall_directory.svg | 1 + .../uswds/img/material-icons/storefront.svg | 1 + .../uswds/img/material-icons/straighten.svg | 1 + assets/uswds/img/material-icons/stream.svg | 1 + .../uswds/img/material-icons/streetview.svg | 1 + .../img/material-icons/strikethrough_s.svg | 1 + assets/uswds/img/material-icons/stroller.svg | 1 + assets/uswds/img/material-icons/style.svg | 1 + .../subdirectory_arrow_left.svg | 1 + .../subdirectory_arrow_right.svg | 1 + assets/uswds/img/material-icons/subject.svg | 1 + assets/uswds/img/material-icons/subscript.svg | 1 + .../img/material-icons/subscriptions.svg | 1 + assets/uswds/img/material-icons/subtitles.svg | 1 + .../img/material-icons/subtitles_off.svg | 1 + assets/uswds/img/material-icons/subway.svg | 1 + .../uswds/img/material-icons/superscript.svg | 1 + .../material-icons/supervised_user_circle.svg | 1 + .../img/material-icons/supervisor_account.svg | 1 + assets/uswds/img/material-icons/support.svg | 1 + .../img/material-icons/support_agent.svg | 1 + .../img/material-icons/surround_sound.svg | 1 + .../uswds/img/material-icons/swap_calls.svg | 1 + .../uswds/img/material-icons/swap_horiz.svg | 1 + .../material-icons/swap_horizontal_circle.svg | 1 + assets/uswds/img/material-icons/swap_vert.svg | 1 + .../material-icons/swap_vertical_circle.svg | 1 + assets/uswds/img/material-icons/swipe.svg | 1 + .../img/material-icons/switch_account.svg | 1 + .../img/material-icons/switch_camera.svg | 1 + .../uswds/img/material-icons/switch_left.svg | 1 + .../uswds/img/material-icons/switch_right.svg | 1 + .../uswds/img/material-icons/switch_video.svg | 1 + assets/uswds/img/material-icons/sync.svg | 1 + assets/uswds/img/material-icons/sync_alt.svg | 1 + .../img/material-icons/sync_disabled.svg | 1 + .../uswds/img/material-icons/sync_problem.svg | 1 + .../img/material-icons/system_update.svg | 1 + .../img/material-icons/system_update_alt.svg | 1 + assets/uswds/img/material-icons/tab.svg | 1 + .../img/material-icons/tab_unselected.svg | 1 + .../uswds/img/material-icons/table_chart.svg | 1 + .../uswds/img/material-icons/table_rows.svg | 1 + .../uswds/img/material-icons/table_view.svg | 1 + assets/uswds/img/material-icons/tablet.svg | 1 + .../img/material-icons/tablet_android.svg | 1 + .../uswds/img/material-icons/tablet_mac.svg | 1 + assets/uswds/img/material-icons/tag.svg | 1 + assets/uswds/img/material-icons/tag_faces.svg | 1 + .../img/material-icons/takeout_dining.svg | 1 + .../uswds/img/material-icons/tap_and_play.svg | 1 + assets/uswds/img/material-icons/tapas.svg | 1 + .../uswds/img/material-icons/taxi_alert.svg | 1 + assets/uswds/img/material-icons/terrain.svg | 1 + .../uswds/img/material-icons/text_fields.svg | 1 + .../uswds/img/material-icons/text_format.svg | 1 + .../img/material-icons/text_rotate_up.svg | 1 + .../material-icons/text_rotate_vertical.svg | 1 + .../text_rotation_angledown.svg | 1 + .../material-icons/text_rotation_angleup.svg | 1 + .../img/material-icons/text_rotation_down.svg | 1 + .../img/material-icons/text_rotation_none.svg | 1 + .../uswds/img/material-icons/text_snippet.svg | 1 + assets/uswds/img/material-icons/textsms.svg | 1 + assets/uswds/img/material-icons/texture.svg | 1 + .../img/material-icons/theater_comedy.svg | 1 + assets/uswds/img/material-icons/theaters.svg | 1 + .../uswds/img/material-icons/thumb_down.svg | 1 + .../img/material-icons/thumb_down_alt.svg | 1 + .../img/material-icons/thumb_down_off_alt.svg | 1 + assets/uswds/img/material-icons/thumb_up.svg | 1 + .../uswds/img/material-icons/thumb_up_alt.svg | 1 + .../img/material-icons/thumb_up_off_alt.svg | 1 + .../img/material-icons/thumbs_up_down.svg | 1 + .../img/material-icons/time_to_leave.svg | 1 + assets/uswds/img/material-icons/timelapse.svg | 1 + assets/uswds/img/material-icons/timeline.svg | 1 + assets/uswds/img/material-icons/timer.svg | 1 + assets/uswds/img/material-icons/timer_10.svg | 1 + assets/uswds/img/material-icons/timer_3.svg | 1 + assets/uswds/img/material-icons/timer_off.svg | 1 + assets/uswds/img/material-icons/title.svg | 1 + assets/uswds/img/material-icons/toc.svg | 1 + assets/uswds/img/material-icons/today.svg | 1 + .../uswds/img/material-icons/toggle_off.svg | 1 + assets/uswds/img/material-icons/toggle_on.svg | 1 + assets/uswds/img/material-icons/toll.svg | 1 + assets/uswds/img/material-icons/tonality.svg | 1 + assets/uswds/img/material-icons/topic.svg | 1 + assets/uswds/img/material-icons/touch_app.svg | 1 + assets/uswds/img/material-icons/tour.svg | 1 + assets/uswds/img/material-icons/toys.svg | 1 + .../img/material-icons/track_changes.svg | 1 + assets/uswds/img/material-icons/traffic.svg | 1 + assets/uswds/img/material-icons/train.svg | 1 + assets/uswds/img/material-icons/tram.svg | 1 + .../transfer_within_a_station.svg | 1 + assets/uswds/img/material-icons/transform.svg | 1 + .../img/material-icons/transit_enterexit.svg | 1 + assets/uswds/img/material-icons/translate.svg | 1 + .../img/material-icons/trending_down.svg | 1 + .../img/material-icons/trending_flat.svg | 1 + .../uswds/img/material-icons/trending_up.svg | 1 + .../uswds/img/material-icons/trip_origin.svg | 1 + assets/uswds/img/material-icons/tty.svg | 1 + assets/uswds/img/material-icons/tune.svg | 1 + assets/uswds/img/material-icons/turned_in.svg | 1 + .../img/material-icons/turned_in_not.svg | 1 + assets/uswds/img/material-icons/tv.svg | 1 + assets/uswds/img/material-icons/tv_off.svg | 1 + .../uswds/img/material-icons/two_wheeler.svg | 1 + assets/uswds/img/material-icons/umbrella.svg | 1 + assets/uswds/img/material-icons/unarchive.svg | 1 + assets/uswds/img/material-icons/undo.svg | 1 + .../uswds/img/material-icons/unfold_less.svg | 1 + .../uswds/img/material-icons/unfold_more.svg | 1 + .../uswds/img/material-icons/unpublished.svg | 1 + .../uswds/img/material-icons/unsubscribe.svg | 1 + assets/uswds/img/material-icons/update.svg | 1 + .../img/material-icons/update_disabled.svg | 1 + assets/uswds/img/material-icons/upgrade.svg | 1 + .../uswds/img/material-icons/upload_file.svg | 1 + assets/uswds/img/material-icons/usb.svg | 1 + assets/uswds/img/material-icons/verified.svg | 1 + .../img/material-icons/verified_user.svg | 1 + .../material-icons/vertical_align_bottom.svg | 1 + .../material-icons/vertical_align_center.svg | 1 + .../img/material-icons/vertical_align_top.svg | 1 + .../material-icons/vertical_distribute.svg | 1 + .../img/material-icons/vertical_split.svg | 1 + assets/uswds/img/material-icons/vibration.svg | 1 + .../uswds/img/material-icons/video_call.svg | 1 + .../uswds/img/material-icons/video_label.svg | 1 + .../img/material-icons/video_library.svg | 1 + .../img/material-icons/video_settings.svg | 1 + assets/uswds/img/material-icons/videocam.svg | 1 + .../uswds/img/material-icons/videocam_off.svg | 1 + .../img/material-icons/videogame_asset.svg | 1 + .../uswds/img/material-icons/view_agenda.svg | 1 + .../uswds/img/material-icons/view_array.svg | 1 + .../img/material-icons/view_carousel.svg | 1 + .../uswds/img/material-icons/view_column.svg | 1 + .../uswds/img/material-icons/view_comfy.svg | 1 + .../uswds/img/material-icons/view_compact.svg | 1 + assets/uswds/img/material-icons/view_day.svg | 1 + .../img/material-icons/view_headline.svg | 1 + .../uswds/img/material-icons/view_in_ar.svg | 1 + assets/uswds/img/material-icons/view_list.svg | 1 + .../uswds/img/material-icons/view_module.svg | 1 + .../uswds/img/material-icons/view_quilt.svg | 1 + .../uswds/img/material-icons/view_sidebar.svg | 1 + .../uswds/img/material-icons/view_stream.svg | 1 + assets/uswds/img/material-icons/view_week.svg | 1 + assets/uswds/img/material-icons/vignette.svg | 1 + .../uswds/img/material-icons/visibility.svg | 1 + .../img/material-icons/visibility_off.svg | 1 + .../uswds/img/material-icons/voice_chat.svg | 1 + .../img/material-icons/voice_over_off.svg | 1 + assets/uswds/img/material-icons/voicemail.svg | 1 + .../uswds/img/material-icons/volume_down.svg | 1 + .../uswds/img/material-icons/volume_mute.svg | 1 + .../uswds/img/material-icons/volume_off.svg | 1 + assets/uswds/img/material-icons/volume_up.svg | 1 + .../img/material-icons/volunteer_activism.svg | 1 + assets/uswds/img/material-icons/vpn_key.svg | 1 + assets/uswds/img/material-icons/vpn_lock.svg | 1 + assets/uswds/img/material-icons/wallpaper.svg | 1 + assets/uswds/img/material-icons/warning.svg | 1 + assets/uswds/img/material-icons/wash.svg | 1 + assets/uswds/img/material-icons/watch.svg | 1 + .../uswds/img/material-icons/watch_later.svg | 1 + .../uswds/img/material-icons/water_damage.svg | 1 + .../img/material-icons/waterfall_chart.svg | 1 + assets/uswds/img/material-icons/waves.svg | 1 + assets/uswds/img/material-icons/wb_auto.svg | 1 + assets/uswds/img/material-icons/wb_cloudy.svg | 1 + .../img/material-icons/wb_incandescent.svg | 1 + .../img/material-icons/wb_iridescent.svg | 1 + assets/uswds/img/material-icons/wb_shade.svg | 1 + assets/uswds/img/material-icons/wb_sunny.svg | 1 + .../img/material-icons/wb_twighlight.svg | 1 + assets/uswds/img/material-icons/wc.svg | 1 + assets/uswds/img/material-icons/web.svg | 1 + assets/uswds/img/material-icons/web_asset.svg | 1 + assets/uswds/img/material-icons/weekend.svg | 1 + assets/uswds/img/material-icons/west.svg | 1 + assets/uswds/img/material-icons/whatshot.svg | 1 + .../img/material-icons/wheelchair_pickup.svg | 1 + .../img/material-icons/where_to_vote.svg | 1 + assets/uswds/img/material-icons/widgets.svg | 1 + assets/uswds/img/material-icons/wifi.svg | 1 + .../uswds/img/material-icons/wifi_calling.svg | 1 + assets/uswds/img/material-icons/wifi_lock.svg | 1 + assets/uswds/img/material-icons/wifi_off.svg | 1 + .../material-icons/wifi_protected_setup.svg | 1 + .../img/material-icons/wifi_tethering.svg | 1 + assets/uswds/img/material-icons/wine_bar.svg | 1 + assets/uswds/img/material-icons/work.svg | 1 + assets/uswds/img/material-icons/work_off.svg | 1 + .../uswds/img/material-icons/work_outline.svg | 1 + .../img/material-icons/workspaces_filled.svg | 1 + .../img/material-icons/workspaces_outline.svg | 1 + assets/uswds/img/material-icons/wrap_text.svg | 1 + .../img/material-icons/wrong_location.svg | 1 + assets/uswds/img/material-icons/wysiwyg.svg | 1 + .../material-icons/youtube_searched_for.svg | 1 + assets/uswds/img/material-icons/zoom_in.svg | 1 + assets/uswds/img/material-icons/zoom_out.svg | 1 + .../uswds/img/material-icons/zoom_out_map.svg | 1 + assets/uswds/img/minus-alt.svg | 1 + assets/uswds/img/minus.svg | 1 + assets/uswds/img/plus-alt.svg | 1 + assets/uswds/img/plus.svg | 1 + assets/uswds/img/search-alt.svg | 1 + assets/uswds/img/search-primary.svg | 1 + assets/uswds/img/search.svg | 1 + assets/uswds/img/social-icons/facebook25.png | Bin 0 -> 270 bytes assets/uswds/img/social-icons/facebook25.svg | 1 + assets/uswds/img/social-icons/instagram25.png | Bin 0 -> 1215 bytes assets/uswds/img/social-icons/instagram25.svg | 1 + assets/uswds/img/social-icons/rss25.png | Bin 0 -> 502 bytes assets/uswds/img/social-icons/rss25.svg | 1 + assets/uswds/img/social-icons/twitter16.png | Bin 0 -> 431 bytes assets/uswds/img/social-icons/twitter16.svg | 1 + assets/uswds/img/social-icons/youtube15.png | Bin 0 -> 590 bytes assets/uswds/img/social-icons/youtube15.svg | 1 + assets/uswds/img/sprite.svg | 1 + assets/uswds/img/us_flag_small.png | Bin 0 -> 176 bytes assets/uswds/img/usa-icons-bg/add--white.svg | 1 + .../img/usa-icons-bg/check--blue-60v.svg | 1 + .../img/usa-icons-bg/check_circle--white.svg | 1 + .../uswds/img/usa-icons-bg/error--white.svg | 1 + .../img/usa-icons-bg/expand_less--white.svg | 1 + .../expand_more--blue-warm-70v.svg | 1 + .../img/usa-icons-bg/expand_more--white.svg | 1 + assets/uswds/img/usa-icons-bg/info--white.svg | 1 + .../img/usa-icons-bg/launch--blue-60v.svg | 1 + .../img/usa-icons-bg/launch--blue-70v.svg | 1 + .../uswds/img/usa-icons-bg/launch--gray-5.svg | 1 + .../uswds/img/usa-icons-bg/launch--white.svg | 1 + .../uswds/img/usa-icons-bg/remove--white.svg | 1 + .../uswds/img/usa-icons-bg/search--white.svg | 1 + .../uswds/img/usa-icons-bg/warning--white.svg | 1 + .../uswds/img/usa-icons/accessibility_new.svg | 1 + .../img/usa-icons/accessible_forward.svg | 1 + .../uswds/img/usa-icons/account_balance.svg | 1 + assets/uswds/img/usa-icons/account_box.svg | 1 + assets/uswds/img/usa-icons/account_circle.svg | 1 + assets/uswds/img/usa-icons/add.svg | 1 + assets/uswds/img/usa-icons/add_circle.svg | 1 + .../img/usa-icons/add_circle_outline.svg | 1 + assets/uswds/img/usa-icons/alarm.svg | 1 + .../uswds/img/usa-icons/alternate_email.svg | 1 + assets/uswds/img/usa-icons/announcement.svg | 1 + assets/uswds/img/usa-icons/api.svg | 1 + assets/uswds/img/usa-icons/arrow_back.svg | 1 + assets/uswds/img/usa-icons/arrow_downward.svg | 1 + .../uswds/img/usa-icons/arrow_drop_down.svg | 1 + assets/uswds/img/usa-icons/arrow_drop_up.svg | 1 + assets/uswds/img/usa-icons/arrow_forward.svg | 1 + assets/uswds/img/usa-icons/arrow_upward.svg | 1 + assets/uswds/img/usa-icons/assessment.svg | 1 + assets/uswds/img/usa-icons/attach_file.svg | 1 + assets/uswds/img/usa-icons/attach_money.svg | 1 + assets/uswds/img/usa-icons/autorenew.svg | 1 + assets/uswds/img/usa-icons/backpack.svg | 1 + assets/uswds/img/usa-icons/bathtub.svg | 1 + assets/uswds/img/usa-icons/bedding.svg | 1 + assets/uswds/img/usa-icons/bookmark.svg | 1 + assets/uswds/img/usa-icons/bug_report.svg | 1 + assets/uswds/img/usa-icons/build.svg | 1 + assets/uswds/img/usa-icons/calendar_today.svg | 1 + assets/uswds/img/usa-icons/campaign.svg | 1 + assets/uswds/img/usa-icons/camping.svg | 1 + assets/uswds/img/usa-icons/cancel.svg | 1 + assets/uswds/img/usa-icons/chat.svg | 1 + assets/uswds/img/usa-icons/check.svg | 1 + .../img/usa-icons/check_box_outline_blank.svg | 1 + assets/uswds/img/usa-icons/check_circle.svg | 1 + .../img/usa-icons/check_circle_outline.svg | 1 + assets/uswds/img/usa-icons/checkroom.svg | 1 + assets/uswds/img/usa-icons/chevron_left.svg | 1 + assets/uswds/img/usa-icons/chevron_right.svg | 1 + assets/uswds/img/usa-icons/clean_hands.svg | 1 + assets/uswds/img/usa-icons/close.svg | 1 + assets/uswds/img/usa-icons/closed_caption.svg | 1 + assets/uswds/img/usa-icons/clothes.svg | 1 + assets/uswds/img/usa-icons/cloud.svg | 1 + assets/uswds/img/usa-icons/code.svg | 1 + assets/uswds/img/usa-icons/comment.svg | 1 + .../img/usa-icons/connect_without_contact.svg | 1 + assets/uswds/img/usa-icons/construction.svg | 1 + .../img/usa-icons/construction_worker.svg | 1 + assets/uswds/img/usa-icons/contact_page.svg | 1 + assets/uswds/img/usa-icons/content_copy.svg | 1 + assets/uswds/img/usa-icons/coronavirus.svg | 1 + assets/uswds/img/usa-icons/credit_card.svg | 1 + assets/uswds/img/usa-icons/deck.svg | 1 + assets/uswds/img/usa-icons/delete.svg | 1 + .../uswds/img/usa-icons/device_thermostat.svg | 1 + assets/uswds/img/usa-icons/directions.svg | 1 + .../uswds/img/usa-icons/directions_bike.svg | 1 + assets/uswds/img/usa-icons/directions_bus.svg | 1 + assets/uswds/img/usa-icons/directions_car.svg | 1 + .../uswds/img/usa-icons/directions_walk.svg | 1 + assets/uswds/img/usa-icons/do_not_disturb.svg | 1 + assets/uswds/img/usa-icons/do_not_touch.svg | 1 + assets/uswds/img/usa-icons/drag_handle.svg | 1 + assets/uswds/img/usa-icons/eco.svg | 1 + assets/uswds/img/usa-icons/edit.svg | 1 + .../img/usa-icons/electrical_services.svg | 1 + assets/uswds/img/usa-icons/emoji_events.svg | 1 + assets/uswds/img/usa-icons/error.svg | 1 + assets/uswds/img/usa-icons/error_outline.svg | 1 + assets/uswds/img/usa-icons/event.svg | 1 + assets/uswds/img/usa-icons/expand_less.svg | 1 + assets/uswds/img/usa-icons/expand_more.svg | 1 + assets/uswds/img/usa-icons/facebook.svg | 1 + assets/uswds/img/usa-icons/fast_forward.svg | 1 + assets/uswds/img/usa-icons/fast_rewind.svg | 1 + assets/uswds/img/usa-icons/favorite.svg | 1 + .../uswds/img/usa-icons/favorite_border.svg | 1 + assets/uswds/img/usa-icons/file_download.svg | 1 + assets/uswds/img/usa-icons/file_present.svg | 1 + assets/uswds/img/usa-icons/file_upload.svg | 1 + assets/uswds/img/usa-icons/filter_alt.svg | 1 + assets/uswds/img/usa-icons/filter_list.svg | 1 + assets/uswds/img/usa-icons/fingerprint.svg | 1 + assets/uswds/img/usa-icons/first_page.svg | 1 + assets/uswds/img/usa-icons/flag.svg | 1 + assets/uswds/img/usa-icons/flickr.svg | 1 + assets/uswds/img/usa-icons/flight.svg | 1 + assets/uswds/img/usa-icons/flooding.svg | 1 + assets/uswds/img/usa-icons/folder.svg | 1 + assets/uswds/img/usa-icons/folder_open.svg | 1 + assets/uswds/img/usa-icons/format_quote.svg | 1 + assets/uswds/img/usa-icons/format_size.svg | 1 + assets/uswds/img/usa-icons/forum.svg | 1 + assets/uswds/img/usa-icons/github.svg | 1 + assets/uswds/img/usa-icons/grid_view.svg | 1 + assets/uswds/img/usa-icons/group_add.svg | 1 + assets/uswds/img/usa-icons/groups.svg | 1 + assets/uswds/img/usa-icons/hearing.svg | 1 + assets/uswds/img/usa-icons/help.svg | 1 + assets/uswds/img/usa-icons/help_outline.svg | 1 + assets/uswds/img/usa-icons/highlight_off.svg | 1 + assets/uswds/img/usa-icons/history.svg | 1 + assets/uswds/img/usa-icons/home.svg | 1 + assets/uswds/img/usa-icons/hospital.svg | 1 + assets/uswds/img/usa-icons/hotel.svg | 1 + .../uswds/img/usa-icons/hourglass_empty.svg | 1 + assets/uswds/img/usa-icons/hurricane.svg | 1 + assets/uswds/img/usa-icons/identification.svg | 1 + assets/uswds/img/usa-icons/image.svg | 1 + assets/uswds/img/usa-icons/info.svg | 1 + assets/uswds/img/usa-icons/info_outline.svg | 1 + assets/uswds/img/usa-icons/insights.svg | 1 + assets/uswds/img/usa-icons/instagram.svg | 1 + assets/uswds/img/usa-icons/keyboard.svg | 1 + assets/uswds/img/usa-icons/label.svg | 1 + assets/uswds/img/usa-icons/language.svg | 1 + assets/uswds/img/usa-icons/last_page.svg | 1 + assets/uswds/img/usa-icons/launch.svg | 1 + assets/uswds/img/usa-icons/lightbulb.svg | 1 + .../uswds/img/usa-icons/lightbulb_outline.svg | 1 + assets/uswds/img/usa-icons/link.svg | 1 + assets/uswds/img/usa-icons/link_off.svg | 1 + assets/uswds/img/usa-icons/list.svg | 1 + assets/uswds/img/usa-icons/local_cafe.svg | 1 + .../img/usa-icons/local_fire_department.svg | 1 + .../uswds/img/usa-icons/local_gas_station.svg | 1 + .../img/usa-icons/local_grocery_store.svg | 1 + assets/uswds/img/usa-icons/local_hospital.svg | 1 + .../img/usa-icons/local_laundry_service.svg | 1 + assets/uswds/img/usa-icons/local_library.svg | 1 + assets/uswds/img/usa-icons/local_offer.svg | 1 + assets/uswds/img/usa-icons/local_parking.svg | 1 + assets/uswds/img/usa-icons/local_pharmacy.svg | 1 + assets/uswds/img/usa-icons/local_police.svg | 1 + assets/uswds/img/usa-icons/local_taxi.svg | 1 + assets/uswds/img/usa-icons/location_city.svg | 1 + assets/uswds/img/usa-icons/location_on.svg | 1 + assets/uswds/img/usa-icons/lock.svg | 1 + assets/uswds/img/usa-icons/lock_open.svg | 1 + assets/uswds/img/usa-icons/lock_outline.svg | 1 + assets/uswds/img/usa-icons/login.svg | 1 + assets/uswds/img/usa-icons/logout.svg | 1 + assets/uswds/img/usa-icons/loop.svg | 1 + assets/uswds/img/usa-icons/mail.svg | 1 + assets/uswds/img/usa-icons/mail_outline.svg | 1 + assets/uswds/img/usa-icons/map.svg | 1 + assets/uswds/img/usa-icons/masks.svg | 1 + .../uswds/img/usa-icons/medical_services.svg | 1 + assets/uswds/img/usa-icons/menu.svg | 1 + assets/uswds/img/usa-icons/military_tech.svg | 1 + assets/uswds/img/usa-icons/more_horiz.svg | 1 + assets/uswds/img/usa-icons/more_vert.svg | 1 + assets/uswds/img/usa-icons/my_location.svg | 1 + .../uswds/img/usa-icons/navigate_before.svg | 1 + .../img/usa-icons/navigate_far_before.svg | 1 + .../uswds/img/usa-icons/navigate_far_next.svg | 1 + assets/uswds/img/usa-icons/navigate_next.svg | 1 + assets/uswds/img/usa-icons/near_me.svg | 1 + assets/uswds/img/usa-icons/notifications.svg | 1 + .../img/usa-icons/notifications_active.svg | 1 + .../img/usa-icons/notifications_none.svg | 1 + .../uswds/img/usa-icons/notifications_off.svg | 1 + assets/uswds/img/usa-icons/park.svg | 1 + assets/uswds/img/usa-icons/people.svg | 1 + assets/uswds/img/usa-icons/person.svg | 1 + assets/uswds/img/usa-icons/pets.svg | 1 + assets/uswds/img/usa-icons/phone.svg | 1 + assets/uswds/img/usa-icons/photo_camera.svg | 1 + assets/uswds/img/usa-icons/print.svg | 1 + assets/uswds/img/usa-icons/priority_high.svg | 1 + assets/uswds/img/usa-icons/public.svg | 1 + assets/uswds/img/usa-icons/push_pin.svg | 1 + .../img/usa-icons/radio_button_unchecked.svg | 1 + assets/uswds/img/usa-icons/rain.svg | 1 + .../uswds/img/usa-icons/reduce_capacity.svg | 1 + assets/uswds/img/usa-icons/remove.svg | 1 + assets/uswds/img/usa-icons/report.svg | 1 + assets/uswds/img/usa-icons/restaurant.svg | 1 + assets/uswds/img/usa-icons/rss_feed.svg | 1 + assets/uswds/img/usa-icons/safety_divider.svg | 1 + assets/uswds/img/usa-icons/sanitizer.svg | 1 + assets/uswds/img/usa-icons/save_alt.svg | 1 + assets/uswds/img/usa-icons/schedule.svg | 1 + assets/uswds/img/usa-icons/school.svg | 1 + assets/uswds/img/usa-icons/science.svg | 1 + assets/uswds/img/usa-icons/search.svg | 1 + assets/uswds/img/usa-icons/security.svg | 1 + assets/uswds/img/usa-icons/send.svg | 1 + .../img/usa-icons/sentiment_dissatisfied.svg | 1 + .../uswds/img/usa-icons/sentiment_neutral.svg | 1 + .../img/usa-icons/sentiment_satisfied.svg | 1 + .../img/usa-icons/sentiment_satisfied_alt.svg | 1 + .../usa-icons/sentiment_very_dissatisfied.svg | 1 + assets/uswds/img/usa-icons/settings.svg | 1 + assets/uswds/img/usa-icons/severe_weather.svg | 1 + assets/uswds/img/usa-icons/share.svg | 1 + assets/uswds/img/usa-icons/shield.svg | 1 + .../uswds/img/usa-icons/shopping_basket.svg | 1 + assets/uswds/img/usa-icons/snow.svg | 1 + assets/uswds/img/usa-icons/soap.svg | 1 + .../uswds/img/usa-icons/social_distance.svg | 1 + assets/uswds/img/usa-icons/sort_arrow.svg | 1 + assets/uswds/img/usa-icons/spellcheck.svg | 1 + assets/uswds/img/usa-icons/star.svg | 1 + assets/uswds/img/usa-icons/star_half.svg | 1 + assets/uswds/img/usa-icons/star_outline.svg | 1 + assets/uswds/img/usa-icons/store.svg | 1 + assets/uswds/img/usa-icons/support.svg | 1 + assets/uswds/img/usa-icons/support_agent.svg | 1 + assets/uswds/img/usa-icons/text_fields.svg | 1 + assets/uswds/img/usa-icons/thumb_down_alt.svg | 1 + assets/uswds/img/usa-icons/thumb_up_alt.svg | 1 + assets/uswds/img/usa-icons/timer.svg | 1 + assets/uswds/img/usa-icons/toggle_off.svg | 1 + assets/uswds/img/usa-icons/toggle_on.svg | 1 + assets/uswds/img/usa-icons/topic.svg | 1 + assets/uswds/img/usa-icons/tornado.svg | 1 + assets/uswds/img/usa-icons/translate.svg | 1 + assets/uswds/img/usa-icons/trending_down.svg | 1 + assets/uswds/img/usa-icons/trending_up.svg | 1 + assets/uswds/img/usa-icons/twitter.svg | 1 + assets/uswds/img/usa-icons/undo.svg | 1 + assets/uswds/img/usa-icons/unfold_less.svg | 1 + assets/uswds/img/usa-icons/unfold_more.svg | 1 + assets/uswds/img/usa-icons/update.svg | 1 + assets/uswds/img/usa-icons/upload_file.svg | 1 + assets/uswds/img/usa-icons/verified.svg | 1 + assets/uswds/img/usa-icons/verified_user.svg | 1 + assets/uswds/img/usa-icons/visibility.svg | 1 + assets/uswds/img/usa-icons/visibility_off.svg | 1 + assets/uswds/img/usa-icons/volume_off.svg | 1 + assets/uswds/img/usa-icons/warning.svg | 1 + assets/uswds/img/usa-icons/wash.svg | 1 + assets/uswds/img/usa-icons/wifi.svg | 1 + assets/uswds/img/usa-icons/work.svg | 1 + assets/uswds/img/usa-icons/youtube.svg | 1 + assets/uswds/img/usa-icons/zoom_in.svg | 1 + assets/uswds/img/usa-icons/zoom_out.svg | 1 + assets/uswds/img/usa-icons/zoom_out_map.svg | 1 + assets/uswds/img/uswds-icons/bedding.svg | 1 + assets/uswds/img/uswds-icons/camping.svg | 1 + assets/uswds/img/uswds-icons/chevron_left.svg | 1 + .../uswds/img/uswds-icons/chevron_right.svg | 1 + assets/uswds/img/uswds-icons/clothes.svg | 1 + .../img/uswds-icons/construction_worker.svg | 1 + assets/uswds/img/uswds-icons/flickr.svg | 1 + assets/uswds/img/uswds-icons/flooding.svg | 1 + assets/uswds/img/uswds-icons/github.svg | 1 + assets/uswds/img/uswds-icons/hospital.svg | 1 + assets/uswds/img/uswds-icons/hurricane.svg | 1 + .../uswds/img/uswds-icons/identification.svg | 1 + assets/uswds/img/uswds-icons/instagram.svg | 1 + .../img/uswds-icons/navigate_far_before.svg | 1 + .../img/uswds-icons/navigate_far_next.svg | 1 + assets/uswds/img/uswds-icons/rain.svg | 1 + .../uswds/img/uswds-icons/severe_weather.svg | 1 + assets/uswds/img/uswds-icons/snow.svg | 1 + assets/uswds/img/uswds-icons/sort_arrow.svg | 1 + assets/uswds/img/uswds-icons/tornado.svg | 1 + assets/uswds/img/uswds-icons/twitter.svg | 1 + assets/uswds/img/uswds-icons/youtube.svg | 1 + assets/uswds/loader.gif | Bin 0 -> 11437 bytes assets/uswds/loader.svg | 1 + assets/uswds/lock.svg | 1 + assets/uswds/logo-img.png | Bin 0 -> 1022 bytes assets/uswds/material-icons/10k.svg | 1 + assets/uswds/material-icons/10mp.svg | 1 + assets/uswds/material-icons/11mp.svg | 1 + assets/uswds/material-icons/12mp.svg | 1 + assets/uswds/material-icons/13mp.svg | 1 + assets/uswds/material-icons/14mp.svg | 1 + assets/uswds/material-icons/15mp.svg | 1 + assets/uswds/material-icons/16mp.svg | 1 + assets/uswds/material-icons/17mp.svg | 1 + assets/uswds/material-icons/18mp.svg | 1 + assets/uswds/material-icons/19mp.svg | 1 + assets/uswds/material-icons/1k.svg | 1 + assets/uswds/material-icons/1k_plus.svg | 1 + assets/uswds/material-icons/20mp.svg | 1 + assets/uswds/material-icons/21mp.svg | 1 + assets/uswds/material-icons/22mp.svg | 1 + assets/uswds/material-icons/23mp.svg | 1 + assets/uswds/material-icons/24mp.svg | 1 + assets/uswds/material-icons/2k.svg | 1 + assets/uswds/material-icons/2k_plus.svg | 1 + assets/uswds/material-icons/2mp.svg | 1 + assets/uswds/material-icons/360.svg | 1 + assets/uswds/material-icons/3d_rotation.svg | 1 + assets/uswds/material-icons/3k.svg | 1 + assets/uswds/material-icons/3k_plus.svg | 1 + assets/uswds/material-icons/3mp.svg | 1 + assets/uswds/material-icons/4k.svg | 1 + assets/uswds/material-icons/4k_plus.svg | 1 + assets/uswds/material-icons/4mp.svg | 1 + assets/uswds/material-icons/5g.svg | 1 + assets/uswds/material-icons/5k.svg | 1 + assets/uswds/material-icons/5k_plus.svg | 1 + assets/uswds/material-icons/5mp.svg | 1 + assets/uswds/material-icons/6_ft_apart.svg | 1 + assets/uswds/material-icons/6k.svg | 1 + assets/uswds/material-icons/6k_plus.svg | 1 + assets/uswds/material-icons/6mp.svg | 1 + assets/uswds/material-icons/7k.svg | 1 + assets/uswds/material-icons/7k_plus.svg | 1 + assets/uswds/material-icons/7mp.svg | 1 + assets/uswds/material-icons/8k.svg | 1 + assets/uswds/material-icons/8k_plus.svg | 1 + assets/uswds/material-icons/8mp.svg | 1 + assets/uswds/material-icons/9k.svg | 1 + assets/uswds/material-icons/9k_plus.svg | 1 + assets/uswds/material-icons/9mp.svg | 1 + assets/uswds/material-icons/ac_unit.svg | 1 + assets/uswds/material-icons/access_alarm.svg | 1 + assets/uswds/material-icons/access_alarms.svg | 1 + assets/uswds/material-icons/access_time.svg | 1 + assets/uswds/material-icons/accessibility.svg | 1 + .../material-icons/accessibility_new.svg | 1 + assets/uswds/material-icons/accessible.svg | 1 + .../material-icons/accessible_forward.svg | 1 + .../uswds/material-icons/account_balance.svg | 1 + .../material-icons/account_balance_wallet.svg | 1 + assets/uswds/material-icons/account_box.svg | 1 + .../uswds/material-icons/account_circle.svg | 1 + assets/uswds/material-icons/account_tree.svg | 1 + assets/uswds/material-icons/ad_units.svg | 1 + assets/uswds/material-icons/adb.svg | 1 + assets/uswds/material-icons/add.svg | 1 + assets/uswds/material-icons/add_a_photo.svg | 1 + assets/uswds/material-icons/add_alarm.svg | 1 + assets/uswds/material-icons/add_alert.svg | 1 + assets/uswds/material-icons/add_box.svg | 1 + assets/uswds/material-icons/add_business.svg | 1 + assets/uswds/material-icons/add_call.svg | 1 + assets/uswds/material-icons/add_chart.svg | 1 + assets/uswds/material-icons/add_circle.svg | 1 + .../material-icons/add_circle_outline.svg | 1 + assets/uswds/material-icons/add_comment.svg | 1 + assets/uswds/material-icons/add_ic_call.svg | 1 + assets/uswds/material-icons/add_link.svg | 1 + assets/uswds/material-icons/add_location.svg | 1 + .../uswds/material-icons/add_location_alt.svg | 1 + assets/uswds/material-icons/add_moderator.svg | 1 + .../material-icons/add_photo_alternate.svg | 1 + assets/uswds/material-icons/add_road.svg | 1 + .../material-icons/add_shopping_cart.svg | 1 + assets/uswds/material-icons/add_task.svg | 1 + assets/uswds/material-icons/add_to_drive.svg | 1 + .../material-icons/add_to_home_screen.svg | 1 + assets/uswds/material-icons/add_to_photos.svg | 1 + assets/uswds/material-icons/add_to_queue.svg | 1 + assets/uswds/material-icons/addchart.svg | 1 + assets/uswds/material-icons/adjust.svg | 1 + .../material-icons/admin_panel_settings.svg | 1 + assets/uswds/material-icons/agriculture.svg | 1 + .../material-icons/airline_seat_flat.svg | 1 + .../airline_seat_flat_angled.svg | 1 + .../airline_seat_individual_suite.svg | 1 + .../airline_seat_legroom_extra.svg | 1 + .../airline_seat_legroom_normal.svg | 1 + .../airline_seat_legroom_reduced.svg | 1 + .../airline_seat_recline_extra.svg | 1 + .../airline_seat_recline_normal.svg | 1 + .../material-icons/airplanemode_active.svg | 1 + .../material-icons/airplanemode_inactive.svg | 1 + assets/uswds/material-icons/airplay.svg | 1 + .../uswds/material-icons/airport_shuttle.svg | 1 + assets/uswds/material-icons/alarm.svg | 1 + assets/uswds/material-icons/alarm_add.svg | 1 + assets/uswds/material-icons/alarm_off.svg | 1 + assets/uswds/material-icons/alarm_on.svg | 1 + assets/uswds/material-icons/album.svg | 1 + .../align_horizontal_center.svg | 1 + .../material-icons/align_horizontal_left.svg | 1 + .../material-icons/align_horizontal_right.svg | 1 + .../material-icons/align_vertical_bottom.svg | 1 + .../material-icons/align_vertical_center.svg | 1 + .../material-icons/align_vertical_top.svg | 1 + assets/uswds/material-icons/all_inbox.svg | 1 + assets/uswds/material-icons/all_inclusive.svg | 1 + assets/uswds/material-icons/all_out.svg | 1 + assets/uswds/material-icons/alt_route.svg | 1 + .../uswds/material-icons/alternate_email.svg | 1 + assets/uswds/material-icons/amp_stories.svg | 1 + assets/uswds/material-icons/analytics.svg | 1 + assets/uswds/material-icons/anchor.svg | 1 + assets/uswds/material-icons/android.svg | 1 + assets/uswds/material-icons/animation.svg | 1 + assets/uswds/material-icons/announcement.svg | 1 + assets/uswds/material-icons/apartment.svg | 1 + assets/uswds/material-icons/api.svg | 1 + assets/uswds/material-icons/app_blocking.svg | 1 + .../uswds/material-icons/app_registration.svg | 1 + .../uswds/material-icons/app_settings_alt.svg | 1 + assets/uswds/material-icons/approval.svg | 1 + assets/uswds/material-icons/apps.svg | 1 + assets/uswds/material-icons/architecture.svg | 1 + assets/uswds/material-icons/archive.svg | 1 + assets/uswds/material-icons/arrow_back.svg | 1 + .../uswds/material-icons/arrow_back_ios.svg | 1 + .../material-icons/arrow_circle_down.svg | 1 + .../uswds/material-icons/arrow_circle_up.svg | 1 + .../uswds/material-icons/arrow_downward.svg | 1 + .../uswds/material-icons/arrow_drop_down.svg | 1 + .../material-icons/arrow_drop_down_circle.svg | 1 + assets/uswds/material-icons/arrow_drop_up.svg | 1 + assets/uswds/material-icons/arrow_forward.svg | 1 + .../material-icons/arrow_forward_ios.svg | 1 + assets/uswds/material-icons/arrow_left.svg | 1 + assets/uswds/material-icons/arrow_right.svg | 1 + .../uswds/material-icons/arrow_right_alt.svg | 1 + assets/uswds/material-icons/arrow_upward.svg | 1 + assets/uswds/material-icons/art_track.svg | 1 + assets/uswds/material-icons/article.svg | 1 + assets/uswds/material-icons/aspect_ratio.svg | 1 + assets/uswds/material-icons/assessment.svg | 1 + assets/uswds/material-icons/assignment.svg | 1 + .../uswds/material-icons/assignment_ind.svg | 1 + .../uswds/material-icons/assignment_late.svg | 1 + .../material-icons/assignment_return.svg | 1 + .../material-icons/assignment_returned.svg | 1 + .../material-icons/assignment_turned_in.svg | 1 + assets/uswds/material-icons/assistant.svg | 1 + .../material-icons/assistant_direction.svg | 1 + .../material-icons/assistant_navigation.svg | 1 + .../uswds/material-icons/assistant_photo.svg | 1 + assets/uswds/material-icons/atm.svg | 1 + assets/uswds/material-icons/attach_email.svg | 1 + assets/uswds/material-icons/attach_file.svg | 1 + assets/uswds/material-icons/attach_money.svg | 1 + assets/uswds/material-icons/attachment.svg | 1 + assets/uswds/material-icons/attractions.svg | 1 + assets/uswds/material-icons/audiotrack.svg | 1 + assets/uswds/material-icons/auto_awesome.svg | 1 + .../material-icons/auto_awesome_mosaic.svg | 1 + .../material-icons/auto_awesome_motion.svg | 1 + assets/uswds/material-icons/auto_delete.svg | 1 + assets/uswds/material-icons/auto_fix_high.svg | 1 + .../uswds/material-icons/auto_fix_normal.svg | 1 + assets/uswds/material-icons/auto_fix_off.svg | 1 + assets/uswds/material-icons/auto_stories.svg | 1 + assets/uswds/material-icons/autorenew.svg | 1 + assets/uswds/material-icons/av_timer.svg | 1 + .../material-icons/baby_changing_station.svg | 1 + assets/uswds/material-icons/backpack.svg | 1 + assets/uswds/material-icons/backspace.svg | 1 + assets/uswds/material-icons/backup.svg | 1 + assets/uswds/material-icons/backup_table.svg | 1 + assets/uswds/material-icons/badge.svg | 1 + assets/uswds/material-icons/bakery_dining.svg | 1 + assets/uswds/material-icons/ballot.svg | 1 + assets/uswds/material-icons/bar_chart.svg | 1 + .../uswds/material-icons/batch_prediction.svg | 1 + assets/uswds/material-icons/bathtub.svg | 1 + assets/uswds/material-icons/battery_alert.svg | 1 + .../material-icons/battery_charging_full.svg | 1 + assets/uswds/material-icons/battery_full.svg | 1 + assets/uswds/material-icons/battery_std.svg | 1 + .../uswds/material-icons/battery_unknown.svg | 1 + assets/uswds/material-icons/beach_access.svg | 1 + assets/uswds/material-icons/bedtime.svg | 1 + assets/uswds/material-icons/beenhere.svg | 1 + assets/uswds/material-icons/bento.svg | 1 + assets/uswds/material-icons/bike_scooter.svg | 1 + assets/uswds/material-icons/biotech.svg | 1 + assets/uswds/material-icons/block.svg | 1 + assets/uswds/material-icons/block_flipped.svg | 1 + assets/uswds/material-icons/bluetooth.svg | 1 + .../uswds/material-icons/bluetooth_audio.svg | 1 + .../material-icons/bluetooth_connected.svg | 1 + .../material-icons/bluetooth_disabled.svg | 1 + .../material-icons/bluetooth_searching.svg | 1 + assets/uswds/material-icons/blur_circular.svg | 1 + assets/uswds/material-icons/blur_linear.svg | 1 + assets/uswds/material-icons/blur_off.svg | 1 + assets/uswds/material-icons/blur_on.svg | 1 + assets/uswds/material-icons/bolt.svg | 1 + assets/uswds/material-icons/book.svg | 1 + assets/uswds/material-icons/book_online.svg | 1 + assets/uswds/material-icons/bookmark.svg | 1 + .../uswds/material-icons/bookmark_border.svg | 1 + assets/uswds/material-icons/bookmarks.svg | 1 + assets/uswds/material-icons/border_all.svg | 1 + assets/uswds/material-icons/border_bottom.svg | 1 + assets/uswds/material-icons/border_clear.svg | 1 + assets/uswds/material-icons/border_color.svg | 1 + .../material-icons/border_horizontal.svg | 1 + assets/uswds/material-icons/border_inner.svg | 1 + assets/uswds/material-icons/border_left.svg | 1 + assets/uswds/material-icons/border_outer.svg | 1 + assets/uswds/material-icons/border_right.svg | 1 + assets/uswds/material-icons/border_style.svg | 1 + assets/uswds/material-icons/border_top.svg | 1 + .../uswds/material-icons/border_vertical.svg | 1 + .../material-icons/branding_watermark.svg | 1 + .../uswds/material-icons/breakfast_dining.svg | 1 + assets/uswds/material-icons/brightness_1.svg | 1 + assets/uswds/material-icons/brightness_2.svg | 1 + assets/uswds/material-icons/brightness_3.svg | 1 + assets/uswds/material-icons/brightness_4.svg | 1 + assets/uswds/material-icons/brightness_5.svg | 1 + assets/uswds/material-icons/brightness_6.svg | 1 + assets/uswds/material-icons/brightness_7.svg | 1 + .../uswds/material-icons/brightness_auto.svg | 1 + .../uswds/material-icons/brightness_high.svg | 1 + .../uswds/material-icons/brightness_low.svg | 1 + .../material-icons/brightness_medium.svg | 1 + assets/uswds/material-icons/broken_image.svg | 1 + .../material-icons/browser_not_supported.svg | 1 + assets/uswds/material-icons/brunch_dining.svg | 1 + assets/uswds/material-icons/brush.svg | 1 + assets/uswds/material-icons/bubble_chart.svg | 1 + assets/uswds/material-icons/bug_report.svg | 1 + assets/uswds/material-icons/build.svg | 1 + assets/uswds/material-icons/build_circle.svg | 1 + assets/uswds/material-icons/burst_mode.svg | 1 + assets/uswds/material-icons/bus_alert.svg | 1 + assets/uswds/material-icons/business.svg | 1 + .../uswds/material-icons/business_center.svg | 1 + assets/uswds/material-icons/cached.svg | 1 + assets/uswds/material-icons/cake.svg | 1 + assets/uswds/material-icons/calculate.svg | 1 + .../uswds/material-icons/calendar_today.svg | 1 + .../material-icons/calendar_view_day.svg | 1 + assets/uswds/material-icons/call.svg | 1 + assets/uswds/material-icons/call_end.svg | 1 + assets/uswds/material-icons/call_made.svg | 1 + assets/uswds/material-icons/call_merge.svg | 1 + assets/uswds/material-icons/call_missed.svg | 1 + .../material-icons/call_missed_outgoing.svg | 1 + assets/uswds/material-icons/call_received.svg | 1 + assets/uswds/material-icons/call_split.svg | 1 + .../uswds/material-icons/call_to_action.svg | 1 + assets/uswds/material-icons/camera.svg | 1 + assets/uswds/material-icons/camera_alt.svg | 1 + .../uswds/material-icons/camera_enhance.svg | 1 + assets/uswds/material-icons/camera_front.svg | 1 + assets/uswds/material-icons/camera_rear.svg | 1 + assets/uswds/material-icons/camera_roll.svg | 1 + assets/uswds/material-icons/campaign.svg | 1 + assets/uswds/material-icons/cancel.svg | 1 + .../material-icons/cancel_presentation.svg | 1 + .../material-icons/cancel_schedule_send.svg | 1 + assets/uswds/material-icons/car_rental.svg | 1 + assets/uswds/material-icons/car_repair.svg | 1 + assets/uswds/material-icons/card_giftcard.svg | 1 + .../uswds/material-icons/card_membership.svg | 1 + assets/uswds/material-icons/card_travel.svg | 1 + assets/uswds/material-icons/carpenter.svg | 1 + assets/uswds/material-icons/cases.svg | 1 + assets/uswds/material-icons/casino.svg | 1 + assets/uswds/material-icons/cast.svg | 1 + .../uswds/material-icons/cast_connected.svg | 1 + .../material-icons/cast_for_education.svg | 1 + assets/uswds/material-icons/category.svg | 1 + assets/uswds/material-icons/celebration.svg | 1 + assets/uswds/material-icons/cell_wifi.svg | 1 + .../material-icons/center_focus_strong.svg | 1 + .../material-icons/center_focus_weak.svg | 1 + .../uswds/material-icons/change_history.svg | 1 + .../uswds/material-icons/charging_station.svg | 1 + assets/uswds/material-icons/chat.svg | 1 + assets/uswds/material-icons/chat_bubble.svg | 1 + .../material-icons/chat_bubble_outline.svg | 1 + assets/uswds/material-icons/check.svg | 1 + assets/uswds/material-icons/check_box.svg | 1 + .../check_box_outline_blank.svg | 1 + assets/uswds/material-icons/check_circle.svg | 1 + .../material-icons/check_circle_outline.svg | 1 + assets/uswds/material-icons/checkroom.svg | 1 + assets/uswds/material-icons/chevron_left.svg | 1 + assets/uswds/material-icons/chevron_right.svg | 1 + assets/uswds/material-icons/child_care.svg | 1 + .../uswds/material-icons/child_friendly.svg | 1 + .../material-icons/chrome_reader_mode.svg | 1 + assets/uswds/material-icons/circle.svg | 1 + .../material-icons/circle_notifications.svg | 1 + assets/uswds/material-icons/class.svg | 1 + assets/uswds/material-icons/clean_hands.svg | 1 + .../material-icons/cleaning_services.svg | 1 + assets/uswds/material-icons/clear.svg | 1 + assets/uswds/material-icons/clear_all.svg | 1 + assets/uswds/material-icons/close.svg | 1 + .../uswds/material-icons/close_fullscreen.svg | 1 + .../uswds/material-icons/closed_caption.svg | 1 + .../closed_caption_disabled.svg | 1 + .../material-icons/closed_caption_off.svg | 1 + assets/uswds/material-icons/cloud.svg | 1 + assets/uswds/material-icons/cloud_circle.svg | 1 + assets/uswds/material-icons/cloud_done.svg | 1 + .../uswds/material-icons/cloud_download.svg | 1 + assets/uswds/material-icons/cloud_off.svg | 1 + assets/uswds/material-icons/cloud_queue.svg | 1 + assets/uswds/material-icons/cloud_upload.svg | 1 + assets/uswds/material-icons/code.svg | 1 + assets/uswds/material-icons/collections.svg | 1 + .../material-icons/collections_bookmark.svg | 1 + assets/uswds/material-icons/color_lens.svg | 1 + assets/uswds/material-icons/colorize.svg | 1 + assets/uswds/material-icons/comment.svg | 1 + assets/uswds/material-icons/comment_bank.svg | 1 + assets/uswds/material-icons/commute.svg | 1 + assets/uswds/material-icons/compare.svg | 1 + .../uswds/material-icons/compare_arrows.svg | 1 + .../material-icons/compass_calibration.svg | 1 + assets/uswds/material-icons/compress.svg | 1 + assets/uswds/material-icons/computer.svg | 1 + .../material-icons/confirmation_number.svg | 1 + .../connect_without_contact.svg | 1 + assets/uswds/material-icons/connected_tv.svg | 1 + assets/uswds/material-icons/construction.svg | 1 + assets/uswds/material-icons/contact_mail.svg | 1 + assets/uswds/material-icons/contact_page.svg | 1 + assets/uswds/material-icons/contact_phone.svg | 1 + .../uswds/material-icons/contact_support.svg | 1 + assets/uswds/material-icons/contactless.svg | 1 + assets/uswds/material-icons/contacts.svg | 1 + assets/uswds/material-icons/content_copy.svg | 1 + assets/uswds/material-icons/content_cut.svg | 1 + assets/uswds/material-icons/content_paste.svg | 1 + .../uswds/material-icons/control_camera.svg | 1 + assets/uswds/material-icons/control_point.svg | 1 + .../control_point_duplicate.svg | 1 + assets/uswds/material-icons/copyright.svg | 1 + assets/uswds/material-icons/coronavirus.svg | 1 + .../uswds/material-icons/corporate_fare.svg | 1 + assets/uswds/material-icons/countertops.svg | 1 + assets/uswds/material-icons/create.svg | 1 + .../material-icons/create_new_folder.svg | 1 + assets/uswds/material-icons/credit_card.svg | 1 + assets/uswds/material-icons/crop.svg | 1 + assets/uswds/material-icons/crop_16_9.svg | 1 + assets/uswds/material-icons/crop_3_2.svg | 1 + assets/uswds/material-icons/crop_5_4.svg | 1 + assets/uswds/material-icons/crop_7_5.svg | 1 + assets/uswds/material-icons/crop_din.svg | 1 + assets/uswds/material-icons/crop_free.svg | 1 + .../uswds/material-icons/crop_landscape.svg | 1 + assets/uswds/material-icons/crop_original.svg | 1 + assets/uswds/material-icons/crop_portrait.svg | 1 + assets/uswds/material-icons/crop_rotate.svg | 1 + assets/uswds/material-icons/crop_square.svg | 1 + assets/uswds/material-icons/dangerous.svg | 1 + assets/uswds/material-icons/dashboard.svg | 1 + .../material-icons/dashboard_customize.svg | 1 + assets/uswds/material-icons/data_usage.svg | 1 + assets/uswds/material-icons/date_range.svg | 1 + assets/uswds/material-icons/deck.svg | 1 + assets/uswds/material-icons/dehaze.svg | 1 + assets/uswds/material-icons/delete.svg | 1 + .../uswds/material-icons/delete_forever.svg | 1 + .../uswds/material-icons/delete_outline.svg | 1 + assets/uswds/material-icons/delete_sweep.svg | 1 + .../uswds/material-icons/delivery_dining.svg | 1 + .../uswds/material-icons/departure_board.svg | 1 + assets/uswds/material-icons/description.svg | 1 + .../uswds/material-icons/design_services.svg | 1 + .../desktop_access_disabled.svg | 1 + assets/uswds/material-icons/desktop_mac.svg | 1 + .../uswds/material-icons/desktop_windows.svg | 1 + assets/uswds/material-icons/details.svg | 1 + .../uswds/material-icons/developer_board.svg | 1 + .../uswds/material-icons/developer_mode.svg | 1 + assets/uswds/material-icons/device_hub.svg | 1 + .../material-icons/device_thermostat.svg | 1 + .../uswds/material-icons/device_unknown.svg | 1 + assets/uswds/material-icons/devices.svg | 1 + assets/uswds/material-icons/devices_other.svg | 1 + assets/uswds/material-icons/dialer_sip.svg | 1 + assets/uswds/material-icons/dialpad.svg | 1 + assets/uswds/material-icons/dinner_dining.svg | 1 + assets/uswds/material-icons/directions.svg | 1 + .../uswds/material-icons/directions_bike.svg | 1 + .../uswds/material-icons/directions_boat.svg | 1 + .../uswds/material-icons/directions_bus.svg | 1 + .../uswds/material-icons/directions_car.svg | 1 + .../uswds/material-icons/directions_off.svg | 1 + .../material-icons/directions_railway.svg | 1 + .../uswds/material-icons/directions_run.svg | 1 + .../material-icons/directions_subway.svg | 1 + .../material-icons/directions_transit.svg | 1 + .../uswds/material-icons/directions_walk.svg | 1 + assets/uswds/material-icons/dirty_lens.svg | 1 + .../material-icons/disabled_by_default.svg | 1 + assets/uswds/material-icons/disc_full.svg | 1 + assets/uswds/material-icons/dns.svg | 1 + .../uswds/material-icons/do_not_disturb.svg | 1 + .../material-icons/do_not_disturb_alt.svg | 1 + .../material-icons/do_not_disturb_off.svg | 1 + .../material-icons/do_not_disturb_on.svg | 1 + assets/uswds/material-icons/do_not_step.svg | 1 + assets/uswds/material-icons/do_not_touch.svg | 1 + assets/uswds/material-icons/dock.svg | 1 + assets/uswds/material-icons/domain.svg | 1 + .../uswds/material-icons/domain_disabled.svg | 1 + .../material-icons/domain_verification.svg | 1 + assets/uswds/material-icons/done.svg | 1 + assets/uswds/material-icons/done_all.svg | 1 + assets/uswds/material-icons/done_outline.svg | 1 + assets/uswds/material-icons/donut_large.svg | 1 + assets/uswds/material-icons/donut_small.svg | 1 + assets/uswds/material-icons/double_arrow.svg | 1 + assets/uswds/material-icons/drafts.svg | 1 + assets/uswds/material-icons/drag_handle.svg | 1 + .../uswds/material-icons/drag_indicator.svg | 1 + assets/uswds/material-icons/drive_eta.svg | 1 + .../uswds/material-icons/drive_file_move.svg | 1 + .../drive_file_move_outline.svg | 1 + .../drive_file_rename_outline.svg | 1 + .../material-icons/drive_folder_upload.svg | 1 + assets/uswds/material-icons/dry.svg | 1 + assets/uswds/material-icons/dry_cleaning.svg | 1 + assets/uswds/material-icons/duo.svg | 1 + assets/uswds/material-icons/dvr.svg | 1 + assets/uswds/material-icons/dynamic_feed.svg | 1 + assets/uswds/material-icons/dynamic_form.svg | 1 + assets/uswds/material-icons/east.svg | 1 + assets/uswds/material-icons/eco.svg | 1 + assets/uswds/material-icons/edit.svg | 1 + .../uswds/material-icons/edit_attributes.svg | 1 + assets/uswds/material-icons/edit_location.svg | 1 + assets/uswds/material-icons/edit_off.svg | 1 + assets/uswds/material-icons/edit_road.svg | 1 + assets/uswds/material-icons/eject.svg | 1 + assets/uswds/material-icons/elderly.svg | 1 + assets/uswds/material-icons/electric_bike.svg | 1 + assets/uswds/material-icons/electric_car.svg | 1 + .../uswds/material-icons/electric_moped.svg | 1 + .../material-icons/electric_rickshaw.svg | 1 + .../uswds/material-icons/electric_scooter.svg | 1 + .../material-icons/electrical_services.svg | 1 + assets/uswds/material-icons/elevator.svg | 1 + assets/uswds/material-icons/email.svg | 1 + .../uswds/material-icons/emoji_emotions.svg | 1 + assets/uswds/material-icons/emoji_events.svg | 1 + assets/uswds/material-icons/emoji_flags.svg | 1 + .../material-icons/emoji_food_beverage.svg | 1 + assets/uswds/material-icons/emoji_nature.svg | 1 + assets/uswds/material-icons/emoji_objects.svg | 1 + assets/uswds/material-icons/emoji_people.svg | 1 + assets/uswds/material-icons/emoji_symbols.svg | 1 + .../material-icons/emoji_transportation.svg | 1 + assets/uswds/material-icons/engineering.svg | 1 + .../material-icons/enhanced_encryption.svg | 1 + assets/uswds/material-icons/equalizer.svg | 1 + assets/uswds/material-icons/error.svg | 1 + assets/uswds/material-icons/error_outline.svg | 1 + assets/uswds/material-icons/escalator.svg | 1 + .../material-icons/escalator_warning.svg | 1 + assets/uswds/material-icons/euro.svg | 1 + assets/uswds/material-icons/euro_symbol.svg | 1 + assets/uswds/material-icons/ev_station.svg | 1 + assets/uswds/material-icons/event.svg | 1 + .../uswds/material-icons/event_available.svg | 1 + assets/uswds/material-icons/event_busy.svg | 1 + assets/uswds/material-icons/event_note.svg | 1 + assets/uswds/material-icons/event_seat.svg | 1 + assets/uswds/material-icons/exit_to_app.svg | 1 + assets/uswds/material-icons/expand.svg | 1 + assets/uswds/material-icons/expand_less.svg | 1 + assets/uswds/material-icons/expand_more.svg | 1 + assets/uswds/material-icons/explicit.svg | 1 + assets/uswds/material-icons/explore.svg | 1 + assets/uswds/material-icons/explore_off.svg | 1 + assets/uswds/material-icons/exposure.svg | 1 + .../uswds/material-icons/exposure_neg_1.svg | 1 + .../uswds/material-icons/exposure_neg_2.svg | 1 + .../uswds/material-icons/exposure_plus_1.svg | 1 + .../uswds/material-icons/exposure_plus_2.svg | 1 + assets/uswds/material-icons/exposure_zero.svg | 1 + assets/uswds/material-icons/extension.svg | 1 + assets/uswds/material-icons/face.svg | 1 + .../face_retouching_natural.svg | 1 + assets/uswds/material-icons/facebook.svg | 1 + assets/uswds/material-icons/fact_check.svg | 1 + .../uswds/material-icons/family_restroom.svg | 1 + assets/uswds/material-icons/fast_forward.svg | 1 + assets/uswds/material-icons/fast_rewind.svg | 1 + assets/uswds/material-icons/fastfood.svg | 1 + assets/uswds/material-icons/favorite.svg | 1 + .../uswds/material-icons/favorite_border.svg | 1 + .../material-icons/featured_play_list.svg | 1 + .../uswds/material-icons/featured_video.svg | 1 + assets/uswds/material-icons/feedback.svg | 1 + assets/uswds/material-icons/fence.svg | 1 + assets/uswds/material-icons/festival.svg | 1 + assets/uswds/material-icons/fiber_dvr.svg | 1 + .../material-icons/fiber_manual_record.svg | 1 + assets/uswds/material-icons/fiber_new.svg | 1 + assets/uswds/material-icons/fiber_pin.svg | 1 + .../material-icons/fiber_smart_record.svg | 1 + assets/uswds/material-icons/file_copy.svg | 1 + assets/uswds/material-icons/file_download.svg | 1 + .../material-icons/file_download_done.svg | 1 + assets/uswds/material-icons/file_present.svg | 1 + assets/uswds/material-icons/file_upload.svg | 1 + assets/uswds/material-icons/filter.svg | 1 + assets/uswds/material-icons/filter_1.svg | 1 + assets/uswds/material-icons/filter_2.svg | 1 + assets/uswds/material-icons/filter_3.svg | 1 + assets/uswds/material-icons/filter_4.svg | 1 + assets/uswds/material-icons/filter_5.svg | 1 + assets/uswds/material-icons/filter_6.svg | 1 + assets/uswds/material-icons/filter_7.svg | 1 + assets/uswds/material-icons/filter_8.svg | 1 + assets/uswds/material-icons/filter_9.svg | 1 + assets/uswds/material-icons/filter_9_plus.svg | 1 + assets/uswds/material-icons/filter_alt.svg | 1 + .../uswds/material-icons/filter_b_and_w.svg | 1 + .../material-icons/filter_center_focus.svg | 1 + assets/uswds/material-icons/filter_drama.svg | 1 + assets/uswds/material-icons/filter_frames.svg | 1 + assets/uswds/material-icons/filter_hdr.svg | 1 + assets/uswds/material-icons/filter_list.svg | 1 + .../uswds/material-icons/filter_list_alt.svg | 1 + assets/uswds/material-icons/filter_none.svg | 1 + .../material-icons/filter_tilt_shift.svg | 1 + .../uswds/material-icons/filter_vintage.svg | 1 + assets/uswds/material-icons/find_in_page.svg | 1 + assets/uswds/material-icons/find_replace.svg | 1 + assets/uswds/material-icons/fingerprint.svg | 1 + .../material-icons/fire_extinguisher.svg | 1 + assets/uswds/material-icons/fireplace.svg | 1 + assets/uswds/material-icons/first_page.svg | 1 + assets/uswds/material-icons/fit_screen.svg | 1 + .../uswds/material-icons/fitness_center.svg | 1 + assets/uswds/material-icons/flag.svg | 1 + assets/uswds/material-icons/flaky.svg | 1 + assets/uswds/material-icons/flare.svg | 1 + assets/uswds/material-icons/flash_auto.svg | 1 + assets/uswds/material-icons/flash_off.svg | 1 + assets/uswds/material-icons/flash_on.svg | 1 + assets/uswds/material-icons/flight.svg | 1 + assets/uswds/material-icons/flight_land.svg | 1 + .../uswds/material-icons/flight_takeoff.svg | 1 + assets/uswds/material-icons/flip.svg | 1 + .../material-icons/flip_camera_android.svg | 1 + .../uswds/material-icons/flip_camera_ios.svg | 1 + assets/uswds/material-icons/flip_to_back.svg | 1 + assets/uswds/material-icons/flip_to_front.svg | 1 + assets/uswds/material-icons/folder.svg | 1 + assets/uswds/material-icons/folder_open.svg | 1 + assets/uswds/material-icons/folder_shared.svg | 1 + .../uswds/material-icons/folder_special.svg | 1 + .../uswds/material-icons/follow_the_signs.svg | 1 + assets/uswds/material-icons/font_download.svg | 1 + assets/uswds/material-icons/food_bank.svg | 1 + .../material-icons/format_align_center.svg | 1 + .../material-icons/format_align_justify.svg | 1 + .../material-icons/format_align_left.svg | 1 + .../material-icons/format_align_right.svg | 1 + assets/uswds/material-icons/format_bold.svg | 1 + assets/uswds/material-icons/format_clear.svg | 1 + .../material-icons/format_color_fill.svg | 1 + .../material-icons/format_color_reset.svg | 1 + .../material-icons/format_color_text.svg | 1 + .../material-icons/format_indent_decrease.svg | 1 + .../material-icons/format_indent_increase.svg | 1 + assets/uswds/material-icons/format_italic.svg | 1 + .../material-icons/format_line_spacing.svg | 1 + .../material-icons/format_list_bulleted.svg | 1 + .../material-icons/format_list_numbered.svg | 1 + .../format_list_numbered_rtl.svg | 1 + assets/uswds/material-icons/format_paint.svg | 1 + assets/uswds/material-icons/format_quote.svg | 1 + assets/uswds/material-icons/format_shapes.svg | 1 + assets/uswds/material-icons/format_size.svg | 1 + .../material-icons/format_strikethrough.svg | 1 + .../format_textdirection_l_to_r.svg | 1 + .../format_textdirection_r_to_l.svg | 1 + .../material-icons/format_underlined.svg | 1 + assets/uswds/material-icons/forum.svg | 1 + assets/uswds/material-icons/forward.svg | 1 + assets/uswds/material-icons/forward_10.svg | 1 + assets/uswds/material-icons/forward_30.svg | 1 + assets/uswds/material-icons/forward_5.svg | 1 + .../uswds/material-icons/forward_to_inbox.svg | 1 + assets/uswds/material-icons/foundation.svg | 1 + .../uswds/material-icons/free_breakfast.svg | 1 + assets/uswds/material-icons/fullscreen.svg | 1 + .../uswds/material-icons/fullscreen_exit.svg | 1 + assets/uswds/material-icons/functions.svg | 1 + assets/uswds/material-icons/g_translate.svg | 1 + assets/uswds/material-icons/gamepad.svg | 1 + assets/uswds/material-icons/games.svg | 1 + assets/uswds/material-icons/gavel.svg | 1 + assets/uswds/material-icons/gesture.svg | 1 + assets/uswds/material-icons/get_app.svg | 1 + assets/uswds/material-icons/gif.svg | 1 + assets/uswds/material-icons/golf_course.svg | 1 + assets/uswds/material-icons/gps_fixed.svg | 1 + assets/uswds/material-icons/gps_not_fixed.svg | 1 + assets/uswds/material-icons/gps_off.svg | 1 + assets/uswds/material-icons/grade.svg | 1 + assets/uswds/material-icons/gradient.svg | 1 + assets/uswds/material-icons/grading.svg | 1 + assets/uswds/material-icons/grain.svg | 1 + assets/uswds/material-icons/graphic_eq.svg | 1 + assets/uswds/material-icons/grass.svg | 1 + assets/uswds/material-icons/grid_off.svg | 1 + assets/uswds/material-icons/grid_on.svg | 1 + assets/uswds/material-icons/grid_view.svg | 1 + assets/uswds/material-icons/group.svg | 1 + assets/uswds/material-icons/group_add.svg | 1 + assets/uswds/material-icons/group_work.svg | 1 + assets/uswds/material-icons/groups.svg | 1 + assets/uswds/material-icons/hail.svg | 1 + assets/uswds/material-icons/handyman.svg | 1 + assets/uswds/material-icons/hardware.svg | 1 + assets/uswds/material-icons/hd.svg | 1 + .../material-icons/hdr_enhanced_select.svg | 1 + assets/uswds/material-icons/hdr_off.svg | 1 + assets/uswds/material-icons/hdr_on.svg | 1 + assets/uswds/material-icons/hdr_strong.svg | 1 + assets/uswds/material-icons/hdr_weak.svg | 1 + assets/uswds/material-icons/headset.svg | 1 + assets/uswds/material-icons/headset_mic.svg | 1 + assets/uswds/material-icons/headset_off.svg | 1 + assets/uswds/material-icons/healing.svg | 1 + assets/uswds/material-icons/hearing.svg | 1 + .../uswds/material-icons/hearing_disabled.svg | 1 + assets/uswds/material-icons/height.svg | 1 + assets/uswds/material-icons/help.svg | 1 + assets/uswds/material-icons/help_center.svg | 1 + assets/uswds/material-icons/help_outline.svg | 1 + assets/uswds/material-icons/high_quality.svg | 1 + assets/uswds/material-icons/highlight.svg | 1 + assets/uswds/material-icons/highlight_alt.svg | 1 + assets/uswds/material-icons/highlight_off.svg | 1 + assets/uswds/material-icons/history.svg | 1 + assets/uswds/material-icons/history_edu.svg | 1 + .../material-icons/history_toggle_off.svg | 1 + assets/uswds/material-icons/home.svg | 1 + assets/uswds/material-icons/home_filled.svg | 1 + .../material-icons/home_repair_service.svg | 1 + assets/uswds/material-icons/home_work.svg | 1 + .../material-icons/horizontal_distribute.svg | 1 + .../uswds/material-icons/horizontal_rule.svg | 1 + .../uswds/material-icons/horizontal_split.svg | 1 + assets/uswds/material-icons/hot_tub.svg | 1 + assets/uswds/material-icons/hotel.svg | 1 + .../uswds/material-icons/hourglass_bottom.svg | 1 + .../material-icons/hourglass_disabled.svg | 1 + .../uswds/material-icons/hourglass_empty.svg | 1 + .../uswds/material-icons/hourglass_full.svg | 1 + assets/uswds/material-icons/hourglass_top.svg | 1 + assets/uswds/material-icons/house.svg | 1 + assets/uswds/material-icons/house_siding.svg | 1 + assets/uswds/material-icons/how_to_reg.svg | 1 + assets/uswds/material-icons/how_to_vote.svg | 1 + assets/uswds/material-icons/http.svg | 1 + assets/uswds/material-icons/https.svg | 1 + assets/uswds/material-icons/hvac.svg | 1 + assets/uswds/material-icons/icecream.svg | 1 + assets/uswds/material-icons/image.svg | 1 + .../material-icons/image_aspect_ratio.svg | 1 + .../material-icons/image_not_supported.svg | 1 + assets/uswds/material-icons/image_search.svg | 1 + .../material-icons/imagesearch_roller.svg | 1 + .../uswds/material-icons/import_contacts.svg | 1 + assets/uswds/material-icons/import_export.svg | 1 + .../material-icons/important_devices.svg | 1 + assets/uswds/material-icons/inbox.svg | 1 + .../indeterminate_check_box.svg | 1 + assets/uswds/material-icons/info.svg | 1 + assets/uswds/material-icons/info_outline.svg | 1 + assets/uswds/material-icons/input.svg | 1 + assets/uswds/material-icons/insert_chart.svg | 1 + .../material-icons/insert_chart_outlined.svg | 1 + .../uswds/material-icons/insert_comment.svg | 1 + .../material-icons/insert_drive_file.svg | 1 + .../uswds/material-icons/insert_emoticon.svg | 1 + .../material-icons/insert_invitation.svg | 1 + assets/uswds/material-icons/insert_link.svg | 1 + assets/uswds/material-icons/insert_photo.svg | 1 + assets/uswds/material-icons/insights.svg | 1 + .../integration_instructions.svg | 1 + assets/uswds/material-icons/inventory.svg | 1 + assets/uswds/material-icons/invert_colors.svg | 1 + .../material-icons/invert_colors_off.svg | 1 + assets/uswds/material-icons/ios_share.svg | 1 + assets/uswds/material-icons/iso.svg | 1 + assets/uswds/material-icons/keyboard.svg | 1 + .../material-icons/keyboard_arrow_down.svg | 1 + .../material-icons/keyboard_arrow_left.svg | 1 + .../material-icons/keyboard_arrow_right.svg | 1 + .../material-icons/keyboard_arrow_up.svg | 1 + .../material-icons/keyboard_backspace.svg | 1 + .../material-icons/keyboard_capslock.svg | 1 + assets/uswds/material-icons/keyboard_hide.svg | 1 + .../uswds/material-icons/keyboard_return.svg | 1 + assets/uswds/material-icons/keyboard_tab.svg | 1 + .../uswds/material-icons/keyboard_voice.svg | 1 + assets/uswds/material-icons/king_bed.svg | 1 + assets/uswds/material-icons/kitchen.svg | 1 + assets/uswds/material-icons/label.svg | 1 + .../uswds/material-icons/label_important.svg | 1 + .../label_important_outline.svg | 1 + assets/uswds/material-icons/label_off.svg | 1 + assets/uswds/material-icons/label_outline.svg | 1 + assets/uswds/material-icons/landscape.svg | 1 + assets/uswds/material-icons/language.svg | 1 + assets/uswds/material-icons/laptop.svg | 1 + .../material-icons/laptop_chromebook.svg | 1 + assets/uswds/material-icons/laptop_mac.svg | 1 + .../uswds/material-icons/laptop_windows.svg | 1 + assets/uswds/material-icons/last_page.svg | 1 + assets/uswds/material-icons/launch.svg | 1 + assets/uswds/material-icons/layers.svg | 1 + assets/uswds/material-icons/layers_clear.svg | 1 + assets/uswds/material-icons/leaderboard.svg | 1 + assets/uswds/material-icons/leak_add.svg | 1 + assets/uswds/material-icons/leak_remove.svg | 1 + assets/uswds/material-icons/legend_toggle.svg | 1 + assets/uswds/material-icons/lens.svg | 1 + assets/uswds/material-icons/library_add.svg | 1 + .../material-icons/library_add_check.svg | 1 + assets/uswds/material-icons/library_books.svg | 1 + assets/uswds/material-icons/library_music.svg | 1 + assets/uswds/material-icons/lightbulb.svg | 1 + .../material-icons/lightbulb_outline.svg | 1 + assets/uswds/material-icons/line_style.svg | 1 + assets/uswds/material-icons/line_weight.svg | 1 + assets/uswds/material-icons/linear_scale.svg | 1 + assets/uswds/material-icons/link.svg | 1 + assets/uswds/material-icons/link_off.svg | 1 + assets/uswds/material-icons/linked_camera.svg | 1 + assets/uswds/material-icons/liquor.svg | 1 + assets/uswds/material-icons/list.svg | 1 + assets/uswds/material-icons/list_alt.svg | 1 + assets/uswds/material-icons/live_help.svg | 1 + assets/uswds/material-icons/live_tv.svg | 1 + .../uswds/material-icons/local_activity.svg | 1 + assets/uswds/material-icons/local_airport.svg | 1 + assets/uswds/material-icons/local_atm.svg | 1 + assets/uswds/material-icons/local_bar.svg | 1 + assets/uswds/material-icons/local_cafe.svg | 1 + .../uswds/material-icons/local_car_wash.svg | 1 + .../local_convenience_store.svg | 1 + assets/uswds/material-icons/local_dining.svg | 1 + assets/uswds/material-icons/local_drink.svg | 1 + .../material-icons/local_fire_department.svg | 1 + assets/uswds/material-icons/local_florist.svg | 1 + .../material-icons/local_gas_station.svg | 1 + .../material-icons/local_grocery_store.svg | 1 + .../uswds/material-icons/local_hospital.svg | 1 + assets/uswds/material-icons/local_hotel.svg | 1 + .../material-icons/local_laundry_service.svg | 1 + assets/uswds/material-icons/local_library.svg | 1 + assets/uswds/material-icons/local_mall.svg | 1 + assets/uswds/material-icons/local_movies.svg | 1 + assets/uswds/material-icons/local_offer.svg | 1 + assets/uswds/material-icons/local_parking.svg | 1 + .../uswds/material-icons/local_pharmacy.svg | 1 + assets/uswds/material-icons/local_phone.svg | 1 + assets/uswds/material-icons/local_pizza.svg | 1 + assets/uswds/material-icons/local_play.svg | 1 + assets/uswds/material-icons/local_police.svg | 1 + .../material-icons/local_post_office.svg | 1 + .../uswds/material-icons/local_printshop.svg | 1 + assets/uswds/material-icons/local_see.svg | 1 + .../uswds/material-icons/local_shipping.svg | 1 + assets/uswds/material-icons/local_taxi.svg | 1 + assets/uswds/material-icons/location_city.svg | 1 + .../material-icons/location_disabled.svg | 1 + assets/uswds/material-icons/location_off.svg | 1 + assets/uswds/material-icons/location_on.svg | 1 + assets/uswds/material-icons/location_pin.svg | 1 + .../material-icons/location_searching.svg | 1 + assets/uswds/material-icons/lock.svg | 1 + assets/uswds/material-icons/lock_clock.svg | 1 + assets/uswds/material-icons/lock_open.svg | 1 + assets/uswds/material-icons/lock_outline.svg | 1 + assets/uswds/material-icons/login.svg | 1 + assets/uswds/material-icons/logout.svg | 1 + assets/uswds/material-icons/looks.svg | 1 + assets/uswds/material-icons/looks_3.svg | 1 + assets/uswds/material-icons/looks_4.svg | 1 + assets/uswds/material-icons/looks_5.svg | 1 + assets/uswds/material-icons/looks_6.svg | 1 + assets/uswds/material-icons/looks_one.svg | 1 + assets/uswds/material-icons/looks_two.svg | 1 + assets/uswds/material-icons/loop.svg | 1 + assets/uswds/material-icons/loupe.svg | 1 + assets/uswds/material-icons/low_priority.svg | 1 + assets/uswds/material-icons/loyalty.svg | 1 + assets/uswds/material-icons/luggage.svg | 1 + assets/uswds/material-icons/lunch_dining.svg | 1 + assets/uswds/material-icons/mail.svg | 1 + assets/uswds/material-icons/mail_outline.svg | 1 + assets/uswds/material-icons/map.svg | 1 + assets/uswds/material-icons/maps_ugc.svg | 1 + assets/uswds/material-icons/margin.svg | 1 + .../uswds/material-icons/mark_as_unread.svg | 1 + .../uswds/material-icons/mark_chat_read.svg | 1 + .../uswds/material-icons/mark_chat_unread.svg | 1 + .../uswds/material-icons/mark_email_read.svg | 1 + .../material-icons/mark_email_unread.svg | 1 + assets/uswds/material-icons/markunread.svg | 1 + .../material-icons/markunread_mailbox.svg | 1 + assets/uswds/material-icons/masks.svg | 1 + assets/uswds/material-icons/maximize.svg | 1 + assets/uswds/material-icons/mediation.svg | 1 + .../uswds/material-icons/medical_services.svg | 1 + assets/uswds/material-icons/meeting_room.svg | 1 + assets/uswds/material-icons/memory.svg | 1 + assets/uswds/material-icons/menu.svg | 1 + assets/uswds/material-icons/menu_book.svg | 1 + assets/uswds/material-icons/menu_open.svg | 1 + assets/uswds/material-icons/merge_type.svg | 1 + assets/uswds/material-icons/message.svg | 1 + assets/uswds/material-icons/mic.svg | 1 + .../uswds/material-icons/mic_external_off.svg | 1 + .../uswds/material-icons/mic_external_on.svg | 1 + assets/uswds/material-icons/mic_none.svg | 1 + assets/uswds/material-icons/mic_off.svg | 1 + assets/uswds/material-icons/microwave.svg | 1 + assets/uswds/material-icons/military_tech.svg | 1 + assets/uswds/material-icons/minimize.svg | 1 + .../material-icons/miscellaneous_services.svg | 1 + .../material-icons/missed_video_call.svg | 1 + assets/uswds/material-icons/mms.svg | 1 + .../uswds/material-icons/mobile_friendly.svg | 1 + assets/uswds/material-icons/mobile_off.svg | 1 + .../material-icons/mobile_screen_share.svg | 1 + assets/uswds/material-icons/mode_comment.svg | 1 + assets/uswds/material-icons/mode_edit.svg | 1 + .../uswds/material-icons/model_training.svg | 1 + .../uswds/material-icons/monetization_on.svg | 1 + assets/uswds/material-icons/money.svg | 1 + assets/uswds/material-icons/money_off.svg | 1 + assets/uswds/material-icons/monitor.svg | 1 + .../material-icons/monochrome_photos.svg | 1 + assets/uswds/material-icons/mood.svg | 1 + assets/uswds/material-icons/mood_bad.svg | 1 + assets/uswds/material-icons/moped.svg | 1 + assets/uswds/material-icons/more.svg | 1 + assets/uswds/material-icons/more_horiz.svg | 1 + assets/uswds/material-icons/more_time.svg | 1 + assets/uswds/material-icons/more_vert.svg | 1 + .../material-icons/motion_photos_off.svg | 1 + .../uswds/material-icons/motion_photos_on.svg | 1 + .../material-icons/motion_photos_pause.svg | 1 + .../material-icons/motion_photos_paused.svg | 1 + assets/uswds/material-icons/mouse.svg | 1 + assets/uswds/material-icons/move_to_inbox.svg | 1 + assets/uswds/material-icons/movie.svg | 1 + .../uswds/material-icons/movie_creation.svg | 1 + assets/uswds/material-icons/movie_filter.svg | 1 + assets/uswds/material-icons/mp.svg | 1 + .../uswds/material-icons/multiline_chart.svg | 1 + assets/uswds/material-icons/multiple_stop.svg | 1 + assets/uswds/material-icons/museum.svg | 1 + assets/uswds/material-icons/music_note.svg | 1 + assets/uswds/material-icons/music_off.svg | 1 + assets/uswds/material-icons/music_video.svg | 1 + assets/uswds/material-icons/my_location.svg | 1 + assets/uswds/material-icons/nat.svg | 1 + assets/uswds/material-icons/nature.svg | 1 + assets/uswds/material-icons/nature_people.svg | 1 + .../uswds/material-icons/navigate_before.svg | 1 + assets/uswds/material-icons/navigate_next.svg | 1 + assets/uswds/material-icons/navigation.svg | 1 + assets/uswds/material-icons/near_me.svg | 1 + .../uswds/material-icons/near_me_disabled.svg | 1 + assets/uswds/material-icons/network_cell.svg | 1 + assets/uswds/material-icons/network_check.svg | 1 + .../uswds/material-icons/network_locked.svg | 1 + assets/uswds/material-icons/network_wifi.svg | 1 + assets/uswds/material-icons/new_releases.svg | 1 + assets/uswds/material-icons/next_plan.svg | 1 + assets/uswds/material-icons/next_week.svg | 1 + assets/uswds/material-icons/nfc.svg | 1 + assets/uswds/material-icons/night_shelter.svg | 1 + assets/uswds/material-icons/nightlife.svg | 1 + .../uswds/material-icons/nightlight_round.svg | 1 + assets/uswds/material-icons/nights_stay.svg | 1 + assets/uswds/material-icons/no_backpack.svg | 1 + assets/uswds/material-icons/no_cell.svg | 1 + assets/uswds/material-icons/no_drinks.svg | 1 + assets/uswds/material-icons/no_encryption.svg | 1 + assets/uswds/material-icons/no_flash.svg | 1 + assets/uswds/material-icons/no_food.svg | 1 + assets/uswds/material-icons/no_luggage.svg | 1 + assets/uswds/material-icons/no_meals.svg | 1 + .../uswds/material-icons/no_meals_ouline.svg | 1 + .../uswds/material-icons/no_meeting_room.svg | 1 + .../uswds/material-icons/no_photography.svg | 1 + assets/uswds/material-icons/no_sim.svg | 1 + assets/uswds/material-icons/no_stroller.svg | 1 + assets/uswds/material-icons/no_transfer.svg | 1 + assets/uswds/material-icons/north.svg | 1 + assets/uswds/material-icons/north_east.svg | 1 + assets/uswds/material-icons/north_west.svg | 1 + .../uswds/material-icons/not_accessible.svg | 1 + .../uswds/material-icons/not_interested.svg | 1 + .../material-icons/not_listed_location.svg | 1 + assets/uswds/material-icons/not_started.svg | 1 + assets/uswds/material-icons/note.svg | 1 + assets/uswds/material-icons/note_add.svg | 1 + assets/uswds/material-icons/notes.svg | 1 + .../material-icons/notification_important.svg | 1 + assets/uswds/material-icons/notifications.svg | 1 + .../material-icons/notifications_active.svg | 1 + .../material-icons/notifications_none.svg | 1 + .../material-icons/notifications_off.svg | 1 + .../material-icons/notifications_paused.svg | 1 + assets/uswds/material-icons/offline_bolt.svg | 1 + assets/uswds/material-icons/offline_pin.svg | 1 + assets/uswds/material-icons/offline_share.svg | 1 + .../uswds/material-icons/ondemand_video.svg | 1 + .../material-icons/online_prediction.svg | 1 + assets/uswds/material-icons/opacity.svg | 1 + .../uswds/material-icons/open_in_browser.svg | 1 + assets/uswds/material-icons/open_in_full.svg | 1 + assets/uswds/material-icons/open_in_new.svg | 1 + assets/uswds/material-icons/open_with.svg | 1 + assets/uswds/material-icons/outbond.svg | 1 + assets/uswds/material-icons/outbox.svg | 1 + assets/uswds/material-icons/outdoor_grill.svg | 1 + assets/uswds/material-icons/outgoing_mail.svg | 1 + assets/uswds/material-icons/outlet.svg | 1 + assets/uswds/material-icons/outlined_flag.svg | 1 + assets/uswds/material-icons/padding.svg | 1 + assets/uswds/material-icons/pages.svg | 1 + assets/uswds/material-icons/pageview.svg | 1 + assets/uswds/material-icons/palette.svg | 1 + assets/uswds/material-icons/pan_tool.svg | 1 + assets/uswds/material-icons/panorama.svg | 1 + .../material-icons/panorama_fish_eye.svg | 1 + .../material-icons/panorama_horizontal.svg | 1 + .../panorama_horizontal_select.svg | 1 + .../material-icons/panorama_photosphere.svg | 1 + .../panorama_photosphere_select.svg | 1 + .../material-icons/panorama_vertical.svg | 1 + .../panorama_vertical_select.svg | 1 + .../material-icons/panorama_wide_angle.svg | 1 + .../panorama_wide_angle_select.svg | 1 + assets/uswds/material-icons/park.svg | 1 + assets/uswds/material-icons/party_mode.svg | 1 + assets/uswds/material-icons/pause.svg | 1 + .../material-icons/pause_circle_filled.svg | 1 + .../material-icons/pause_circle_outline.svg | 1 + .../material-icons/pause_presentation.svg | 1 + assets/uswds/material-icons/payment.svg | 1 + assets/uswds/material-icons/payments.svg | 1 + assets/uswds/material-icons/pedal_bike.svg | 1 + assets/uswds/material-icons/pending.svg | 1 + .../uswds/material-icons/pending_actions.svg | 1 + assets/uswds/material-icons/people.svg | 1 + assets/uswds/material-icons/people_alt.svg | 1 + .../uswds/material-icons/people_outline.svg | 1 + .../uswds/material-icons/perm_camera_mic.svg | 1 + .../material-icons/perm_contact_calendar.svg | 1 + .../material-icons/perm_data_setting.svg | 1 + .../perm_device_information.svg | 1 + assets/uswds/material-icons/perm_identity.svg | 1 + assets/uswds/material-icons/perm_media.svg | 1 + .../uswds/material-icons/perm_phone_msg.svg | 1 + .../uswds/material-icons/perm_scan_wifi.svg | 1 + assets/uswds/material-icons/person.svg | 1 + assets/uswds/material-icons/person_add.svg | 1 + .../uswds/material-icons/person_add_alt.svg | 1 + .../uswds/material-icons/person_add_alt_1.svg | 1 + .../material-icons/person_add_disabled.svg | 1 + .../uswds/material-icons/person_outline.svg | 1 + assets/uswds/material-icons/person_pin.svg | 1 + .../material-icons/person_pin_circle.svg | 1 + assets/uswds/material-icons/person_remove.svg | 1 + .../material-icons/person_remove_alt_1.svg | 1 + assets/uswds/material-icons/person_search.svg | 1 + .../uswds/material-icons/personal_video.svg | 1 + assets/uswds/material-icons/pest_control.svg | 1 + .../material-icons/pest_control_rodent.svg | 1 + assets/uswds/material-icons/pets.svg | 1 + assets/uswds/material-icons/phone.svg | 1 + assets/uswds/material-icons/phone_android.svg | 1 + .../phone_bluetooth_speaker.svg | 1 + .../uswds/material-icons/phone_callback.svg | 1 + .../uswds/material-icons/phone_disabled.svg | 1 + assets/uswds/material-icons/phone_enabled.svg | 1 + .../uswds/material-icons/phone_forwarded.svg | 1 + assets/uswds/material-icons/phone_in_talk.svg | 1 + assets/uswds/material-icons/phone_iphone.svg | 1 + assets/uswds/material-icons/phone_locked.svg | 1 + assets/uswds/material-icons/phone_missed.svg | 1 + assets/uswds/material-icons/phone_paused.svg | 1 + assets/uswds/material-icons/phonelink.svg | 1 + .../uswds/material-icons/phonelink_erase.svg | 1 + .../uswds/material-icons/phonelink_lock.svg | 1 + assets/uswds/material-icons/phonelink_off.svg | 1 + .../uswds/material-icons/phonelink_ring.svg | 1 + .../uswds/material-icons/phonelink_setup.svg | 1 + assets/uswds/material-icons/photo.svg | 1 + assets/uswds/material-icons/photo_album.svg | 1 + assets/uswds/material-icons/photo_camera.svg | 1 + .../material-icons/photo_camera_back.svg | 1 + .../material-icons/photo_camera_front.svg | 1 + assets/uswds/material-icons/photo_filter.svg | 1 + assets/uswds/material-icons/photo_library.svg | 1 + .../photo_size_select_actual.svg | 1 + .../photo_size_select_large.svg | 1 + .../photo_size_select_small.svg | 1 + .../uswds/material-icons/picture_as_pdf.svg | 1 + .../material-icons/picture_in_picture.svg | 1 + .../material-icons/picture_in_picture_alt.svg | 1 + assets/uswds/material-icons/pie_chart.svg | 1 + .../material-icons/pie_chart_outlined.svg | 1 + assets/uswds/material-icons/pin_drop.svg | 1 + .../material-icons/pivot_table_chart.svg | 1 + assets/uswds/material-icons/place.svg | 1 + assets/uswds/material-icons/plagiarism.svg | 1 + assets/uswds/material-icons/play_arrow.svg | 1 + .../material-icons/play_circle_filled.svg | 1 + .../material-icons/play_circle_outline.svg | 1 + assets/uswds/material-icons/play_disabled.svg | 1 + assets/uswds/material-icons/play_for_work.svg | 1 + assets/uswds/material-icons/playlist_add.svg | 1 + .../material-icons/playlist_add_check.svg | 1 + assets/uswds/material-icons/playlist_play.svg | 1 + assets/uswds/material-icons/plumbing.svg | 1 + assets/uswds/material-icons/plus_one.svg | 1 + assets/uswds/material-icons/point_of_sale.svg | 1 + assets/uswds/material-icons/policy.svg | 1 + assets/uswds/material-icons/poll.svg | 1 + assets/uswds/material-icons/polymer.svg | 1 + assets/uswds/material-icons/pool.svg | 1 + .../material-icons/portable_wifi_off.svg | 1 + assets/uswds/material-icons/portrait.svg | 1 + assets/uswds/material-icons/post_add.svg | 1 + assets/uswds/material-icons/power.svg | 1 + assets/uswds/material-icons/power_input.svg | 1 + assets/uswds/material-icons/power_off.svg | 1 + .../material-icons/power_settings_new.svg | 1 + .../uswds/material-icons/pregnant_woman.svg | 1 + .../uswds/material-icons/present_to_all.svg | 1 + assets/uswds/material-icons/preview.svg | 1 + assets/uswds/material-icons/print.svg | 1 + .../uswds/material-icons/print_disabled.svg | 1 + assets/uswds/material-icons/priority_high.svg | 1 + assets/uswds/material-icons/privacy_tip.svg | 1 + assets/uswds/material-icons/psychology.svg | 1 + assets/uswds/material-icons/public.svg | 1 + assets/uswds/material-icons/public_off.svg | 1 + assets/uswds/material-icons/publish.svg | 1 + .../material-icons/published_with_changes.svg | 1 + assets/uswds/material-icons/push_pin.svg | 1 + assets/uswds/material-icons/qr_code.svg | 1 + assets/uswds/material-icons/qr_code_2.svg | 1 + .../uswds/material-icons/qr_code_scanner.svg | 1 + assets/uswds/material-icons/query_builder.svg | 1 + .../uswds/material-icons/question_answer.svg | 1 + assets/uswds/material-icons/queue.svg | 1 + assets/uswds/material-icons/queue_music.svg | 1 + .../uswds/material-icons/queue_play_next.svg | 1 + assets/uswds/material-icons/quickreply.svg | 1 + assets/uswds/material-icons/radio.svg | 1 + .../material-icons/radio_button_checked.svg | 1 + .../material-icons/radio_button_unchecked.svg | 1 + assets/uswds/material-icons/railway_alert.svg | 1 + assets/uswds/material-icons/ramen_dining.svg | 1 + assets/uswds/material-icons/rate_review.svg | 1 + assets/uswds/material-icons/read_more.svg | 1 + assets/uswds/material-icons/receipt.svg | 1 + assets/uswds/material-icons/receipt_long.svg | 1 + assets/uswds/material-icons/recent_actors.svg | 1 + assets/uswds/material-icons/recommend.svg | 1 + .../material-icons/record_voice_over.svg | 1 + assets/uswds/material-icons/redeem.svg | 1 + assets/uswds/material-icons/redo.svg | 1 + .../uswds/material-icons/reduce_capacity.svg | 1 + assets/uswds/material-icons/refresh.svg | 1 + assets/uswds/material-icons/remove.svg | 1 + assets/uswds/material-icons/remove_circle.svg | 1 + .../material-icons/remove_circle_outline.svg | 1 + assets/uswds/material-icons/remove_done.svg | 1 + .../material-icons/remove_from_queue.svg | 1 + .../uswds/material-icons/remove_moderator.svg | 1 + .../uswds/material-icons/remove_red_eye.svg | 1 + .../material-icons/remove_shopping_cart.svg | 1 + assets/uswds/material-icons/reorder.svg | 1 + assets/uswds/material-icons/repeat.svg | 1 + assets/uswds/material-icons/repeat_on.svg | 1 + assets/uswds/material-icons/repeat_one.svg | 1 + assets/uswds/material-icons/repeat_one_on.svg | 1 + assets/uswds/material-icons/replay.svg | 1 + assets/uswds/material-icons/replay_10.svg | 1 + assets/uswds/material-icons/replay_30.svg | 1 + assets/uswds/material-icons/replay_5.svg | 1 + .../material-icons/replay_circle_filled.svg | 1 + assets/uswds/material-icons/reply.svg | 1 + assets/uswds/material-icons/reply_all.svg | 1 + assets/uswds/material-icons/report.svg | 1 + assets/uswds/material-icons/report_off.svg | 1 + .../uswds/material-icons/report_problem.svg | 1 + assets/uswds/material-icons/request_page.svg | 1 + assets/uswds/material-icons/request_quote.svg | 1 + assets/uswds/material-icons/reset_tv.svg | 1 + assets/uswds/material-icons/restaurant.svg | 1 + .../uswds/material-icons/restaurant_menu.svg | 1 + assets/uswds/material-icons/restore.svg | 1 + .../material-icons/restore_from_trash.svg | 1 + assets/uswds/material-icons/restore_page.svg | 1 + assets/uswds/material-icons/rice_bowl.svg | 1 + assets/uswds/material-icons/ring_volume.svg | 1 + assets/uswds/material-icons/roofing.svg | 1 + assets/uswds/material-icons/room.svg | 1 + .../uswds/material-icons/room_preferences.svg | 1 + assets/uswds/material-icons/room_service.svg | 1 + .../material-icons/rotate_90_degrees_ccw.svg | 1 + assets/uswds/material-icons/rotate_left.svg | 1 + assets/uswds/material-icons/rotate_right.svg | 1 + .../uswds/material-icons/rounded_corner.svg | 1 + assets/uswds/material-icons/router.svg | 1 + assets/uswds/material-icons/rowing.svg | 1 + assets/uswds/material-icons/rss_feed.svg | 1 + assets/uswds/material-icons/rtt.svg | 1 + assets/uswds/material-icons/rule.svg | 1 + assets/uswds/material-icons/rule_folder.svg | 1 + assets/uswds/material-icons/run_circle.svg | 1 + assets/uswds/material-icons/rv_hookup.svg | 1 + .../uswds/material-icons/safety_divider.svg | 1 + assets/uswds/material-icons/sanitizer.svg | 1 + assets/uswds/material-icons/satellite.svg | 1 + assets/uswds/material-icons/save.svg | 1 + assets/uswds/material-icons/save_alt.svg | 1 + assets/uswds/material-icons/saved_search.svg | 1 + assets/uswds/material-icons/scanner.svg | 1 + assets/uswds/material-icons/scatter_plot.svg | 1 + assets/uswds/material-icons/schedule.svg | 1 + assets/uswds/material-icons/schedule_send.svg | 1 + assets/uswds/material-icons/school.svg | 1 + assets/uswds/material-icons/science.svg | 1 + assets/uswds/material-icons/score.svg | 1 + .../material-icons/screen_lock_landscape.svg | 1 + .../material-icons/screen_lock_portrait.svg | 1 + .../material-icons/screen_lock_rotation.svg | 1 + .../uswds/material-icons/screen_rotation.svg | 1 + .../material-icons/screen_search_desktop.svg | 1 + assets/uswds/material-icons/screen_share.svg | 1 + assets/uswds/material-icons/sd.svg | 1 + assets/uswds/material-icons/sd_card.svg | 1 + assets/uswds/material-icons/sd_storage.svg | 1 + assets/uswds/material-icons/search.svg | 1 + assets/uswds/material-icons/search_off.svg | 1 + assets/uswds/material-icons/security.svg | 1 + assets/uswds/material-icons/segment.svg | 1 + assets/uswds/material-icons/select_all.svg | 1 + .../uswds/material-icons/self_improvement.svg | 1 + assets/uswds/material-icons/send.svg | 1 + .../uswds/material-icons/send_and_archive.svg | 1 + .../uswds/material-icons/send_to_mobile.svg | 1 + assets/uswds/material-icons/sensor_door.svg | 1 + assets/uswds/material-icons/sensor_window.svg | 1 + .../material-icons/sentiment_dissatisfied.svg | 1 + .../material-icons/sentiment_neutral.svg | 1 + .../material-icons/sentiment_satisfied.svg | 1 + .../sentiment_satisfied_alt.svg | 1 + .../sentiment_very_dissatisfied.svg | 1 + .../sentiment_very_satisfied.svg | 1 + assets/uswds/material-icons/set_meal.svg | 1 + assets/uswds/material-icons/settings.svg | 1 + .../material-icons/settings_applications.svg | 1 + .../settings_backup_restore.svg | 1 + .../material-icons/settings_bluetooth.svg | 1 + .../material-icons/settings_brightness.svg | 1 + assets/uswds/material-icons/settings_cell.svg | 1 + .../material-icons/settings_ethernet.svg | 1 + .../material-icons/settings_input_antenna.svg | 1 + .../settings_input_component.svg | 1 + .../settings_input_composite.svg | 1 + .../material-icons/settings_input_hdmi.svg | 1 + .../material-icons/settings_input_svideo.svg | 1 + .../material-icons/settings_overscan.svg | 1 + .../uswds/material-icons/settings_phone.svg | 1 + .../uswds/material-icons/settings_power.svg | 1 + .../uswds/material-icons/settings_remote.svg | 1 + .../settings_system_daydream.svg | 1 + .../uswds/material-icons/settings_voice.svg | 1 + assets/uswds/material-icons/share.svg | 1 + assets/uswds/material-icons/shield.svg | 1 + assets/uswds/material-icons/shop.svg | 1 + assets/uswds/material-icons/shop_two.svg | 1 + assets/uswds/material-icons/shopping_bag.svg | 1 + .../uswds/material-icons/shopping_basket.svg | 1 + assets/uswds/material-icons/shopping_cart.svg | 1 + assets/uswds/material-icons/short_text.svg | 1 + assets/uswds/material-icons/show_chart.svg | 1 + assets/uswds/material-icons/shuffle.svg | 1 + assets/uswds/material-icons/shuffle_on.svg | 1 + assets/uswds/material-icons/shutter_speed.svg | 1 + assets/uswds/material-icons/sick.svg | 1 + .../material-icons/signal_cellular_0_bar.svg | 1 + .../material-icons/signal_cellular_4_bar.svg | 1 + .../material-icons/signal_cellular_alt.svg | 1 + ...l_cellular_connected_no_internet_4_bar.svg | 1 + .../material-icons/signal_cellular_no_sim.svg | 1 + .../material-icons/signal_cellular_null.svg | 1 + .../material-icons/signal_cellular_off.svg | 1 + .../material-icons/signal_wifi_0_bar.svg | 1 + .../material-icons/signal_wifi_4_bar.svg | 1 + .../material-icons/signal_wifi_4_bar_lock.svg | 1 + .../uswds/material-icons/signal_wifi_off.svg | 1 + assets/uswds/material-icons/sim_card.svg | 1 + .../uswds/material-icons/sim_card_alert.svg | 1 + assets/uswds/material-icons/single_bed.svg | 1 + assets/uswds/material-icons/skip_next.svg | 1 + assets/uswds/material-icons/skip_previous.svg | 1 + assets/uswds/material-icons/slideshow.svg | 1 + .../material-icons/slow_motion_video.svg | 1 + assets/uswds/material-icons/smart_button.svg | 1 + assets/uswds/material-icons/smartphone.svg | 1 + assets/uswds/material-icons/smoke_free.svg | 1 + assets/uswds/material-icons/smoking_rooms.svg | 1 + assets/uswds/material-icons/sms.svg | 1 + assets/uswds/material-icons/sms_failed.svg | 1 + .../uswds/material-icons/snippet_folder.svg | 1 + assets/uswds/material-icons/snooze.svg | 1 + assets/uswds/material-icons/soap.svg | 1 + .../uswds/material-icons/social_distance.svg | 1 + assets/uswds/material-icons/sort.svg | 1 + assets/uswds/material-icons/sort_by_alpha.svg | 1 + assets/uswds/material-icons/source.svg | 1 + assets/uswds/material-icons/south.svg | 1 + assets/uswds/material-icons/south_east.svg | 1 + assets/uswds/material-icons/south_west.svg | 1 + assets/uswds/material-icons/spa.svg | 1 + assets/uswds/material-icons/space_bar.svg | 1 + assets/uswds/material-icons/speaker.svg | 1 + assets/uswds/material-icons/speaker_group.svg | 1 + assets/uswds/material-icons/speaker_notes.svg | 1 + .../material-icons/speaker_notes_off.svg | 1 + assets/uswds/material-icons/speaker_phone.svg | 1 + assets/uswds/material-icons/speed.svg | 1 + assets/uswds/material-icons/spellcheck.svg | 1 + assets/uswds/material-icons/sports.svg | 1 + assets/uswds/material-icons/sports_bar.svg | 1 + .../uswds/material-icons/sports_baseball.svg | 1 + .../material-icons/sports_basketball.svg | 1 + .../uswds/material-icons/sports_cricket.svg | 1 + .../uswds/material-icons/sports_esports.svg | 1 + .../uswds/material-icons/sports_football.svg | 1 + assets/uswds/material-icons/sports_golf.svg | 1 + .../uswds/material-icons/sports_handball.svg | 1 + assets/uswds/material-icons/sports_hockey.svg | 1 + .../uswds/material-icons/sports_kabaddi.svg | 1 + assets/uswds/material-icons/sports_mma.svg | 1 + .../material-icons/sports_motorsports.svg | 1 + assets/uswds/material-icons/sports_rugby.svg | 1 + assets/uswds/material-icons/sports_soccer.svg | 1 + assets/uswds/material-icons/sports_tennis.svg | 1 + .../material-icons/sports_volleyball.svg | 1 + assets/uswds/material-icons/square_foot.svg | 1 + .../material-icons/stacked_bar_chart.svg | 1 + .../material-icons/stacked_line_chart.svg | 1 + assets/uswds/material-icons/stairs.svg | 1 + assets/uswds/material-icons/star.svg | 1 + assets/uswds/material-icons/star_border.svg | 1 + assets/uswds/material-icons/star_half.svg | 1 + assets/uswds/material-icons/star_outline.svg | 1 + assets/uswds/material-icons/star_rate.svg | 1 + assets/uswds/material-icons/stars.svg | 1 + .../material-icons/stay_current_landscape.svg | 1 + .../material-icons/stay_current_portrait.svg | 1 + .../material-icons/stay_primary_landscape.svg | 1 + .../material-icons/stay_primary_portrait.svg | 1 + assets/uswds/material-icons/sticky_note_2.svg | 1 + assets/uswds/material-icons/stop.svg | 1 + assets/uswds/material-icons/stop_circle.svg | 1 + .../material-icons/stop_screen_share.svg | 1 + assets/uswds/material-icons/storage.svg | 1 + assets/uswds/material-icons/store.svg | 1 + .../material-icons/store_mall_directory.svg | 1 + assets/uswds/material-icons/storefront.svg | 1 + assets/uswds/material-icons/straighten.svg | 1 + assets/uswds/material-icons/stream.svg | 1 + assets/uswds/material-icons/streetview.svg | 1 + .../uswds/material-icons/strikethrough_s.svg | 1 + assets/uswds/material-icons/stroller.svg | 1 + assets/uswds/material-icons/style.svg | 1 + .../subdirectory_arrow_left.svg | 1 + .../subdirectory_arrow_right.svg | 1 + assets/uswds/material-icons/subject.svg | 1 + assets/uswds/material-icons/subscript.svg | 1 + assets/uswds/material-icons/subscriptions.svg | 1 + assets/uswds/material-icons/subtitles.svg | 1 + assets/uswds/material-icons/subtitles_off.svg | 1 + assets/uswds/material-icons/subway.svg | 1 + assets/uswds/material-icons/superscript.svg | 1 + .../material-icons/supervised_user_circle.svg | 1 + .../material-icons/supervisor_account.svg | 1 + assets/uswds/material-icons/support.svg | 1 + assets/uswds/material-icons/support_agent.svg | 1 + .../uswds/material-icons/surround_sound.svg | 1 + assets/uswds/material-icons/swap_calls.svg | 1 + assets/uswds/material-icons/swap_horiz.svg | 1 + .../material-icons/swap_horizontal_circle.svg | 1 + assets/uswds/material-icons/swap_vert.svg | 1 + .../material-icons/swap_vertical_circle.svg | 1 + assets/uswds/material-icons/swipe.svg | 1 + .../uswds/material-icons/switch_account.svg | 1 + assets/uswds/material-icons/switch_camera.svg | 1 + assets/uswds/material-icons/switch_left.svg | 1 + assets/uswds/material-icons/switch_right.svg | 1 + assets/uswds/material-icons/switch_video.svg | 1 + assets/uswds/material-icons/sync.svg | 1 + assets/uswds/material-icons/sync_alt.svg | 1 + assets/uswds/material-icons/sync_disabled.svg | 1 + assets/uswds/material-icons/sync_problem.svg | 1 + assets/uswds/material-icons/system_update.svg | 1 + .../material-icons/system_update_alt.svg | 1 + assets/uswds/material-icons/tab.svg | 1 + .../uswds/material-icons/tab_unselected.svg | 1 + assets/uswds/material-icons/table_chart.svg | 1 + assets/uswds/material-icons/table_rows.svg | 1 + assets/uswds/material-icons/table_view.svg | 1 + assets/uswds/material-icons/tablet.svg | 1 + .../uswds/material-icons/tablet_android.svg | 1 + assets/uswds/material-icons/tablet_mac.svg | 1 + assets/uswds/material-icons/tag.svg | 1 + assets/uswds/material-icons/tag_faces.svg | 1 + .../uswds/material-icons/takeout_dining.svg | 1 + assets/uswds/material-icons/tap_and_play.svg | 1 + assets/uswds/material-icons/tapas.svg | 1 + assets/uswds/material-icons/taxi_alert.svg | 1 + assets/uswds/material-icons/terrain.svg | 1 + assets/uswds/material-icons/text_fields.svg | 1 + assets/uswds/material-icons/text_format.svg | 1 + .../uswds/material-icons/text_rotate_up.svg | 1 + .../material-icons/text_rotate_vertical.svg | 1 + .../text_rotation_angledown.svg | 1 + .../material-icons/text_rotation_angleup.svg | 1 + .../material-icons/text_rotation_down.svg | 1 + .../material-icons/text_rotation_none.svg | 1 + assets/uswds/material-icons/text_snippet.svg | 1 + assets/uswds/material-icons/textsms.svg | 1 + assets/uswds/material-icons/texture.svg | 1 + .../uswds/material-icons/theater_comedy.svg | 1 + assets/uswds/material-icons/theaters.svg | 1 + assets/uswds/material-icons/thumb_down.svg | 1 + .../uswds/material-icons/thumb_down_alt.svg | 1 + .../material-icons/thumb_down_off_alt.svg | 1 + assets/uswds/material-icons/thumb_up.svg | 1 + assets/uswds/material-icons/thumb_up_alt.svg | 1 + .../uswds/material-icons/thumb_up_off_alt.svg | 1 + .../uswds/material-icons/thumbs_up_down.svg | 1 + assets/uswds/material-icons/time_to_leave.svg | 1 + assets/uswds/material-icons/timelapse.svg | 1 + assets/uswds/material-icons/timeline.svg | 1 + assets/uswds/material-icons/timer.svg | 1 + assets/uswds/material-icons/timer_10.svg | 1 + assets/uswds/material-icons/timer_3.svg | 1 + assets/uswds/material-icons/timer_off.svg | 1 + assets/uswds/material-icons/title.svg | 1 + assets/uswds/material-icons/toc.svg | 1 + assets/uswds/material-icons/today.svg | 1 + assets/uswds/material-icons/toggle_off.svg | 1 + assets/uswds/material-icons/toggle_on.svg | 1 + assets/uswds/material-icons/toll.svg | 1 + assets/uswds/material-icons/tonality.svg | 1 + assets/uswds/material-icons/topic.svg | 1 + assets/uswds/material-icons/touch_app.svg | 1 + assets/uswds/material-icons/tour.svg | 1 + assets/uswds/material-icons/toys.svg | 1 + assets/uswds/material-icons/track_changes.svg | 1 + assets/uswds/material-icons/traffic.svg | 1 + assets/uswds/material-icons/train.svg | 1 + assets/uswds/material-icons/tram.svg | 1 + .../transfer_within_a_station.svg | 1 + assets/uswds/material-icons/transform.svg | 1 + .../material-icons/transit_enterexit.svg | 1 + assets/uswds/material-icons/translate.svg | 1 + assets/uswds/material-icons/trending_down.svg | 1 + assets/uswds/material-icons/trending_flat.svg | 1 + assets/uswds/material-icons/trending_up.svg | 1 + assets/uswds/material-icons/trip_origin.svg | 1 + assets/uswds/material-icons/tty.svg | 1 + assets/uswds/material-icons/tune.svg | 1 + assets/uswds/material-icons/turned_in.svg | 1 + assets/uswds/material-icons/turned_in_not.svg | 1 + assets/uswds/material-icons/tv.svg | 1 + assets/uswds/material-icons/tv_off.svg | 1 + assets/uswds/material-icons/two_wheeler.svg | 1 + assets/uswds/material-icons/umbrella.svg | 1 + assets/uswds/material-icons/unarchive.svg | 1 + assets/uswds/material-icons/undo.svg | 1 + assets/uswds/material-icons/unfold_less.svg | 1 + assets/uswds/material-icons/unfold_more.svg | 1 + assets/uswds/material-icons/unpublished.svg | 1 + assets/uswds/material-icons/unsubscribe.svg | 1 + assets/uswds/material-icons/update.svg | 1 + .../uswds/material-icons/update_disabled.svg | 1 + assets/uswds/material-icons/upgrade.svg | 1 + assets/uswds/material-icons/upload_file.svg | 1 + assets/uswds/material-icons/usb.svg | 1 + assets/uswds/material-icons/verified.svg | 1 + assets/uswds/material-icons/verified_user.svg | 1 + .../material-icons/vertical_align_bottom.svg | 1 + .../material-icons/vertical_align_center.svg | 1 + .../material-icons/vertical_align_top.svg | 1 + .../material-icons/vertical_distribute.svg | 1 + .../uswds/material-icons/vertical_split.svg | 1 + assets/uswds/material-icons/vibration.svg | 1 + assets/uswds/material-icons/video_call.svg | 1 + assets/uswds/material-icons/video_label.svg | 1 + assets/uswds/material-icons/video_library.svg | 1 + .../uswds/material-icons/video_settings.svg | 1 + assets/uswds/material-icons/videocam.svg | 1 + assets/uswds/material-icons/videocam_off.svg | 1 + .../uswds/material-icons/videogame_asset.svg | 1 + assets/uswds/material-icons/view_agenda.svg | 1 + assets/uswds/material-icons/view_array.svg | 1 + assets/uswds/material-icons/view_carousel.svg | 1 + assets/uswds/material-icons/view_column.svg | 1 + assets/uswds/material-icons/view_comfy.svg | 1 + assets/uswds/material-icons/view_compact.svg | 1 + assets/uswds/material-icons/view_day.svg | 1 + assets/uswds/material-icons/view_headline.svg | 1 + assets/uswds/material-icons/view_in_ar.svg | 1 + assets/uswds/material-icons/view_list.svg | 1 + assets/uswds/material-icons/view_module.svg | 1 + assets/uswds/material-icons/view_quilt.svg | 1 + assets/uswds/material-icons/view_sidebar.svg | 1 + assets/uswds/material-icons/view_stream.svg | 1 + assets/uswds/material-icons/view_week.svg | 1 + assets/uswds/material-icons/vignette.svg | 1 + assets/uswds/material-icons/visibility.svg | 1 + .../uswds/material-icons/visibility_off.svg | 1 + assets/uswds/material-icons/voice_chat.svg | 1 + .../uswds/material-icons/voice_over_off.svg | 1 + assets/uswds/material-icons/voicemail.svg | 1 + assets/uswds/material-icons/volume_down.svg | 1 + assets/uswds/material-icons/volume_mute.svg | 1 + assets/uswds/material-icons/volume_off.svg | 1 + assets/uswds/material-icons/volume_up.svg | 1 + .../material-icons/volunteer_activism.svg | 1 + assets/uswds/material-icons/vpn_key.svg | 1 + assets/uswds/material-icons/vpn_lock.svg | 1 + assets/uswds/material-icons/wallpaper.svg | 1 + assets/uswds/material-icons/warning.svg | 1 + assets/uswds/material-icons/wash.svg | 1 + assets/uswds/material-icons/watch.svg | 1 + assets/uswds/material-icons/watch_later.svg | 1 + assets/uswds/material-icons/water_damage.svg | 1 + .../uswds/material-icons/waterfall_chart.svg | 1 + assets/uswds/material-icons/waves.svg | 1 + assets/uswds/material-icons/wb_auto.svg | 1 + assets/uswds/material-icons/wb_cloudy.svg | 1 + .../uswds/material-icons/wb_incandescent.svg | 1 + assets/uswds/material-icons/wb_iridescent.svg | 1 + assets/uswds/material-icons/wb_shade.svg | 1 + assets/uswds/material-icons/wb_sunny.svg | 1 + assets/uswds/material-icons/wb_twighlight.svg | 1 + assets/uswds/material-icons/wc.svg | 1 + assets/uswds/material-icons/web.svg | 1 + assets/uswds/material-icons/web_asset.svg | 1 + assets/uswds/material-icons/weekend.svg | 1 + assets/uswds/material-icons/west.svg | 1 + assets/uswds/material-icons/whatshot.svg | 1 + .../material-icons/wheelchair_pickup.svg | 1 + assets/uswds/material-icons/where_to_vote.svg | 1 + assets/uswds/material-icons/widgets.svg | 1 + assets/uswds/material-icons/wifi.svg | 1 + assets/uswds/material-icons/wifi_calling.svg | 1 + assets/uswds/material-icons/wifi_lock.svg | 1 + assets/uswds/material-icons/wifi_off.svg | 1 + .../material-icons/wifi_protected_setup.svg | 1 + .../uswds/material-icons/wifi_tethering.svg | 1 + assets/uswds/material-icons/wine_bar.svg | 1 + assets/uswds/material-icons/work.svg | 1 + assets/uswds/material-icons/work_off.svg | 1 + assets/uswds/material-icons/work_outline.svg | 1 + .../material-icons/workspaces_filled.svg | 1 + .../material-icons/workspaces_outline.svg | 1 + assets/uswds/material-icons/wrap_text.svg | 1 + .../uswds/material-icons/wrong_location.svg | 1 + assets/uswds/material-icons/wysiwyg.svg | 1 + .../material-icons/youtube_searched_for.svg | 1 + assets/uswds/material-icons/zoom_in.svg | 1 + assets/uswds/material-icons/zoom_out.svg | 1 + assets/uswds/material-icons/zoom_out_map.svg | 1 + assets/uswds/minus-alt.svg | 1 + assets/uswds/minus.svg | 1 + assets/uswds/plus-alt.svg | 1 + assets/uswds/plus.svg | 1 + assets/uswds/search-alt.svg | 1 + assets/uswds/search-primary.svg | 1 + assets/uswds/search.svg | 1 + assets/uswds/social-icons/facebook25.png | Bin 0 -> 270 bytes assets/uswds/social-icons/facebook25.svg | 1 + assets/uswds/social-icons/instagram25.png | Bin 0 -> 1215 bytes assets/uswds/social-icons/instagram25.svg | 1 + assets/uswds/social-icons/rss25.png | Bin 0 -> 502 bytes assets/uswds/social-icons/rss25.svg | 1 + assets/uswds/social-icons/twitter16.png | Bin 0 -> 431 bytes assets/uswds/social-icons/twitter16.svg | 1 + assets/uswds/social-icons/youtube15.png | Bin 0 -> 590 bytes assets/uswds/social-icons/youtube15.svg | 1 + assets/uswds/sprite.svg | 1 + assets/uswds/us_flag_small.png | Bin 0 -> 176 bytes assets/uswds/usa-icons-bg/add--white.svg | 1 + assets/uswds/usa-icons-bg/check--blue-60v.svg | 1 + .../usa-icons-bg/check_circle--white.svg | 1 + assets/uswds/usa-icons-bg/error--white.svg | 1 + .../uswds/usa-icons-bg/expand_less--white.svg | 1 + .../expand_more--blue-warm-70v.svg | 1 + .../uswds/usa-icons-bg/expand_more--white.svg | 1 + assets/uswds/usa-icons-bg/info--white.svg | 1 + .../uswds/usa-icons-bg/launch--blue-60v.svg | 1 + .../uswds/usa-icons-bg/launch--blue-70v.svg | 1 + assets/uswds/usa-icons-bg/launch--gray-5.svg | 1 + assets/uswds/usa-icons-bg/launch--white.svg | 1 + assets/uswds/usa-icons-bg/remove--white.svg | 1 + assets/uswds/usa-icons-bg/search--white.svg | 1 + assets/uswds/usa-icons-bg/warning--white.svg | 1 + assets/uswds/usa-icons/accessibility_new.svg | 1 + assets/uswds/usa-icons/accessible_forward.svg | 1 + assets/uswds/usa-icons/account_balance.svg | 1 + assets/uswds/usa-icons/account_box.svg | 1 + assets/uswds/usa-icons/account_circle.svg | 1 + assets/uswds/usa-icons/add.svg | 1 + assets/uswds/usa-icons/add_circle.svg | 1 + assets/uswds/usa-icons/add_circle_outline.svg | 1 + assets/uswds/usa-icons/alarm.svg | 1 + assets/uswds/usa-icons/alternate_email.svg | 1 + assets/uswds/usa-icons/announcement.svg | 1 + assets/uswds/usa-icons/api.svg | 1 + assets/uswds/usa-icons/arrow_back.svg | 1 + assets/uswds/usa-icons/arrow_downward.svg | 1 + assets/uswds/usa-icons/arrow_drop_down.svg | 1 + assets/uswds/usa-icons/arrow_drop_up.svg | 1 + assets/uswds/usa-icons/arrow_forward.svg | 1 + assets/uswds/usa-icons/arrow_upward.svg | 1 + assets/uswds/usa-icons/assessment.svg | 1 + assets/uswds/usa-icons/attach_file.svg | 1 + assets/uswds/usa-icons/attach_money.svg | 1 + assets/uswds/usa-icons/autorenew.svg | 1 + assets/uswds/usa-icons/backpack.svg | 1 + assets/uswds/usa-icons/bathtub.svg | 1 + assets/uswds/usa-icons/bedding.svg | 1 + assets/uswds/usa-icons/bookmark.svg | 1 + assets/uswds/usa-icons/bug_report.svg | 1 + assets/uswds/usa-icons/build.svg | 1 + assets/uswds/usa-icons/calendar_today.svg | 1 + assets/uswds/usa-icons/campaign.svg | 1 + assets/uswds/usa-icons/camping.svg | 1 + assets/uswds/usa-icons/cancel.svg | 1 + assets/uswds/usa-icons/chat.svg | 1 + assets/uswds/usa-icons/check.svg | 1 + .../usa-icons/check_box_outline_blank.svg | 1 + assets/uswds/usa-icons/check_circle.svg | 1 + .../uswds/usa-icons/check_circle_outline.svg | 1 + assets/uswds/usa-icons/checkroom.svg | 1 + assets/uswds/usa-icons/chevron_left.svg | 1 + assets/uswds/usa-icons/chevron_right.svg | 1 + assets/uswds/usa-icons/clean_hands.svg | 1 + assets/uswds/usa-icons/close.svg | 1 + assets/uswds/usa-icons/closed_caption.svg | 1 + assets/uswds/usa-icons/clothes.svg | 1 + assets/uswds/usa-icons/cloud.svg | 1 + assets/uswds/usa-icons/code.svg | 1 + assets/uswds/usa-icons/comment.svg | 1 + .../usa-icons/connect_without_contact.svg | 1 + assets/uswds/usa-icons/construction.svg | 1 + .../uswds/usa-icons/construction_worker.svg | 1 + assets/uswds/usa-icons/contact_page.svg | 1 + assets/uswds/usa-icons/content_copy.svg | 1 + assets/uswds/usa-icons/coronavirus.svg | 1 + assets/uswds/usa-icons/credit_card.svg | 1 + assets/uswds/usa-icons/deck.svg | 1 + assets/uswds/usa-icons/delete.svg | 1 + assets/uswds/usa-icons/device_thermostat.svg | 1 + assets/uswds/usa-icons/directions.svg | 1 + assets/uswds/usa-icons/directions_bike.svg | 1 + assets/uswds/usa-icons/directions_bus.svg | 1 + assets/uswds/usa-icons/directions_car.svg | 1 + assets/uswds/usa-icons/directions_walk.svg | 1 + assets/uswds/usa-icons/do_not_disturb.svg | 1 + assets/uswds/usa-icons/do_not_touch.svg | 1 + assets/uswds/usa-icons/drag_handle.svg | 1 + assets/uswds/usa-icons/eco.svg | 1 + assets/uswds/usa-icons/edit.svg | 1 + .../uswds/usa-icons/electrical_services.svg | 1 + assets/uswds/usa-icons/emoji_events.svg | 1 + assets/uswds/usa-icons/error.svg | 1 + assets/uswds/usa-icons/error_outline.svg | 1 + assets/uswds/usa-icons/event.svg | 1 + assets/uswds/usa-icons/expand_less.svg | 1 + assets/uswds/usa-icons/expand_more.svg | 1 + assets/uswds/usa-icons/facebook.svg | 1 + assets/uswds/usa-icons/fast_forward.svg | 1 + assets/uswds/usa-icons/fast_rewind.svg | 1 + assets/uswds/usa-icons/favorite.svg | 1 + assets/uswds/usa-icons/favorite_border.svg | 1 + assets/uswds/usa-icons/file_download.svg | 1 + assets/uswds/usa-icons/file_present.svg | 1 + assets/uswds/usa-icons/file_upload.svg | 1 + assets/uswds/usa-icons/filter_alt.svg | 1 + assets/uswds/usa-icons/filter_list.svg | 1 + assets/uswds/usa-icons/fingerprint.svg | 1 + assets/uswds/usa-icons/first_page.svg | 1 + assets/uswds/usa-icons/flag.svg | 1 + assets/uswds/usa-icons/flickr.svg | 1 + assets/uswds/usa-icons/flight.svg | 1 + assets/uswds/usa-icons/flooding.svg | 1 + assets/uswds/usa-icons/folder.svg | 1 + assets/uswds/usa-icons/folder_open.svg | 1 + assets/uswds/usa-icons/format_quote.svg | 1 + assets/uswds/usa-icons/format_size.svg | 1 + assets/uswds/usa-icons/forum.svg | 1 + assets/uswds/usa-icons/github.svg | 1 + assets/uswds/usa-icons/grid_view.svg | 1 + assets/uswds/usa-icons/group_add.svg | 1 + assets/uswds/usa-icons/groups.svg | 1 + assets/uswds/usa-icons/hearing.svg | 1 + assets/uswds/usa-icons/help.svg | 1 + assets/uswds/usa-icons/help_outline.svg | 1 + assets/uswds/usa-icons/highlight_off.svg | 1 + assets/uswds/usa-icons/history.svg | 1 + assets/uswds/usa-icons/home.svg | 1 + assets/uswds/usa-icons/hospital.svg | 1 + assets/uswds/usa-icons/hotel.svg | 1 + assets/uswds/usa-icons/hourglass_empty.svg | 1 + assets/uswds/usa-icons/hurricane.svg | 1 + assets/uswds/usa-icons/identification.svg | 1 + assets/uswds/usa-icons/image.svg | 1 + assets/uswds/usa-icons/info.svg | 1 + assets/uswds/usa-icons/info_outline.svg | 1 + assets/uswds/usa-icons/insights.svg | 1 + assets/uswds/usa-icons/instagram.svg | 1 + assets/uswds/usa-icons/keyboard.svg | 1 + assets/uswds/usa-icons/label.svg | 1 + assets/uswds/usa-icons/language.svg | 1 + assets/uswds/usa-icons/last_page.svg | 1 + assets/uswds/usa-icons/launch.svg | 1 + assets/uswds/usa-icons/lightbulb.svg | 1 + assets/uswds/usa-icons/lightbulb_outline.svg | 1 + assets/uswds/usa-icons/link.svg | 1 + assets/uswds/usa-icons/link_off.svg | 1 + assets/uswds/usa-icons/list.svg | 1 + assets/uswds/usa-icons/local_cafe.svg | 1 + .../uswds/usa-icons/local_fire_department.svg | 1 + assets/uswds/usa-icons/local_gas_station.svg | 1 + .../uswds/usa-icons/local_grocery_store.svg | 1 + assets/uswds/usa-icons/local_hospital.svg | 1 + .../uswds/usa-icons/local_laundry_service.svg | 1 + assets/uswds/usa-icons/local_library.svg | 1 + assets/uswds/usa-icons/local_offer.svg | 1 + assets/uswds/usa-icons/local_parking.svg | 1 + assets/uswds/usa-icons/local_pharmacy.svg | 1 + assets/uswds/usa-icons/local_police.svg | 1 + assets/uswds/usa-icons/local_taxi.svg | 1 + assets/uswds/usa-icons/location_city.svg | 1 + assets/uswds/usa-icons/location_on.svg | 1 + assets/uswds/usa-icons/lock.svg | 1 + assets/uswds/usa-icons/lock_open.svg | 1 + assets/uswds/usa-icons/lock_outline.svg | 1 + assets/uswds/usa-icons/login.svg | 1 + assets/uswds/usa-icons/logout.svg | 1 + assets/uswds/usa-icons/loop.svg | 1 + assets/uswds/usa-icons/mail.svg | 1 + assets/uswds/usa-icons/mail_outline.svg | 1 + assets/uswds/usa-icons/map.svg | 1 + assets/uswds/usa-icons/masks.svg | 1 + assets/uswds/usa-icons/medical_services.svg | 1 + assets/uswds/usa-icons/menu.svg | 1 + assets/uswds/usa-icons/military_tech.svg | 1 + assets/uswds/usa-icons/more_horiz.svg | 1 + assets/uswds/usa-icons/more_vert.svg | 1 + assets/uswds/usa-icons/my_location.svg | 1 + assets/uswds/usa-icons/navigate_before.svg | 1 + .../uswds/usa-icons/navigate_far_before.svg | 1 + assets/uswds/usa-icons/navigate_far_next.svg | 1 + assets/uswds/usa-icons/navigate_next.svg | 1 + assets/uswds/usa-icons/near_me.svg | 1 + assets/uswds/usa-icons/notifications.svg | 1 + .../uswds/usa-icons/notifications_active.svg | 1 + assets/uswds/usa-icons/notifications_none.svg | 1 + assets/uswds/usa-icons/notifications_off.svg | 1 + assets/uswds/usa-icons/park.svg | 1 + assets/uswds/usa-icons/people.svg | 1 + assets/uswds/usa-icons/person.svg | 1 + assets/uswds/usa-icons/pets.svg | 1 + assets/uswds/usa-icons/phone.svg | 1 + assets/uswds/usa-icons/photo_camera.svg | 1 + assets/uswds/usa-icons/print.svg | 1 + assets/uswds/usa-icons/priority_high.svg | 1 + assets/uswds/usa-icons/public.svg | 1 + assets/uswds/usa-icons/push_pin.svg | 1 + .../usa-icons/radio_button_unchecked.svg | 1 + assets/uswds/usa-icons/rain.svg | 1 + assets/uswds/usa-icons/reduce_capacity.svg | 1 + assets/uswds/usa-icons/remove.svg | 1 + assets/uswds/usa-icons/report.svg | 1 + assets/uswds/usa-icons/restaurant.svg | 1 + assets/uswds/usa-icons/rss_feed.svg | 1 + assets/uswds/usa-icons/safety_divider.svg | 1 + assets/uswds/usa-icons/sanitizer.svg | 1 + assets/uswds/usa-icons/save_alt.svg | 1 + assets/uswds/usa-icons/schedule.svg | 1 + assets/uswds/usa-icons/school.svg | 1 + assets/uswds/usa-icons/science.svg | 1 + assets/uswds/usa-icons/search.svg | 1 + assets/uswds/usa-icons/security.svg | 1 + assets/uswds/usa-icons/send.svg | 1 + .../usa-icons/sentiment_dissatisfied.svg | 1 + assets/uswds/usa-icons/sentiment_neutral.svg | 1 + .../uswds/usa-icons/sentiment_satisfied.svg | 1 + .../usa-icons/sentiment_satisfied_alt.svg | 1 + .../usa-icons/sentiment_very_dissatisfied.svg | 1 + assets/uswds/usa-icons/settings.svg | 1 + assets/uswds/usa-icons/severe_weather.svg | 1 + assets/uswds/usa-icons/share.svg | 1 + assets/uswds/usa-icons/shield.svg | 1 + assets/uswds/usa-icons/shopping_basket.svg | 1 + assets/uswds/usa-icons/snow.svg | 1 + assets/uswds/usa-icons/soap.svg | 1 + assets/uswds/usa-icons/social_distance.svg | 1 + assets/uswds/usa-icons/sort_arrow.svg | 1 + assets/uswds/usa-icons/spellcheck.svg | 1 + assets/uswds/usa-icons/star.svg | 1 + assets/uswds/usa-icons/star_half.svg | 1 + assets/uswds/usa-icons/star_outline.svg | 1 + assets/uswds/usa-icons/store.svg | 1 + assets/uswds/usa-icons/support.svg | 1 + assets/uswds/usa-icons/support_agent.svg | 1 + assets/uswds/usa-icons/text_fields.svg | 1 + assets/uswds/usa-icons/thumb_down_alt.svg | 1 + assets/uswds/usa-icons/thumb_up_alt.svg | 1 + assets/uswds/usa-icons/timer.svg | 1 + assets/uswds/usa-icons/toggle_off.svg | 1 + assets/uswds/usa-icons/toggle_on.svg | 1 + assets/uswds/usa-icons/topic.svg | 1 + assets/uswds/usa-icons/tornado.svg | 1 + assets/uswds/usa-icons/translate.svg | 1 + assets/uswds/usa-icons/trending_down.svg | 1 + assets/uswds/usa-icons/trending_up.svg | 1 + assets/uswds/usa-icons/twitter.svg | 1 + assets/uswds/usa-icons/undo.svg | 1 + assets/uswds/usa-icons/unfold_less.svg | 1 + assets/uswds/usa-icons/unfold_more.svg | 1 + assets/uswds/usa-icons/update.svg | 1 + assets/uswds/usa-icons/upload_file.svg | 1 + assets/uswds/usa-icons/verified.svg | 1 + assets/uswds/usa-icons/verified_user.svg | 1 + assets/uswds/usa-icons/visibility.svg | 1 + assets/uswds/usa-icons/visibility_off.svg | 1 + assets/uswds/usa-icons/volume_off.svg | 1 + assets/uswds/usa-icons/warning.svg | 1 + assets/uswds/usa-icons/wash.svg | 1 + assets/uswds/usa-icons/wifi.svg | 1 + assets/uswds/usa-icons/work.svg | 1 + assets/uswds/usa-icons/youtube.svg | 1 + assets/uswds/usa-icons/zoom_in.svg | 1 + assets/uswds/usa-icons/zoom_out.svg | 1 + assets/uswds/usa-icons/zoom_out_map.svg | 1 + assets/uswds/uswds-icons/bedding.svg | 1 + assets/uswds/uswds-icons/camping.svg | 1 + assets/uswds/uswds-icons/chevron_left.svg | 1 + assets/uswds/uswds-icons/chevron_right.svg | 1 + assets/uswds/uswds-icons/clothes.svg | 1 + .../uswds/uswds-icons/construction_worker.svg | 1 + assets/uswds/uswds-icons/flickr.svg | 1 + assets/uswds/uswds-icons/flooding.svg | 1 + assets/uswds/uswds-icons/github.svg | 1 + assets/uswds/uswds-icons/hospital.svg | 1 + assets/uswds/uswds-icons/hurricane.svg | 1 + assets/uswds/uswds-icons/identification.svg | 1 + assets/uswds/uswds-icons/instagram.svg | 1 + .../uswds/uswds-icons/navigate_far_before.svg | 1 + .../uswds/uswds-icons/navigate_far_next.svg | 1 + assets/uswds/uswds-icons/rain.svg | 1 + assets/uswds/uswds-icons/severe_weather.svg | 1 + assets/uswds/uswds-icons/snow.svg | 1 + assets/uswds/uswds-icons/sort_arrow.svg | 1 + assets/uswds/uswds-icons/tornado.svg | 1 + assets/uswds/uswds-icons/twitter.svg | 1 + assets/uswds/uswds-icons/youtube.svg | 1 + index.html | 2 +- package-lock.json | 11 +- 3987 files changed, 10591 insertions(+), 48 deletions(-) rename {assets/css/_sass => _sass}/_mixins.scss (100%) rename {assets/css/_sass => _sass}/_uswds-settings.scss (100%) rename {assets/css/_sass => _sass}/_utilities.scss (100%) rename {assets/css/_sass => _sass}/custom/_anchor.scss (94%) rename {assets/css/_sass => _sass}/custom/_breadcrumb.scss (100%) rename {assets/css/_sass => _sass}/custom/_filters.scss (92%) rename {assets/css/_sass => _sass}/custom/_footer-tagline.scss (93%) rename {assets/css/_sass => _sass}/custom/_image.scss (100%) rename {assets/css/_sass => _sass}/custom/_list-fellows.scss (100%) rename {assets/css/_sass => _sass}/custom/_pagination.scss (100%) rename {assets/css/_sass => _sass}/custom/_partner.scss (100%) rename {assets/css/_sass => _sass}/custom/_project-item.scss (100%) rename {assets/css/_sass => _sass}/custom/_project-team.scss (100%) rename {assets/css/_sass => _sass}/custom/_project.scss (76%) rename {assets/css/_sass => _sass}/custom/_quote.scss (100%) rename {assets/css/_sass => _sass}/custom/_site-card.scss (100%) rename {assets/css/_sass => _sass}/custom/_skipnav.scss (100%) rename assets/css/_sass/custom/story.scss => _sass/custom/_story.scss (100%) rename {assets/css/_sass => _sass}/custom/_typography.scss (100%) rename {assets/css/_sass => _sass}/custom/_work-box.scss (100%) rename {assets/css/_sass => _sass}/searchgov/_form.scss (92%) rename {assets/css/_sass => _sass}/uswds-overrides/_banner.scss (100%) rename {assets/css/_sass => _sass}/uswds-overrides/_button.scss (100%) rename {assets/css/_sass => _sass}/uswds-overrides/_footer.scss (100%) rename {assets/css/_sass => _sass}/uswds-overrides/_form.scss (100%) rename {assets/css/_sass => _sass}/uswds-overrides/_graphic-list.scss (100%) rename {assets/css/_sass => _sass}/uswds-overrides/_hero.scss (74%) rename {assets/css/_sass => _sass}/uswds-overrides/_intro.scss (100%) rename {assets/css/_sass => _sass}/uswds-overrides/_list.scss (100%) rename {assets/css/_sass => _sass}/uswds-overrides/_logo.scss (100%) rename {assets/css/_sass => _sass}/uswds-overrides/_menu.scss (100%) rename {assets/css/_sass => _sass}/uswds-overrides/_nav.scss (100%) rename {assets/css/_sass => _sass}/uswds-overrides/_section.scss (100%) rename {assets/css/_sass => _sass}/uswds-overrides/_social-link.scss (57%) rename assets/css/{_sass => }/index.scss (100%) create mode 100644 assets/css/styles.scss create mode 100644 assets/js/uswds-init.js create mode 100644 assets/js/uswds-init.min.js create mode 100644 assets/js/uswds-init.min.js.map create mode 100644 assets/js/uswds.js create mode 100644 assets/js/uswds.min.js create mode 100644 assets/js/uswds.min.js.map create mode 100644 assets/uswds/alerts/emergency.svg create mode 100644 assets/uswds/alerts/error-white.svg create mode 100755 assets/uswds/alerts/error.svg create mode 100755 assets/uswds/alerts/info.svg create mode 100755 assets/uswds/alerts/success.svg create mode 100755 assets/uswds/alerts/warning.svg create mode 100644 assets/uswds/angle-arrow-down-gray-90.svg create mode 100644 assets/uswds/angle-arrow-down-hover.svg create mode 100644 assets/uswds/angle-arrow-down-primary-hover.svg create mode 100644 assets/uswds/angle-arrow-down-primary.svg create mode 100644 assets/uswds/angle-arrow-down-white.svg create mode 100644 assets/uswds/angle-arrow-down.svg create mode 100644 assets/uswds/angle-arrow-right-white.svg create mode 100644 assets/uswds/angle-arrow-right.svg create mode 100644 assets/uswds/angle-arrow-up-primary-hover.svg create mode 100644 assets/uswds/angle-arrow-up-primary.svg create mode 100644 assets/uswds/angle-arrow-up-white.svg create mode 100644 assets/uswds/angle-double-left-solid.svg create mode 100644 assets/uswds/angle-double-right-solid.svg create mode 100644 assets/uswds/angle-left-solid.svg create mode 100644 assets/uswds/angle-right-solid.svg create mode 100644 assets/uswds/arrow-both.svg create mode 100644 assets/uswds/arrow-down-gray-60.svg create mode 100644 assets/uswds/arrow-down.svg create mode 100644 assets/uswds/arrow-left-indigo-cool-50v.svg create mode 100644 assets/uswds/arrow-left-white.svg create mode 100644 assets/uswds/arrow-left.svg create mode 100644 assets/uswds/arrow-right.svg create mode 100644 assets/uswds/calendar-alt-solid.svg create mode 100644 assets/uswds/checkbox-check-print.svg create mode 100644 assets/uswds/chevron-right-white.svg create mode 100644 assets/uswds/chevron-right.svg create mode 100644 assets/uswds/chevron-white.svg create mode 100644 assets/uswds/chevron.svg create mode 100644 assets/uswds/circle-124.png create mode 100644 assets/uswds/circle-gray-20.svg create mode 100644 assets/uswds/close-alt-blue-60v.svg create mode 100644 assets/uswds/close-alt.svg create mode 100644 assets/uswds/close-blue-30-alt.svg create mode 100644 assets/uswds/close-blue-40v-alt.svg create mode 100644 assets/uswds/close-blue-50-alt.svg create mode 100644 assets/uswds/close-blue-50v-alt.svg create mode 100644 assets/uswds/close-blue-60-alt.svg create mode 100644 assets/uswds/close-blue-60v-alt.svg create mode 100644 assets/uswds/close-gray-60.svg create mode 100644 assets/uswds/close-gray-90-alt.svg create mode 100644 assets/uswds/close-primary.svg create mode 100644 assets/uswds/close-white-alt.svg create mode 100644 assets/uswds/close-white.svg create mode 100644 assets/uswds/close.svg create mode 100644 assets/uswds/correct8-alt.png create mode 100644 assets/uswds/correct8-alt.svg create mode 100755 assets/uswds/correct8.svg create mode 100755 assets/uswds/correct9.svg create mode 100644 assets/uswds/external-link-alt-hover.svg create mode 100644 assets/uswds/external-link-alt.svg create mode 100644 assets/uswds/external-link-hover.svg create mode 100644 assets/uswds/external-link.svg create mode 100755 assets/uswds/favicons/favicon-114.png create mode 100755 assets/uswds/favicons/favicon-144.png create mode 100755 assets/uswds/favicons/favicon-16.png create mode 100755 assets/uswds/favicons/favicon-192.png create mode 100755 assets/uswds/favicons/favicon-40.png create mode 100755 assets/uswds/favicons/favicon-57.png create mode 100755 assets/uswds/favicons/favicon-72.png create mode 100644 assets/uswds/favicons/favicon.ico create mode 100755 assets/uswds/favicons/favicon.png create mode 100644 assets/uswds/file-excel.svg create mode 100644 assets/uswds/file-pdf.svg create mode 100644 assets/uswds/file-video.svg create mode 100644 assets/uswds/file-word.svg create mode 100644 assets/uswds/file.svg create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Black.ttf create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Black.woff create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Black.woff2 create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-BlackItalic.ttf create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-BlackItalic.woff create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-BlackItalic.woff2 create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Bold.ttf create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Bold.woff create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Bold.woff2 create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-BoldItalic.ttf create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-BoldItalic.woff create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-BoldItalic.woff2 create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Italic.ttf create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Italic.woff create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Italic.woff2 create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Light.ttf create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Light.woff create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Light.woff2 create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-LightItalic.ttf create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-LightItalic.woff create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-LightItalic.woff2 create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Regular.ttf create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Regular.woff create mode 100644 assets/uswds/fonts/merriweather/Latin-Merriweather-Regular.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Black.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Black.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Black.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-BlackItalic.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-BlackItalic.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-BlackItalic.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Bold.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Bold.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Bold.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-BoldItalic.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-BoldItalic.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-BoldItalic.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ExtraBold.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ExtraBold.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ExtraBold.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ExtraBoldItalic.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ExtraBoldItalic.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ExtraBoldItalic.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ExtraLight.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ExtraLight.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ExtraLight.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ExtraLightItalic.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ExtraLightItalic.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ExtraLightItalic.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Italic.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Italic.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Italic.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Light.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Light.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Light.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-LightItalic.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-LightItalic.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-LightItalic.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Medium.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Medium.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Medium.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-MediumItalic.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-MediumItalic.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-MediumItalic.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Regular.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Regular.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Regular.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-SemiBold.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-SemiBold.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-SemiBold.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-SemiBoldItalic.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-SemiBoldItalic.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-SemiBoldItalic.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Thin.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Thin.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-Thin.woff2 create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ThinItalic.ttf create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ThinItalic.woff create mode 100644 assets/uswds/fonts/public-sans/PublicSans-ThinItalic.woff2 create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-100.ttf create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-100.woff create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-100.woff2 create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-100italic.ttf create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-100italic.woff create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-100italic.woff2 create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-300.ttf create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-300.woff create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-300.woff2 create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-300italic.ttf create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-300italic.woff create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-300italic.woff2 create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-500.ttf create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-500.woff create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-500.woff2 create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-500italic.ttf create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-500italic.woff create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-500italic.woff2 create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-700.ttf create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-700.woff create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-700.woff2 create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-700italic.ttf create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-700italic.woff create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-700italic.woff2 create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-italic.ttf create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-italic.woff create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-italic.woff2 create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-regular.ttf create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-regular.woff create mode 100644 assets/uswds/fonts/roboto-mono/roboto-mono-v5-latin-regular.woff2 create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-black-webfont.ttf create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-black-webfont.woff create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-black-webfont.woff2 create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-blackitalic-webfont.ttf create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-blackitalic-webfont.woff create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-blackitalic-webfont.woff2 create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-bold-webfont.ttf create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-bold-webfont.woff create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-bold-webfont.woff2 create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-bolditalic-webfont.ttf create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-bolditalic-webfont.woff create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-bolditalic-webfont.woff2 create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-extralight-webfont.ttf create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-extralight-webfont.woff create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-extralight-webfont.woff2 create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-extralightitalic-webfont.ttf create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-extralightitalic-webfont.woff create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-extralightitalic-webfont.woff2 create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-italic-webfont.ttf create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-italic-webfont.woff create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-italic-webfont.woff2 create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-light-webfont.ttf create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-light-webfont.woff create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-light-webfont.woff2 create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-lightitalic-webfont.ttf create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-lightitalic-webfont.woff create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-lightitalic-webfont.woff2 create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-regular-webfont.ttf create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-regular-webfont.woff create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-regular-webfont.woff2 create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-semibold-webfont.ttf create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-semibold-webfont.woff create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-semibold-webfont.woff2 create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-semibolditalic-webfont.ttf create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-semibolditalic-webfont.woff create mode 100644 assets/uswds/fonts/source-sans-pro/sourcesanspro-semibolditalic-webfont.woff2 create mode 100644 assets/uswds/hero.png create mode 100644 assets/uswds/icon-dot-gov.svg create mode 100644 assets/uswds/icon-https.svg create mode 100644 assets/uswds/img/alerts/emergency.svg create mode 100644 assets/uswds/img/alerts/error-white.svg create mode 100755 assets/uswds/img/alerts/error.svg create mode 100755 assets/uswds/img/alerts/info.svg create mode 100755 assets/uswds/img/alerts/success.svg create mode 100755 assets/uswds/img/alerts/warning.svg create mode 100644 assets/uswds/img/angle-arrow-down-gray-90.svg create mode 100644 assets/uswds/img/angle-arrow-down-hover.svg create mode 100644 assets/uswds/img/angle-arrow-down-primary-hover.svg create mode 100644 assets/uswds/img/angle-arrow-down-primary.svg create mode 100644 assets/uswds/img/angle-arrow-down-white.svg create mode 100644 assets/uswds/img/angle-arrow-down.svg create mode 100644 assets/uswds/img/angle-arrow-right-white.svg create mode 100644 assets/uswds/img/angle-arrow-right.svg create mode 100644 assets/uswds/img/angle-arrow-up-primary-hover.svg create mode 100644 assets/uswds/img/angle-arrow-up-primary.svg create mode 100644 assets/uswds/img/angle-arrow-up-white.svg create mode 100644 assets/uswds/img/angle-double-left-solid.svg create mode 100644 assets/uswds/img/angle-double-right-solid.svg create mode 100644 assets/uswds/img/angle-left-solid.svg create mode 100644 assets/uswds/img/angle-right-solid.svg create mode 100644 assets/uswds/img/arrow-both.svg create mode 100644 assets/uswds/img/arrow-down-gray-60.svg create mode 100644 assets/uswds/img/arrow-down.svg create mode 100644 assets/uswds/img/arrow-left-indigo-cool-50v.svg create mode 100644 assets/uswds/img/arrow-left-white.svg create mode 100644 assets/uswds/img/arrow-left.svg create mode 100644 assets/uswds/img/arrow-right.svg create mode 100644 assets/uswds/img/calendar-alt-solid.svg create mode 100644 assets/uswds/img/checkbox-check-print.svg create mode 100644 assets/uswds/img/chevron-right-white.svg create mode 100644 assets/uswds/img/chevron-right.svg create mode 100644 assets/uswds/img/chevron-white.svg create mode 100644 assets/uswds/img/chevron.svg create mode 100644 assets/uswds/img/circle-124.png create mode 100644 assets/uswds/img/circle-gray-20.svg create mode 100644 assets/uswds/img/close-alt-blue-60v.svg create mode 100644 assets/uswds/img/close-alt.svg create mode 100644 assets/uswds/img/close-blue-30-alt.svg create mode 100644 assets/uswds/img/close-blue-40v-alt.svg create mode 100644 assets/uswds/img/close-blue-50-alt.svg create mode 100644 assets/uswds/img/close-blue-50v-alt.svg create mode 100644 assets/uswds/img/close-blue-60-alt.svg create mode 100644 assets/uswds/img/close-blue-60v-alt.svg create mode 100644 assets/uswds/img/close-gray-60.svg create mode 100644 assets/uswds/img/close-gray-90-alt.svg create mode 100644 assets/uswds/img/close-primary.svg create mode 100644 assets/uswds/img/close-white-alt.svg create mode 100644 assets/uswds/img/close-white.svg create mode 100644 assets/uswds/img/close.svg create mode 100644 assets/uswds/img/correct8-alt.png create mode 100644 assets/uswds/img/correct8-alt.svg create mode 100755 assets/uswds/img/correct8.svg create mode 100755 assets/uswds/img/correct9.svg create mode 100644 assets/uswds/img/external-link-alt-hover.svg create mode 100644 assets/uswds/img/external-link-alt.svg create mode 100644 assets/uswds/img/external-link-hover.svg create mode 100644 assets/uswds/img/external-link.svg create mode 100755 assets/uswds/img/favicons/favicon-114.png create mode 100755 assets/uswds/img/favicons/favicon-144.png create mode 100755 assets/uswds/img/favicons/favicon-16.png create mode 100755 assets/uswds/img/favicons/favicon-192.png create mode 100755 assets/uswds/img/favicons/favicon-40.png create mode 100755 assets/uswds/img/favicons/favicon-57.png create mode 100755 assets/uswds/img/favicons/favicon-72.png create mode 100644 assets/uswds/img/favicons/favicon.ico create mode 100755 assets/uswds/img/favicons/favicon.png create mode 100644 assets/uswds/img/file-excel.svg create mode 100644 assets/uswds/img/file-pdf.svg create mode 100644 assets/uswds/img/file-video.svg create mode 100644 assets/uswds/img/file-word.svg create mode 100644 assets/uswds/img/file.svg create mode 100644 assets/uswds/img/hero.png create mode 100644 assets/uswds/img/icon-dot-gov.svg create mode 100644 assets/uswds/img/icon-https.svg create mode 100644 assets/uswds/img/loader.gif create mode 100644 assets/uswds/img/loader.svg create mode 100644 assets/uswds/img/lock.svg create mode 100644 assets/uswds/img/logo-img.png create mode 100644 assets/uswds/img/material-icons/10k.svg create mode 100644 assets/uswds/img/material-icons/10mp.svg create mode 100644 assets/uswds/img/material-icons/11mp.svg create mode 100644 assets/uswds/img/material-icons/12mp.svg create mode 100644 assets/uswds/img/material-icons/13mp.svg create mode 100644 assets/uswds/img/material-icons/14mp.svg create mode 100644 assets/uswds/img/material-icons/15mp.svg create mode 100644 assets/uswds/img/material-icons/16mp.svg create mode 100644 assets/uswds/img/material-icons/17mp.svg create mode 100644 assets/uswds/img/material-icons/18mp.svg create mode 100644 assets/uswds/img/material-icons/19mp.svg create mode 100644 assets/uswds/img/material-icons/1k.svg create mode 100644 assets/uswds/img/material-icons/1k_plus.svg create mode 100644 assets/uswds/img/material-icons/20mp.svg create mode 100644 assets/uswds/img/material-icons/21mp.svg create mode 100644 assets/uswds/img/material-icons/22mp.svg create mode 100644 assets/uswds/img/material-icons/23mp.svg create mode 100644 assets/uswds/img/material-icons/24mp.svg create mode 100644 assets/uswds/img/material-icons/2k.svg create mode 100644 assets/uswds/img/material-icons/2k_plus.svg create mode 100644 assets/uswds/img/material-icons/2mp.svg create mode 100644 assets/uswds/img/material-icons/360.svg create mode 100644 assets/uswds/img/material-icons/3d_rotation.svg create mode 100644 assets/uswds/img/material-icons/3k.svg create mode 100644 assets/uswds/img/material-icons/3k_plus.svg create mode 100644 assets/uswds/img/material-icons/3mp.svg create mode 100644 assets/uswds/img/material-icons/4k.svg create mode 100644 assets/uswds/img/material-icons/4k_plus.svg create mode 100644 assets/uswds/img/material-icons/4mp.svg create mode 100755 assets/uswds/img/material-icons/5g.svg create mode 100644 assets/uswds/img/material-icons/5k.svg create mode 100644 assets/uswds/img/material-icons/5k_plus.svg create mode 100644 assets/uswds/img/material-icons/5mp.svg create mode 100644 assets/uswds/img/material-icons/6_ft_apart.svg create mode 100644 assets/uswds/img/material-icons/6k.svg create mode 100644 assets/uswds/img/material-icons/6k_plus.svg create mode 100644 assets/uswds/img/material-icons/6mp.svg create mode 100644 assets/uswds/img/material-icons/7k.svg create mode 100644 assets/uswds/img/material-icons/7k_plus.svg create mode 100644 assets/uswds/img/material-icons/7mp.svg create mode 100644 assets/uswds/img/material-icons/8k.svg create mode 100644 assets/uswds/img/material-icons/8k_plus.svg create mode 100644 assets/uswds/img/material-icons/8mp.svg create mode 100644 assets/uswds/img/material-icons/9k.svg create mode 100644 assets/uswds/img/material-icons/9k_plus.svg create mode 100644 assets/uswds/img/material-icons/9mp.svg create mode 100644 assets/uswds/img/material-icons/ac_unit.svg create mode 100644 assets/uswds/img/material-icons/access_alarm.svg create mode 100644 assets/uswds/img/material-icons/access_alarms.svg create mode 100644 assets/uswds/img/material-icons/access_time.svg create mode 100644 assets/uswds/img/material-icons/accessibility.svg create mode 100644 assets/uswds/img/material-icons/accessibility_new.svg create mode 100644 assets/uswds/img/material-icons/accessible.svg create mode 100644 assets/uswds/img/material-icons/accessible_forward.svg create mode 100644 assets/uswds/img/material-icons/account_balance.svg create mode 100644 assets/uswds/img/material-icons/account_balance_wallet.svg create mode 100644 assets/uswds/img/material-icons/account_box.svg create mode 100644 assets/uswds/img/material-icons/account_circle.svg create mode 100644 assets/uswds/img/material-icons/account_tree.svg create mode 100644 assets/uswds/img/material-icons/ad_units.svg create mode 100644 assets/uswds/img/material-icons/adb.svg create mode 100644 assets/uswds/img/material-icons/add.svg create mode 100644 assets/uswds/img/material-icons/add_a_photo.svg create mode 100644 assets/uswds/img/material-icons/add_alarm.svg create mode 100644 assets/uswds/img/material-icons/add_alert.svg create mode 100644 assets/uswds/img/material-icons/add_box.svg create mode 100755 assets/uswds/img/material-icons/add_business.svg create mode 100644 assets/uswds/img/material-icons/add_call.svg create mode 100644 assets/uswds/img/material-icons/add_chart.svg create mode 100644 assets/uswds/img/material-icons/add_circle.svg create mode 100644 assets/uswds/img/material-icons/add_circle_outline.svg create mode 100644 assets/uswds/img/material-icons/add_comment.svg create mode 100644 assets/uswds/img/material-icons/add_ic_call.svg create mode 100644 assets/uswds/img/material-icons/add_link.svg create mode 100644 assets/uswds/img/material-icons/add_location.svg create mode 100644 assets/uswds/img/material-icons/add_location_alt.svg create mode 100644 assets/uswds/img/material-icons/add_moderator.svg create mode 100644 assets/uswds/img/material-icons/add_photo_alternate.svg create mode 100755 assets/uswds/img/material-icons/add_road.svg create mode 100644 assets/uswds/img/material-icons/add_shopping_cart.svg create mode 100644 assets/uswds/img/material-icons/add_task.svg create mode 100644 assets/uswds/img/material-icons/add_to_drive.svg create mode 100644 assets/uswds/img/material-icons/add_to_home_screen.svg create mode 100644 assets/uswds/img/material-icons/add_to_photos.svg create mode 100644 assets/uswds/img/material-icons/add_to_queue.svg create mode 100644 assets/uswds/img/material-icons/addchart.svg create mode 100644 assets/uswds/img/material-icons/adjust.svg create mode 100755 assets/uswds/img/material-icons/admin_panel_settings.svg create mode 100755 assets/uswds/img/material-icons/agriculture.svg create mode 100644 assets/uswds/img/material-icons/airline_seat_flat.svg create mode 100644 assets/uswds/img/material-icons/airline_seat_flat_angled.svg create mode 100644 assets/uswds/img/material-icons/airline_seat_individual_suite.svg create mode 100644 assets/uswds/img/material-icons/airline_seat_legroom_extra.svg create mode 100644 assets/uswds/img/material-icons/airline_seat_legroom_normal.svg create mode 100644 assets/uswds/img/material-icons/airline_seat_legroom_reduced.svg create mode 100644 assets/uswds/img/material-icons/airline_seat_recline_extra.svg create mode 100644 assets/uswds/img/material-icons/airline_seat_recline_normal.svg create mode 100755 assets/uswds/img/material-icons/airplanemode_active.svg create mode 100755 assets/uswds/img/material-icons/airplanemode_inactive.svg create mode 100644 assets/uswds/img/material-icons/airplay.svg create mode 100644 assets/uswds/img/material-icons/airport_shuttle.svg create mode 100644 assets/uswds/img/material-icons/alarm.svg create mode 100644 assets/uswds/img/material-icons/alarm_add.svg create mode 100644 assets/uswds/img/material-icons/alarm_off.svg create mode 100644 assets/uswds/img/material-icons/alarm_on.svg create mode 100644 assets/uswds/img/material-icons/album.svg create mode 100644 assets/uswds/img/material-icons/align_horizontal_center.svg create mode 100644 assets/uswds/img/material-icons/align_horizontal_left.svg create mode 100644 assets/uswds/img/material-icons/align_horizontal_right.svg create mode 100644 assets/uswds/img/material-icons/align_vertical_bottom.svg create mode 100644 assets/uswds/img/material-icons/align_vertical_center.svg create mode 100644 assets/uswds/img/material-icons/align_vertical_top.svg create mode 100644 assets/uswds/img/material-icons/all_inbox.svg create mode 100644 assets/uswds/img/material-icons/all_inclusive.svg create mode 100644 assets/uswds/img/material-icons/all_out.svg create mode 100755 assets/uswds/img/material-icons/alt_route.svg create mode 100644 assets/uswds/img/material-icons/alternate_email.svg create mode 100755 assets/uswds/img/material-icons/amp_stories.svg create mode 100644 assets/uswds/img/material-icons/analytics.svg create mode 100644 assets/uswds/img/material-icons/anchor.svg create mode 100644 assets/uswds/img/material-icons/android.svg create mode 100644 assets/uswds/img/material-icons/animation.svg create mode 100644 assets/uswds/img/material-icons/announcement.svg create mode 100755 assets/uswds/img/material-icons/apartment.svg create mode 100644 assets/uswds/img/material-icons/api.svg create mode 100644 assets/uswds/img/material-icons/app_blocking.svg create mode 100755 assets/uswds/img/material-icons/app_registration.svg create mode 100644 assets/uswds/img/material-icons/app_settings_alt.svg create mode 100644 assets/uswds/img/material-icons/approval.svg create mode 100644 assets/uswds/img/material-icons/apps.svg create mode 100755 assets/uswds/img/material-icons/architecture.svg create mode 100644 assets/uswds/img/material-icons/archive.svg create mode 100644 assets/uswds/img/material-icons/arrow_back.svg create mode 100644 assets/uswds/img/material-icons/arrow_back_ios.svg create mode 100755 assets/uswds/img/material-icons/arrow_circle_down.svg create mode 100755 assets/uswds/img/material-icons/arrow_circle_up.svg create mode 100644 assets/uswds/img/material-icons/arrow_downward.svg create mode 100644 assets/uswds/img/material-icons/arrow_drop_down.svg create mode 100644 assets/uswds/img/material-icons/arrow_drop_down_circle.svg create mode 100644 assets/uswds/img/material-icons/arrow_drop_up.svg create mode 100644 assets/uswds/img/material-icons/arrow_forward.svg create mode 100644 assets/uswds/img/material-icons/arrow_forward_ios.svg create mode 100644 assets/uswds/img/material-icons/arrow_left.svg create mode 100644 assets/uswds/img/material-icons/arrow_right.svg create mode 100644 assets/uswds/img/material-icons/arrow_right_alt.svg create mode 100644 assets/uswds/img/material-icons/arrow_upward.svg create mode 100644 assets/uswds/img/material-icons/art_track.svg create mode 100644 assets/uswds/img/material-icons/article.svg create mode 100644 assets/uswds/img/material-icons/aspect_ratio.svg create mode 100644 assets/uswds/img/material-icons/assessment.svg create mode 100644 assets/uswds/img/material-icons/assignment.svg create mode 100644 assets/uswds/img/material-icons/assignment_ind.svg create mode 100644 assets/uswds/img/material-icons/assignment_late.svg create mode 100644 assets/uswds/img/material-icons/assignment_return.svg create mode 100644 assets/uswds/img/material-icons/assignment_returned.svg create mode 100644 assets/uswds/img/material-icons/assignment_turned_in.svg create mode 100644 assets/uswds/img/material-icons/assistant.svg create mode 100644 assets/uswds/img/material-icons/assistant_direction.svg create mode 100644 assets/uswds/img/material-icons/assistant_navigation.svg create mode 100644 assets/uswds/img/material-icons/assistant_photo.svg create mode 100644 assets/uswds/img/material-icons/atm.svg create mode 100755 assets/uswds/img/material-icons/attach_email.svg create mode 100644 assets/uswds/img/material-icons/attach_file.svg create mode 100644 assets/uswds/img/material-icons/attach_money.svg create mode 100644 assets/uswds/img/material-icons/attachment.svg create mode 100755 assets/uswds/img/material-icons/attractions.svg create mode 100644 assets/uswds/img/material-icons/audiotrack.svg create mode 100644 assets/uswds/img/material-icons/auto_awesome.svg create mode 100644 assets/uswds/img/material-icons/auto_awesome_mosaic.svg create mode 100644 assets/uswds/img/material-icons/auto_awesome_motion.svg create mode 100755 assets/uswds/img/material-icons/auto_delete.svg create mode 100644 assets/uswds/img/material-icons/auto_fix_high.svg create mode 100644 assets/uswds/img/material-icons/auto_fix_normal.svg create mode 100644 assets/uswds/img/material-icons/auto_fix_off.svg create mode 100644 assets/uswds/img/material-icons/auto_stories.svg create mode 100644 assets/uswds/img/material-icons/autorenew.svg create mode 100644 assets/uswds/img/material-icons/av_timer.svg create mode 100644 assets/uswds/img/material-icons/baby_changing_station.svg create mode 100644 assets/uswds/img/material-icons/backpack.svg create mode 100644 assets/uswds/img/material-icons/backspace.svg create mode 100644 assets/uswds/img/material-icons/backup.svg create mode 100755 assets/uswds/img/material-icons/backup_table.svg create mode 100755 assets/uswds/img/material-icons/badge.svg create mode 100755 assets/uswds/img/material-icons/bakery_dining.svg create mode 100644 assets/uswds/img/material-icons/ballot.svg create mode 100644 assets/uswds/img/material-icons/bar_chart.svg create mode 100755 assets/uswds/img/material-icons/batch_prediction.svg create mode 100755 assets/uswds/img/material-icons/bathtub.svg create mode 100644 assets/uswds/img/material-icons/battery_alert.svg create mode 100644 assets/uswds/img/material-icons/battery_charging_full.svg create mode 100644 assets/uswds/img/material-icons/battery_full.svg create mode 100644 assets/uswds/img/material-icons/battery_std.svg create mode 100644 assets/uswds/img/material-icons/battery_unknown.svg create mode 100644 assets/uswds/img/material-icons/beach_access.svg create mode 100755 assets/uswds/img/material-icons/bedtime.svg create mode 100644 assets/uswds/img/material-icons/beenhere.svg create mode 100644 assets/uswds/img/material-icons/bento.svg create mode 100755 assets/uswds/img/material-icons/bike_scooter.svg create mode 100755 assets/uswds/img/material-icons/biotech.svg create mode 100644 assets/uswds/img/material-icons/block.svg create mode 100755 assets/uswds/img/material-icons/block_flipped.svg create mode 100644 assets/uswds/img/material-icons/bluetooth.svg create mode 100644 assets/uswds/img/material-icons/bluetooth_audio.svg create mode 100644 assets/uswds/img/material-icons/bluetooth_connected.svg create mode 100644 assets/uswds/img/material-icons/bluetooth_disabled.svg create mode 100644 assets/uswds/img/material-icons/bluetooth_searching.svg create mode 100644 assets/uswds/img/material-icons/blur_circular.svg create mode 100644 assets/uswds/img/material-icons/blur_linear.svg create mode 100644 assets/uswds/img/material-icons/blur_off.svg create mode 100644 assets/uswds/img/material-icons/blur_on.svg create mode 100644 assets/uswds/img/material-icons/bolt.svg create mode 100644 assets/uswds/img/material-icons/book.svg create mode 100644 assets/uswds/img/material-icons/book_online.svg create mode 100644 assets/uswds/img/material-icons/bookmark.svg create mode 100644 assets/uswds/img/material-icons/bookmark_border.svg create mode 100644 assets/uswds/img/material-icons/bookmarks.svg create mode 100644 assets/uswds/img/material-icons/border_all.svg create mode 100644 assets/uswds/img/material-icons/border_bottom.svg create mode 100644 assets/uswds/img/material-icons/border_clear.svg create mode 100644 assets/uswds/img/material-icons/border_color.svg create mode 100644 assets/uswds/img/material-icons/border_horizontal.svg create mode 100644 assets/uswds/img/material-icons/border_inner.svg create mode 100644 assets/uswds/img/material-icons/border_left.svg create mode 100644 assets/uswds/img/material-icons/border_outer.svg create mode 100644 assets/uswds/img/material-icons/border_right.svg create mode 100644 assets/uswds/img/material-icons/border_style.svg create mode 100644 assets/uswds/img/material-icons/border_top.svg create mode 100644 assets/uswds/img/material-icons/border_vertical.svg create mode 100644 assets/uswds/img/material-icons/branding_watermark.svg create mode 100755 assets/uswds/img/material-icons/breakfast_dining.svg create mode 100644 assets/uswds/img/material-icons/brightness_1.svg create mode 100644 assets/uswds/img/material-icons/brightness_2.svg create mode 100644 assets/uswds/img/material-icons/brightness_3.svg create mode 100644 assets/uswds/img/material-icons/brightness_4.svg create mode 100644 assets/uswds/img/material-icons/brightness_5.svg create mode 100644 assets/uswds/img/material-icons/brightness_6.svg create mode 100644 assets/uswds/img/material-icons/brightness_7.svg create mode 100644 assets/uswds/img/material-icons/brightness_auto.svg create mode 100644 assets/uswds/img/material-icons/brightness_high.svg create mode 100644 assets/uswds/img/material-icons/brightness_low.svg create mode 100644 assets/uswds/img/material-icons/brightness_medium.svg create mode 100644 assets/uswds/img/material-icons/broken_image.svg create mode 100755 assets/uswds/img/material-icons/browser_not_supported.svg create mode 100755 assets/uswds/img/material-icons/brunch_dining.svg create mode 100644 assets/uswds/img/material-icons/brush.svg create mode 100644 assets/uswds/img/material-icons/bubble_chart.svg create mode 100644 assets/uswds/img/material-icons/bug_report.svg create mode 100644 assets/uswds/img/material-icons/build.svg create mode 100755 assets/uswds/img/material-icons/build_circle.svg create mode 100644 assets/uswds/img/material-icons/burst_mode.svg create mode 100644 assets/uswds/img/material-icons/bus_alert.svg create mode 100644 assets/uswds/img/material-icons/business.svg create mode 100644 assets/uswds/img/material-icons/business_center.svg create mode 100644 assets/uswds/img/material-icons/cached.svg create mode 100644 assets/uswds/img/material-icons/cake.svg create mode 100755 assets/uswds/img/material-icons/calculate.svg create mode 100644 assets/uswds/img/material-icons/calendar_today.svg create mode 100644 assets/uswds/img/material-icons/calendar_view_day.svg create mode 100644 assets/uswds/img/material-icons/call.svg create mode 100644 assets/uswds/img/material-icons/call_end.svg create mode 100644 assets/uswds/img/material-icons/call_made.svg create mode 100644 assets/uswds/img/material-icons/call_merge.svg create mode 100644 assets/uswds/img/material-icons/call_missed.svg create mode 100644 assets/uswds/img/material-icons/call_missed_outgoing.svg create mode 100644 assets/uswds/img/material-icons/call_received.svg create mode 100644 assets/uswds/img/material-icons/call_split.svg create mode 100644 assets/uswds/img/material-icons/call_to_action.svg create mode 100644 assets/uswds/img/material-icons/camera.svg create mode 100644 assets/uswds/img/material-icons/camera_alt.svg create mode 100644 assets/uswds/img/material-icons/camera_enhance.svg create mode 100644 assets/uswds/img/material-icons/camera_front.svg create mode 100644 assets/uswds/img/material-icons/camera_rear.svg create mode 100644 assets/uswds/img/material-icons/camera_roll.svg create mode 100644 assets/uswds/img/material-icons/campaign.svg create mode 100644 assets/uswds/img/material-icons/cancel.svg create mode 100644 assets/uswds/img/material-icons/cancel_presentation.svg create mode 100755 assets/uswds/img/material-icons/cancel_schedule_send.svg create mode 100755 assets/uswds/img/material-icons/car_rental.svg create mode 100755 assets/uswds/img/material-icons/car_repair.svg create mode 100644 assets/uswds/img/material-icons/card_giftcard.svg create mode 100644 assets/uswds/img/material-icons/card_membership.svg create mode 100644 assets/uswds/img/material-icons/card_travel.svg create mode 100644 assets/uswds/img/material-icons/carpenter.svg create mode 100644 assets/uswds/img/material-icons/cases.svg create mode 100644 assets/uswds/img/material-icons/casino.svg create mode 100644 assets/uswds/img/material-icons/cast.svg create mode 100644 assets/uswds/img/material-icons/cast_connected.svg create mode 100644 assets/uswds/img/material-icons/cast_for_education.svg create mode 100644 assets/uswds/img/material-icons/category.svg create mode 100755 assets/uswds/img/material-icons/celebration.svg create mode 100644 assets/uswds/img/material-icons/cell_wifi.svg create mode 100644 assets/uswds/img/material-icons/center_focus_strong.svg create mode 100644 assets/uswds/img/material-icons/center_focus_weak.svg create mode 100644 assets/uswds/img/material-icons/change_history.svg create mode 100644 assets/uswds/img/material-icons/charging_station.svg create mode 100644 assets/uswds/img/material-icons/chat.svg create mode 100644 assets/uswds/img/material-icons/chat_bubble.svg create mode 100644 assets/uswds/img/material-icons/chat_bubble_outline.svg create mode 100644 assets/uswds/img/material-icons/check.svg create mode 100644 assets/uswds/img/material-icons/check_box.svg create mode 100644 assets/uswds/img/material-icons/check_box_outline_blank.svg create mode 100644 assets/uswds/img/material-icons/check_circle.svg create mode 100644 assets/uswds/img/material-icons/check_circle_outline.svg create mode 100644 assets/uswds/img/material-icons/checkroom.svg create mode 100755 assets/uswds/img/material-icons/chevron_left.svg create mode 100755 assets/uswds/img/material-icons/chevron_right.svg create mode 100644 assets/uswds/img/material-icons/child_care.svg create mode 100644 assets/uswds/img/material-icons/child_friendly.svg create mode 100644 assets/uswds/img/material-icons/chrome_reader_mode.svg create mode 100644 assets/uswds/img/material-icons/circle.svg create mode 100644 assets/uswds/img/material-icons/circle_notifications.svg create mode 100644 assets/uswds/img/material-icons/class.svg create mode 100644 assets/uswds/img/material-icons/clean_hands.svg create mode 100755 assets/uswds/img/material-icons/cleaning_services.svg create mode 100644 assets/uswds/img/material-icons/clear.svg create mode 100644 assets/uswds/img/material-icons/clear_all.svg create mode 100644 assets/uswds/img/material-icons/close.svg create mode 100644 assets/uswds/img/material-icons/close_fullscreen.svg create mode 100644 assets/uswds/img/material-icons/closed_caption.svg create mode 100644 assets/uswds/img/material-icons/closed_caption_disabled.svg create mode 100644 assets/uswds/img/material-icons/closed_caption_off.svg create mode 100644 assets/uswds/img/material-icons/cloud.svg create mode 100644 assets/uswds/img/material-icons/cloud_circle.svg create mode 100644 assets/uswds/img/material-icons/cloud_done.svg create mode 100644 assets/uswds/img/material-icons/cloud_download.svg create mode 100644 assets/uswds/img/material-icons/cloud_off.svg create mode 100644 assets/uswds/img/material-icons/cloud_queue.svg create mode 100644 assets/uswds/img/material-icons/cloud_upload.svg create mode 100644 assets/uswds/img/material-icons/code.svg create mode 100644 assets/uswds/img/material-icons/collections.svg create mode 100644 assets/uswds/img/material-icons/collections_bookmark.svg create mode 100644 assets/uswds/img/material-icons/color_lens.svg create mode 100644 assets/uswds/img/material-icons/colorize.svg create mode 100644 assets/uswds/img/material-icons/comment.svg create mode 100755 assets/uswds/img/material-icons/comment_bank.svg create mode 100644 assets/uswds/img/material-icons/commute.svg create mode 100644 assets/uswds/img/material-icons/compare.svg create mode 100644 assets/uswds/img/material-icons/compare_arrows.svg create mode 100644 assets/uswds/img/material-icons/compass_calibration.svg create mode 100644 assets/uswds/img/material-icons/compress.svg create mode 100644 assets/uswds/img/material-icons/computer.svg create mode 100644 assets/uswds/img/material-icons/confirmation_number.svg create mode 100644 assets/uswds/img/material-icons/connect_without_contact.svg create mode 100644 assets/uswds/img/material-icons/connected_tv.svg create mode 100755 assets/uswds/img/material-icons/construction.svg create mode 100644 assets/uswds/img/material-icons/contact_mail.svg create mode 100644 assets/uswds/img/material-icons/contact_page.svg create mode 100644 assets/uswds/img/material-icons/contact_phone.svg create mode 100644 assets/uswds/img/material-icons/contact_support.svg create mode 100755 assets/uswds/img/material-icons/contactless.svg create mode 100644 assets/uswds/img/material-icons/contacts.svg create mode 100644 assets/uswds/img/material-icons/content_copy.svg create mode 100644 assets/uswds/img/material-icons/content_cut.svg create mode 100644 assets/uswds/img/material-icons/content_paste.svg create mode 100644 assets/uswds/img/material-icons/control_camera.svg create mode 100644 assets/uswds/img/material-icons/control_point.svg create mode 100644 assets/uswds/img/material-icons/control_point_duplicate.svg create mode 100644 assets/uswds/img/material-icons/copyright.svg create mode 100644 assets/uswds/img/material-icons/coronavirus.svg create mode 100644 assets/uswds/img/material-icons/corporate_fare.svg create mode 100644 assets/uswds/img/material-icons/countertops.svg create mode 100644 assets/uswds/img/material-icons/create.svg create mode 100644 assets/uswds/img/material-icons/create_new_folder.svg create mode 100644 assets/uswds/img/material-icons/credit_card.svg create mode 100644 assets/uswds/img/material-icons/crop.svg create mode 100644 assets/uswds/img/material-icons/crop_16_9.svg create mode 100644 assets/uswds/img/material-icons/crop_3_2.svg create mode 100644 assets/uswds/img/material-icons/crop_5_4.svg create mode 100644 assets/uswds/img/material-icons/crop_7_5.svg create mode 100644 assets/uswds/img/material-icons/crop_din.svg create mode 100644 assets/uswds/img/material-icons/crop_free.svg create mode 100644 assets/uswds/img/material-icons/crop_landscape.svg create mode 100644 assets/uswds/img/material-icons/crop_original.svg create mode 100644 assets/uswds/img/material-icons/crop_portrait.svg create mode 100644 assets/uswds/img/material-icons/crop_rotate.svg create mode 100644 assets/uswds/img/material-icons/crop_square.svg create mode 100755 assets/uswds/img/material-icons/dangerous.svg create mode 100644 assets/uswds/img/material-icons/dashboard.svg create mode 100644 assets/uswds/img/material-icons/dashboard_customize.svg create mode 100644 assets/uswds/img/material-icons/data_usage.svg create mode 100644 assets/uswds/img/material-icons/date_range.svg create mode 100755 assets/uswds/img/material-icons/deck.svg create mode 100644 assets/uswds/img/material-icons/dehaze.svg create mode 100644 assets/uswds/img/material-icons/delete.svg create mode 100644 assets/uswds/img/material-icons/delete_forever.svg create mode 100644 assets/uswds/img/material-icons/delete_outline.svg create mode 100644 assets/uswds/img/material-icons/delete_sweep.svg create mode 100755 assets/uswds/img/material-icons/delivery_dining.svg create mode 100644 assets/uswds/img/material-icons/departure_board.svg create mode 100644 assets/uswds/img/material-icons/description.svg create mode 100755 assets/uswds/img/material-icons/design_services.svg create mode 100644 assets/uswds/img/material-icons/desktop_access_disabled.svg create mode 100644 assets/uswds/img/material-icons/desktop_mac.svg create mode 100644 assets/uswds/img/material-icons/desktop_windows.svg create mode 100644 assets/uswds/img/material-icons/details.svg create mode 100644 assets/uswds/img/material-icons/developer_board.svg create mode 100644 assets/uswds/img/material-icons/developer_mode.svg create mode 100644 assets/uswds/img/material-icons/device_hub.svg create mode 100644 assets/uswds/img/material-icons/device_thermostat.svg create mode 100644 assets/uswds/img/material-icons/device_unknown.svg create mode 100644 assets/uswds/img/material-icons/devices.svg create mode 100644 assets/uswds/img/material-icons/devices_other.svg create mode 100644 assets/uswds/img/material-icons/dialer_sip.svg create mode 100644 assets/uswds/img/material-icons/dialpad.svg create mode 100755 assets/uswds/img/material-icons/dinner_dining.svg create mode 100644 assets/uswds/img/material-icons/directions.svg create mode 100644 assets/uswds/img/material-icons/directions_bike.svg create mode 100644 assets/uswds/img/material-icons/directions_boat.svg create mode 100644 assets/uswds/img/material-icons/directions_bus.svg create mode 100644 assets/uswds/img/material-icons/directions_car.svg create mode 100644 assets/uswds/img/material-icons/directions_off.svg create mode 100644 assets/uswds/img/material-icons/directions_railway.svg create mode 100644 assets/uswds/img/material-icons/directions_run.svg create mode 100644 assets/uswds/img/material-icons/directions_subway.svg create mode 100644 assets/uswds/img/material-icons/directions_transit.svg create mode 100644 assets/uswds/img/material-icons/directions_walk.svg create mode 100644 assets/uswds/img/material-icons/dirty_lens.svg create mode 100644 assets/uswds/img/material-icons/disabled_by_default.svg create mode 100644 assets/uswds/img/material-icons/disc_full.svg create mode 100644 assets/uswds/img/material-icons/dns.svg create mode 100644 assets/uswds/img/material-icons/do_not_disturb.svg create mode 100644 assets/uswds/img/material-icons/do_not_disturb_alt.svg create mode 100644 assets/uswds/img/material-icons/do_not_disturb_off.svg create mode 100644 assets/uswds/img/material-icons/do_not_disturb_on.svg create mode 100644 assets/uswds/img/material-icons/do_not_step.svg create mode 100644 assets/uswds/img/material-icons/do_not_touch.svg create mode 100644 assets/uswds/img/material-icons/dock.svg create mode 100644 assets/uswds/img/material-icons/domain.svg create mode 100644 assets/uswds/img/material-icons/domain_disabled.svg create mode 100755 assets/uswds/img/material-icons/domain_verification.svg create mode 100644 assets/uswds/img/material-icons/done.svg create mode 100644 assets/uswds/img/material-icons/done_all.svg create mode 100644 assets/uswds/img/material-icons/done_outline.svg create mode 100644 assets/uswds/img/material-icons/donut_large.svg create mode 100644 assets/uswds/img/material-icons/donut_small.svg create mode 100755 assets/uswds/img/material-icons/double_arrow.svg create mode 100644 assets/uswds/img/material-icons/drafts.svg create mode 100644 assets/uswds/img/material-icons/drag_handle.svg create mode 100644 assets/uswds/img/material-icons/drag_indicator.svg create mode 100644 assets/uswds/img/material-icons/drive_eta.svg create mode 100644 assets/uswds/img/material-icons/drive_file_move.svg create mode 100644 assets/uswds/img/material-icons/drive_file_move_outline.svg create mode 100644 assets/uswds/img/material-icons/drive_file_rename_outline.svg create mode 100644 assets/uswds/img/material-icons/drive_folder_upload.svg create mode 100644 assets/uswds/img/material-icons/dry.svg create mode 100755 assets/uswds/img/material-icons/dry_cleaning.svg create mode 100644 assets/uswds/img/material-icons/duo.svg create mode 100644 assets/uswds/img/material-icons/dvr.svg create mode 100755 assets/uswds/img/material-icons/dynamic_feed.svg create mode 100644 assets/uswds/img/material-icons/dynamic_form.svg create mode 100644 assets/uswds/img/material-icons/east.svg create mode 100755 assets/uswds/img/material-icons/eco.svg create mode 100644 assets/uswds/img/material-icons/edit.svg create mode 100644 assets/uswds/img/material-icons/edit_attributes.svg create mode 100644 assets/uswds/img/material-icons/edit_location.svg create mode 100644 assets/uswds/img/material-icons/edit_off.svg create mode 100755 assets/uswds/img/material-icons/edit_road.svg create mode 100644 assets/uswds/img/material-icons/eject.svg create mode 100644 assets/uswds/img/material-icons/elderly.svg create mode 100755 assets/uswds/img/material-icons/electric_bike.svg create mode 100755 assets/uswds/img/material-icons/electric_car.svg create mode 100755 assets/uswds/img/material-icons/electric_moped.svg create mode 100755 assets/uswds/img/material-icons/electric_rickshaw.svg create mode 100755 assets/uswds/img/material-icons/electric_scooter.svg create mode 100755 assets/uswds/img/material-icons/electrical_services.svg create mode 100644 assets/uswds/img/material-icons/elevator.svg create mode 100644 assets/uswds/img/material-icons/email.svg create mode 100755 assets/uswds/img/material-icons/emoji_emotions.svg create mode 100755 assets/uswds/img/material-icons/emoji_events.svg create mode 100755 assets/uswds/img/material-icons/emoji_flags.svg create mode 100755 assets/uswds/img/material-icons/emoji_food_beverage.svg create mode 100755 assets/uswds/img/material-icons/emoji_nature.svg create mode 100755 assets/uswds/img/material-icons/emoji_objects.svg create mode 100755 assets/uswds/img/material-icons/emoji_people.svg create mode 100755 assets/uswds/img/material-icons/emoji_symbols.svg create mode 100755 assets/uswds/img/material-icons/emoji_transportation.svg create mode 100755 assets/uswds/img/material-icons/engineering.svg create mode 100644 assets/uswds/img/material-icons/enhanced_encryption.svg create mode 100644 assets/uswds/img/material-icons/equalizer.svg create mode 100644 assets/uswds/img/material-icons/error.svg create mode 100644 assets/uswds/img/material-icons/error_outline.svg create mode 100644 assets/uswds/img/material-icons/escalator.svg create mode 100644 assets/uswds/img/material-icons/escalator_warning.svg create mode 100755 assets/uswds/img/material-icons/euro.svg create mode 100644 assets/uswds/img/material-icons/euro_symbol.svg create mode 100644 assets/uswds/img/material-icons/ev_station.svg create mode 100644 assets/uswds/img/material-icons/event.svg create mode 100644 assets/uswds/img/material-icons/event_available.svg create mode 100644 assets/uswds/img/material-icons/event_busy.svg create mode 100644 assets/uswds/img/material-icons/event_note.svg create mode 100644 assets/uswds/img/material-icons/event_seat.svg create mode 100644 assets/uswds/img/material-icons/exit_to_app.svg create mode 100644 assets/uswds/img/material-icons/expand.svg create mode 100644 assets/uswds/img/material-icons/expand_less.svg create mode 100644 assets/uswds/img/material-icons/expand_more.svg create mode 100644 assets/uswds/img/material-icons/explicit.svg create mode 100644 assets/uswds/img/material-icons/explore.svg create mode 100644 assets/uswds/img/material-icons/explore_off.svg create mode 100644 assets/uswds/img/material-icons/exposure.svg create mode 100644 assets/uswds/img/material-icons/exposure_neg_1.svg create mode 100644 assets/uswds/img/material-icons/exposure_neg_2.svg create mode 100644 assets/uswds/img/material-icons/exposure_plus_1.svg create mode 100644 assets/uswds/img/material-icons/exposure_plus_2.svg create mode 100644 assets/uswds/img/material-icons/exposure_zero.svg create mode 100644 assets/uswds/img/material-icons/extension.svg create mode 100644 assets/uswds/img/material-icons/face.svg create mode 100644 assets/uswds/img/material-icons/face_retouching_natural.svg create mode 100644 assets/uswds/img/material-icons/facebook.svg create mode 100755 assets/uswds/img/material-icons/fact_check.svg create mode 100644 assets/uswds/img/material-icons/family_restroom.svg create mode 100644 assets/uswds/img/material-icons/fast_forward.svg create mode 100644 assets/uswds/img/material-icons/fast_rewind.svg create mode 100644 assets/uswds/img/material-icons/fastfood.svg create mode 100644 assets/uswds/img/material-icons/favorite.svg create mode 100644 assets/uswds/img/material-icons/favorite_border.svg create mode 100644 assets/uswds/img/material-icons/featured_play_list.svg create mode 100644 assets/uswds/img/material-icons/featured_video.svg create mode 100644 assets/uswds/img/material-icons/feedback.svg create mode 100644 assets/uswds/img/material-icons/fence.svg create mode 100755 assets/uswds/img/material-icons/festival.svg create mode 100644 assets/uswds/img/material-icons/fiber_dvr.svg create mode 100644 assets/uswds/img/material-icons/fiber_manual_record.svg create mode 100644 assets/uswds/img/material-icons/fiber_new.svg create mode 100644 assets/uswds/img/material-icons/fiber_pin.svg create mode 100644 assets/uswds/img/material-icons/fiber_smart_record.svg create mode 100644 assets/uswds/img/material-icons/file_copy.svg create mode 100644 assets/uswds/img/material-icons/file_download.svg create mode 100644 assets/uswds/img/material-icons/file_download_done.svg create mode 100644 assets/uswds/img/material-icons/file_present.svg create mode 100644 assets/uswds/img/material-icons/file_upload.svg create mode 100644 assets/uswds/img/material-icons/filter.svg create mode 100644 assets/uswds/img/material-icons/filter_1.svg create mode 100644 assets/uswds/img/material-icons/filter_2.svg create mode 100644 assets/uswds/img/material-icons/filter_3.svg create mode 100644 assets/uswds/img/material-icons/filter_4.svg create mode 100644 assets/uswds/img/material-icons/filter_5.svg create mode 100644 assets/uswds/img/material-icons/filter_6.svg create mode 100644 assets/uswds/img/material-icons/filter_7.svg create mode 100644 assets/uswds/img/material-icons/filter_8.svg create mode 100644 assets/uswds/img/material-icons/filter_9.svg create mode 100644 assets/uswds/img/material-icons/filter_9_plus.svg create mode 100644 assets/uswds/img/material-icons/filter_alt.svg create mode 100644 assets/uswds/img/material-icons/filter_b_and_w.svg create mode 100644 assets/uswds/img/material-icons/filter_center_focus.svg create mode 100644 assets/uswds/img/material-icons/filter_drama.svg create mode 100644 assets/uswds/img/material-icons/filter_frames.svg create mode 100644 assets/uswds/img/material-icons/filter_hdr.svg create mode 100644 assets/uswds/img/material-icons/filter_list.svg create mode 100644 assets/uswds/img/material-icons/filter_list_alt.svg create mode 100644 assets/uswds/img/material-icons/filter_none.svg create mode 100644 assets/uswds/img/material-icons/filter_tilt_shift.svg create mode 100644 assets/uswds/img/material-icons/filter_vintage.svg create mode 100644 assets/uswds/img/material-icons/find_in_page.svg create mode 100644 assets/uswds/img/material-icons/find_replace.svg create mode 100644 assets/uswds/img/material-icons/fingerprint.svg create mode 100644 assets/uswds/img/material-icons/fire_extinguisher.svg create mode 100755 assets/uswds/img/material-icons/fireplace.svg create mode 100644 assets/uswds/img/material-icons/first_page.svg create mode 100644 assets/uswds/img/material-icons/fit_screen.svg create mode 100644 assets/uswds/img/material-icons/fitness_center.svg create mode 100644 assets/uswds/img/material-icons/flag.svg create mode 100755 assets/uswds/img/material-icons/flaky.svg create mode 100644 assets/uswds/img/material-icons/flare.svg create mode 100644 assets/uswds/img/material-icons/flash_auto.svg create mode 100644 assets/uswds/img/material-icons/flash_off.svg create mode 100644 assets/uswds/img/material-icons/flash_on.svg create mode 100644 assets/uswds/img/material-icons/flight.svg create mode 100644 assets/uswds/img/material-icons/flight_land.svg create mode 100644 assets/uswds/img/material-icons/flight_takeoff.svg create mode 100644 assets/uswds/img/material-icons/flip.svg create mode 100755 assets/uswds/img/material-icons/flip_camera_android.svg create mode 100755 assets/uswds/img/material-icons/flip_camera_ios.svg create mode 100644 assets/uswds/img/material-icons/flip_to_back.svg create mode 100644 assets/uswds/img/material-icons/flip_to_front.svg create mode 100644 assets/uswds/img/material-icons/folder.svg create mode 100644 assets/uswds/img/material-icons/folder_open.svg create mode 100644 assets/uswds/img/material-icons/folder_shared.svg create mode 100644 assets/uswds/img/material-icons/folder_special.svg create mode 100644 assets/uswds/img/material-icons/follow_the_signs.svg create mode 100644 assets/uswds/img/material-icons/font_download.svg create mode 100644 assets/uswds/img/material-icons/food_bank.svg create mode 100644 assets/uswds/img/material-icons/format_align_center.svg create mode 100644 assets/uswds/img/material-icons/format_align_justify.svg create mode 100644 assets/uswds/img/material-icons/format_align_left.svg create mode 100644 assets/uswds/img/material-icons/format_align_right.svg create mode 100644 assets/uswds/img/material-icons/format_bold.svg create mode 100644 assets/uswds/img/material-icons/format_clear.svg create mode 100644 assets/uswds/img/material-icons/format_color_fill.svg create mode 100644 assets/uswds/img/material-icons/format_color_reset.svg create mode 100644 assets/uswds/img/material-icons/format_color_text.svg create mode 100644 assets/uswds/img/material-icons/format_indent_decrease.svg create mode 100644 assets/uswds/img/material-icons/format_indent_increase.svg create mode 100644 assets/uswds/img/material-icons/format_italic.svg create mode 100644 assets/uswds/img/material-icons/format_line_spacing.svg create mode 100644 assets/uswds/img/material-icons/format_list_bulleted.svg create mode 100644 assets/uswds/img/material-icons/format_list_numbered.svg create mode 100644 assets/uswds/img/material-icons/format_list_numbered_rtl.svg create mode 100644 assets/uswds/img/material-icons/format_paint.svg create mode 100644 assets/uswds/img/material-icons/format_quote.svg create mode 100644 assets/uswds/img/material-icons/format_shapes.svg create mode 100644 assets/uswds/img/material-icons/format_size.svg create mode 100644 assets/uswds/img/material-icons/format_strikethrough.svg create mode 100644 assets/uswds/img/material-icons/format_textdirection_l_to_r.svg create mode 100644 assets/uswds/img/material-icons/format_textdirection_r_to_l.svg create mode 100644 assets/uswds/img/material-icons/format_underlined.svg create mode 100644 assets/uswds/img/material-icons/forum.svg create mode 100644 assets/uswds/img/material-icons/forward.svg create mode 100644 assets/uswds/img/material-icons/forward_10.svg create mode 100644 assets/uswds/img/material-icons/forward_30.svg create mode 100644 assets/uswds/img/material-icons/forward_5.svg create mode 100755 assets/uswds/img/material-icons/forward_to_inbox.svg create mode 100644 assets/uswds/img/material-icons/foundation.svg create mode 100644 assets/uswds/img/material-icons/free_breakfast.svg create mode 100644 assets/uswds/img/material-icons/fullscreen.svg create mode 100644 assets/uswds/img/material-icons/fullscreen_exit.svg create mode 100644 assets/uswds/img/material-icons/functions.svg create mode 100644 assets/uswds/img/material-icons/g_translate.svg create mode 100644 assets/uswds/img/material-icons/gamepad.svg create mode 100644 assets/uswds/img/material-icons/games.svg create mode 100644 assets/uswds/img/material-icons/gavel.svg create mode 100644 assets/uswds/img/material-icons/gesture.svg create mode 100644 assets/uswds/img/material-icons/get_app.svg create mode 100644 assets/uswds/img/material-icons/gif.svg create mode 100644 assets/uswds/img/material-icons/golf_course.svg create mode 100644 assets/uswds/img/material-icons/gps_fixed.svg create mode 100644 assets/uswds/img/material-icons/gps_not_fixed.svg create mode 100644 assets/uswds/img/material-icons/gps_off.svg create mode 100644 assets/uswds/img/material-icons/grade.svg create mode 100644 assets/uswds/img/material-icons/gradient.svg create mode 100755 assets/uswds/img/material-icons/grading.svg create mode 100644 assets/uswds/img/material-icons/grain.svg create mode 100644 assets/uswds/img/material-icons/graphic_eq.svg create mode 100644 assets/uswds/img/material-icons/grass.svg create mode 100644 assets/uswds/img/material-icons/grid_off.svg create mode 100644 assets/uswds/img/material-icons/grid_on.svg create mode 100644 assets/uswds/img/material-icons/grid_view.svg create mode 100644 assets/uswds/img/material-icons/group.svg create mode 100644 assets/uswds/img/material-icons/group_add.svg create mode 100644 assets/uswds/img/material-icons/group_work.svg create mode 100644 assets/uswds/img/material-icons/groups.svg create mode 100644 assets/uswds/img/material-icons/hail.svg create mode 100755 assets/uswds/img/material-icons/handyman.svg create mode 100755 assets/uswds/img/material-icons/hardware.svg create mode 100644 assets/uswds/img/material-icons/hd.svg create mode 100644 assets/uswds/img/material-icons/hdr_enhanced_select.svg create mode 100644 assets/uswds/img/material-icons/hdr_off.svg create mode 100644 assets/uswds/img/material-icons/hdr_on.svg create mode 100644 assets/uswds/img/material-icons/hdr_strong.svg create mode 100644 assets/uswds/img/material-icons/hdr_weak.svg create mode 100644 assets/uswds/img/material-icons/headset.svg create mode 100644 assets/uswds/img/material-icons/headset_mic.svg create mode 100644 assets/uswds/img/material-icons/headset_off.svg create mode 100644 assets/uswds/img/material-icons/healing.svg create mode 100644 assets/uswds/img/material-icons/hearing.svg create mode 100755 assets/uswds/img/material-icons/hearing_disabled.svg create mode 100755 assets/uswds/img/material-icons/height.svg create mode 100644 assets/uswds/img/material-icons/help.svg create mode 100644 assets/uswds/img/material-icons/help_center.svg create mode 100644 assets/uswds/img/material-icons/help_outline.svg create mode 100644 assets/uswds/img/material-icons/high_quality.svg create mode 100644 assets/uswds/img/material-icons/highlight.svg create mode 100644 assets/uswds/img/material-icons/highlight_alt.svg create mode 100644 assets/uswds/img/material-icons/highlight_off.svg create mode 100644 assets/uswds/img/material-icons/history.svg create mode 100755 assets/uswds/img/material-icons/history_edu.svg create mode 100755 assets/uswds/img/material-icons/history_toggle_off.svg create mode 100644 assets/uswds/img/material-icons/home.svg create mode 100644 assets/uswds/img/material-icons/home_filled.svg create mode 100755 assets/uswds/img/material-icons/home_repair_service.svg create mode 100644 assets/uswds/img/material-icons/home_work.svg create mode 100644 assets/uswds/img/material-icons/horizontal_distribute.svg create mode 100755 assets/uswds/img/material-icons/horizontal_rule.svg create mode 100644 assets/uswds/img/material-icons/horizontal_split.svg create mode 100644 assets/uswds/img/material-icons/hot_tub.svg create mode 100644 assets/uswds/img/material-icons/hotel.svg create mode 100755 assets/uswds/img/material-icons/hourglass_bottom.svg create mode 100755 assets/uswds/img/material-icons/hourglass_disabled.svg create mode 100644 assets/uswds/img/material-icons/hourglass_empty.svg create mode 100644 assets/uswds/img/material-icons/hourglass_full.svg create mode 100755 assets/uswds/img/material-icons/hourglass_top.svg create mode 100755 assets/uswds/img/material-icons/house.svg create mode 100644 assets/uswds/img/material-icons/house_siding.svg create mode 100644 assets/uswds/img/material-icons/how_to_reg.svg create mode 100644 assets/uswds/img/material-icons/how_to_vote.svg create mode 100644 assets/uswds/img/material-icons/http.svg create mode 100644 assets/uswds/img/material-icons/https.svg create mode 100755 assets/uswds/img/material-icons/hvac.svg create mode 100755 assets/uswds/img/material-icons/icecream.svg create mode 100644 assets/uswds/img/material-icons/image.svg create mode 100644 assets/uswds/img/material-icons/image_aspect_ratio.svg create mode 100755 assets/uswds/img/material-icons/image_not_supported.svg create mode 100644 assets/uswds/img/material-icons/image_search.svg create mode 100644 assets/uswds/img/material-icons/imagesearch_roller.svg create mode 100644 assets/uswds/img/material-icons/import_contacts.svg create mode 100644 assets/uswds/img/material-icons/import_export.svg create mode 100644 assets/uswds/img/material-icons/important_devices.svg create mode 100644 assets/uswds/img/material-icons/inbox.svg create mode 100644 assets/uswds/img/material-icons/indeterminate_check_box.svg create mode 100644 assets/uswds/img/material-icons/info.svg create mode 100644 assets/uswds/img/material-icons/info_outline.svg create mode 100644 assets/uswds/img/material-icons/input.svg create mode 100644 assets/uswds/img/material-icons/insert_chart.svg create mode 100644 assets/uswds/img/material-icons/insert_chart_outlined.svg create mode 100644 assets/uswds/img/material-icons/insert_comment.svg create mode 100644 assets/uswds/img/material-icons/insert_drive_file.svg create mode 100644 assets/uswds/img/material-icons/insert_emoticon.svg create mode 100644 assets/uswds/img/material-icons/insert_invitation.svg create mode 100644 assets/uswds/img/material-icons/insert_link.svg create mode 100644 assets/uswds/img/material-icons/insert_photo.svg create mode 100755 assets/uswds/img/material-icons/insights.svg create mode 100644 assets/uswds/img/material-icons/integration_instructions.svg create mode 100644 assets/uswds/img/material-icons/inventory.svg create mode 100644 assets/uswds/img/material-icons/invert_colors.svg create mode 100644 assets/uswds/img/material-icons/invert_colors_off.svg create mode 100644 assets/uswds/img/material-icons/ios_share.svg create mode 100644 assets/uswds/img/material-icons/iso.svg create mode 100644 assets/uswds/img/material-icons/keyboard.svg create mode 100644 assets/uswds/img/material-icons/keyboard_arrow_down.svg create mode 100644 assets/uswds/img/material-icons/keyboard_arrow_left.svg create mode 100644 assets/uswds/img/material-icons/keyboard_arrow_right.svg create mode 100644 assets/uswds/img/material-icons/keyboard_arrow_up.svg create mode 100644 assets/uswds/img/material-icons/keyboard_backspace.svg create mode 100644 assets/uswds/img/material-icons/keyboard_capslock.svg create mode 100644 assets/uswds/img/material-icons/keyboard_hide.svg create mode 100644 assets/uswds/img/material-icons/keyboard_return.svg create mode 100644 assets/uswds/img/material-icons/keyboard_tab.svg create mode 100644 assets/uswds/img/material-icons/keyboard_voice.svg create mode 100755 assets/uswds/img/material-icons/king_bed.svg create mode 100644 assets/uswds/img/material-icons/kitchen.svg create mode 100644 assets/uswds/img/material-icons/label.svg create mode 100644 assets/uswds/img/material-icons/label_important.svg create mode 100644 assets/uswds/img/material-icons/label_important_outline.svg create mode 100644 assets/uswds/img/material-icons/label_off.svg create mode 100644 assets/uswds/img/material-icons/label_outline.svg create mode 100644 assets/uswds/img/material-icons/landscape.svg create mode 100644 assets/uswds/img/material-icons/language.svg create mode 100644 assets/uswds/img/material-icons/laptop.svg create mode 100644 assets/uswds/img/material-icons/laptop_chromebook.svg create mode 100644 assets/uswds/img/material-icons/laptop_mac.svg create mode 100644 assets/uswds/img/material-icons/laptop_windows.svg create mode 100644 assets/uswds/img/material-icons/last_page.svg create mode 100644 assets/uswds/img/material-icons/launch.svg create mode 100644 assets/uswds/img/material-icons/layers.svg create mode 100644 assets/uswds/img/material-icons/layers_clear.svg create mode 100644 assets/uswds/img/material-icons/leaderboard.svg create mode 100644 assets/uswds/img/material-icons/leak_add.svg create mode 100644 assets/uswds/img/material-icons/leak_remove.svg create mode 100755 assets/uswds/img/material-icons/legend_toggle.svg create mode 100644 assets/uswds/img/material-icons/lens.svg create mode 100644 assets/uswds/img/material-icons/library_add.svg create mode 100755 assets/uswds/img/material-icons/library_add_check.svg create mode 100644 assets/uswds/img/material-icons/library_books.svg create mode 100644 assets/uswds/img/material-icons/library_music.svg create mode 100644 assets/uswds/img/material-icons/lightbulb.svg create mode 100644 assets/uswds/img/material-icons/lightbulb_outline.svg create mode 100644 assets/uswds/img/material-icons/line_style.svg create mode 100644 assets/uswds/img/material-icons/line_weight.svg create mode 100644 assets/uswds/img/material-icons/linear_scale.svg create mode 100644 assets/uswds/img/material-icons/link.svg create mode 100644 assets/uswds/img/material-icons/link_off.svg create mode 100644 assets/uswds/img/material-icons/linked_camera.svg create mode 100755 assets/uswds/img/material-icons/liquor.svg create mode 100644 assets/uswds/img/material-icons/list.svg create mode 100644 assets/uswds/img/material-icons/list_alt.svg create mode 100644 assets/uswds/img/material-icons/live_help.svg create mode 100644 assets/uswds/img/material-icons/live_tv.svg create mode 100644 assets/uswds/img/material-icons/local_activity.svg create mode 100755 assets/uswds/img/material-icons/local_airport.svg create mode 100644 assets/uswds/img/material-icons/local_atm.svg create mode 100644 assets/uswds/img/material-icons/local_bar.svg create mode 100644 assets/uswds/img/material-icons/local_cafe.svg create mode 100644 assets/uswds/img/material-icons/local_car_wash.svg create mode 100644 assets/uswds/img/material-icons/local_convenience_store.svg create mode 100644 assets/uswds/img/material-icons/local_dining.svg create mode 100644 assets/uswds/img/material-icons/local_drink.svg create mode 100644 assets/uswds/img/material-icons/local_fire_department.svg create mode 100644 assets/uswds/img/material-icons/local_florist.svg create mode 100644 assets/uswds/img/material-icons/local_gas_station.svg create mode 100644 assets/uswds/img/material-icons/local_grocery_store.svg create mode 100644 assets/uswds/img/material-icons/local_hospital.svg create mode 100644 assets/uswds/img/material-icons/local_hotel.svg create mode 100644 assets/uswds/img/material-icons/local_laundry_service.svg create mode 100644 assets/uswds/img/material-icons/local_library.svg create mode 100644 assets/uswds/img/material-icons/local_mall.svg create mode 100644 assets/uswds/img/material-icons/local_movies.svg create mode 100644 assets/uswds/img/material-icons/local_offer.svg create mode 100644 assets/uswds/img/material-icons/local_parking.svg create mode 100644 assets/uswds/img/material-icons/local_pharmacy.svg create mode 100644 assets/uswds/img/material-icons/local_phone.svg create mode 100644 assets/uswds/img/material-icons/local_pizza.svg create mode 100644 assets/uswds/img/material-icons/local_play.svg create mode 100644 assets/uswds/img/material-icons/local_police.svg create mode 100644 assets/uswds/img/material-icons/local_post_office.svg create mode 100644 assets/uswds/img/material-icons/local_printshop.svg create mode 100644 assets/uswds/img/material-icons/local_see.svg create mode 100644 assets/uswds/img/material-icons/local_shipping.svg create mode 100644 assets/uswds/img/material-icons/local_taxi.svg create mode 100644 assets/uswds/img/material-icons/location_city.svg create mode 100644 assets/uswds/img/material-icons/location_disabled.svg create mode 100644 assets/uswds/img/material-icons/location_off.svg create mode 100644 assets/uswds/img/material-icons/location_on.svg create mode 100644 assets/uswds/img/material-icons/location_pin.svg create mode 100644 assets/uswds/img/material-icons/location_searching.svg create mode 100644 assets/uswds/img/material-icons/lock.svg create mode 100755 assets/uswds/img/material-icons/lock_clock.svg create mode 100644 assets/uswds/img/material-icons/lock_open.svg create mode 100644 assets/uswds/img/material-icons/lock_outline.svg create mode 100755 assets/uswds/img/material-icons/login.svg create mode 100644 assets/uswds/img/material-icons/logout.svg create mode 100644 assets/uswds/img/material-icons/looks.svg create mode 100644 assets/uswds/img/material-icons/looks_3.svg create mode 100644 assets/uswds/img/material-icons/looks_4.svg create mode 100644 assets/uswds/img/material-icons/looks_5.svg create mode 100644 assets/uswds/img/material-icons/looks_6.svg create mode 100644 assets/uswds/img/material-icons/looks_one.svg create mode 100644 assets/uswds/img/material-icons/looks_two.svg create mode 100644 assets/uswds/img/material-icons/loop.svg create mode 100644 assets/uswds/img/material-icons/loupe.svg create mode 100644 assets/uswds/img/material-icons/low_priority.svg create mode 100644 assets/uswds/img/material-icons/loyalty.svg create mode 100644 assets/uswds/img/material-icons/luggage.svg create mode 100755 assets/uswds/img/material-icons/lunch_dining.svg create mode 100644 assets/uswds/img/material-icons/mail.svg create mode 100644 assets/uswds/img/material-icons/mail_outline.svg create mode 100644 assets/uswds/img/material-icons/map.svg create mode 100644 assets/uswds/img/material-icons/maps_ugc.svg create mode 100644 assets/uswds/img/material-icons/margin.svg create mode 100755 assets/uswds/img/material-icons/mark_as_unread.svg create mode 100755 assets/uswds/img/material-icons/mark_chat_read.svg create mode 100755 assets/uswds/img/material-icons/mark_chat_unread.svg create mode 100755 assets/uswds/img/material-icons/mark_email_read.svg create mode 100755 assets/uswds/img/material-icons/mark_email_unread.svg create mode 100644 assets/uswds/img/material-icons/markunread.svg create mode 100644 assets/uswds/img/material-icons/markunread_mailbox.svg create mode 100644 assets/uswds/img/material-icons/masks.svg create mode 100644 assets/uswds/img/material-icons/maximize.svg create mode 100644 assets/uswds/img/material-icons/mediation.svg create mode 100755 assets/uswds/img/material-icons/medical_services.svg create mode 100644 assets/uswds/img/material-icons/meeting_room.svg create mode 100644 assets/uswds/img/material-icons/memory.svg create mode 100644 assets/uswds/img/material-icons/menu.svg create mode 100644 assets/uswds/img/material-icons/menu_book.svg create mode 100644 assets/uswds/img/material-icons/menu_open.svg create mode 100644 assets/uswds/img/material-icons/merge_type.svg create mode 100644 assets/uswds/img/material-icons/message.svg create mode 100644 assets/uswds/img/material-icons/mic.svg create mode 100644 assets/uswds/img/material-icons/mic_external_off.svg create mode 100644 assets/uswds/img/material-icons/mic_external_on.svg create mode 100644 assets/uswds/img/material-icons/mic_none.svg create mode 100644 assets/uswds/img/material-icons/mic_off.svg create mode 100644 assets/uswds/img/material-icons/microwave.svg create mode 100755 assets/uswds/img/material-icons/military_tech.svg create mode 100644 assets/uswds/img/material-icons/minimize.svg create mode 100755 assets/uswds/img/material-icons/miscellaneous_services.svg create mode 100644 assets/uswds/img/material-icons/missed_video_call.svg create mode 100644 assets/uswds/img/material-icons/mms.svg create mode 100644 assets/uswds/img/material-icons/mobile_friendly.svg create mode 100644 assets/uswds/img/material-icons/mobile_off.svg create mode 100644 assets/uswds/img/material-icons/mobile_screen_share.svg create mode 100644 assets/uswds/img/material-icons/mode_comment.svg create mode 100644 assets/uswds/img/material-icons/mode_edit.svg create mode 100755 assets/uswds/img/material-icons/model_training.svg create mode 100644 assets/uswds/img/material-icons/monetization_on.svg create mode 100644 assets/uswds/img/material-icons/money.svg create mode 100644 assets/uswds/img/material-icons/money_off.svg create mode 100644 assets/uswds/img/material-icons/monitor.svg create mode 100644 assets/uswds/img/material-icons/monochrome_photos.svg create mode 100644 assets/uswds/img/material-icons/mood.svg create mode 100644 assets/uswds/img/material-icons/mood_bad.svg create mode 100755 assets/uswds/img/material-icons/moped.svg create mode 100644 assets/uswds/img/material-icons/more.svg create mode 100644 assets/uswds/img/material-icons/more_horiz.svg create mode 100755 assets/uswds/img/material-icons/more_time.svg create mode 100644 assets/uswds/img/material-icons/more_vert.svg create mode 100644 assets/uswds/img/material-icons/motion_photos_off.svg create mode 100644 assets/uswds/img/material-icons/motion_photos_on.svg create mode 100644 assets/uswds/img/material-icons/motion_photos_pause.svg create mode 100644 assets/uswds/img/material-icons/motion_photos_paused.svg create mode 100644 assets/uswds/img/material-icons/mouse.svg create mode 100644 assets/uswds/img/material-icons/move_to_inbox.svg create mode 100644 assets/uswds/img/material-icons/movie.svg create mode 100644 assets/uswds/img/material-icons/movie_creation.svg create mode 100644 assets/uswds/img/material-icons/movie_filter.svg create mode 100644 assets/uswds/img/material-icons/mp.svg create mode 100644 assets/uswds/img/material-icons/multiline_chart.svg create mode 100644 assets/uswds/img/material-icons/multiple_stop.svg create mode 100755 assets/uswds/img/material-icons/museum.svg create mode 100644 assets/uswds/img/material-icons/music_note.svg create mode 100644 assets/uswds/img/material-icons/music_off.svg create mode 100644 assets/uswds/img/material-icons/music_video.svg create mode 100644 assets/uswds/img/material-icons/my_location.svg create mode 100755 assets/uswds/img/material-icons/nat.svg create mode 100644 assets/uswds/img/material-icons/nature.svg create mode 100644 assets/uswds/img/material-icons/nature_people.svg create mode 100644 assets/uswds/img/material-icons/navigate_before.svg create mode 100644 assets/uswds/img/material-icons/navigate_next.svg create mode 100644 assets/uswds/img/material-icons/navigation.svg create mode 100644 assets/uswds/img/material-icons/near_me.svg create mode 100644 assets/uswds/img/material-icons/near_me_disabled.svg create mode 100644 assets/uswds/img/material-icons/network_cell.svg create mode 100644 assets/uswds/img/material-icons/network_check.svg create mode 100644 assets/uswds/img/material-icons/network_locked.svg create mode 100644 assets/uswds/img/material-icons/network_wifi.svg create mode 100644 assets/uswds/img/material-icons/new_releases.svg create mode 100755 assets/uswds/img/material-icons/next_plan.svg create mode 100644 assets/uswds/img/material-icons/next_week.svg create mode 100644 assets/uswds/img/material-icons/nfc.svg create mode 100644 assets/uswds/img/material-icons/night_shelter.svg create mode 100755 assets/uswds/img/material-icons/nightlife.svg create mode 100644 assets/uswds/img/material-icons/nightlight_round.svg create mode 100755 assets/uswds/img/material-icons/nights_stay.svg create mode 100644 assets/uswds/img/material-icons/no_backpack.svg create mode 100644 assets/uswds/img/material-icons/no_cell.svg create mode 100644 assets/uswds/img/material-icons/no_drinks.svg create mode 100644 assets/uswds/img/material-icons/no_encryption.svg create mode 100644 assets/uswds/img/material-icons/no_flash.svg create mode 100644 assets/uswds/img/material-icons/no_food.svg create mode 100644 assets/uswds/img/material-icons/no_luggage.svg create mode 100644 assets/uswds/img/material-icons/no_meals.svg create mode 100644 assets/uswds/img/material-icons/no_meals_ouline.svg create mode 100644 assets/uswds/img/material-icons/no_meeting_room.svg create mode 100644 assets/uswds/img/material-icons/no_photography.svg create mode 100644 assets/uswds/img/material-icons/no_sim.svg create mode 100644 assets/uswds/img/material-icons/no_stroller.svg create mode 100644 assets/uswds/img/material-icons/no_transfer.svg create mode 100644 assets/uswds/img/material-icons/north.svg create mode 100644 assets/uswds/img/material-icons/north_east.svg create mode 100644 assets/uswds/img/material-icons/north_west.svg create mode 100755 assets/uswds/img/material-icons/not_accessible.svg create mode 100644 assets/uswds/img/material-icons/not_interested.svg create mode 100644 assets/uswds/img/material-icons/not_listed_location.svg create mode 100755 assets/uswds/img/material-icons/not_started.svg create mode 100644 assets/uswds/img/material-icons/note.svg create mode 100644 assets/uswds/img/material-icons/note_add.svg create mode 100644 assets/uswds/img/material-icons/notes.svg create mode 100644 assets/uswds/img/material-icons/notification_important.svg create mode 100644 assets/uswds/img/material-icons/notifications.svg create mode 100644 assets/uswds/img/material-icons/notifications_active.svg create mode 100644 assets/uswds/img/material-icons/notifications_none.svg create mode 100644 assets/uswds/img/material-icons/notifications_off.svg create mode 100644 assets/uswds/img/material-icons/notifications_paused.svg create mode 100644 assets/uswds/img/material-icons/offline_bolt.svg create mode 100644 assets/uswds/img/material-icons/offline_pin.svg create mode 100644 assets/uswds/img/material-icons/offline_share.svg create mode 100644 assets/uswds/img/material-icons/ondemand_video.svg create mode 100755 assets/uswds/img/material-icons/online_prediction.svg create mode 100644 assets/uswds/img/material-icons/opacity.svg create mode 100644 assets/uswds/img/material-icons/open_in_browser.svg create mode 100644 assets/uswds/img/material-icons/open_in_full.svg create mode 100644 assets/uswds/img/material-icons/open_in_new.svg create mode 100644 assets/uswds/img/material-icons/open_with.svg create mode 100644 assets/uswds/img/material-icons/outbond.svg create mode 100755 assets/uswds/img/material-icons/outbox.svg create mode 100755 assets/uswds/img/material-icons/outdoor_grill.svg create mode 100755 assets/uswds/img/material-icons/outgoing_mail.svg create mode 100644 assets/uswds/img/material-icons/outlet.svg create mode 100644 assets/uswds/img/material-icons/outlined_flag.svg create mode 100644 assets/uswds/img/material-icons/padding.svg create mode 100644 assets/uswds/img/material-icons/pages.svg create mode 100644 assets/uswds/img/material-icons/pageview.svg create mode 100644 assets/uswds/img/material-icons/palette.svg create mode 100644 assets/uswds/img/material-icons/pan_tool.svg create mode 100644 assets/uswds/img/material-icons/panorama.svg create mode 100644 assets/uswds/img/material-icons/panorama_fish_eye.svg create mode 100644 assets/uswds/img/material-icons/panorama_horizontal.svg create mode 100644 assets/uswds/img/material-icons/panorama_horizontal_select.svg create mode 100644 assets/uswds/img/material-icons/panorama_photosphere.svg create mode 100644 assets/uswds/img/material-icons/panorama_photosphere_select.svg create mode 100644 assets/uswds/img/material-icons/panorama_vertical.svg create mode 100644 assets/uswds/img/material-icons/panorama_vertical_select.svg create mode 100644 assets/uswds/img/material-icons/panorama_wide_angle.svg create mode 100644 assets/uswds/img/material-icons/panorama_wide_angle_select.svg create mode 100755 assets/uswds/img/material-icons/park.svg create mode 100644 assets/uswds/img/material-icons/party_mode.svg create mode 100644 assets/uswds/img/material-icons/pause.svg create mode 100644 assets/uswds/img/material-icons/pause_circle_filled.svg create mode 100644 assets/uswds/img/material-icons/pause_circle_outline.svg create mode 100644 assets/uswds/img/material-icons/pause_presentation.svg create mode 100644 assets/uswds/img/material-icons/payment.svg create mode 100644 assets/uswds/img/material-icons/payments.svg create mode 100755 assets/uswds/img/material-icons/pedal_bike.svg create mode 100755 assets/uswds/img/material-icons/pending.svg create mode 100644 assets/uswds/img/material-icons/pending_actions.svg create mode 100644 assets/uswds/img/material-icons/people.svg create mode 100755 assets/uswds/img/material-icons/people_alt.svg create mode 100644 assets/uswds/img/material-icons/people_outline.svg create mode 100644 assets/uswds/img/material-icons/perm_camera_mic.svg create mode 100644 assets/uswds/img/material-icons/perm_contact_calendar.svg create mode 100644 assets/uswds/img/material-icons/perm_data_setting.svg create mode 100644 assets/uswds/img/material-icons/perm_device_information.svg create mode 100644 assets/uswds/img/material-icons/perm_identity.svg create mode 100644 assets/uswds/img/material-icons/perm_media.svg create mode 100644 assets/uswds/img/material-icons/perm_phone_msg.svg create mode 100644 assets/uswds/img/material-icons/perm_scan_wifi.svg create mode 100644 assets/uswds/img/material-icons/person.svg create mode 100644 assets/uswds/img/material-icons/person_add.svg create mode 100755 assets/uswds/img/material-icons/person_add_alt.svg create mode 100755 assets/uswds/img/material-icons/person_add_alt_1.svg create mode 100644 assets/uswds/img/material-icons/person_add_disabled.svg create mode 100644 assets/uswds/img/material-icons/person_outline.svg create mode 100644 assets/uswds/img/material-icons/person_pin.svg create mode 100644 assets/uswds/img/material-icons/person_pin_circle.svg create mode 100755 assets/uswds/img/material-icons/person_remove.svg create mode 100755 assets/uswds/img/material-icons/person_remove_alt_1.svg create mode 100755 assets/uswds/img/material-icons/person_search.svg create mode 100644 assets/uswds/img/material-icons/personal_video.svg create mode 100755 assets/uswds/img/material-icons/pest_control.svg create mode 100755 assets/uswds/img/material-icons/pest_control_rodent.svg create mode 100644 assets/uswds/img/material-icons/pets.svg create mode 100644 assets/uswds/img/material-icons/phone.svg create mode 100644 assets/uswds/img/material-icons/phone_android.svg create mode 100644 assets/uswds/img/material-icons/phone_bluetooth_speaker.svg create mode 100644 assets/uswds/img/material-icons/phone_callback.svg create mode 100644 assets/uswds/img/material-icons/phone_disabled.svg create mode 100644 assets/uswds/img/material-icons/phone_enabled.svg create mode 100644 assets/uswds/img/material-icons/phone_forwarded.svg create mode 100644 assets/uswds/img/material-icons/phone_in_talk.svg create mode 100644 assets/uswds/img/material-icons/phone_iphone.svg create mode 100644 assets/uswds/img/material-icons/phone_locked.svg create mode 100644 assets/uswds/img/material-icons/phone_missed.svg create mode 100644 assets/uswds/img/material-icons/phone_paused.svg create mode 100644 assets/uswds/img/material-icons/phonelink.svg create mode 100644 assets/uswds/img/material-icons/phonelink_erase.svg create mode 100644 assets/uswds/img/material-icons/phonelink_lock.svg create mode 100644 assets/uswds/img/material-icons/phonelink_off.svg create mode 100644 assets/uswds/img/material-icons/phonelink_ring.svg create mode 100644 assets/uswds/img/material-icons/phonelink_setup.svg create mode 100644 assets/uswds/img/material-icons/photo.svg create mode 100644 assets/uswds/img/material-icons/photo_album.svg create mode 100644 assets/uswds/img/material-icons/photo_camera.svg create mode 100644 assets/uswds/img/material-icons/photo_camera_back.svg create mode 100644 assets/uswds/img/material-icons/photo_camera_front.svg create mode 100644 assets/uswds/img/material-icons/photo_filter.svg create mode 100644 assets/uswds/img/material-icons/photo_library.svg create mode 100644 assets/uswds/img/material-icons/photo_size_select_actual.svg create mode 100644 assets/uswds/img/material-icons/photo_size_select_large.svg create mode 100644 assets/uswds/img/material-icons/photo_size_select_small.svg create mode 100644 assets/uswds/img/material-icons/picture_as_pdf.svg create mode 100644 assets/uswds/img/material-icons/picture_in_picture.svg create mode 100644 assets/uswds/img/material-icons/picture_in_picture_alt.svg create mode 100644 assets/uswds/img/material-icons/pie_chart.svg create mode 100644 assets/uswds/img/material-icons/pie_chart_outlined.svg create mode 100644 assets/uswds/img/material-icons/pin_drop.svg create mode 100644 assets/uswds/img/material-icons/pivot_table_chart.svg create mode 100644 assets/uswds/img/material-icons/place.svg create mode 100755 assets/uswds/img/material-icons/plagiarism.svg create mode 100644 assets/uswds/img/material-icons/play_arrow.svg create mode 100644 assets/uswds/img/material-icons/play_circle_filled.svg create mode 100644 assets/uswds/img/material-icons/play_circle_outline.svg create mode 100644 assets/uswds/img/material-icons/play_disabled.svg create mode 100644 assets/uswds/img/material-icons/play_for_work.svg create mode 100644 assets/uswds/img/material-icons/playlist_add.svg create mode 100644 assets/uswds/img/material-icons/playlist_add_check.svg create mode 100644 assets/uswds/img/material-icons/playlist_play.svg create mode 100755 assets/uswds/img/material-icons/plumbing.svg create mode 100644 assets/uswds/img/material-icons/plus_one.svg create mode 100755 assets/uswds/img/material-icons/point_of_sale.svg create mode 100755 assets/uswds/img/material-icons/policy.svg create mode 100644 assets/uswds/img/material-icons/poll.svg create mode 100644 assets/uswds/img/material-icons/polymer.svg create mode 100644 assets/uswds/img/material-icons/pool.svg create mode 100644 assets/uswds/img/material-icons/portable_wifi_off.svg create mode 100644 assets/uswds/img/material-icons/portrait.svg create mode 100755 assets/uswds/img/material-icons/post_add.svg create mode 100644 assets/uswds/img/material-icons/power.svg create mode 100644 assets/uswds/img/material-icons/power_input.svg create mode 100644 assets/uswds/img/material-icons/power_off.svg create mode 100644 assets/uswds/img/material-icons/power_settings_new.svg create mode 100644 assets/uswds/img/material-icons/pregnant_woman.svg create mode 100644 assets/uswds/img/material-icons/present_to_all.svg create mode 100644 assets/uswds/img/material-icons/preview.svg create mode 100644 assets/uswds/img/material-icons/print.svg create mode 100644 assets/uswds/img/material-icons/print_disabled.svg create mode 100644 assets/uswds/img/material-icons/priority_high.svg create mode 100755 assets/uswds/img/material-icons/privacy_tip.svg create mode 100755 assets/uswds/img/material-icons/psychology.svg create mode 100644 assets/uswds/img/material-icons/public.svg create mode 100644 assets/uswds/img/material-icons/public_off.svg create mode 100644 assets/uswds/img/material-icons/publish.svg create mode 100644 assets/uswds/img/material-icons/published_with_changes.svg create mode 100755 assets/uswds/img/material-icons/push_pin.svg create mode 100755 assets/uswds/img/material-icons/qr_code.svg create mode 100644 assets/uswds/img/material-icons/qr_code_2.svg create mode 100644 assets/uswds/img/material-icons/qr_code_scanner.svg create mode 100644 assets/uswds/img/material-icons/query_builder.svg create mode 100644 assets/uswds/img/material-icons/question_answer.svg create mode 100644 assets/uswds/img/material-icons/queue.svg create mode 100644 assets/uswds/img/material-icons/queue_music.svg create mode 100644 assets/uswds/img/material-icons/queue_play_next.svg create mode 100755 assets/uswds/img/material-icons/quickreply.svg create mode 100644 assets/uswds/img/material-icons/radio.svg create mode 100644 assets/uswds/img/material-icons/radio_button_checked.svg create mode 100644 assets/uswds/img/material-icons/radio_button_unchecked.svg create mode 100644 assets/uswds/img/material-icons/railway_alert.svg create mode 100755 assets/uswds/img/material-icons/ramen_dining.svg create mode 100644 assets/uswds/img/material-icons/rate_review.svg create mode 100755 assets/uswds/img/material-icons/read_more.svg create mode 100644 assets/uswds/img/material-icons/receipt.svg create mode 100644 assets/uswds/img/material-icons/receipt_long.svg create mode 100644 assets/uswds/img/material-icons/recent_actors.svg create mode 100644 assets/uswds/img/material-icons/recommend.svg create mode 100644 assets/uswds/img/material-icons/record_voice_over.svg create mode 100644 assets/uswds/img/material-icons/redeem.svg create mode 100644 assets/uswds/img/material-icons/redo.svg create mode 100644 assets/uswds/img/material-icons/reduce_capacity.svg create mode 100644 assets/uswds/img/material-icons/refresh.svg create mode 100644 assets/uswds/img/material-icons/remove.svg create mode 100644 assets/uswds/img/material-icons/remove_circle.svg create mode 100644 assets/uswds/img/material-icons/remove_circle_outline.svg create mode 100644 assets/uswds/img/material-icons/remove_done.svg create mode 100644 assets/uswds/img/material-icons/remove_from_queue.svg create mode 100644 assets/uswds/img/material-icons/remove_moderator.svg create mode 100644 assets/uswds/img/material-icons/remove_red_eye.svg create mode 100644 assets/uswds/img/material-icons/remove_shopping_cart.svg create mode 100644 assets/uswds/img/material-icons/reorder.svg create mode 100644 assets/uswds/img/material-icons/repeat.svg create mode 100644 assets/uswds/img/material-icons/repeat_on.svg create mode 100644 assets/uswds/img/material-icons/repeat_one.svg create mode 100644 assets/uswds/img/material-icons/repeat_one_on.svg create mode 100644 assets/uswds/img/material-icons/replay.svg create mode 100644 assets/uswds/img/material-icons/replay_10.svg create mode 100644 assets/uswds/img/material-icons/replay_30.svg create mode 100644 assets/uswds/img/material-icons/replay_5.svg create mode 100755 assets/uswds/img/material-icons/replay_circle_filled.svg create mode 100644 assets/uswds/img/material-icons/reply.svg create mode 100644 assets/uswds/img/material-icons/reply_all.svg create mode 100644 assets/uswds/img/material-icons/report.svg create mode 100644 assets/uswds/img/material-icons/report_off.svg create mode 100644 assets/uswds/img/material-icons/report_problem.svg create mode 100644 assets/uswds/img/material-icons/request_page.svg create mode 100644 assets/uswds/img/material-icons/request_quote.svg create mode 100644 assets/uswds/img/material-icons/reset_tv.svg create mode 100644 assets/uswds/img/material-icons/restaurant.svg create mode 100644 assets/uswds/img/material-icons/restaurant_menu.svg create mode 100644 assets/uswds/img/material-icons/restore.svg create mode 100644 assets/uswds/img/material-icons/restore_from_trash.svg create mode 100644 assets/uswds/img/material-icons/restore_page.svg create mode 100644 assets/uswds/img/material-icons/rice_bowl.svg create mode 100644 assets/uswds/img/material-icons/ring_volume.svg create mode 100644 assets/uswds/img/material-icons/roofing.svg create mode 100644 assets/uswds/img/material-icons/room.svg create mode 100644 assets/uswds/img/material-icons/room_preferences.svg create mode 100644 assets/uswds/img/material-icons/room_service.svg create mode 100644 assets/uswds/img/material-icons/rotate_90_degrees_ccw.svg create mode 100644 assets/uswds/img/material-icons/rotate_left.svg create mode 100644 assets/uswds/img/material-icons/rotate_right.svg create mode 100644 assets/uswds/img/material-icons/rounded_corner.svg create mode 100644 assets/uswds/img/material-icons/router.svg create mode 100644 assets/uswds/img/material-icons/rowing.svg create mode 100644 assets/uswds/img/material-icons/rss_feed.svg create mode 100644 assets/uswds/img/material-icons/rtt.svg create mode 100644 assets/uswds/img/material-icons/rule.svg create mode 100644 assets/uswds/img/material-icons/rule_folder.svg create mode 100755 assets/uswds/img/material-icons/run_circle.svg create mode 100644 assets/uswds/img/material-icons/rv_hookup.svg create mode 100644 assets/uswds/img/material-icons/safety_divider.svg create mode 100644 assets/uswds/img/material-icons/sanitizer.svg create mode 100644 assets/uswds/img/material-icons/satellite.svg create mode 100644 assets/uswds/img/material-icons/save.svg create mode 100644 assets/uswds/img/material-icons/save_alt.svg create mode 100644 assets/uswds/img/material-icons/saved_search.svg create mode 100644 assets/uswds/img/material-icons/scanner.svg create mode 100644 assets/uswds/img/material-icons/scatter_plot.svg create mode 100644 assets/uswds/img/material-icons/schedule.svg create mode 100644 assets/uswds/img/material-icons/schedule_send.svg create mode 100644 assets/uswds/img/material-icons/school.svg create mode 100755 assets/uswds/img/material-icons/science.svg create mode 100644 assets/uswds/img/material-icons/score.svg create mode 100644 assets/uswds/img/material-icons/screen_lock_landscape.svg create mode 100644 assets/uswds/img/material-icons/screen_lock_portrait.svg create mode 100644 assets/uswds/img/material-icons/screen_lock_rotation.svg create mode 100644 assets/uswds/img/material-icons/screen_rotation.svg create mode 100644 assets/uswds/img/material-icons/screen_search_desktop.svg create mode 100644 assets/uswds/img/material-icons/screen_share.svg create mode 100644 assets/uswds/img/material-icons/sd.svg create mode 100644 assets/uswds/img/material-icons/sd_card.svg create mode 100644 assets/uswds/img/material-icons/sd_storage.svg create mode 100644 assets/uswds/img/material-icons/search.svg create mode 100755 assets/uswds/img/material-icons/search_off.svg create mode 100644 assets/uswds/img/material-icons/security.svg create mode 100644 assets/uswds/img/material-icons/segment.svg create mode 100644 assets/uswds/img/material-icons/select_all.svg create mode 100755 assets/uswds/img/material-icons/self_improvement.svg create mode 100644 assets/uswds/img/material-icons/send.svg create mode 100755 assets/uswds/img/material-icons/send_and_archive.svg create mode 100644 assets/uswds/img/material-icons/send_to_mobile.svg create mode 100755 assets/uswds/img/material-icons/sensor_door.svg create mode 100755 assets/uswds/img/material-icons/sensor_window.svg create mode 100644 assets/uswds/img/material-icons/sentiment_dissatisfied.svg create mode 100644 assets/uswds/img/material-icons/sentiment_neutral.svg create mode 100644 assets/uswds/img/material-icons/sentiment_satisfied.svg create mode 100644 assets/uswds/img/material-icons/sentiment_satisfied_alt.svg create mode 100644 assets/uswds/img/material-icons/sentiment_very_dissatisfied.svg create mode 100644 assets/uswds/img/material-icons/sentiment_very_satisfied.svg create mode 100644 assets/uswds/img/material-icons/set_meal.svg create mode 100644 assets/uswds/img/material-icons/settings.svg create mode 100644 assets/uswds/img/material-icons/settings_applications.svg create mode 100644 assets/uswds/img/material-icons/settings_backup_restore.svg create mode 100644 assets/uswds/img/material-icons/settings_bluetooth.svg create mode 100644 assets/uswds/img/material-icons/settings_brightness.svg create mode 100644 assets/uswds/img/material-icons/settings_cell.svg create mode 100644 assets/uswds/img/material-icons/settings_ethernet.svg create mode 100644 assets/uswds/img/material-icons/settings_input_antenna.svg create mode 100644 assets/uswds/img/material-icons/settings_input_component.svg create mode 100644 assets/uswds/img/material-icons/settings_input_composite.svg create mode 100644 assets/uswds/img/material-icons/settings_input_hdmi.svg create mode 100644 assets/uswds/img/material-icons/settings_input_svideo.svg create mode 100644 assets/uswds/img/material-icons/settings_overscan.svg create mode 100644 assets/uswds/img/material-icons/settings_phone.svg create mode 100644 assets/uswds/img/material-icons/settings_power.svg create mode 100644 assets/uswds/img/material-icons/settings_remote.svg create mode 100644 assets/uswds/img/material-icons/settings_system_daydream.svg create mode 100644 assets/uswds/img/material-icons/settings_voice.svg create mode 100644 assets/uswds/img/material-icons/share.svg create mode 100644 assets/uswds/img/material-icons/shield.svg create mode 100644 assets/uswds/img/material-icons/shop.svg create mode 100644 assets/uswds/img/material-icons/shop_two.svg create mode 100644 assets/uswds/img/material-icons/shopping_bag.svg create mode 100644 assets/uswds/img/material-icons/shopping_basket.svg create mode 100644 assets/uswds/img/material-icons/shopping_cart.svg create mode 100644 assets/uswds/img/material-icons/short_text.svg create mode 100644 assets/uswds/img/material-icons/show_chart.svg create mode 100644 assets/uswds/img/material-icons/shuffle.svg create mode 100644 assets/uswds/img/material-icons/shuffle_on.svg create mode 100644 assets/uswds/img/material-icons/shutter_speed.svg create mode 100644 assets/uswds/img/material-icons/sick.svg create mode 100644 assets/uswds/img/material-icons/signal_cellular_0_bar.svg create mode 100644 assets/uswds/img/material-icons/signal_cellular_4_bar.svg create mode 100644 assets/uswds/img/material-icons/signal_cellular_alt.svg create mode 100644 assets/uswds/img/material-icons/signal_cellular_connected_no_internet_4_bar.svg create mode 100644 assets/uswds/img/material-icons/signal_cellular_no_sim.svg create mode 100644 assets/uswds/img/material-icons/signal_cellular_null.svg create mode 100644 assets/uswds/img/material-icons/signal_cellular_off.svg create mode 100644 assets/uswds/img/material-icons/signal_wifi_0_bar.svg create mode 100644 assets/uswds/img/material-icons/signal_wifi_4_bar.svg create mode 100644 assets/uswds/img/material-icons/signal_wifi_4_bar_lock.svg create mode 100644 assets/uswds/img/material-icons/signal_wifi_off.svg create mode 100644 assets/uswds/img/material-icons/sim_card.svg create mode 100644 assets/uswds/img/material-icons/sim_card_alert.svg create mode 100755 assets/uswds/img/material-icons/single_bed.svg create mode 100644 assets/uswds/img/material-icons/skip_next.svg create mode 100644 assets/uswds/img/material-icons/skip_previous.svg create mode 100644 assets/uswds/img/material-icons/slideshow.svg create mode 100644 assets/uswds/img/material-icons/slow_motion_video.svg create mode 100644 assets/uswds/img/material-icons/smart_button.svg create mode 100644 assets/uswds/img/material-icons/smartphone.svg create mode 100644 assets/uswds/img/material-icons/smoke_free.svg create mode 100644 assets/uswds/img/material-icons/smoking_rooms.svg create mode 100644 assets/uswds/img/material-icons/sms.svg create mode 100644 assets/uswds/img/material-icons/sms_failed.svg create mode 100644 assets/uswds/img/material-icons/snippet_folder.svg create mode 100644 assets/uswds/img/material-icons/snooze.svg create mode 100644 assets/uswds/img/material-icons/soap.svg create mode 100644 assets/uswds/img/material-icons/social_distance.svg create mode 100644 assets/uswds/img/material-icons/sort.svg create mode 100644 assets/uswds/img/material-icons/sort_by_alpha.svg create mode 100644 assets/uswds/img/material-icons/source.svg create mode 100644 assets/uswds/img/material-icons/south.svg create mode 100644 assets/uswds/img/material-icons/south_east.svg create mode 100644 assets/uswds/img/material-icons/south_west.svg create mode 100644 assets/uswds/img/material-icons/spa.svg create mode 100644 assets/uswds/img/material-icons/space_bar.svg create mode 100644 assets/uswds/img/material-icons/speaker.svg create mode 100644 assets/uswds/img/material-icons/speaker_group.svg create mode 100644 assets/uswds/img/material-icons/speaker_notes.svg create mode 100644 assets/uswds/img/material-icons/speaker_notes_off.svg create mode 100644 assets/uswds/img/material-icons/speaker_phone.svg create mode 100644 assets/uswds/img/material-icons/speed.svg create mode 100644 assets/uswds/img/material-icons/spellcheck.svg create mode 100755 assets/uswds/img/material-icons/sports.svg create mode 100644 assets/uswds/img/material-icons/sports_bar.svg create mode 100755 assets/uswds/img/material-icons/sports_baseball.svg create mode 100755 assets/uswds/img/material-icons/sports_basketball.svg create mode 100755 assets/uswds/img/material-icons/sports_cricket.svg create mode 100755 assets/uswds/img/material-icons/sports_esports.svg create mode 100755 assets/uswds/img/material-icons/sports_football.svg create mode 100755 assets/uswds/img/material-icons/sports_golf.svg create mode 100755 assets/uswds/img/material-icons/sports_handball.svg create mode 100755 assets/uswds/img/material-icons/sports_hockey.svg create mode 100755 assets/uswds/img/material-icons/sports_kabaddi.svg create mode 100755 assets/uswds/img/material-icons/sports_mma.svg create mode 100755 assets/uswds/img/material-icons/sports_motorsports.svg create mode 100755 assets/uswds/img/material-icons/sports_rugby.svg create mode 100755 assets/uswds/img/material-icons/sports_soccer.svg create mode 100755 assets/uswds/img/material-icons/sports_tennis.svg create mode 100755 assets/uswds/img/material-icons/sports_volleyball.svg create mode 100755 assets/uswds/img/material-icons/square_foot.svg create mode 100644 assets/uswds/img/material-icons/stacked_bar_chart.svg create mode 100644 assets/uswds/img/material-icons/stacked_line_chart.svg create mode 100644 assets/uswds/img/material-icons/stairs.svg create mode 100644 assets/uswds/img/material-icons/star.svg create mode 100644 assets/uswds/img/material-icons/star_border.svg create mode 100644 assets/uswds/img/material-icons/star_half.svg create mode 100644 assets/uswds/img/material-icons/star_outline.svg create mode 100755 assets/uswds/img/material-icons/star_rate.svg create mode 100644 assets/uswds/img/material-icons/stars.svg create mode 100644 assets/uswds/img/material-icons/stay_current_landscape.svg create mode 100644 assets/uswds/img/material-icons/stay_current_portrait.svg create mode 100644 assets/uswds/img/material-icons/stay_primary_landscape.svg create mode 100644 assets/uswds/img/material-icons/stay_primary_portrait.svg create mode 100644 assets/uswds/img/material-icons/sticky_note_2.svg create mode 100644 assets/uswds/img/material-icons/stop.svg create mode 100755 assets/uswds/img/material-icons/stop_circle.svg create mode 100644 assets/uswds/img/material-icons/stop_screen_share.svg create mode 100644 assets/uswds/img/material-icons/storage.svg create mode 100644 assets/uswds/img/material-icons/store.svg create mode 100644 assets/uswds/img/material-icons/store_mall_directory.svg create mode 100644 assets/uswds/img/material-icons/storefront.svg create mode 100644 assets/uswds/img/material-icons/straighten.svg create mode 100644 assets/uswds/img/material-icons/stream.svg create mode 100644 assets/uswds/img/material-icons/streetview.svg create mode 100644 assets/uswds/img/material-icons/strikethrough_s.svg create mode 100644 assets/uswds/img/material-icons/stroller.svg create mode 100644 assets/uswds/img/material-icons/style.svg create mode 100644 assets/uswds/img/material-icons/subdirectory_arrow_left.svg create mode 100644 assets/uswds/img/material-icons/subdirectory_arrow_right.svg create mode 100644 assets/uswds/img/material-icons/subject.svg create mode 100755 assets/uswds/img/material-icons/subscript.svg create mode 100644 assets/uswds/img/material-icons/subscriptions.svg create mode 100644 assets/uswds/img/material-icons/subtitles.svg create mode 100755 assets/uswds/img/material-icons/subtitles_off.svg create mode 100644 assets/uswds/img/material-icons/subway.svg create mode 100755 assets/uswds/img/material-icons/superscript.svg create mode 100644 assets/uswds/img/material-icons/supervised_user_circle.svg create mode 100644 assets/uswds/img/material-icons/supervisor_account.svg create mode 100755 assets/uswds/img/material-icons/support.svg create mode 100755 assets/uswds/img/material-icons/support_agent.svg create mode 100644 assets/uswds/img/material-icons/surround_sound.svg create mode 100644 assets/uswds/img/material-icons/swap_calls.svg create mode 100644 assets/uswds/img/material-icons/swap_horiz.svg create mode 100644 assets/uswds/img/material-icons/swap_horizontal_circle.svg create mode 100644 assets/uswds/img/material-icons/swap_vert.svg create mode 100644 assets/uswds/img/material-icons/swap_vertical_circle.svg create mode 100644 assets/uswds/img/material-icons/swipe.svg create mode 100644 assets/uswds/img/material-icons/switch_account.svg create mode 100644 assets/uswds/img/material-icons/switch_camera.svg create mode 100644 assets/uswds/img/material-icons/switch_left.svg create mode 100644 assets/uswds/img/material-icons/switch_right.svg create mode 100644 assets/uswds/img/material-icons/switch_video.svg create mode 100644 assets/uswds/img/material-icons/sync.svg create mode 100755 assets/uswds/img/material-icons/sync_alt.svg create mode 100644 assets/uswds/img/material-icons/sync_disabled.svg create mode 100644 assets/uswds/img/material-icons/sync_problem.svg create mode 100644 assets/uswds/img/material-icons/system_update.svg create mode 100644 assets/uswds/img/material-icons/system_update_alt.svg create mode 100644 assets/uswds/img/material-icons/tab.svg create mode 100644 assets/uswds/img/material-icons/tab_unselected.svg create mode 100644 assets/uswds/img/material-icons/table_chart.svg create mode 100755 assets/uswds/img/material-icons/table_rows.svg create mode 100644 assets/uswds/img/material-icons/table_view.svg create mode 100644 assets/uswds/img/material-icons/tablet.svg create mode 100644 assets/uswds/img/material-icons/tablet_android.svg create mode 100644 assets/uswds/img/material-icons/tablet_mac.svg create mode 100644 assets/uswds/img/material-icons/tag.svg create mode 100644 assets/uswds/img/material-icons/tag_faces.svg create mode 100755 assets/uswds/img/material-icons/takeout_dining.svg create mode 100644 assets/uswds/img/material-icons/tap_and_play.svg create mode 100644 assets/uswds/img/material-icons/tapas.svg create mode 100644 assets/uswds/img/material-icons/taxi_alert.svg create mode 100644 assets/uswds/img/material-icons/terrain.svg create mode 100644 assets/uswds/img/material-icons/text_fields.svg create mode 100644 assets/uswds/img/material-icons/text_format.svg create mode 100644 assets/uswds/img/material-icons/text_rotate_up.svg create mode 100644 assets/uswds/img/material-icons/text_rotate_vertical.svg create mode 100644 assets/uswds/img/material-icons/text_rotation_angledown.svg create mode 100644 assets/uswds/img/material-icons/text_rotation_angleup.svg create mode 100644 assets/uswds/img/material-icons/text_rotation_down.svg create mode 100644 assets/uswds/img/material-icons/text_rotation_none.svg create mode 100644 assets/uswds/img/material-icons/text_snippet.svg create mode 100644 assets/uswds/img/material-icons/textsms.svg create mode 100644 assets/uswds/img/material-icons/texture.svg create mode 100755 assets/uswds/img/material-icons/theater_comedy.svg create mode 100644 assets/uswds/img/material-icons/theaters.svg create mode 100644 assets/uswds/img/material-icons/thumb_down.svg create mode 100644 assets/uswds/img/material-icons/thumb_down_alt.svg create mode 100644 assets/uswds/img/material-icons/thumb_down_off_alt.svg create mode 100644 assets/uswds/img/material-icons/thumb_up.svg create mode 100644 assets/uswds/img/material-icons/thumb_up_alt.svg create mode 100644 assets/uswds/img/material-icons/thumb_up_off_alt.svg create mode 100644 assets/uswds/img/material-icons/thumbs_up_down.svg create mode 100644 assets/uswds/img/material-icons/time_to_leave.svg create mode 100644 assets/uswds/img/material-icons/timelapse.svg create mode 100644 assets/uswds/img/material-icons/timeline.svg create mode 100644 assets/uswds/img/material-icons/timer.svg create mode 100644 assets/uswds/img/material-icons/timer_10.svg create mode 100644 assets/uswds/img/material-icons/timer_3.svg create mode 100644 assets/uswds/img/material-icons/timer_off.svg create mode 100644 assets/uswds/img/material-icons/title.svg create mode 100644 assets/uswds/img/material-icons/toc.svg create mode 100644 assets/uswds/img/material-icons/today.svg create mode 100644 assets/uswds/img/material-icons/toggle_off.svg create mode 100644 assets/uswds/img/material-icons/toggle_on.svg create mode 100644 assets/uswds/img/material-icons/toll.svg create mode 100644 assets/uswds/img/material-icons/tonality.svg create mode 100644 assets/uswds/img/material-icons/topic.svg create mode 100644 assets/uswds/img/material-icons/touch_app.svg create mode 100644 assets/uswds/img/material-icons/tour.svg create mode 100644 assets/uswds/img/material-icons/toys.svg create mode 100644 assets/uswds/img/material-icons/track_changes.svg create mode 100644 assets/uswds/img/material-icons/traffic.svg create mode 100644 assets/uswds/img/material-icons/train.svg create mode 100644 assets/uswds/img/material-icons/tram.svg create mode 100644 assets/uswds/img/material-icons/transfer_within_a_station.svg create mode 100644 assets/uswds/img/material-icons/transform.svg create mode 100644 assets/uswds/img/material-icons/transit_enterexit.svg create mode 100644 assets/uswds/img/material-icons/translate.svg create mode 100644 assets/uswds/img/material-icons/trending_down.svg create mode 100644 assets/uswds/img/material-icons/trending_flat.svg create mode 100644 assets/uswds/img/material-icons/trending_up.svg create mode 100644 assets/uswds/img/material-icons/trip_origin.svg create mode 100644 assets/uswds/img/material-icons/tty.svg create mode 100644 assets/uswds/img/material-icons/tune.svg create mode 100644 assets/uswds/img/material-icons/turned_in.svg create mode 100644 assets/uswds/img/material-icons/turned_in_not.svg create mode 100644 assets/uswds/img/material-icons/tv.svg create mode 100644 assets/uswds/img/material-icons/tv_off.svg create mode 100755 assets/uswds/img/material-icons/two_wheeler.svg create mode 100644 assets/uswds/img/material-icons/umbrella.svg create mode 100644 assets/uswds/img/material-icons/unarchive.svg create mode 100644 assets/uswds/img/material-icons/undo.svg create mode 100644 assets/uswds/img/material-icons/unfold_less.svg create mode 100644 assets/uswds/img/material-icons/unfold_more.svg create mode 100644 assets/uswds/img/material-icons/unpublished.svg create mode 100644 assets/uswds/img/material-icons/unsubscribe.svg create mode 100644 assets/uswds/img/material-icons/update.svg create mode 100644 assets/uswds/img/material-icons/update_disabled.svg create mode 100755 assets/uswds/img/material-icons/upgrade.svg create mode 100644 assets/uswds/img/material-icons/upload_file.svg create mode 100644 assets/uswds/img/material-icons/usb.svg create mode 100755 assets/uswds/img/material-icons/verified.svg create mode 100644 assets/uswds/img/material-icons/verified_user.svg create mode 100644 assets/uswds/img/material-icons/vertical_align_bottom.svg create mode 100644 assets/uswds/img/material-icons/vertical_align_center.svg create mode 100644 assets/uswds/img/material-icons/vertical_align_top.svg create mode 100644 assets/uswds/img/material-icons/vertical_distribute.svg create mode 100644 assets/uswds/img/material-icons/vertical_split.svg create mode 100644 assets/uswds/img/material-icons/vibration.svg create mode 100644 assets/uswds/img/material-icons/video_call.svg create mode 100644 assets/uswds/img/material-icons/video_label.svg create mode 100644 assets/uswds/img/material-icons/video_library.svg create mode 100755 assets/uswds/img/material-icons/video_settings.svg create mode 100644 assets/uswds/img/material-icons/videocam.svg create mode 100644 assets/uswds/img/material-icons/videocam_off.svg create mode 100644 assets/uswds/img/material-icons/videogame_asset.svg create mode 100644 assets/uswds/img/material-icons/view_agenda.svg create mode 100644 assets/uswds/img/material-icons/view_array.svg create mode 100644 assets/uswds/img/material-icons/view_carousel.svg create mode 100644 assets/uswds/img/material-icons/view_column.svg create mode 100644 assets/uswds/img/material-icons/view_comfy.svg create mode 100644 assets/uswds/img/material-icons/view_compact.svg create mode 100644 assets/uswds/img/material-icons/view_day.svg create mode 100644 assets/uswds/img/material-icons/view_headline.svg create mode 100644 assets/uswds/img/material-icons/view_in_ar.svg create mode 100644 assets/uswds/img/material-icons/view_list.svg create mode 100644 assets/uswds/img/material-icons/view_module.svg create mode 100644 assets/uswds/img/material-icons/view_quilt.svg create mode 100755 assets/uswds/img/material-icons/view_sidebar.svg create mode 100644 assets/uswds/img/material-icons/view_stream.svg create mode 100644 assets/uswds/img/material-icons/view_week.svg create mode 100644 assets/uswds/img/material-icons/vignette.svg create mode 100644 assets/uswds/img/material-icons/visibility.svg create mode 100644 assets/uswds/img/material-icons/visibility_off.svg create mode 100644 assets/uswds/img/material-icons/voice_chat.svg create mode 100644 assets/uswds/img/material-icons/voice_over_off.svg create mode 100644 assets/uswds/img/material-icons/voicemail.svg create mode 100644 assets/uswds/img/material-icons/volume_down.svg create mode 100644 assets/uswds/img/material-icons/volume_mute.svg create mode 100644 assets/uswds/img/material-icons/volume_off.svg create mode 100644 assets/uswds/img/material-icons/volume_up.svg create mode 100755 assets/uswds/img/material-icons/volunteer_activism.svg create mode 100644 assets/uswds/img/material-icons/vpn_key.svg create mode 100644 assets/uswds/img/material-icons/vpn_lock.svg create mode 100644 assets/uswds/img/material-icons/wallpaper.svg create mode 100644 assets/uswds/img/material-icons/warning.svg create mode 100644 assets/uswds/img/material-icons/wash.svg create mode 100644 assets/uswds/img/material-icons/watch.svg create mode 100644 assets/uswds/img/material-icons/watch_later.svg create mode 100644 assets/uswds/img/material-icons/water_damage.svg create mode 100644 assets/uswds/img/material-icons/waterfall_chart.svg create mode 100644 assets/uswds/img/material-icons/waves.svg create mode 100644 assets/uswds/img/material-icons/wb_auto.svg create mode 100644 assets/uswds/img/material-icons/wb_cloudy.svg create mode 100644 assets/uswds/img/material-icons/wb_incandescent.svg create mode 100644 assets/uswds/img/material-icons/wb_iridescent.svg create mode 100644 assets/uswds/img/material-icons/wb_shade.svg create mode 100644 assets/uswds/img/material-icons/wb_sunny.svg create mode 100644 assets/uswds/img/material-icons/wb_twighlight.svg create mode 100644 assets/uswds/img/material-icons/wc.svg create mode 100644 assets/uswds/img/material-icons/web.svg create mode 100644 assets/uswds/img/material-icons/web_asset.svg create mode 100644 assets/uswds/img/material-icons/weekend.svg create mode 100644 assets/uswds/img/material-icons/west.svg create mode 100644 assets/uswds/img/material-icons/whatshot.svg create mode 100644 assets/uswds/img/material-icons/wheelchair_pickup.svg create mode 100644 assets/uswds/img/material-icons/where_to_vote.svg create mode 100644 assets/uswds/img/material-icons/widgets.svg create mode 100644 assets/uswds/img/material-icons/wifi.svg create mode 100755 assets/uswds/img/material-icons/wifi_calling.svg create mode 100644 assets/uswds/img/material-icons/wifi_lock.svg create mode 100644 assets/uswds/img/material-icons/wifi_off.svg create mode 100755 assets/uswds/img/material-icons/wifi_protected_setup.svg create mode 100644 assets/uswds/img/material-icons/wifi_tethering.svg create mode 100644 assets/uswds/img/material-icons/wine_bar.svg create mode 100644 assets/uswds/img/material-icons/work.svg create mode 100644 assets/uswds/img/material-icons/work_off.svg create mode 100644 assets/uswds/img/material-icons/work_outline.svg create mode 100644 assets/uswds/img/material-icons/workspaces_filled.svg create mode 100644 assets/uswds/img/material-icons/workspaces_outline.svg create mode 100644 assets/uswds/img/material-icons/wrap_text.svg create mode 100755 assets/uswds/img/material-icons/wrong_location.svg create mode 100644 assets/uswds/img/material-icons/wysiwyg.svg create mode 100644 assets/uswds/img/material-icons/youtube_searched_for.svg create mode 100644 assets/uswds/img/material-icons/zoom_in.svg create mode 100644 assets/uswds/img/material-icons/zoom_out.svg create mode 100644 assets/uswds/img/material-icons/zoom_out_map.svg create mode 100644 assets/uswds/img/minus-alt.svg create mode 100644 assets/uswds/img/minus.svg create mode 100644 assets/uswds/img/plus-alt.svg create mode 100644 assets/uswds/img/plus.svg create mode 100755 assets/uswds/img/search-alt.svg create mode 100644 assets/uswds/img/search-primary.svg create mode 100755 assets/uswds/img/search.svg create mode 100644 assets/uswds/img/social-icons/facebook25.png create mode 100755 assets/uswds/img/social-icons/facebook25.svg create mode 100644 assets/uswds/img/social-icons/instagram25.png create mode 100644 assets/uswds/img/social-icons/instagram25.svg create mode 100644 assets/uswds/img/social-icons/rss25.png create mode 100755 assets/uswds/img/social-icons/rss25.svg create mode 100644 assets/uswds/img/social-icons/twitter16.png create mode 100755 assets/uswds/img/social-icons/twitter16.svg create mode 100644 assets/uswds/img/social-icons/youtube15.png create mode 100755 assets/uswds/img/social-icons/youtube15.svg create mode 100644 assets/uswds/img/sprite.svg create mode 100644 assets/uswds/img/us_flag_small.png create mode 100644 assets/uswds/img/usa-icons-bg/add--white.svg create mode 100644 assets/uswds/img/usa-icons-bg/check--blue-60v.svg create mode 100644 assets/uswds/img/usa-icons-bg/check_circle--white.svg create mode 100644 assets/uswds/img/usa-icons-bg/error--white.svg create mode 100644 assets/uswds/img/usa-icons-bg/expand_less--white.svg create mode 100644 assets/uswds/img/usa-icons-bg/expand_more--blue-warm-70v.svg create mode 100644 assets/uswds/img/usa-icons-bg/expand_more--white.svg create mode 100644 assets/uswds/img/usa-icons-bg/info--white.svg create mode 100644 assets/uswds/img/usa-icons-bg/launch--blue-60v.svg create mode 100644 assets/uswds/img/usa-icons-bg/launch--blue-70v.svg create mode 100644 assets/uswds/img/usa-icons-bg/launch--gray-5.svg create mode 100644 assets/uswds/img/usa-icons-bg/launch--white.svg create mode 100644 assets/uswds/img/usa-icons-bg/remove--white.svg create mode 100644 assets/uswds/img/usa-icons-bg/search--white.svg create mode 100644 assets/uswds/img/usa-icons-bg/warning--white.svg create mode 100644 assets/uswds/img/usa-icons/accessibility_new.svg create mode 100644 assets/uswds/img/usa-icons/accessible_forward.svg create mode 100644 assets/uswds/img/usa-icons/account_balance.svg create mode 100644 assets/uswds/img/usa-icons/account_box.svg create mode 100644 assets/uswds/img/usa-icons/account_circle.svg create mode 100644 assets/uswds/img/usa-icons/add.svg create mode 100644 assets/uswds/img/usa-icons/add_circle.svg create mode 100644 assets/uswds/img/usa-icons/add_circle_outline.svg create mode 100644 assets/uswds/img/usa-icons/alarm.svg create mode 100644 assets/uswds/img/usa-icons/alternate_email.svg create mode 100644 assets/uswds/img/usa-icons/announcement.svg create mode 100644 assets/uswds/img/usa-icons/api.svg create mode 100644 assets/uswds/img/usa-icons/arrow_back.svg create mode 100644 assets/uswds/img/usa-icons/arrow_downward.svg create mode 100644 assets/uswds/img/usa-icons/arrow_drop_down.svg create mode 100644 assets/uswds/img/usa-icons/arrow_drop_up.svg create mode 100644 assets/uswds/img/usa-icons/arrow_forward.svg create mode 100644 assets/uswds/img/usa-icons/arrow_upward.svg create mode 100644 assets/uswds/img/usa-icons/assessment.svg create mode 100644 assets/uswds/img/usa-icons/attach_file.svg create mode 100644 assets/uswds/img/usa-icons/attach_money.svg create mode 100644 assets/uswds/img/usa-icons/autorenew.svg create mode 100644 assets/uswds/img/usa-icons/backpack.svg create mode 100755 assets/uswds/img/usa-icons/bathtub.svg create mode 100644 assets/uswds/img/usa-icons/bedding.svg create mode 100644 assets/uswds/img/usa-icons/bookmark.svg create mode 100644 assets/uswds/img/usa-icons/bug_report.svg create mode 100644 assets/uswds/img/usa-icons/build.svg create mode 100644 assets/uswds/img/usa-icons/calendar_today.svg create mode 100644 assets/uswds/img/usa-icons/campaign.svg create mode 100644 assets/uswds/img/usa-icons/camping.svg create mode 100644 assets/uswds/img/usa-icons/cancel.svg create mode 100644 assets/uswds/img/usa-icons/chat.svg create mode 100644 assets/uswds/img/usa-icons/check.svg create mode 100644 assets/uswds/img/usa-icons/check_box_outline_blank.svg create mode 100644 assets/uswds/img/usa-icons/check_circle.svg create mode 100644 assets/uswds/img/usa-icons/check_circle_outline.svg create mode 100644 assets/uswds/img/usa-icons/checkroom.svg create mode 100755 assets/uswds/img/usa-icons/chevron_left.svg create mode 100755 assets/uswds/img/usa-icons/chevron_right.svg create mode 100644 assets/uswds/img/usa-icons/clean_hands.svg create mode 100644 assets/uswds/img/usa-icons/close.svg create mode 100644 assets/uswds/img/usa-icons/closed_caption.svg create mode 100644 assets/uswds/img/usa-icons/clothes.svg create mode 100644 assets/uswds/img/usa-icons/cloud.svg create mode 100644 assets/uswds/img/usa-icons/code.svg create mode 100644 assets/uswds/img/usa-icons/comment.svg create mode 100644 assets/uswds/img/usa-icons/connect_without_contact.svg create mode 100755 assets/uswds/img/usa-icons/construction.svg create mode 100644 assets/uswds/img/usa-icons/construction_worker.svg create mode 100644 assets/uswds/img/usa-icons/contact_page.svg create mode 100644 assets/uswds/img/usa-icons/content_copy.svg create mode 100644 assets/uswds/img/usa-icons/coronavirus.svg create mode 100644 assets/uswds/img/usa-icons/credit_card.svg create mode 100755 assets/uswds/img/usa-icons/deck.svg create mode 100644 assets/uswds/img/usa-icons/delete.svg create mode 100644 assets/uswds/img/usa-icons/device_thermostat.svg create mode 100644 assets/uswds/img/usa-icons/directions.svg create mode 100644 assets/uswds/img/usa-icons/directions_bike.svg create mode 100644 assets/uswds/img/usa-icons/directions_bus.svg create mode 100644 assets/uswds/img/usa-icons/directions_car.svg create mode 100644 assets/uswds/img/usa-icons/directions_walk.svg create mode 100644 assets/uswds/img/usa-icons/do_not_disturb.svg create mode 100644 assets/uswds/img/usa-icons/do_not_touch.svg create mode 100644 assets/uswds/img/usa-icons/drag_handle.svg create mode 100755 assets/uswds/img/usa-icons/eco.svg create mode 100644 assets/uswds/img/usa-icons/edit.svg create mode 100755 assets/uswds/img/usa-icons/electrical_services.svg create mode 100755 assets/uswds/img/usa-icons/emoji_events.svg create mode 100644 assets/uswds/img/usa-icons/error.svg create mode 100644 assets/uswds/img/usa-icons/error_outline.svg create mode 100644 assets/uswds/img/usa-icons/event.svg create mode 100644 assets/uswds/img/usa-icons/expand_less.svg create mode 100644 assets/uswds/img/usa-icons/expand_more.svg create mode 100644 assets/uswds/img/usa-icons/facebook.svg create mode 100644 assets/uswds/img/usa-icons/fast_forward.svg create mode 100644 assets/uswds/img/usa-icons/fast_rewind.svg create mode 100644 assets/uswds/img/usa-icons/favorite.svg create mode 100644 assets/uswds/img/usa-icons/favorite_border.svg create mode 100644 assets/uswds/img/usa-icons/file_download.svg create mode 100644 assets/uswds/img/usa-icons/file_present.svg create mode 100644 assets/uswds/img/usa-icons/file_upload.svg create mode 100644 assets/uswds/img/usa-icons/filter_alt.svg create mode 100644 assets/uswds/img/usa-icons/filter_list.svg create mode 100644 assets/uswds/img/usa-icons/fingerprint.svg create mode 100644 assets/uswds/img/usa-icons/first_page.svg create mode 100644 assets/uswds/img/usa-icons/flag.svg create mode 100644 assets/uswds/img/usa-icons/flickr.svg create mode 100644 assets/uswds/img/usa-icons/flight.svg create mode 100644 assets/uswds/img/usa-icons/flooding.svg create mode 100644 assets/uswds/img/usa-icons/folder.svg create mode 100644 assets/uswds/img/usa-icons/folder_open.svg create mode 100644 assets/uswds/img/usa-icons/format_quote.svg create mode 100644 assets/uswds/img/usa-icons/format_size.svg create mode 100644 assets/uswds/img/usa-icons/forum.svg create mode 100644 assets/uswds/img/usa-icons/github.svg create mode 100644 assets/uswds/img/usa-icons/grid_view.svg create mode 100644 assets/uswds/img/usa-icons/group_add.svg create mode 100644 assets/uswds/img/usa-icons/groups.svg create mode 100644 assets/uswds/img/usa-icons/hearing.svg create mode 100644 assets/uswds/img/usa-icons/help.svg create mode 100644 assets/uswds/img/usa-icons/help_outline.svg create mode 100644 assets/uswds/img/usa-icons/highlight_off.svg create mode 100644 assets/uswds/img/usa-icons/history.svg create mode 100644 assets/uswds/img/usa-icons/home.svg create mode 100644 assets/uswds/img/usa-icons/hospital.svg create mode 100644 assets/uswds/img/usa-icons/hotel.svg create mode 100644 assets/uswds/img/usa-icons/hourglass_empty.svg create mode 100644 assets/uswds/img/usa-icons/hurricane.svg create mode 100644 assets/uswds/img/usa-icons/identification.svg create mode 100644 assets/uswds/img/usa-icons/image.svg create mode 100644 assets/uswds/img/usa-icons/info.svg create mode 100644 assets/uswds/img/usa-icons/info_outline.svg create mode 100755 assets/uswds/img/usa-icons/insights.svg create mode 100644 assets/uswds/img/usa-icons/instagram.svg create mode 100644 assets/uswds/img/usa-icons/keyboard.svg create mode 100644 assets/uswds/img/usa-icons/label.svg create mode 100644 assets/uswds/img/usa-icons/language.svg create mode 100644 assets/uswds/img/usa-icons/last_page.svg create mode 100644 assets/uswds/img/usa-icons/launch.svg create mode 100644 assets/uswds/img/usa-icons/lightbulb.svg create mode 100644 assets/uswds/img/usa-icons/lightbulb_outline.svg create mode 100644 assets/uswds/img/usa-icons/link.svg create mode 100644 assets/uswds/img/usa-icons/link_off.svg create mode 100644 assets/uswds/img/usa-icons/list.svg create mode 100644 assets/uswds/img/usa-icons/local_cafe.svg create mode 100644 assets/uswds/img/usa-icons/local_fire_department.svg create mode 100644 assets/uswds/img/usa-icons/local_gas_station.svg create mode 100644 assets/uswds/img/usa-icons/local_grocery_store.svg create mode 100644 assets/uswds/img/usa-icons/local_hospital.svg create mode 100644 assets/uswds/img/usa-icons/local_laundry_service.svg create mode 100644 assets/uswds/img/usa-icons/local_library.svg create mode 100644 assets/uswds/img/usa-icons/local_offer.svg create mode 100644 assets/uswds/img/usa-icons/local_parking.svg create mode 100644 assets/uswds/img/usa-icons/local_pharmacy.svg create mode 100644 assets/uswds/img/usa-icons/local_police.svg create mode 100644 assets/uswds/img/usa-icons/local_taxi.svg create mode 100644 assets/uswds/img/usa-icons/location_city.svg create mode 100644 assets/uswds/img/usa-icons/location_on.svg create mode 100644 assets/uswds/img/usa-icons/lock.svg create mode 100644 assets/uswds/img/usa-icons/lock_open.svg create mode 100644 assets/uswds/img/usa-icons/lock_outline.svg create mode 100755 assets/uswds/img/usa-icons/login.svg create mode 100644 assets/uswds/img/usa-icons/logout.svg create mode 100644 assets/uswds/img/usa-icons/loop.svg create mode 100644 assets/uswds/img/usa-icons/mail.svg create mode 100644 assets/uswds/img/usa-icons/mail_outline.svg create mode 100644 assets/uswds/img/usa-icons/map.svg create mode 100644 assets/uswds/img/usa-icons/masks.svg create mode 100755 assets/uswds/img/usa-icons/medical_services.svg create mode 100644 assets/uswds/img/usa-icons/menu.svg create mode 100755 assets/uswds/img/usa-icons/military_tech.svg create mode 100644 assets/uswds/img/usa-icons/more_horiz.svg create mode 100644 assets/uswds/img/usa-icons/more_vert.svg create mode 100644 assets/uswds/img/usa-icons/my_location.svg create mode 100644 assets/uswds/img/usa-icons/navigate_before.svg create mode 100644 assets/uswds/img/usa-icons/navigate_far_before.svg create mode 100644 assets/uswds/img/usa-icons/navigate_far_next.svg create mode 100644 assets/uswds/img/usa-icons/navigate_next.svg create mode 100644 assets/uswds/img/usa-icons/near_me.svg create mode 100644 assets/uswds/img/usa-icons/notifications.svg create mode 100644 assets/uswds/img/usa-icons/notifications_active.svg create mode 100644 assets/uswds/img/usa-icons/notifications_none.svg create mode 100644 assets/uswds/img/usa-icons/notifications_off.svg create mode 100755 assets/uswds/img/usa-icons/park.svg create mode 100644 assets/uswds/img/usa-icons/people.svg create mode 100644 assets/uswds/img/usa-icons/person.svg create mode 100644 assets/uswds/img/usa-icons/pets.svg create mode 100644 assets/uswds/img/usa-icons/phone.svg create mode 100644 assets/uswds/img/usa-icons/photo_camera.svg create mode 100644 assets/uswds/img/usa-icons/print.svg create mode 100644 assets/uswds/img/usa-icons/priority_high.svg create mode 100644 assets/uswds/img/usa-icons/public.svg create mode 100755 assets/uswds/img/usa-icons/push_pin.svg create mode 100644 assets/uswds/img/usa-icons/radio_button_unchecked.svg create mode 100644 assets/uswds/img/usa-icons/rain.svg create mode 100644 assets/uswds/img/usa-icons/reduce_capacity.svg create mode 100644 assets/uswds/img/usa-icons/remove.svg create mode 100644 assets/uswds/img/usa-icons/report.svg create mode 100644 assets/uswds/img/usa-icons/restaurant.svg create mode 100644 assets/uswds/img/usa-icons/rss_feed.svg create mode 100644 assets/uswds/img/usa-icons/safety_divider.svg create mode 100644 assets/uswds/img/usa-icons/sanitizer.svg create mode 100644 assets/uswds/img/usa-icons/save_alt.svg create mode 100644 assets/uswds/img/usa-icons/schedule.svg create mode 100644 assets/uswds/img/usa-icons/school.svg create mode 100755 assets/uswds/img/usa-icons/science.svg create mode 100644 assets/uswds/img/usa-icons/search.svg create mode 100644 assets/uswds/img/usa-icons/security.svg create mode 100644 assets/uswds/img/usa-icons/send.svg create mode 100644 assets/uswds/img/usa-icons/sentiment_dissatisfied.svg create mode 100644 assets/uswds/img/usa-icons/sentiment_neutral.svg create mode 100644 assets/uswds/img/usa-icons/sentiment_satisfied.svg create mode 100644 assets/uswds/img/usa-icons/sentiment_satisfied_alt.svg create mode 100644 assets/uswds/img/usa-icons/sentiment_very_dissatisfied.svg create mode 100644 assets/uswds/img/usa-icons/settings.svg create mode 100644 assets/uswds/img/usa-icons/severe_weather.svg create mode 100644 assets/uswds/img/usa-icons/share.svg create mode 100644 assets/uswds/img/usa-icons/shield.svg create mode 100644 assets/uswds/img/usa-icons/shopping_basket.svg create mode 100644 assets/uswds/img/usa-icons/snow.svg create mode 100644 assets/uswds/img/usa-icons/soap.svg create mode 100644 assets/uswds/img/usa-icons/social_distance.svg create mode 100644 assets/uswds/img/usa-icons/sort_arrow.svg create mode 100644 assets/uswds/img/usa-icons/spellcheck.svg create mode 100644 assets/uswds/img/usa-icons/star.svg create mode 100644 assets/uswds/img/usa-icons/star_half.svg create mode 100644 assets/uswds/img/usa-icons/star_outline.svg create mode 100644 assets/uswds/img/usa-icons/store.svg create mode 100755 assets/uswds/img/usa-icons/support.svg create mode 100755 assets/uswds/img/usa-icons/support_agent.svg create mode 100644 assets/uswds/img/usa-icons/text_fields.svg create mode 100755 assets/uswds/img/usa-icons/thumb_down_alt.svg create mode 100644 assets/uswds/img/usa-icons/thumb_up_alt.svg create mode 100644 assets/uswds/img/usa-icons/timer.svg create mode 100644 assets/uswds/img/usa-icons/toggle_off.svg create mode 100644 assets/uswds/img/usa-icons/toggle_on.svg create mode 100644 assets/uswds/img/usa-icons/topic.svg create mode 100644 assets/uswds/img/usa-icons/tornado.svg create mode 100644 assets/uswds/img/usa-icons/translate.svg create mode 100644 assets/uswds/img/usa-icons/trending_down.svg create mode 100644 assets/uswds/img/usa-icons/trending_up.svg create mode 100644 assets/uswds/img/usa-icons/twitter.svg create mode 100644 assets/uswds/img/usa-icons/undo.svg create mode 100644 assets/uswds/img/usa-icons/unfold_less.svg create mode 100644 assets/uswds/img/usa-icons/unfold_more.svg create mode 100644 assets/uswds/img/usa-icons/update.svg create mode 100644 assets/uswds/img/usa-icons/upload_file.svg create mode 100755 assets/uswds/img/usa-icons/verified.svg create mode 100644 assets/uswds/img/usa-icons/verified_user.svg create mode 100644 assets/uswds/img/usa-icons/visibility.svg create mode 100644 assets/uswds/img/usa-icons/visibility_off.svg create mode 100644 assets/uswds/img/usa-icons/volume_off.svg create mode 100644 assets/uswds/img/usa-icons/warning.svg create mode 100644 assets/uswds/img/usa-icons/wash.svg create mode 100644 assets/uswds/img/usa-icons/wifi.svg create mode 100644 assets/uswds/img/usa-icons/work.svg create mode 100644 assets/uswds/img/usa-icons/youtube.svg create mode 100644 assets/uswds/img/usa-icons/zoom_in.svg create mode 100644 assets/uswds/img/usa-icons/zoom_out.svg create mode 100644 assets/uswds/img/usa-icons/zoom_out_map.svg create mode 100644 assets/uswds/img/uswds-icons/bedding.svg create mode 100644 assets/uswds/img/uswds-icons/camping.svg create mode 100644 assets/uswds/img/uswds-icons/chevron_left.svg create mode 100644 assets/uswds/img/uswds-icons/chevron_right.svg create mode 100644 assets/uswds/img/uswds-icons/clothes.svg create mode 100644 assets/uswds/img/uswds-icons/construction_worker.svg create mode 100644 assets/uswds/img/uswds-icons/flickr.svg create mode 100644 assets/uswds/img/uswds-icons/flooding.svg create mode 100644 assets/uswds/img/uswds-icons/github.svg create mode 100644 assets/uswds/img/uswds-icons/hospital.svg create mode 100644 assets/uswds/img/uswds-icons/hurricane.svg create mode 100644 assets/uswds/img/uswds-icons/identification.svg create mode 100644 assets/uswds/img/uswds-icons/instagram.svg create mode 100644 assets/uswds/img/uswds-icons/navigate_far_before.svg create mode 100644 assets/uswds/img/uswds-icons/navigate_far_next.svg create mode 100644 assets/uswds/img/uswds-icons/rain.svg create mode 100644 assets/uswds/img/uswds-icons/severe_weather.svg create mode 100644 assets/uswds/img/uswds-icons/snow.svg create mode 100644 assets/uswds/img/uswds-icons/sort_arrow.svg create mode 100644 assets/uswds/img/uswds-icons/tornado.svg create mode 100644 assets/uswds/img/uswds-icons/twitter.svg create mode 100644 assets/uswds/img/uswds-icons/youtube.svg create mode 100644 assets/uswds/loader.gif create mode 100644 assets/uswds/loader.svg create mode 100644 assets/uswds/lock.svg create mode 100644 assets/uswds/logo-img.png create mode 100644 assets/uswds/material-icons/10k.svg create mode 100644 assets/uswds/material-icons/10mp.svg create mode 100644 assets/uswds/material-icons/11mp.svg create mode 100644 assets/uswds/material-icons/12mp.svg create mode 100644 assets/uswds/material-icons/13mp.svg create mode 100644 assets/uswds/material-icons/14mp.svg create mode 100644 assets/uswds/material-icons/15mp.svg create mode 100644 assets/uswds/material-icons/16mp.svg create mode 100644 assets/uswds/material-icons/17mp.svg create mode 100644 assets/uswds/material-icons/18mp.svg create mode 100644 assets/uswds/material-icons/19mp.svg create mode 100644 assets/uswds/material-icons/1k.svg create mode 100644 assets/uswds/material-icons/1k_plus.svg create mode 100644 assets/uswds/material-icons/20mp.svg create mode 100644 assets/uswds/material-icons/21mp.svg create mode 100644 assets/uswds/material-icons/22mp.svg create mode 100644 assets/uswds/material-icons/23mp.svg create mode 100644 assets/uswds/material-icons/24mp.svg create mode 100644 assets/uswds/material-icons/2k.svg create mode 100644 assets/uswds/material-icons/2k_plus.svg create mode 100644 assets/uswds/material-icons/2mp.svg create mode 100644 assets/uswds/material-icons/360.svg create mode 100644 assets/uswds/material-icons/3d_rotation.svg create mode 100644 assets/uswds/material-icons/3k.svg create mode 100644 assets/uswds/material-icons/3k_plus.svg create mode 100644 assets/uswds/material-icons/3mp.svg create mode 100644 assets/uswds/material-icons/4k.svg create mode 100644 assets/uswds/material-icons/4k_plus.svg create mode 100644 assets/uswds/material-icons/4mp.svg create mode 100755 assets/uswds/material-icons/5g.svg create mode 100644 assets/uswds/material-icons/5k.svg create mode 100644 assets/uswds/material-icons/5k_plus.svg create mode 100644 assets/uswds/material-icons/5mp.svg create mode 100644 assets/uswds/material-icons/6_ft_apart.svg create mode 100644 assets/uswds/material-icons/6k.svg create mode 100644 assets/uswds/material-icons/6k_plus.svg create mode 100644 assets/uswds/material-icons/6mp.svg create mode 100644 assets/uswds/material-icons/7k.svg create mode 100644 assets/uswds/material-icons/7k_plus.svg create mode 100644 assets/uswds/material-icons/7mp.svg create mode 100644 assets/uswds/material-icons/8k.svg create mode 100644 assets/uswds/material-icons/8k_plus.svg create mode 100644 assets/uswds/material-icons/8mp.svg create mode 100644 assets/uswds/material-icons/9k.svg create mode 100644 assets/uswds/material-icons/9k_plus.svg create mode 100644 assets/uswds/material-icons/9mp.svg create mode 100644 assets/uswds/material-icons/ac_unit.svg create mode 100644 assets/uswds/material-icons/access_alarm.svg create mode 100644 assets/uswds/material-icons/access_alarms.svg create mode 100644 assets/uswds/material-icons/access_time.svg create mode 100644 assets/uswds/material-icons/accessibility.svg create mode 100644 assets/uswds/material-icons/accessibility_new.svg create mode 100644 assets/uswds/material-icons/accessible.svg create mode 100644 assets/uswds/material-icons/accessible_forward.svg create mode 100644 assets/uswds/material-icons/account_balance.svg create mode 100644 assets/uswds/material-icons/account_balance_wallet.svg create mode 100644 assets/uswds/material-icons/account_box.svg create mode 100644 assets/uswds/material-icons/account_circle.svg create mode 100644 assets/uswds/material-icons/account_tree.svg create mode 100644 assets/uswds/material-icons/ad_units.svg create mode 100644 assets/uswds/material-icons/adb.svg create mode 100644 assets/uswds/material-icons/add.svg create mode 100644 assets/uswds/material-icons/add_a_photo.svg create mode 100644 assets/uswds/material-icons/add_alarm.svg create mode 100644 assets/uswds/material-icons/add_alert.svg create mode 100644 assets/uswds/material-icons/add_box.svg create mode 100755 assets/uswds/material-icons/add_business.svg create mode 100644 assets/uswds/material-icons/add_call.svg create mode 100644 assets/uswds/material-icons/add_chart.svg create mode 100644 assets/uswds/material-icons/add_circle.svg create mode 100644 assets/uswds/material-icons/add_circle_outline.svg create mode 100644 assets/uswds/material-icons/add_comment.svg create mode 100644 assets/uswds/material-icons/add_ic_call.svg create mode 100644 assets/uswds/material-icons/add_link.svg create mode 100644 assets/uswds/material-icons/add_location.svg create mode 100644 assets/uswds/material-icons/add_location_alt.svg create mode 100644 assets/uswds/material-icons/add_moderator.svg create mode 100644 assets/uswds/material-icons/add_photo_alternate.svg create mode 100755 assets/uswds/material-icons/add_road.svg create mode 100644 assets/uswds/material-icons/add_shopping_cart.svg create mode 100644 assets/uswds/material-icons/add_task.svg create mode 100644 assets/uswds/material-icons/add_to_drive.svg create mode 100644 assets/uswds/material-icons/add_to_home_screen.svg create mode 100644 assets/uswds/material-icons/add_to_photos.svg create mode 100644 assets/uswds/material-icons/add_to_queue.svg create mode 100644 assets/uswds/material-icons/addchart.svg create mode 100644 assets/uswds/material-icons/adjust.svg create mode 100755 assets/uswds/material-icons/admin_panel_settings.svg create mode 100755 assets/uswds/material-icons/agriculture.svg create mode 100644 assets/uswds/material-icons/airline_seat_flat.svg create mode 100644 assets/uswds/material-icons/airline_seat_flat_angled.svg create mode 100644 assets/uswds/material-icons/airline_seat_individual_suite.svg create mode 100644 assets/uswds/material-icons/airline_seat_legroom_extra.svg create mode 100644 assets/uswds/material-icons/airline_seat_legroom_normal.svg create mode 100644 assets/uswds/material-icons/airline_seat_legroom_reduced.svg create mode 100644 assets/uswds/material-icons/airline_seat_recline_extra.svg create mode 100644 assets/uswds/material-icons/airline_seat_recline_normal.svg create mode 100755 assets/uswds/material-icons/airplanemode_active.svg create mode 100755 assets/uswds/material-icons/airplanemode_inactive.svg create mode 100644 assets/uswds/material-icons/airplay.svg create mode 100644 assets/uswds/material-icons/airport_shuttle.svg create mode 100644 assets/uswds/material-icons/alarm.svg create mode 100644 assets/uswds/material-icons/alarm_add.svg create mode 100644 assets/uswds/material-icons/alarm_off.svg create mode 100644 assets/uswds/material-icons/alarm_on.svg create mode 100644 assets/uswds/material-icons/album.svg create mode 100644 assets/uswds/material-icons/align_horizontal_center.svg create mode 100644 assets/uswds/material-icons/align_horizontal_left.svg create mode 100644 assets/uswds/material-icons/align_horizontal_right.svg create mode 100644 assets/uswds/material-icons/align_vertical_bottom.svg create mode 100644 assets/uswds/material-icons/align_vertical_center.svg create mode 100644 assets/uswds/material-icons/align_vertical_top.svg create mode 100644 assets/uswds/material-icons/all_inbox.svg create mode 100644 assets/uswds/material-icons/all_inclusive.svg create mode 100644 assets/uswds/material-icons/all_out.svg create mode 100755 assets/uswds/material-icons/alt_route.svg create mode 100644 assets/uswds/material-icons/alternate_email.svg create mode 100755 assets/uswds/material-icons/amp_stories.svg create mode 100644 assets/uswds/material-icons/analytics.svg create mode 100644 assets/uswds/material-icons/anchor.svg create mode 100644 assets/uswds/material-icons/android.svg create mode 100644 assets/uswds/material-icons/animation.svg create mode 100644 assets/uswds/material-icons/announcement.svg create mode 100755 assets/uswds/material-icons/apartment.svg create mode 100644 assets/uswds/material-icons/api.svg create mode 100644 assets/uswds/material-icons/app_blocking.svg create mode 100755 assets/uswds/material-icons/app_registration.svg create mode 100644 assets/uswds/material-icons/app_settings_alt.svg create mode 100644 assets/uswds/material-icons/approval.svg create mode 100644 assets/uswds/material-icons/apps.svg create mode 100755 assets/uswds/material-icons/architecture.svg create mode 100644 assets/uswds/material-icons/archive.svg create mode 100644 assets/uswds/material-icons/arrow_back.svg create mode 100644 assets/uswds/material-icons/arrow_back_ios.svg create mode 100755 assets/uswds/material-icons/arrow_circle_down.svg create mode 100755 assets/uswds/material-icons/arrow_circle_up.svg create mode 100644 assets/uswds/material-icons/arrow_downward.svg create mode 100644 assets/uswds/material-icons/arrow_drop_down.svg create mode 100644 assets/uswds/material-icons/arrow_drop_down_circle.svg create mode 100644 assets/uswds/material-icons/arrow_drop_up.svg create mode 100644 assets/uswds/material-icons/arrow_forward.svg create mode 100644 assets/uswds/material-icons/arrow_forward_ios.svg create mode 100644 assets/uswds/material-icons/arrow_left.svg create mode 100644 assets/uswds/material-icons/arrow_right.svg create mode 100644 assets/uswds/material-icons/arrow_right_alt.svg create mode 100644 assets/uswds/material-icons/arrow_upward.svg create mode 100644 assets/uswds/material-icons/art_track.svg create mode 100644 assets/uswds/material-icons/article.svg create mode 100644 assets/uswds/material-icons/aspect_ratio.svg create mode 100644 assets/uswds/material-icons/assessment.svg create mode 100644 assets/uswds/material-icons/assignment.svg create mode 100644 assets/uswds/material-icons/assignment_ind.svg create mode 100644 assets/uswds/material-icons/assignment_late.svg create mode 100644 assets/uswds/material-icons/assignment_return.svg create mode 100644 assets/uswds/material-icons/assignment_returned.svg create mode 100644 assets/uswds/material-icons/assignment_turned_in.svg create mode 100644 assets/uswds/material-icons/assistant.svg create mode 100644 assets/uswds/material-icons/assistant_direction.svg create mode 100644 assets/uswds/material-icons/assistant_navigation.svg create mode 100644 assets/uswds/material-icons/assistant_photo.svg create mode 100644 assets/uswds/material-icons/atm.svg create mode 100755 assets/uswds/material-icons/attach_email.svg create mode 100644 assets/uswds/material-icons/attach_file.svg create mode 100644 assets/uswds/material-icons/attach_money.svg create mode 100644 assets/uswds/material-icons/attachment.svg create mode 100755 assets/uswds/material-icons/attractions.svg create mode 100644 assets/uswds/material-icons/audiotrack.svg create mode 100644 assets/uswds/material-icons/auto_awesome.svg create mode 100644 assets/uswds/material-icons/auto_awesome_mosaic.svg create mode 100644 assets/uswds/material-icons/auto_awesome_motion.svg create mode 100755 assets/uswds/material-icons/auto_delete.svg create mode 100644 assets/uswds/material-icons/auto_fix_high.svg create mode 100644 assets/uswds/material-icons/auto_fix_normal.svg create mode 100644 assets/uswds/material-icons/auto_fix_off.svg create mode 100644 assets/uswds/material-icons/auto_stories.svg create mode 100644 assets/uswds/material-icons/autorenew.svg create mode 100644 assets/uswds/material-icons/av_timer.svg create mode 100644 assets/uswds/material-icons/baby_changing_station.svg create mode 100644 assets/uswds/material-icons/backpack.svg create mode 100644 assets/uswds/material-icons/backspace.svg create mode 100644 assets/uswds/material-icons/backup.svg create mode 100755 assets/uswds/material-icons/backup_table.svg create mode 100755 assets/uswds/material-icons/badge.svg create mode 100755 assets/uswds/material-icons/bakery_dining.svg create mode 100644 assets/uswds/material-icons/ballot.svg create mode 100644 assets/uswds/material-icons/bar_chart.svg create mode 100755 assets/uswds/material-icons/batch_prediction.svg create mode 100755 assets/uswds/material-icons/bathtub.svg create mode 100644 assets/uswds/material-icons/battery_alert.svg create mode 100644 assets/uswds/material-icons/battery_charging_full.svg create mode 100644 assets/uswds/material-icons/battery_full.svg create mode 100644 assets/uswds/material-icons/battery_std.svg create mode 100644 assets/uswds/material-icons/battery_unknown.svg create mode 100644 assets/uswds/material-icons/beach_access.svg create mode 100755 assets/uswds/material-icons/bedtime.svg create mode 100644 assets/uswds/material-icons/beenhere.svg create mode 100644 assets/uswds/material-icons/bento.svg create mode 100755 assets/uswds/material-icons/bike_scooter.svg create mode 100755 assets/uswds/material-icons/biotech.svg create mode 100644 assets/uswds/material-icons/block.svg create mode 100755 assets/uswds/material-icons/block_flipped.svg create mode 100644 assets/uswds/material-icons/bluetooth.svg create mode 100644 assets/uswds/material-icons/bluetooth_audio.svg create mode 100644 assets/uswds/material-icons/bluetooth_connected.svg create mode 100644 assets/uswds/material-icons/bluetooth_disabled.svg create mode 100644 assets/uswds/material-icons/bluetooth_searching.svg create mode 100644 assets/uswds/material-icons/blur_circular.svg create mode 100644 assets/uswds/material-icons/blur_linear.svg create mode 100644 assets/uswds/material-icons/blur_off.svg create mode 100644 assets/uswds/material-icons/blur_on.svg create mode 100644 assets/uswds/material-icons/bolt.svg create mode 100644 assets/uswds/material-icons/book.svg create mode 100644 assets/uswds/material-icons/book_online.svg create mode 100644 assets/uswds/material-icons/bookmark.svg create mode 100644 assets/uswds/material-icons/bookmark_border.svg create mode 100644 assets/uswds/material-icons/bookmarks.svg create mode 100644 assets/uswds/material-icons/border_all.svg create mode 100644 assets/uswds/material-icons/border_bottom.svg create mode 100644 assets/uswds/material-icons/border_clear.svg create mode 100644 assets/uswds/material-icons/border_color.svg create mode 100644 assets/uswds/material-icons/border_horizontal.svg create mode 100644 assets/uswds/material-icons/border_inner.svg create mode 100644 assets/uswds/material-icons/border_left.svg create mode 100644 assets/uswds/material-icons/border_outer.svg create mode 100644 assets/uswds/material-icons/border_right.svg create mode 100644 assets/uswds/material-icons/border_style.svg create mode 100644 assets/uswds/material-icons/border_top.svg create mode 100644 assets/uswds/material-icons/border_vertical.svg create mode 100644 assets/uswds/material-icons/branding_watermark.svg create mode 100755 assets/uswds/material-icons/breakfast_dining.svg create mode 100644 assets/uswds/material-icons/brightness_1.svg create mode 100644 assets/uswds/material-icons/brightness_2.svg create mode 100644 assets/uswds/material-icons/brightness_3.svg create mode 100644 assets/uswds/material-icons/brightness_4.svg create mode 100644 assets/uswds/material-icons/brightness_5.svg create mode 100644 assets/uswds/material-icons/brightness_6.svg create mode 100644 assets/uswds/material-icons/brightness_7.svg create mode 100644 assets/uswds/material-icons/brightness_auto.svg create mode 100644 assets/uswds/material-icons/brightness_high.svg create mode 100644 assets/uswds/material-icons/brightness_low.svg create mode 100644 assets/uswds/material-icons/brightness_medium.svg create mode 100644 assets/uswds/material-icons/broken_image.svg create mode 100755 assets/uswds/material-icons/browser_not_supported.svg create mode 100755 assets/uswds/material-icons/brunch_dining.svg create mode 100644 assets/uswds/material-icons/brush.svg create mode 100644 assets/uswds/material-icons/bubble_chart.svg create mode 100644 assets/uswds/material-icons/bug_report.svg create mode 100644 assets/uswds/material-icons/build.svg create mode 100755 assets/uswds/material-icons/build_circle.svg create mode 100644 assets/uswds/material-icons/burst_mode.svg create mode 100644 assets/uswds/material-icons/bus_alert.svg create mode 100644 assets/uswds/material-icons/business.svg create mode 100644 assets/uswds/material-icons/business_center.svg create mode 100644 assets/uswds/material-icons/cached.svg create mode 100644 assets/uswds/material-icons/cake.svg create mode 100755 assets/uswds/material-icons/calculate.svg create mode 100644 assets/uswds/material-icons/calendar_today.svg create mode 100644 assets/uswds/material-icons/calendar_view_day.svg create mode 100644 assets/uswds/material-icons/call.svg create mode 100644 assets/uswds/material-icons/call_end.svg create mode 100644 assets/uswds/material-icons/call_made.svg create mode 100644 assets/uswds/material-icons/call_merge.svg create mode 100644 assets/uswds/material-icons/call_missed.svg create mode 100644 assets/uswds/material-icons/call_missed_outgoing.svg create mode 100644 assets/uswds/material-icons/call_received.svg create mode 100644 assets/uswds/material-icons/call_split.svg create mode 100644 assets/uswds/material-icons/call_to_action.svg create mode 100644 assets/uswds/material-icons/camera.svg create mode 100644 assets/uswds/material-icons/camera_alt.svg create mode 100644 assets/uswds/material-icons/camera_enhance.svg create mode 100644 assets/uswds/material-icons/camera_front.svg create mode 100644 assets/uswds/material-icons/camera_rear.svg create mode 100644 assets/uswds/material-icons/camera_roll.svg create mode 100644 assets/uswds/material-icons/campaign.svg create mode 100644 assets/uswds/material-icons/cancel.svg create mode 100644 assets/uswds/material-icons/cancel_presentation.svg create mode 100755 assets/uswds/material-icons/cancel_schedule_send.svg create mode 100755 assets/uswds/material-icons/car_rental.svg create mode 100755 assets/uswds/material-icons/car_repair.svg create mode 100644 assets/uswds/material-icons/card_giftcard.svg create mode 100644 assets/uswds/material-icons/card_membership.svg create mode 100644 assets/uswds/material-icons/card_travel.svg create mode 100644 assets/uswds/material-icons/carpenter.svg create mode 100644 assets/uswds/material-icons/cases.svg create mode 100644 assets/uswds/material-icons/casino.svg create mode 100644 assets/uswds/material-icons/cast.svg create mode 100644 assets/uswds/material-icons/cast_connected.svg create mode 100644 assets/uswds/material-icons/cast_for_education.svg create mode 100644 assets/uswds/material-icons/category.svg create mode 100755 assets/uswds/material-icons/celebration.svg create mode 100644 assets/uswds/material-icons/cell_wifi.svg create mode 100644 assets/uswds/material-icons/center_focus_strong.svg create mode 100644 assets/uswds/material-icons/center_focus_weak.svg create mode 100644 assets/uswds/material-icons/change_history.svg create mode 100644 assets/uswds/material-icons/charging_station.svg create mode 100644 assets/uswds/material-icons/chat.svg create mode 100644 assets/uswds/material-icons/chat_bubble.svg create mode 100644 assets/uswds/material-icons/chat_bubble_outline.svg create mode 100644 assets/uswds/material-icons/check.svg create mode 100644 assets/uswds/material-icons/check_box.svg create mode 100644 assets/uswds/material-icons/check_box_outline_blank.svg create mode 100644 assets/uswds/material-icons/check_circle.svg create mode 100644 assets/uswds/material-icons/check_circle_outline.svg create mode 100644 assets/uswds/material-icons/checkroom.svg create mode 100755 assets/uswds/material-icons/chevron_left.svg create mode 100755 assets/uswds/material-icons/chevron_right.svg create mode 100644 assets/uswds/material-icons/child_care.svg create mode 100644 assets/uswds/material-icons/child_friendly.svg create mode 100644 assets/uswds/material-icons/chrome_reader_mode.svg create mode 100644 assets/uswds/material-icons/circle.svg create mode 100644 assets/uswds/material-icons/circle_notifications.svg create mode 100644 assets/uswds/material-icons/class.svg create mode 100644 assets/uswds/material-icons/clean_hands.svg create mode 100755 assets/uswds/material-icons/cleaning_services.svg create mode 100644 assets/uswds/material-icons/clear.svg create mode 100644 assets/uswds/material-icons/clear_all.svg create mode 100644 assets/uswds/material-icons/close.svg create mode 100644 assets/uswds/material-icons/close_fullscreen.svg create mode 100644 assets/uswds/material-icons/closed_caption.svg create mode 100644 assets/uswds/material-icons/closed_caption_disabled.svg create mode 100644 assets/uswds/material-icons/closed_caption_off.svg create mode 100644 assets/uswds/material-icons/cloud.svg create mode 100644 assets/uswds/material-icons/cloud_circle.svg create mode 100644 assets/uswds/material-icons/cloud_done.svg create mode 100644 assets/uswds/material-icons/cloud_download.svg create mode 100644 assets/uswds/material-icons/cloud_off.svg create mode 100644 assets/uswds/material-icons/cloud_queue.svg create mode 100644 assets/uswds/material-icons/cloud_upload.svg create mode 100644 assets/uswds/material-icons/code.svg create mode 100644 assets/uswds/material-icons/collections.svg create mode 100644 assets/uswds/material-icons/collections_bookmark.svg create mode 100644 assets/uswds/material-icons/color_lens.svg create mode 100644 assets/uswds/material-icons/colorize.svg create mode 100644 assets/uswds/material-icons/comment.svg create mode 100755 assets/uswds/material-icons/comment_bank.svg create mode 100644 assets/uswds/material-icons/commute.svg create mode 100644 assets/uswds/material-icons/compare.svg create mode 100644 assets/uswds/material-icons/compare_arrows.svg create mode 100644 assets/uswds/material-icons/compass_calibration.svg create mode 100644 assets/uswds/material-icons/compress.svg create mode 100644 assets/uswds/material-icons/computer.svg create mode 100644 assets/uswds/material-icons/confirmation_number.svg create mode 100644 assets/uswds/material-icons/connect_without_contact.svg create mode 100644 assets/uswds/material-icons/connected_tv.svg create mode 100755 assets/uswds/material-icons/construction.svg create mode 100644 assets/uswds/material-icons/contact_mail.svg create mode 100644 assets/uswds/material-icons/contact_page.svg create mode 100644 assets/uswds/material-icons/contact_phone.svg create mode 100644 assets/uswds/material-icons/contact_support.svg create mode 100755 assets/uswds/material-icons/contactless.svg create mode 100644 assets/uswds/material-icons/contacts.svg create mode 100644 assets/uswds/material-icons/content_copy.svg create mode 100644 assets/uswds/material-icons/content_cut.svg create mode 100644 assets/uswds/material-icons/content_paste.svg create mode 100644 assets/uswds/material-icons/control_camera.svg create mode 100644 assets/uswds/material-icons/control_point.svg create mode 100644 assets/uswds/material-icons/control_point_duplicate.svg create mode 100644 assets/uswds/material-icons/copyright.svg create mode 100644 assets/uswds/material-icons/coronavirus.svg create mode 100644 assets/uswds/material-icons/corporate_fare.svg create mode 100644 assets/uswds/material-icons/countertops.svg create mode 100644 assets/uswds/material-icons/create.svg create mode 100644 assets/uswds/material-icons/create_new_folder.svg create mode 100644 assets/uswds/material-icons/credit_card.svg create mode 100644 assets/uswds/material-icons/crop.svg create mode 100644 assets/uswds/material-icons/crop_16_9.svg create mode 100644 assets/uswds/material-icons/crop_3_2.svg create mode 100644 assets/uswds/material-icons/crop_5_4.svg create mode 100644 assets/uswds/material-icons/crop_7_5.svg create mode 100644 assets/uswds/material-icons/crop_din.svg create mode 100644 assets/uswds/material-icons/crop_free.svg create mode 100644 assets/uswds/material-icons/crop_landscape.svg create mode 100644 assets/uswds/material-icons/crop_original.svg create mode 100644 assets/uswds/material-icons/crop_portrait.svg create mode 100644 assets/uswds/material-icons/crop_rotate.svg create mode 100644 assets/uswds/material-icons/crop_square.svg create mode 100755 assets/uswds/material-icons/dangerous.svg create mode 100644 assets/uswds/material-icons/dashboard.svg create mode 100644 assets/uswds/material-icons/dashboard_customize.svg create mode 100644 assets/uswds/material-icons/data_usage.svg create mode 100644 assets/uswds/material-icons/date_range.svg create mode 100755 assets/uswds/material-icons/deck.svg create mode 100644 assets/uswds/material-icons/dehaze.svg create mode 100644 assets/uswds/material-icons/delete.svg create mode 100644 assets/uswds/material-icons/delete_forever.svg create mode 100644 assets/uswds/material-icons/delete_outline.svg create mode 100644 assets/uswds/material-icons/delete_sweep.svg create mode 100755 assets/uswds/material-icons/delivery_dining.svg create mode 100644 assets/uswds/material-icons/departure_board.svg create mode 100644 assets/uswds/material-icons/description.svg create mode 100755 assets/uswds/material-icons/design_services.svg create mode 100644 assets/uswds/material-icons/desktop_access_disabled.svg create mode 100644 assets/uswds/material-icons/desktop_mac.svg create mode 100644 assets/uswds/material-icons/desktop_windows.svg create mode 100644 assets/uswds/material-icons/details.svg create mode 100644 assets/uswds/material-icons/developer_board.svg create mode 100644 assets/uswds/material-icons/developer_mode.svg create mode 100644 assets/uswds/material-icons/device_hub.svg create mode 100644 assets/uswds/material-icons/device_thermostat.svg create mode 100644 assets/uswds/material-icons/device_unknown.svg create mode 100644 assets/uswds/material-icons/devices.svg create mode 100644 assets/uswds/material-icons/devices_other.svg create mode 100644 assets/uswds/material-icons/dialer_sip.svg create mode 100644 assets/uswds/material-icons/dialpad.svg create mode 100755 assets/uswds/material-icons/dinner_dining.svg create mode 100644 assets/uswds/material-icons/directions.svg create mode 100644 assets/uswds/material-icons/directions_bike.svg create mode 100644 assets/uswds/material-icons/directions_boat.svg create mode 100644 assets/uswds/material-icons/directions_bus.svg create mode 100644 assets/uswds/material-icons/directions_car.svg create mode 100644 assets/uswds/material-icons/directions_off.svg create mode 100644 assets/uswds/material-icons/directions_railway.svg create mode 100644 assets/uswds/material-icons/directions_run.svg create mode 100644 assets/uswds/material-icons/directions_subway.svg create mode 100644 assets/uswds/material-icons/directions_transit.svg create mode 100644 assets/uswds/material-icons/directions_walk.svg create mode 100644 assets/uswds/material-icons/dirty_lens.svg create mode 100644 assets/uswds/material-icons/disabled_by_default.svg create mode 100644 assets/uswds/material-icons/disc_full.svg create mode 100644 assets/uswds/material-icons/dns.svg create mode 100644 assets/uswds/material-icons/do_not_disturb.svg create mode 100644 assets/uswds/material-icons/do_not_disturb_alt.svg create mode 100644 assets/uswds/material-icons/do_not_disturb_off.svg create mode 100644 assets/uswds/material-icons/do_not_disturb_on.svg create mode 100644 assets/uswds/material-icons/do_not_step.svg create mode 100644 assets/uswds/material-icons/do_not_touch.svg create mode 100644 assets/uswds/material-icons/dock.svg create mode 100644 assets/uswds/material-icons/domain.svg create mode 100644 assets/uswds/material-icons/domain_disabled.svg create mode 100755 assets/uswds/material-icons/domain_verification.svg create mode 100644 assets/uswds/material-icons/done.svg create mode 100644 assets/uswds/material-icons/done_all.svg create mode 100644 assets/uswds/material-icons/done_outline.svg create mode 100644 assets/uswds/material-icons/donut_large.svg create mode 100644 assets/uswds/material-icons/donut_small.svg create mode 100755 assets/uswds/material-icons/double_arrow.svg create mode 100644 assets/uswds/material-icons/drafts.svg create mode 100644 assets/uswds/material-icons/drag_handle.svg create mode 100644 assets/uswds/material-icons/drag_indicator.svg create mode 100644 assets/uswds/material-icons/drive_eta.svg create mode 100644 assets/uswds/material-icons/drive_file_move.svg create mode 100644 assets/uswds/material-icons/drive_file_move_outline.svg create mode 100644 assets/uswds/material-icons/drive_file_rename_outline.svg create mode 100644 assets/uswds/material-icons/drive_folder_upload.svg create mode 100644 assets/uswds/material-icons/dry.svg create mode 100755 assets/uswds/material-icons/dry_cleaning.svg create mode 100644 assets/uswds/material-icons/duo.svg create mode 100644 assets/uswds/material-icons/dvr.svg create mode 100755 assets/uswds/material-icons/dynamic_feed.svg create mode 100644 assets/uswds/material-icons/dynamic_form.svg create mode 100644 assets/uswds/material-icons/east.svg create mode 100755 assets/uswds/material-icons/eco.svg create mode 100644 assets/uswds/material-icons/edit.svg create mode 100644 assets/uswds/material-icons/edit_attributes.svg create mode 100644 assets/uswds/material-icons/edit_location.svg create mode 100644 assets/uswds/material-icons/edit_off.svg create mode 100755 assets/uswds/material-icons/edit_road.svg create mode 100644 assets/uswds/material-icons/eject.svg create mode 100644 assets/uswds/material-icons/elderly.svg create mode 100755 assets/uswds/material-icons/electric_bike.svg create mode 100755 assets/uswds/material-icons/electric_car.svg create mode 100755 assets/uswds/material-icons/electric_moped.svg create mode 100755 assets/uswds/material-icons/electric_rickshaw.svg create mode 100755 assets/uswds/material-icons/electric_scooter.svg create mode 100755 assets/uswds/material-icons/electrical_services.svg create mode 100644 assets/uswds/material-icons/elevator.svg create mode 100644 assets/uswds/material-icons/email.svg create mode 100755 assets/uswds/material-icons/emoji_emotions.svg create mode 100755 assets/uswds/material-icons/emoji_events.svg create mode 100755 assets/uswds/material-icons/emoji_flags.svg create mode 100755 assets/uswds/material-icons/emoji_food_beverage.svg create mode 100755 assets/uswds/material-icons/emoji_nature.svg create mode 100755 assets/uswds/material-icons/emoji_objects.svg create mode 100755 assets/uswds/material-icons/emoji_people.svg create mode 100755 assets/uswds/material-icons/emoji_symbols.svg create mode 100755 assets/uswds/material-icons/emoji_transportation.svg create mode 100755 assets/uswds/material-icons/engineering.svg create mode 100644 assets/uswds/material-icons/enhanced_encryption.svg create mode 100644 assets/uswds/material-icons/equalizer.svg create mode 100644 assets/uswds/material-icons/error.svg create mode 100644 assets/uswds/material-icons/error_outline.svg create mode 100644 assets/uswds/material-icons/escalator.svg create mode 100644 assets/uswds/material-icons/escalator_warning.svg create mode 100755 assets/uswds/material-icons/euro.svg create mode 100644 assets/uswds/material-icons/euro_symbol.svg create mode 100644 assets/uswds/material-icons/ev_station.svg create mode 100644 assets/uswds/material-icons/event.svg create mode 100644 assets/uswds/material-icons/event_available.svg create mode 100644 assets/uswds/material-icons/event_busy.svg create mode 100644 assets/uswds/material-icons/event_note.svg create mode 100644 assets/uswds/material-icons/event_seat.svg create mode 100644 assets/uswds/material-icons/exit_to_app.svg create mode 100644 assets/uswds/material-icons/expand.svg create mode 100644 assets/uswds/material-icons/expand_less.svg create mode 100644 assets/uswds/material-icons/expand_more.svg create mode 100644 assets/uswds/material-icons/explicit.svg create mode 100644 assets/uswds/material-icons/explore.svg create mode 100644 assets/uswds/material-icons/explore_off.svg create mode 100644 assets/uswds/material-icons/exposure.svg create mode 100644 assets/uswds/material-icons/exposure_neg_1.svg create mode 100644 assets/uswds/material-icons/exposure_neg_2.svg create mode 100644 assets/uswds/material-icons/exposure_plus_1.svg create mode 100644 assets/uswds/material-icons/exposure_plus_2.svg create mode 100644 assets/uswds/material-icons/exposure_zero.svg create mode 100644 assets/uswds/material-icons/extension.svg create mode 100644 assets/uswds/material-icons/face.svg create mode 100644 assets/uswds/material-icons/face_retouching_natural.svg create mode 100644 assets/uswds/material-icons/facebook.svg create mode 100755 assets/uswds/material-icons/fact_check.svg create mode 100644 assets/uswds/material-icons/family_restroom.svg create mode 100644 assets/uswds/material-icons/fast_forward.svg create mode 100644 assets/uswds/material-icons/fast_rewind.svg create mode 100644 assets/uswds/material-icons/fastfood.svg create mode 100644 assets/uswds/material-icons/favorite.svg create mode 100644 assets/uswds/material-icons/favorite_border.svg create mode 100644 assets/uswds/material-icons/featured_play_list.svg create mode 100644 assets/uswds/material-icons/featured_video.svg create mode 100644 assets/uswds/material-icons/feedback.svg create mode 100644 assets/uswds/material-icons/fence.svg create mode 100755 assets/uswds/material-icons/festival.svg create mode 100644 assets/uswds/material-icons/fiber_dvr.svg create mode 100644 assets/uswds/material-icons/fiber_manual_record.svg create mode 100644 assets/uswds/material-icons/fiber_new.svg create mode 100644 assets/uswds/material-icons/fiber_pin.svg create mode 100644 assets/uswds/material-icons/fiber_smart_record.svg create mode 100644 assets/uswds/material-icons/file_copy.svg create mode 100644 assets/uswds/material-icons/file_download.svg create mode 100644 assets/uswds/material-icons/file_download_done.svg create mode 100644 assets/uswds/material-icons/file_present.svg create mode 100644 assets/uswds/material-icons/file_upload.svg create mode 100644 assets/uswds/material-icons/filter.svg create mode 100644 assets/uswds/material-icons/filter_1.svg create mode 100644 assets/uswds/material-icons/filter_2.svg create mode 100644 assets/uswds/material-icons/filter_3.svg create mode 100644 assets/uswds/material-icons/filter_4.svg create mode 100644 assets/uswds/material-icons/filter_5.svg create mode 100644 assets/uswds/material-icons/filter_6.svg create mode 100644 assets/uswds/material-icons/filter_7.svg create mode 100644 assets/uswds/material-icons/filter_8.svg create mode 100644 assets/uswds/material-icons/filter_9.svg create mode 100644 assets/uswds/material-icons/filter_9_plus.svg create mode 100644 assets/uswds/material-icons/filter_alt.svg create mode 100644 assets/uswds/material-icons/filter_b_and_w.svg create mode 100644 assets/uswds/material-icons/filter_center_focus.svg create mode 100644 assets/uswds/material-icons/filter_drama.svg create mode 100644 assets/uswds/material-icons/filter_frames.svg create mode 100644 assets/uswds/material-icons/filter_hdr.svg create mode 100644 assets/uswds/material-icons/filter_list.svg create mode 100644 assets/uswds/material-icons/filter_list_alt.svg create mode 100644 assets/uswds/material-icons/filter_none.svg create mode 100644 assets/uswds/material-icons/filter_tilt_shift.svg create mode 100644 assets/uswds/material-icons/filter_vintage.svg create mode 100644 assets/uswds/material-icons/find_in_page.svg create mode 100644 assets/uswds/material-icons/find_replace.svg create mode 100644 assets/uswds/material-icons/fingerprint.svg create mode 100644 assets/uswds/material-icons/fire_extinguisher.svg create mode 100755 assets/uswds/material-icons/fireplace.svg create mode 100644 assets/uswds/material-icons/first_page.svg create mode 100644 assets/uswds/material-icons/fit_screen.svg create mode 100644 assets/uswds/material-icons/fitness_center.svg create mode 100644 assets/uswds/material-icons/flag.svg create mode 100755 assets/uswds/material-icons/flaky.svg create mode 100644 assets/uswds/material-icons/flare.svg create mode 100644 assets/uswds/material-icons/flash_auto.svg create mode 100644 assets/uswds/material-icons/flash_off.svg create mode 100644 assets/uswds/material-icons/flash_on.svg create mode 100644 assets/uswds/material-icons/flight.svg create mode 100644 assets/uswds/material-icons/flight_land.svg create mode 100644 assets/uswds/material-icons/flight_takeoff.svg create mode 100644 assets/uswds/material-icons/flip.svg create mode 100755 assets/uswds/material-icons/flip_camera_android.svg create mode 100755 assets/uswds/material-icons/flip_camera_ios.svg create mode 100644 assets/uswds/material-icons/flip_to_back.svg create mode 100644 assets/uswds/material-icons/flip_to_front.svg create mode 100644 assets/uswds/material-icons/folder.svg create mode 100644 assets/uswds/material-icons/folder_open.svg create mode 100644 assets/uswds/material-icons/folder_shared.svg create mode 100644 assets/uswds/material-icons/folder_special.svg create mode 100644 assets/uswds/material-icons/follow_the_signs.svg create mode 100644 assets/uswds/material-icons/font_download.svg create mode 100644 assets/uswds/material-icons/food_bank.svg create mode 100644 assets/uswds/material-icons/format_align_center.svg create mode 100644 assets/uswds/material-icons/format_align_justify.svg create mode 100644 assets/uswds/material-icons/format_align_left.svg create mode 100644 assets/uswds/material-icons/format_align_right.svg create mode 100644 assets/uswds/material-icons/format_bold.svg create mode 100644 assets/uswds/material-icons/format_clear.svg create mode 100644 assets/uswds/material-icons/format_color_fill.svg create mode 100644 assets/uswds/material-icons/format_color_reset.svg create mode 100644 assets/uswds/material-icons/format_color_text.svg create mode 100644 assets/uswds/material-icons/format_indent_decrease.svg create mode 100644 assets/uswds/material-icons/format_indent_increase.svg create mode 100644 assets/uswds/material-icons/format_italic.svg create mode 100644 assets/uswds/material-icons/format_line_spacing.svg create mode 100644 assets/uswds/material-icons/format_list_bulleted.svg create mode 100644 assets/uswds/material-icons/format_list_numbered.svg create mode 100644 assets/uswds/material-icons/format_list_numbered_rtl.svg create mode 100644 assets/uswds/material-icons/format_paint.svg create mode 100644 assets/uswds/material-icons/format_quote.svg create mode 100644 assets/uswds/material-icons/format_shapes.svg create mode 100644 assets/uswds/material-icons/format_size.svg create mode 100644 assets/uswds/material-icons/format_strikethrough.svg create mode 100644 assets/uswds/material-icons/format_textdirection_l_to_r.svg create mode 100644 assets/uswds/material-icons/format_textdirection_r_to_l.svg create mode 100644 assets/uswds/material-icons/format_underlined.svg create mode 100644 assets/uswds/material-icons/forum.svg create mode 100644 assets/uswds/material-icons/forward.svg create mode 100644 assets/uswds/material-icons/forward_10.svg create mode 100644 assets/uswds/material-icons/forward_30.svg create mode 100644 assets/uswds/material-icons/forward_5.svg create mode 100755 assets/uswds/material-icons/forward_to_inbox.svg create mode 100644 assets/uswds/material-icons/foundation.svg create mode 100644 assets/uswds/material-icons/free_breakfast.svg create mode 100644 assets/uswds/material-icons/fullscreen.svg create mode 100644 assets/uswds/material-icons/fullscreen_exit.svg create mode 100644 assets/uswds/material-icons/functions.svg create mode 100644 assets/uswds/material-icons/g_translate.svg create mode 100644 assets/uswds/material-icons/gamepad.svg create mode 100644 assets/uswds/material-icons/games.svg create mode 100644 assets/uswds/material-icons/gavel.svg create mode 100644 assets/uswds/material-icons/gesture.svg create mode 100644 assets/uswds/material-icons/get_app.svg create mode 100644 assets/uswds/material-icons/gif.svg create mode 100644 assets/uswds/material-icons/golf_course.svg create mode 100644 assets/uswds/material-icons/gps_fixed.svg create mode 100644 assets/uswds/material-icons/gps_not_fixed.svg create mode 100644 assets/uswds/material-icons/gps_off.svg create mode 100644 assets/uswds/material-icons/grade.svg create mode 100644 assets/uswds/material-icons/gradient.svg create mode 100755 assets/uswds/material-icons/grading.svg create mode 100644 assets/uswds/material-icons/grain.svg create mode 100644 assets/uswds/material-icons/graphic_eq.svg create mode 100644 assets/uswds/material-icons/grass.svg create mode 100644 assets/uswds/material-icons/grid_off.svg create mode 100644 assets/uswds/material-icons/grid_on.svg create mode 100644 assets/uswds/material-icons/grid_view.svg create mode 100644 assets/uswds/material-icons/group.svg create mode 100644 assets/uswds/material-icons/group_add.svg create mode 100644 assets/uswds/material-icons/group_work.svg create mode 100644 assets/uswds/material-icons/groups.svg create mode 100644 assets/uswds/material-icons/hail.svg create mode 100755 assets/uswds/material-icons/handyman.svg create mode 100755 assets/uswds/material-icons/hardware.svg create mode 100644 assets/uswds/material-icons/hd.svg create mode 100644 assets/uswds/material-icons/hdr_enhanced_select.svg create mode 100644 assets/uswds/material-icons/hdr_off.svg create mode 100644 assets/uswds/material-icons/hdr_on.svg create mode 100644 assets/uswds/material-icons/hdr_strong.svg create mode 100644 assets/uswds/material-icons/hdr_weak.svg create mode 100644 assets/uswds/material-icons/headset.svg create mode 100644 assets/uswds/material-icons/headset_mic.svg create mode 100644 assets/uswds/material-icons/headset_off.svg create mode 100644 assets/uswds/material-icons/healing.svg create mode 100644 assets/uswds/material-icons/hearing.svg create mode 100755 assets/uswds/material-icons/hearing_disabled.svg create mode 100755 assets/uswds/material-icons/height.svg create mode 100644 assets/uswds/material-icons/help.svg create mode 100644 assets/uswds/material-icons/help_center.svg create mode 100644 assets/uswds/material-icons/help_outline.svg create mode 100644 assets/uswds/material-icons/high_quality.svg create mode 100644 assets/uswds/material-icons/highlight.svg create mode 100644 assets/uswds/material-icons/highlight_alt.svg create mode 100644 assets/uswds/material-icons/highlight_off.svg create mode 100644 assets/uswds/material-icons/history.svg create mode 100755 assets/uswds/material-icons/history_edu.svg create mode 100755 assets/uswds/material-icons/history_toggle_off.svg create mode 100644 assets/uswds/material-icons/home.svg create mode 100644 assets/uswds/material-icons/home_filled.svg create mode 100755 assets/uswds/material-icons/home_repair_service.svg create mode 100644 assets/uswds/material-icons/home_work.svg create mode 100644 assets/uswds/material-icons/horizontal_distribute.svg create mode 100755 assets/uswds/material-icons/horizontal_rule.svg create mode 100644 assets/uswds/material-icons/horizontal_split.svg create mode 100644 assets/uswds/material-icons/hot_tub.svg create mode 100644 assets/uswds/material-icons/hotel.svg create mode 100755 assets/uswds/material-icons/hourglass_bottom.svg create mode 100755 assets/uswds/material-icons/hourglass_disabled.svg create mode 100644 assets/uswds/material-icons/hourglass_empty.svg create mode 100644 assets/uswds/material-icons/hourglass_full.svg create mode 100755 assets/uswds/material-icons/hourglass_top.svg create mode 100755 assets/uswds/material-icons/house.svg create mode 100644 assets/uswds/material-icons/house_siding.svg create mode 100644 assets/uswds/material-icons/how_to_reg.svg create mode 100644 assets/uswds/material-icons/how_to_vote.svg create mode 100644 assets/uswds/material-icons/http.svg create mode 100644 assets/uswds/material-icons/https.svg create mode 100755 assets/uswds/material-icons/hvac.svg create mode 100755 assets/uswds/material-icons/icecream.svg create mode 100644 assets/uswds/material-icons/image.svg create mode 100644 assets/uswds/material-icons/image_aspect_ratio.svg create mode 100755 assets/uswds/material-icons/image_not_supported.svg create mode 100644 assets/uswds/material-icons/image_search.svg create mode 100644 assets/uswds/material-icons/imagesearch_roller.svg create mode 100644 assets/uswds/material-icons/import_contacts.svg create mode 100644 assets/uswds/material-icons/import_export.svg create mode 100644 assets/uswds/material-icons/important_devices.svg create mode 100644 assets/uswds/material-icons/inbox.svg create mode 100644 assets/uswds/material-icons/indeterminate_check_box.svg create mode 100644 assets/uswds/material-icons/info.svg create mode 100644 assets/uswds/material-icons/info_outline.svg create mode 100644 assets/uswds/material-icons/input.svg create mode 100644 assets/uswds/material-icons/insert_chart.svg create mode 100644 assets/uswds/material-icons/insert_chart_outlined.svg create mode 100644 assets/uswds/material-icons/insert_comment.svg create mode 100644 assets/uswds/material-icons/insert_drive_file.svg create mode 100644 assets/uswds/material-icons/insert_emoticon.svg create mode 100644 assets/uswds/material-icons/insert_invitation.svg create mode 100644 assets/uswds/material-icons/insert_link.svg create mode 100644 assets/uswds/material-icons/insert_photo.svg create mode 100755 assets/uswds/material-icons/insights.svg create mode 100644 assets/uswds/material-icons/integration_instructions.svg create mode 100644 assets/uswds/material-icons/inventory.svg create mode 100644 assets/uswds/material-icons/invert_colors.svg create mode 100644 assets/uswds/material-icons/invert_colors_off.svg create mode 100644 assets/uswds/material-icons/ios_share.svg create mode 100644 assets/uswds/material-icons/iso.svg create mode 100644 assets/uswds/material-icons/keyboard.svg create mode 100644 assets/uswds/material-icons/keyboard_arrow_down.svg create mode 100644 assets/uswds/material-icons/keyboard_arrow_left.svg create mode 100644 assets/uswds/material-icons/keyboard_arrow_right.svg create mode 100644 assets/uswds/material-icons/keyboard_arrow_up.svg create mode 100644 assets/uswds/material-icons/keyboard_backspace.svg create mode 100644 assets/uswds/material-icons/keyboard_capslock.svg create mode 100644 assets/uswds/material-icons/keyboard_hide.svg create mode 100644 assets/uswds/material-icons/keyboard_return.svg create mode 100644 assets/uswds/material-icons/keyboard_tab.svg create mode 100644 assets/uswds/material-icons/keyboard_voice.svg create mode 100755 assets/uswds/material-icons/king_bed.svg create mode 100644 assets/uswds/material-icons/kitchen.svg create mode 100644 assets/uswds/material-icons/label.svg create mode 100644 assets/uswds/material-icons/label_important.svg create mode 100644 assets/uswds/material-icons/label_important_outline.svg create mode 100644 assets/uswds/material-icons/label_off.svg create mode 100644 assets/uswds/material-icons/label_outline.svg create mode 100644 assets/uswds/material-icons/landscape.svg create mode 100644 assets/uswds/material-icons/language.svg create mode 100644 assets/uswds/material-icons/laptop.svg create mode 100644 assets/uswds/material-icons/laptop_chromebook.svg create mode 100644 assets/uswds/material-icons/laptop_mac.svg create mode 100644 assets/uswds/material-icons/laptop_windows.svg create mode 100644 assets/uswds/material-icons/last_page.svg create mode 100644 assets/uswds/material-icons/launch.svg create mode 100644 assets/uswds/material-icons/layers.svg create mode 100644 assets/uswds/material-icons/layers_clear.svg create mode 100644 assets/uswds/material-icons/leaderboard.svg create mode 100644 assets/uswds/material-icons/leak_add.svg create mode 100644 assets/uswds/material-icons/leak_remove.svg create mode 100755 assets/uswds/material-icons/legend_toggle.svg create mode 100644 assets/uswds/material-icons/lens.svg create mode 100644 assets/uswds/material-icons/library_add.svg create mode 100755 assets/uswds/material-icons/library_add_check.svg create mode 100644 assets/uswds/material-icons/library_books.svg create mode 100644 assets/uswds/material-icons/library_music.svg create mode 100644 assets/uswds/material-icons/lightbulb.svg create mode 100644 assets/uswds/material-icons/lightbulb_outline.svg create mode 100644 assets/uswds/material-icons/line_style.svg create mode 100644 assets/uswds/material-icons/line_weight.svg create mode 100644 assets/uswds/material-icons/linear_scale.svg create mode 100644 assets/uswds/material-icons/link.svg create mode 100644 assets/uswds/material-icons/link_off.svg create mode 100644 assets/uswds/material-icons/linked_camera.svg create mode 100755 assets/uswds/material-icons/liquor.svg create mode 100644 assets/uswds/material-icons/list.svg create mode 100644 assets/uswds/material-icons/list_alt.svg create mode 100644 assets/uswds/material-icons/live_help.svg create mode 100644 assets/uswds/material-icons/live_tv.svg create mode 100644 assets/uswds/material-icons/local_activity.svg create mode 100755 assets/uswds/material-icons/local_airport.svg create mode 100644 assets/uswds/material-icons/local_atm.svg create mode 100644 assets/uswds/material-icons/local_bar.svg create mode 100644 assets/uswds/material-icons/local_cafe.svg create mode 100644 assets/uswds/material-icons/local_car_wash.svg create mode 100644 assets/uswds/material-icons/local_convenience_store.svg create mode 100644 assets/uswds/material-icons/local_dining.svg create mode 100644 assets/uswds/material-icons/local_drink.svg create mode 100644 assets/uswds/material-icons/local_fire_department.svg create mode 100644 assets/uswds/material-icons/local_florist.svg create mode 100644 assets/uswds/material-icons/local_gas_station.svg create mode 100644 assets/uswds/material-icons/local_grocery_store.svg create mode 100644 assets/uswds/material-icons/local_hospital.svg create mode 100644 assets/uswds/material-icons/local_hotel.svg create mode 100644 assets/uswds/material-icons/local_laundry_service.svg create mode 100644 assets/uswds/material-icons/local_library.svg create mode 100644 assets/uswds/material-icons/local_mall.svg create mode 100644 assets/uswds/material-icons/local_movies.svg create mode 100644 assets/uswds/material-icons/local_offer.svg create mode 100644 assets/uswds/material-icons/local_parking.svg create mode 100644 assets/uswds/material-icons/local_pharmacy.svg create mode 100644 assets/uswds/material-icons/local_phone.svg create mode 100644 assets/uswds/material-icons/local_pizza.svg create mode 100644 assets/uswds/material-icons/local_play.svg create mode 100644 assets/uswds/material-icons/local_police.svg create mode 100644 assets/uswds/material-icons/local_post_office.svg create mode 100644 assets/uswds/material-icons/local_printshop.svg create mode 100644 assets/uswds/material-icons/local_see.svg create mode 100644 assets/uswds/material-icons/local_shipping.svg create mode 100644 assets/uswds/material-icons/local_taxi.svg create mode 100644 assets/uswds/material-icons/location_city.svg create mode 100644 assets/uswds/material-icons/location_disabled.svg create mode 100644 assets/uswds/material-icons/location_off.svg create mode 100644 assets/uswds/material-icons/location_on.svg create mode 100644 assets/uswds/material-icons/location_pin.svg create mode 100644 assets/uswds/material-icons/location_searching.svg create mode 100644 assets/uswds/material-icons/lock.svg create mode 100755 assets/uswds/material-icons/lock_clock.svg create mode 100644 assets/uswds/material-icons/lock_open.svg create mode 100644 assets/uswds/material-icons/lock_outline.svg create mode 100755 assets/uswds/material-icons/login.svg create mode 100644 assets/uswds/material-icons/logout.svg create mode 100644 assets/uswds/material-icons/looks.svg create mode 100644 assets/uswds/material-icons/looks_3.svg create mode 100644 assets/uswds/material-icons/looks_4.svg create mode 100644 assets/uswds/material-icons/looks_5.svg create mode 100644 assets/uswds/material-icons/looks_6.svg create mode 100644 assets/uswds/material-icons/looks_one.svg create mode 100644 assets/uswds/material-icons/looks_two.svg create mode 100644 assets/uswds/material-icons/loop.svg create mode 100644 assets/uswds/material-icons/loupe.svg create mode 100644 assets/uswds/material-icons/low_priority.svg create mode 100644 assets/uswds/material-icons/loyalty.svg create mode 100644 assets/uswds/material-icons/luggage.svg create mode 100755 assets/uswds/material-icons/lunch_dining.svg create mode 100644 assets/uswds/material-icons/mail.svg create mode 100644 assets/uswds/material-icons/mail_outline.svg create mode 100644 assets/uswds/material-icons/map.svg create mode 100644 assets/uswds/material-icons/maps_ugc.svg create mode 100644 assets/uswds/material-icons/margin.svg create mode 100755 assets/uswds/material-icons/mark_as_unread.svg create mode 100755 assets/uswds/material-icons/mark_chat_read.svg create mode 100755 assets/uswds/material-icons/mark_chat_unread.svg create mode 100755 assets/uswds/material-icons/mark_email_read.svg create mode 100755 assets/uswds/material-icons/mark_email_unread.svg create mode 100644 assets/uswds/material-icons/markunread.svg create mode 100644 assets/uswds/material-icons/markunread_mailbox.svg create mode 100644 assets/uswds/material-icons/masks.svg create mode 100644 assets/uswds/material-icons/maximize.svg create mode 100644 assets/uswds/material-icons/mediation.svg create mode 100755 assets/uswds/material-icons/medical_services.svg create mode 100644 assets/uswds/material-icons/meeting_room.svg create mode 100644 assets/uswds/material-icons/memory.svg create mode 100644 assets/uswds/material-icons/menu.svg create mode 100644 assets/uswds/material-icons/menu_book.svg create mode 100644 assets/uswds/material-icons/menu_open.svg create mode 100644 assets/uswds/material-icons/merge_type.svg create mode 100644 assets/uswds/material-icons/message.svg create mode 100644 assets/uswds/material-icons/mic.svg create mode 100644 assets/uswds/material-icons/mic_external_off.svg create mode 100644 assets/uswds/material-icons/mic_external_on.svg create mode 100644 assets/uswds/material-icons/mic_none.svg create mode 100644 assets/uswds/material-icons/mic_off.svg create mode 100644 assets/uswds/material-icons/microwave.svg create mode 100755 assets/uswds/material-icons/military_tech.svg create mode 100644 assets/uswds/material-icons/minimize.svg create mode 100755 assets/uswds/material-icons/miscellaneous_services.svg create mode 100644 assets/uswds/material-icons/missed_video_call.svg create mode 100644 assets/uswds/material-icons/mms.svg create mode 100644 assets/uswds/material-icons/mobile_friendly.svg create mode 100644 assets/uswds/material-icons/mobile_off.svg create mode 100644 assets/uswds/material-icons/mobile_screen_share.svg create mode 100644 assets/uswds/material-icons/mode_comment.svg create mode 100644 assets/uswds/material-icons/mode_edit.svg create mode 100755 assets/uswds/material-icons/model_training.svg create mode 100644 assets/uswds/material-icons/monetization_on.svg create mode 100644 assets/uswds/material-icons/money.svg create mode 100644 assets/uswds/material-icons/money_off.svg create mode 100644 assets/uswds/material-icons/monitor.svg create mode 100644 assets/uswds/material-icons/monochrome_photos.svg create mode 100644 assets/uswds/material-icons/mood.svg create mode 100644 assets/uswds/material-icons/mood_bad.svg create mode 100755 assets/uswds/material-icons/moped.svg create mode 100644 assets/uswds/material-icons/more.svg create mode 100644 assets/uswds/material-icons/more_horiz.svg create mode 100755 assets/uswds/material-icons/more_time.svg create mode 100644 assets/uswds/material-icons/more_vert.svg create mode 100644 assets/uswds/material-icons/motion_photos_off.svg create mode 100644 assets/uswds/material-icons/motion_photos_on.svg create mode 100644 assets/uswds/material-icons/motion_photos_pause.svg create mode 100644 assets/uswds/material-icons/motion_photos_paused.svg create mode 100644 assets/uswds/material-icons/mouse.svg create mode 100644 assets/uswds/material-icons/move_to_inbox.svg create mode 100644 assets/uswds/material-icons/movie.svg create mode 100644 assets/uswds/material-icons/movie_creation.svg create mode 100644 assets/uswds/material-icons/movie_filter.svg create mode 100644 assets/uswds/material-icons/mp.svg create mode 100644 assets/uswds/material-icons/multiline_chart.svg create mode 100644 assets/uswds/material-icons/multiple_stop.svg create mode 100755 assets/uswds/material-icons/museum.svg create mode 100644 assets/uswds/material-icons/music_note.svg create mode 100644 assets/uswds/material-icons/music_off.svg create mode 100644 assets/uswds/material-icons/music_video.svg create mode 100644 assets/uswds/material-icons/my_location.svg create mode 100755 assets/uswds/material-icons/nat.svg create mode 100644 assets/uswds/material-icons/nature.svg create mode 100644 assets/uswds/material-icons/nature_people.svg create mode 100644 assets/uswds/material-icons/navigate_before.svg create mode 100644 assets/uswds/material-icons/navigate_next.svg create mode 100644 assets/uswds/material-icons/navigation.svg create mode 100644 assets/uswds/material-icons/near_me.svg create mode 100644 assets/uswds/material-icons/near_me_disabled.svg create mode 100644 assets/uswds/material-icons/network_cell.svg create mode 100644 assets/uswds/material-icons/network_check.svg create mode 100644 assets/uswds/material-icons/network_locked.svg create mode 100644 assets/uswds/material-icons/network_wifi.svg create mode 100644 assets/uswds/material-icons/new_releases.svg create mode 100755 assets/uswds/material-icons/next_plan.svg create mode 100644 assets/uswds/material-icons/next_week.svg create mode 100644 assets/uswds/material-icons/nfc.svg create mode 100644 assets/uswds/material-icons/night_shelter.svg create mode 100755 assets/uswds/material-icons/nightlife.svg create mode 100644 assets/uswds/material-icons/nightlight_round.svg create mode 100755 assets/uswds/material-icons/nights_stay.svg create mode 100644 assets/uswds/material-icons/no_backpack.svg create mode 100644 assets/uswds/material-icons/no_cell.svg create mode 100644 assets/uswds/material-icons/no_drinks.svg create mode 100644 assets/uswds/material-icons/no_encryption.svg create mode 100644 assets/uswds/material-icons/no_flash.svg create mode 100644 assets/uswds/material-icons/no_food.svg create mode 100644 assets/uswds/material-icons/no_luggage.svg create mode 100644 assets/uswds/material-icons/no_meals.svg create mode 100644 assets/uswds/material-icons/no_meals_ouline.svg create mode 100644 assets/uswds/material-icons/no_meeting_room.svg create mode 100644 assets/uswds/material-icons/no_photography.svg create mode 100644 assets/uswds/material-icons/no_sim.svg create mode 100644 assets/uswds/material-icons/no_stroller.svg create mode 100644 assets/uswds/material-icons/no_transfer.svg create mode 100644 assets/uswds/material-icons/north.svg create mode 100644 assets/uswds/material-icons/north_east.svg create mode 100644 assets/uswds/material-icons/north_west.svg create mode 100755 assets/uswds/material-icons/not_accessible.svg create mode 100644 assets/uswds/material-icons/not_interested.svg create mode 100644 assets/uswds/material-icons/not_listed_location.svg create mode 100755 assets/uswds/material-icons/not_started.svg create mode 100644 assets/uswds/material-icons/note.svg create mode 100644 assets/uswds/material-icons/note_add.svg create mode 100644 assets/uswds/material-icons/notes.svg create mode 100644 assets/uswds/material-icons/notification_important.svg create mode 100644 assets/uswds/material-icons/notifications.svg create mode 100644 assets/uswds/material-icons/notifications_active.svg create mode 100644 assets/uswds/material-icons/notifications_none.svg create mode 100644 assets/uswds/material-icons/notifications_off.svg create mode 100644 assets/uswds/material-icons/notifications_paused.svg create mode 100644 assets/uswds/material-icons/offline_bolt.svg create mode 100644 assets/uswds/material-icons/offline_pin.svg create mode 100644 assets/uswds/material-icons/offline_share.svg create mode 100644 assets/uswds/material-icons/ondemand_video.svg create mode 100755 assets/uswds/material-icons/online_prediction.svg create mode 100644 assets/uswds/material-icons/opacity.svg create mode 100644 assets/uswds/material-icons/open_in_browser.svg create mode 100644 assets/uswds/material-icons/open_in_full.svg create mode 100644 assets/uswds/material-icons/open_in_new.svg create mode 100644 assets/uswds/material-icons/open_with.svg create mode 100644 assets/uswds/material-icons/outbond.svg create mode 100755 assets/uswds/material-icons/outbox.svg create mode 100755 assets/uswds/material-icons/outdoor_grill.svg create mode 100755 assets/uswds/material-icons/outgoing_mail.svg create mode 100644 assets/uswds/material-icons/outlet.svg create mode 100644 assets/uswds/material-icons/outlined_flag.svg create mode 100644 assets/uswds/material-icons/padding.svg create mode 100644 assets/uswds/material-icons/pages.svg create mode 100644 assets/uswds/material-icons/pageview.svg create mode 100644 assets/uswds/material-icons/palette.svg create mode 100644 assets/uswds/material-icons/pan_tool.svg create mode 100644 assets/uswds/material-icons/panorama.svg create mode 100644 assets/uswds/material-icons/panorama_fish_eye.svg create mode 100644 assets/uswds/material-icons/panorama_horizontal.svg create mode 100644 assets/uswds/material-icons/panorama_horizontal_select.svg create mode 100644 assets/uswds/material-icons/panorama_photosphere.svg create mode 100644 assets/uswds/material-icons/panorama_photosphere_select.svg create mode 100644 assets/uswds/material-icons/panorama_vertical.svg create mode 100644 assets/uswds/material-icons/panorama_vertical_select.svg create mode 100644 assets/uswds/material-icons/panorama_wide_angle.svg create mode 100644 assets/uswds/material-icons/panorama_wide_angle_select.svg create mode 100755 assets/uswds/material-icons/park.svg create mode 100644 assets/uswds/material-icons/party_mode.svg create mode 100644 assets/uswds/material-icons/pause.svg create mode 100644 assets/uswds/material-icons/pause_circle_filled.svg create mode 100644 assets/uswds/material-icons/pause_circle_outline.svg create mode 100644 assets/uswds/material-icons/pause_presentation.svg create mode 100644 assets/uswds/material-icons/payment.svg create mode 100644 assets/uswds/material-icons/payments.svg create mode 100755 assets/uswds/material-icons/pedal_bike.svg create mode 100755 assets/uswds/material-icons/pending.svg create mode 100644 assets/uswds/material-icons/pending_actions.svg create mode 100644 assets/uswds/material-icons/people.svg create mode 100755 assets/uswds/material-icons/people_alt.svg create mode 100644 assets/uswds/material-icons/people_outline.svg create mode 100644 assets/uswds/material-icons/perm_camera_mic.svg create mode 100644 assets/uswds/material-icons/perm_contact_calendar.svg create mode 100644 assets/uswds/material-icons/perm_data_setting.svg create mode 100644 assets/uswds/material-icons/perm_device_information.svg create mode 100644 assets/uswds/material-icons/perm_identity.svg create mode 100644 assets/uswds/material-icons/perm_media.svg create mode 100644 assets/uswds/material-icons/perm_phone_msg.svg create mode 100644 assets/uswds/material-icons/perm_scan_wifi.svg create mode 100644 assets/uswds/material-icons/person.svg create mode 100644 assets/uswds/material-icons/person_add.svg create mode 100755 assets/uswds/material-icons/person_add_alt.svg create mode 100755 assets/uswds/material-icons/person_add_alt_1.svg create mode 100644 assets/uswds/material-icons/person_add_disabled.svg create mode 100644 assets/uswds/material-icons/person_outline.svg create mode 100644 assets/uswds/material-icons/person_pin.svg create mode 100644 assets/uswds/material-icons/person_pin_circle.svg create mode 100755 assets/uswds/material-icons/person_remove.svg create mode 100755 assets/uswds/material-icons/person_remove_alt_1.svg create mode 100755 assets/uswds/material-icons/person_search.svg create mode 100644 assets/uswds/material-icons/personal_video.svg create mode 100755 assets/uswds/material-icons/pest_control.svg create mode 100755 assets/uswds/material-icons/pest_control_rodent.svg create mode 100644 assets/uswds/material-icons/pets.svg create mode 100644 assets/uswds/material-icons/phone.svg create mode 100644 assets/uswds/material-icons/phone_android.svg create mode 100644 assets/uswds/material-icons/phone_bluetooth_speaker.svg create mode 100644 assets/uswds/material-icons/phone_callback.svg create mode 100644 assets/uswds/material-icons/phone_disabled.svg create mode 100644 assets/uswds/material-icons/phone_enabled.svg create mode 100644 assets/uswds/material-icons/phone_forwarded.svg create mode 100644 assets/uswds/material-icons/phone_in_talk.svg create mode 100644 assets/uswds/material-icons/phone_iphone.svg create mode 100644 assets/uswds/material-icons/phone_locked.svg create mode 100644 assets/uswds/material-icons/phone_missed.svg create mode 100644 assets/uswds/material-icons/phone_paused.svg create mode 100644 assets/uswds/material-icons/phonelink.svg create mode 100644 assets/uswds/material-icons/phonelink_erase.svg create mode 100644 assets/uswds/material-icons/phonelink_lock.svg create mode 100644 assets/uswds/material-icons/phonelink_off.svg create mode 100644 assets/uswds/material-icons/phonelink_ring.svg create mode 100644 assets/uswds/material-icons/phonelink_setup.svg create mode 100644 assets/uswds/material-icons/photo.svg create mode 100644 assets/uswds/material-icons/photo_album.svg create mode 100644 assets/uswds/material-icons/photo_camera.svg create mode 100644 assets/uswds/material-icons/photo_camera_back.svg create mode 100644 assets/uswds/material-icons/photo_camera_front.svg create mode 100644 assets/uswds/material-icons/photo_filter.svg create mode 100644 assets/uswds/material-icons/photo_library.svg create mode 100644 assets/uswds/material-icons/photo_size_select_actual.svg create mode 100644 assets/uswds/material-icons/photo_size_select_large.svg create mode 100644 assets/uswds/material-icons/photo_size_select_small.svg create mode 100644 assets/uswds/material-icons/picture_as_pdf.svg create mode 100644 assets/uswds/material-icons/picture_in_picture.svg create mode 100644 assets/uswds/material-icons/picture_in_picture_alt.svg create mode 100644 assets/uswds/material-icons/pie_chart.svg create mode 100644 assets/uswds/material-icons/pie_chart_outlined.svg create mode 100644 assets/uswds/material-icons/pin_drop.svg create mode 100644 assets/uswds/material-icons/pivot_table_chart.svg create mode 100644 assets/uswds/material-icons/place.svg create mode 100755 assets/uswds/material-icons/plagiarism.svg create mode 100644 assets/uswds/material-icons/play_arrow.svg create mode 100644 assets/uswds/material-icons/play_circle_filled.svg create mode 100644 assets/uswds/material-icons/play_circle_outline.svg create mode 100644 assets/uswds/material-icons/play_disabled.svg create mode 100644 assets/uswds/material-icons/play_for_work.svg create mode 100644 assets/uswds/material-icons/playlist_add.svg create mode 100644 assets/uswds/material-icons/playlist_add_check.svg create mode 100644 assets/uswds/material-icons/playlist_play.svg create mode 100755 assets/uswds/material-icons/plumbing.svg create mode 100644 assets/uswds/material-icons/plus_one.svg create mode 100755 assets/uswds/material-icons/point_of_sale.svg create mode 100755 assets/uswds/material-icons/policy.svg create mode 100644 assets/uswds/material-icons/poll.svg create mode 100644 assets/uswds/material-icons/polymer.svg create mode 100644 assets/uswds/material-icons/pool.svg create mode 100644 assets/uswds/material-icons/portable_wifi_off.svg create mode 100644 assets/uswds/material-icons/portrait.svg create mode 100755 assets/uswds/material-icons/post_add.svg create mode 100644 assets/uswds/material-icons/power.svg create mode 100644 assets/uswds/material-icons/power_input.svg create mode 100644 assets/uswds/material-icons/power_off.svg create mode 100644 assets/uswds/material-icons/power_settings_new.svg create mode 100644 assets/uswds/material-icons/pregnant_woman.svg create mode 100644 assets/uswds/material-icons/present_to_all.svg create mode 100644 assets/uswds/material-icons/preview.svg create mode 100644 assets/uswds/material-icons/print.svg create mode 100644 assets/uswds/material-icons/print_disabled.svg create mode 100644 assets/uswds/material-icons/priority_high.svg create mode 100755 assets/uswds/material-icons/privacy_tip.svg create mode 100755 assets/uswds/material-icons/psychology.svg create mode 100644 assets/uswds/material-icons/public.svg create mode 100644 assets/uswds/material-icons/public_off.svg create mode 100644 assets/uswds/material-icons/publish.svg create mode 100644 assets/uswds/material-icons/published_with_changes.svg create mode 100755 assets/uswds/material-icons/push_pin.svg create mode 100755 assets/uswds/material-icons/qr_code.svg create mode 100644 assets/uswds/material-icons/qr_code_2.svg create mode 100644 assets/uswds/material-icons/qr_code_scanner.svg create mode 100644 assets/uswds/material-icons/query_builder.svg create mode 100644 assets/uswds/material-icons/question_answer.svg create mode 100644 assets/uswds/material-icons/queue.svg create mode 100644 assets/uswds/material-icons/queue_music.svg create mode 100644 assets/uswds/material-icons/queue_play_next.svg create mode 100755 assets/uswds/material-icons/quickreply.svg create mode 100644 assets/uswds/material-icons/radio.svg create mode 100644 assets/uswds/material-icons/radio_button_checked.svg create mode 100644 assets/uswds/material-icons/radio_button_unchecked.svg create mode 100644 assets/uswds/material-icons/railway_alert.svg create mode 100755 assets/uswds/material-icons/ramen_dining.svg create mode 100644 assets/uswds/material-icons/rate_review.svg create mode 100755 assets/uswds/material-icons/read_more.svg create mode 100644 assets/uswds/material-icons/receipt.svg create mode 100644 assets/uswds/material-icons/receipt_long.svg create mode 100644 assets/uswds/material-icons/recent_actors.svg create mode 100644 assets/uswds/material-icons/recommend.svg create mode 100644 assets/uswds/material-icons/record_voice_over.svg create mode 100644 assets/uswds/material-icons/redeem.svg create mode 100644 assets/uswds/material-icons/redo.svg create mode 100644 assets/uswds/material-icons/reduce_capacity.svg create mode 100644 assets/uswds/material-icons/refresh.svg create mode 100644 assets/uswds/material-icons/remove.svg create mode 100644 assets/uswds/material-icons/remove_circle.svg create mode 100644 assets/uswds/material-icons/remove_circle_outline.svg create mode 100644 assets/uswds/material-icons/remove_done.svg create mode 100644 assets/uswds/material-icons/remove_from_queue.svg create mode 100644 assets/uswds/material-icons/remove_moderator.svg create mode 100644 assets/uswds/material-icons/remove_red_eye.svg create mode 100644 assets/uswds/material-icons/remove_shopping_cart.svg create mode 100644 assets/uswds/material-icons/reorder.svg create mode 100644 assets/uswds/material-icons/repeat.svg create mode 100644 assets/uswds/material-icons/repeat_on.svg create mode 100644 assets/uswds/material-icons/repeat_one.svg create mode 100644 assets/uswds/material-icons/repeat_one_on.svg create mode 100644 assets/uswds/material-icons/replay.svg create mode 100644 assets/uswds/material-icons/replay_10.svg create mode 100644 assets/uswds/material-icons/replay_30.svg create mode 100644 assets/uswds/material-icons/replay_5.svg create mode 100755 assets/uswds/material-icons/replay_circle_filled.svg create mode 100644 assets/uswds/material-icons/reply.svg create mode 100644 assets/uswds/material-icons/reply_all.svg create mode 100644 assets/uswds/material-icons/report.svg create mode 100644 assets/uswds/material-icons/report_off.svg create mode 100644 assets/uswds/material-icons/report_problem.svg create mode 100644 assets/uswds/material-icons/request_page.svg create mode 100644 assets/uswds/material-icons/request_quote.svg create mode 100644 assets/uswds/material-icons/reset_tv.svg create mode 100644 assets/uswds/material-icons/restaurant.svg create mode 100644 assets/uswds/material-icons/restaurant_menu.svg create mode 100644 assets/uswds/material-icons/restore.svg create mode 100644 assets/uswds/material-icons/restore_from_trash.svg create mode 100644 assets/uswds/material-icons/restore_page.svg create mode 100644 assets/uswds/material-icons/rice_bowl.svg create mode 100644 assets/uswds/material-icons/ring_volume.svg create mode 100644 assets/uswds/material-icons/roofing.svg create mode 100644 assets/uswds/material-icons/room.svg create mode 100644 assets/uswds/material-icons/room_preferences.svg create mode 100644 assets/uswds/material-icons/room_service.svg create mode 100644 assets/uswds/material-icons/rotate_90_degrees_ccw.svg create mode 100644 assets/uswds/material-icons/rotate_left.svg create mode 100644 assets/uswds/material-icons/rotate_right.svg create mode 100644 assets/uswds/material-icons/rounded_corner.svg create mode 100644 assets/uswds/material-icons/router.svg create mode 100644 assets/uswds/material-icons/rowing.svg create mode 100644 assets/uswds/material-icons/rss_feed.svg create mode 100644 assets/uswds/material-icons/rtt.svg create mode 100644 assets/uswds/material-icons/rule.svg create mode 100644 assets/uswds/material-icons/rule_folder.svg create mode 100755 assets/uswds/material-icons/run_circle.svg create mode 100644 assets/uswds/material-icons/rv_hookup.svg create mode 100644 assets/uswds/material-icons/safety_divider.svg create mode 100644 assets/uswds/material-icons/sanitizer.svg create mode 100644 assets/uswds/material-icons/satellite.svg create mode 100644 assets/uswds/material-icons/save.svg create mode 100644 assets/uswds/material-icons/save_alt.svg create mode 100644 assets/uswds/material-icons/saved_search.svg create mode 100644 assets/uswds/material-icons/scanner.svg create mode 100644 assets/uswds/material-icons/scatter_plot.svg create mode 100644 assets/uswds/material-icons/schedule.svg create mode 100644 assets/uswds/material-icons/schedule_send.svg create mode 100644 assets/uswds/material-icons/school.svg create mode 100755 assets/uswds/material-icons/science.svg create mode 100644 assets/uswds/material-icons/score.svg create mode 100644 assets/uswds/material-icons/screen_lock_landscape.svg create mode 100644 assets/uswds/material-icons/screen_lock_portrait.svg create mode 100644 assets/uswds/material-icons/screen_lock_rotation.svg create mode 100644 assets/uswds/material-icons/screen_rotation.svg create mode 100644 assets/uswds/material-icons/screen_search_desktop.svg create mode 100644 assets/uswds/material-icons/screen_share.svg create mode 100644 assets/uswds/material-icons/sd.svg create mode 100644 assets/uswds/material-icons/sd_card.svg create mode 100644 assets/uswds/material-icons/sd_storage.svg create mode 100644 assets/uswds/material-icons/search.svg create mode 100755 assets/uswds/material-icons/search_off.svg create mode 100644 assets/uswds/material-icons/security.svg create mode 100644 assets/uswds/material-icons/segment.svg create mode 100644 assets/uswds/material-icons/select_all.svg create mode 100755 assets/uswds/material-icons/self_improvement.svg create mode 100644 assets/uswds/material-icons/send.svg create mode 100755 assets/uswds/material-icons/send_and_archive.svg create mode 100644 assets/uswds/material-icons/send_to_mobile.svg create mode 100755 assets/uswds/material-icons/sensor_door.svg create mode 100755 assets/uswds/material-icons/sensor_window.svg create mode 100644 assets/uswds/material-icons/sentiment_dissatisfied.svg create mode 100644 assets/uswds/material-icons/sentiment_neutral.svg create mode 100644 assets/uswds/material-icons/sentiment_satisfied.svg create mode 100644 assets/uswds/material-icons/sentiment_satisfied_alt.svg create mode 100644 assets/uswds/material-icons/sentiment_very_dissatisfied.svg create mode 100644 assets/uswds/material-icons/sentiment_very_satisfied.svg create mode 100644 assets/uswds/material-icons/set_meal.svg create mode 100644 assets/uswds/material-icons/settings.svg create mode 100644 assets/uswds/material-icons/settings_applications.svg create mode 100644 assets/uswds/material-icons/settings_backup_restore.svg create mode 100644 assets/uswds/material-icons/settings_bluetooth.svg create mode 100644 assets/uswds/material-icons/settings_brightness.svg create mode 100644 assets/uswds/material-icons/settings_cell.svg create mode 100644 assets/uswds/material-icons/settings_ethernet.svg create mode 100644 assets/uswds/material-icons/settings_input_antenna.svg create mode 100644 assets/uswds/material-icons/settings_input_component.svg create mode 100644 assets/uswds/material-icons/settings_input_composite.svg create mode 100644 assets/uswds/material-icons/settings_input_hdmi.svg create mode 100644 assets/uswds/material-icons/settings_input_svideo.svg create mode 100644 assets/uswds/material-icons/settings_overscan.svg create mode 100644 assets/uswds/material-icons/settings_phone.svg create mode 100644 assets/uswds/material-icons/settings_power.svg create mode 100644 assets/uswds/material-icons/settings_remote.svg create mode 100644 assets/uswds/material-icons/settings_system_daydream.svg create mode 100644 assets/uswds/material-icons/settings_voice.svg create mode 100644 assets/uswds/material-icons/share.svg create mode 100644 assets/uswds/material-icons/shield.svg create mode 100644 assets/uswds/material-icons/shop.svg create mode 100644 assets/uswds/material-icons/shop_two.svg create mode 100644 assets/uswds/material-icons/shopping_bag.svg create mode 100644 assets/uswds/material-icons/shopping_basket.svg create mode 100644 assets/uswds/material-icons/shopping_cart.svg create mode 100644 assets/uswds/material-icons/short_text.svg create mode 100644 assets/uswds/material-icons/show_chart.svg create mode 100644 assets/uswds/material-icons/shuffle.svg create mode 100644 assets/uswds/material-icons/shuffle_on.svg create mode 100644 assets/uswds/material-icons/shutter_speed.svg create mode 100644 assets/uswds/material-icons/sick.svg create mode 100644 assets/uswds/material-icons/signal_cellular_0_bar.svg create mode 100644 assets/uswds/material-icons/signal_cellular_4_bar.svg create mode 100644 assets/uswds/material-icons/signal_cellular_alt.svg create mode 100644 assets/uswds/material-icons/signal_cellular_connected_no_internet_4_bar.svg create mode 100644 assets/uswds/material-icons/signal_cellular_no_sim.svg create mode 100644 assets/uswds/material-icons/signal_cellular_null.svg create mode 100644 assets/uswds/material-icons/signal_cellular_off.svg create mode 100644 assets/uswds/material-icons/signal_wifi_0_bar.svg create mode 100644 assets/uswds/material-icons/signal_wifi_4_bar.svg create mode 100644 assets/uswds/material-icons/signal_wifi_4_bar_lock.svg create mode 100644 assets/uswds/material-icons/signal_wifi_off.svg create mode 100644 assets/uswds/material-icons/sim_card.svg create mode 100644 assets/uswds/material-icons/sim_card_alert.svg create mode 100755 assets/uswds/material-icons/single_bed.svg create mode 100644 assets/uswds/material-icons/skip_next.svg create mode 100644 assets/uswds/material-icons/skip_previous.svg create mode 100644 assets/uswds/material-icons/slideshow.svg create mode 100644 assets/uswds/material-icons/slow_motion_video.svg create mode 100644 assets/uswds/material-icons/smart_button.svg create mode 100644 assets/uswds/material-icons/smartphone.svg create mode 100644 assets/uswds/material-icons/smoke_free.svg create mode 100644 assets/uswds/material-icons/smoking_rooms.svg create mode 100644 assets/uswds/material-icons/sms.svg create mode 100644 assets/uswds/material-icons/sms_failed.svg create mode 100644 assets/uswds/material-icons/snippet_folder.svg create mode 100644 assets/uswds/material-icons/snooze.svg create mode 100644 assets/uswds/material-icons/soap.svg create mode 100644 assets/uswds/material-icons/social_distance.svg create mode 100644 assets/uswds/material-icons/sort.svg create mode 100644 assets/uswds/material-icons/sort_by_alpha.svg create mode 100644 assets/uswds/material-icons/source.svg create mode 100644 assets/uswds/material-icons/south.svg create mode 100644 assets/uswds/material-icons/south_east.svg create mode 100644 assets/uswds/material-icons/south_west.svg create mode 100644 assets/uswds/material-icons/spa.svg create mode 100644 assets/uswds/material-icons/space_bar.svg create mode 100644 assets/uswds/material-icons/speaker.svg create mode 100644 assets/uswds/material-icons/speaker_group.svg create mode 100644 assets/uswds/material-icons/speaker_notes.svg create mode 100644 assets/uswds/material-icons/speaker_notes_off.svg create mode 100644 assets/uswds/material-icons/speaker_phone.svg create mode 100644 assets/uswds/material-icons/speed.svg create mode 100644 assets/uswds/material-icons/spellcheck.svg create mode 100755 assets/uswds/material-icons/sports.svg create mode 100644 assets/uswds/material-icons/sports_bar.svg create mode 100755 assets/uswds/material-icons/sports_baseball.svg create mode 100755 assets/uswds/material-icons/sports_basketball.svg create mode 100755 assets/uswds/material-icons/sports_cricket.svg create mode 100755 assets/uswds/material-icons/sports_esports.svg create mode 100755 assets/uswds/material-icons/sports_football.svg create mode 100755 assets/uswds/material-icons/sports_golf.svg create mode 100755 assets/uswds/material-icons/sports_handball.svg create mode 100755 assets/uswds/material-icons/sports_hockey.svg create mode 100755 assets/uswds/material-icons/sports_kabaddi.svg create mode 100755 assets/uswds/material-icons/sports_mma.svg create mode 100755 assets/uswds/material-icons/sports_motorsports.svg create mode 100755 assets/uswds/material-icons/sports_rugby.svg create mode 100755 assets/uswds/material-icons/sports_soccer.svg create mode 100755 assets/uswds/material-icons/sports_tennis.svg create mode 100755 assets/uswds/material-icons/sports_volleyball.svg create mode 100755 assets/uswds/material-icons/square_foot.svg create mode 100644 assets/uswds/material-icons/stacked_bar_chart.svg create mode 100644 assets/uswds/material-icons/stacked_line_chart.svg create mode 100644 assets/uswds/material-icons/stairs.svg create mode 100644 assets/uswds/material-icons/star.svg create mode 100644 assets/uswds/material-icons/star_border.svg create mode 100644 assets/uswds/material-icons/star_half.svg create mode 100644 assets/uswds/material-icons/star_outline.svg create mode 100755 assets/uswds/material-icons/star_rate.svg create mode 100644 assets/uswds/material-icons/stars.svg create mode 100644 assets/uswds/material-icons/stay_current_landscape.svg create mode 100644 assets/uswds/material-icons/stay_current_portrait.svg create mode 100644 assets/uswds/material-icons/stay_primary_landscape.svg create mode 100644 assets/uswds/material-icons/stay_primary_portrait.svg create mode 100644 assets/uswds/material-icons/sticky_note_2.svg create mode 100644 assets/uswds/material-icons/stop.svg create mode 100755 assets/uswds/material-icons/stop_circle.svg create mode 100644 assets/uswds/material-icons/stop_screen_share.svg create mode 100644 assets/uswds/material-icons/storage.svg create mode 100644 assets/uswds/material-icons/store.svg create mode 100644 assets/uswds/material-icons/store_mall_directory.svg create mode 100644 assets/uswds/material-icons/storefront.svg create mode 100644 assets/uswds/material-icons/straighten.svg create mode 100644 assets/uswds/material-icons/stream.svg create mode 100644 assets/uswds/material-icons/streetview.svg create mode 100644 assets/uswds/material-icons/strikethrough_s.svg create mode 100644 assets/uswds/material-icons/stroller.svg create mode 100644 assets/uswds/material-icons/style.svg create mode 100644 assets/uswds/material-icons/subdirectory_arrow_left.svg create mode 100644 assets/uswds/material-icons/subdirectory_arrow_right.svg create mode 100644 assets/uswds/material-icons/subject.svg create mode 100755 assets/uswds/material-icons/subscript.svg create mode 100644 assets/uswds/material-icons/subscriptions.svg create mode 100644 assets/uswds/material-icons/subtitles.svg create mode 100755 assets/uswds/material-icons/subtitles_off.svg create mode 100644 assets/uswds/material-icons/subway.svg create mode 100755 assets/uswds/material-icons/superscript.svg create mode 100644 assets/uswds/material-icons/supervised_user_circle.svg create mode 100644 assets/uswds/material-icons/supervisor_account.svg create mode 100755 assets/uswds/material-icons/support.svg create mode 100755 assets/uswds/material-icons/support_agent.svg create mode 100644 assets/uswds/material-icons/surround_sound.svg create mode 100644 assets/uswds/material-icons/swap_calls.svg create mode 100644 assets/uswds/material-icons/swap_horiz.svg create mode 100644 assets/uswds/material-icons/swap_horizontal_circle.svg create mode 100644 assets/uswds/material-icons/swap_vert.svg create mode 100644 assets/uswds/material-icons/swap_vertical_circle.svg create mode 100644 assets/uswds/material-icons/swipe.svg create mode 100644 assets/uswds/material-icons/switch_account.svg create mode 100644 assets/uswds/material-icons/switch_camera.svg create mode 100644 assets/uswds/material-icons/switch_left.svg create mode 100644 assets/uswds/material-icons/switch_right.svg create mode 100644 assets/uswds/material-icons/switch_video.svg create mode 100644 assets/uswds/material-icons/sync.svg create mode 100755 assets/uswds/material-icons/sync_alt.svg create mode 100644 assets/uswds/material-icons/sync_disabled.svg create mode 100644 assets/uswds/material-icons/sync_problem.svg create mode 100644 assets/uswds/material-icons/system_update.svg create mode 100644 assets/uswds/material-icons/system_update_alt.svg create mode 100644 assets/uswds/material-icons/tab.svg create mode 100644 assets/uswds/material-icons/tab_unselected.svg create mode 100644 assets/uswds/material-icons/table_chart.svg create mode 100755 assets/uswds/material-icons/table_rows.svg create mode 100644 assets/uswds/material-icons/table_view.svg create mode 100644 assets/uswds/material-icons/tablet.svg create mode 100644 assets/uswds/material-icons/tablet_android.svg create mode 100644 assets/uswds/material-icons/tablet_mac.svg create mode 100644 assets/uswds/material-icons/tag.svg create mode 100644 assets/uswds/material-icons/tag_faces.svg create mode 100755 assets/uswds/material-icons/takeout_dining.svg create mode 100644 assets/uswds/material-icons/tap_and_play.svg create mode 100644 assets/uswds/material-icons/tapas.svg create mode 100644 assets/uswds/material-icons/taxi_alert.svg create mode 100644 assets/uswds/material-icons/terrain.svg create mode 100644 assets/uswds/material-icons/text_fields.svg create mode 100644 assets/uswds/material-icons/text_format.svg create mode 100644 assets/uswds/material-icons/text_rotate_up.svg create mode 100644 assets/uswds/material-icons/text_rotate_vertical.svg create mode 100644 assets/uswds/material-icons/text_rotation_angledown.svg create mode 100644 assets/uswds/material-icons/text_rotation_angleup.svg create mode 100644 assets/uswds/material-icons/text_rotation_down.svg create mode 100644 assets/uswds/material-icons/text_rotation_none.svg create mode 100644 assets/uswds/material-icons/text_snippet.svg create mode 100644 assets/uswds/material-icons/textsms.svg create mode 100644 assets/uswds/material-icons/texture.svg create mode 100755 assets/uswds/material-icons/theater_comedy.svg create mode 100644 assets/uswds/material-icons/theaters.svg create mode 100644 assets/uswds/material-icons/thumb_down.svg create mode 100644 assets/uswds/material-icons/thumb_down_alt.svg create mode 100644 assets/uswds/material-icons/thumb_down_off_alt.svg create mode 100644 assets/uswds/material-icons/thumb_up.svg create mode 100644 assets/uswds/material-icons/thumb_up_alt.svg create mode 100644 assets/uswds/material-icons/thumb_up_off_alt.svg create mode 100644 assets/uswds/material-icons/thumbs_up_down.svg create mode 100644 assets/uswds/material-icons/time_to_leave.svg create mode 100644 assets/uswds/material-icons/timelapse.svg create mode 100644 assets/uswds/material-icons/timeline.svg create mode 100644 assets/uswds/material-icons/timer.svg create mode 100644 assets/uswds/material-icons/timer_10.svg create mode 100644 assets/uswds/material-icons/timer_3.svg create mode 100644 assets/uswds/material-icons/timer_off.svg create mode 100644 assets/uswds/material-icons/title.svg create mode 100644 assets/uswds/material-icons/toc.svg create mode 100644 assets/uswds/material-icons/today.svg create mode 100644 assets/uswds/material-icons/toggle_off.svg create mode 100644 assets/uswds/material-icons/toggle_on.svg create mode 100644 assets/uswds/material-icons/toll.svg create mode 100644 assets/uswds/material-icons/tonality.svg create mode 100644 assets/uswds/material-icons/topic.svg create mode 100644 assets/uswds/material-icons/touch_app.svg create mode 100644 assets/uswds/material-icons/tour.svg create mode 100644 assets/uswds/material-icons/toys.svg create mode 100644 assets/uswds/material-icons/track_changes.svg create mode 100644 assets/uswds/material-icons/traffic.svg create mode 100644 assets/uswds/material-icons/train.svg create mode 100644 assets/uswds/material-icons/tram.svg create mode 100644 assets/uswds/material-icons/transfer_within_a_station.svg create mode 100644 assets/uswds/material-icons/transform.svg create mode 100644 assets/uswds/material-icons/transit_enterexit.svg create mode 100644 assets/uswds/material-icons/translate.svg create mode 100644 assets/uswds/material-icons/trending_down.svg create mode 100644 assets/uswds/material-icons/trending_flat.svg create mode 100644 assets/uswds/material-icons/trending_up.svg create mode 100644 assets/uswds/material-icons/trip_origin.svg create mode 100644 assets/uswds/material-icons/tty.svg create mode 100644 assets/uswds/material-icons/tune.svg create mode 100644 assets/uswds/material-icons/turned_in.svg create mode 100644 assets/uswds/material-icons/turned_in_not.svg create mode 100644 assets/uswds/material-icons/tv.svg create mode 100644 assets/uswds/material-icons/tv_off.svg create mode 100755 assets/uswds/material-icons/two_wheeler.svg create mode 100644 assets/uswds/material-icons/umbrella.svg create mode 100644 assets/uswds/material-icons/unarchive.svg create mode 100644 assets/uswds/material-icons/undo.svg create mode 100644 assets/uswds/material-icons/unfold_less.svg create mode 100644 assets/uswds/material-icons/unfold_more.svg create mode 100644 assets/uswds/material-icons/unpublished.svg create mode 100644 assets/uswds/material-icons/unsubscribe.svg create mode 100644 assets/uswds/material-icons/update.svg create mode 100644 assets/uswds/material-icons/update_disabled.svg create mode 100755 assets/uswds/material-icons/upgrade.svg create mode 100644 assets/uswds/material-icons/upload_file.svg create mode 100644 assets/uswds/material-icons/usb.svg create mode 100755 assets/uswds/material-icons/verified.svg create mode 100644 assets/uswds/material-icons/verified_user.svg create mode 100644 assets/uswds/material-icons/vertical_align_bottom.svg create mode 100644 assets/uswds/material-icons/vertical_align_center.svg create mode 100644 assets/uswds/material-icons/vertical_align_top.svg create mode 100644 assets/uswds/material-icons/vertical_distribute.svg create mode 100644 assets/uswds/material-icons/vertical_split.svg create mode 100644 assets/uswds/material-icons/vibration.svg create mode 100644 assets/uswds/material-icons/video_call.svg create mode 100644 assets/uswds/material-icons/video_label.svg create mode 100644 assets/uswds/material-icons/video_library.svg create mode 100755 assets/uswds/material-icons/video_settings.svg create mode 100644 assets/uswds/material-icons/videocam.svg create mode 100644 assets/uswds/material-icons/videocam_off.svg create mode 100644 assets/uswds/material-icons/videogame_asset.svg create mode 100644 assets/uswds/material-icons/view_agenda.svg create mode 100644 assets/uswds/material-icons/view_array.svg create mode 100644 assets/uswds/material-icons/view_carousel.svg create mode 100644 assets/uswds/material-icons/view_column.svg create mode 100644 assets/uswds/material-icons/view_comfy.svg create mode 100644 assets/uswds/material-icons/view_compact.svg create mode 100644 assets/uswds/material-icons/view_day.svg create mode 100644 assets/uswds/material-icons/view_headline.svg create mode 100644 assets/uswds/material-icons/view_in_ar.svg create mode 100644 assets/uswds/material-icons/view_list.svg create mode 100644 assets/uswds/material-icons/view_module.svg create mode 100644 assets/uswds/material-icons/view_quilt.svg create mode 100755 assets/uswds/material-icons/view_sidebar.svg create mode 100644 assets/uswds/material-icons/view_stream.svg create mode 100644 assets/uswds/material-icons/view_week.svg create mode 100644 assets/uswds/material-icons/vignette.svg create mode 100644 assets/uswds/material-icons/visibility.svg create mode 100644 assets/uswds/material-icons/visibility_off.svg create mode 100644 assets/uswds/material-icons/voice_chat.svg create mode 100644 assets/uswds/material-icons/voice_over_off.svg create mode 100644 assets/uswds/material-icons/voicemail.svg create mode 100644 assets/uswds/material-icons/volume_down.svg create mode 100644 assets/uswds/material-icons/volume_mute.svg create mode 100644 assets/uswds/material-icons/volume_off.svg create mode 100644 assets/uswds/material-icons/volume_up.svg create mode 100755 assets/uswds/material-icons/volunteer_activism.svg create mode 100644 assets/uswds/material-icons/vpn_key.svg create mode 100644 assets/uswds/material-icons/vpn_lock.svg create mode 100644 assets/uswds/material-icons/wallpaper.svg create mode 100644 assets/uswds/material-icons/warning.svg create mode 100644 assets/uswds/material-icons/wash.svg create mode 100644 assets/uswds/material-icons/watch.svg create mode 100644 assets/uswds/material-icons/watch_later.svg create mode 100644 assets/uswds/material-icons/water_damage.svg create mode 100644 assets/uswds/material-icons/waterfall_chart.svg create mode 100644 assets/uswds/material-icons/waves.svg create mode 100644 assets/uswds/material-icons/wb_auto.svg create mode 100644 assets/uswds/material-icons/wb_cloudy.svg create mode 100644 assets/uswds/material-icons/wb_incandescent.svg create mode 100644 assets/uswds/material-icons/wb_iridescent.svg create mode 100644 assets/uswds/material-icons/wb_shade.svg create mode 100644 assets/uswds/material-icons/wb_sunny.svg create mode 100644 assets/uswds/material-icons/wb_twighlight.svg create mode 100644 assets/uswds/material-icons/wc.svg create mode 100644 assets/uswds/material-icons/web.svg create mode 100644 assets/uswds/material-icons/web_asset.svg create mode 100644 assets/uswds/material-icons/weekend.svg create mode 100644 assets/uswds/material-icons/west.svg create mode 100644 assets/uswds/material-icons/whatshot.svg create mode 100644 assets/uswds/material-icons/wheelchair_pickup.svg create mode 100644 assets/uswds/material-icons/where_to_vote.svg create mode 100644 assets/uswds/material-icons/widgets.svg create mode 100644 assets/uswds/material-icons/wifi.svg create mode 100755 assets/uswds/material-icons/wifi_calling.svg create mode 100644 assets/uswds/material-icons/wifi_lock.svg create mode 100644 assets/uswds/material-icons/wifi_off.svg create mode 100755 assets/uswds/material-icons/wifi_protected_setup.svg create mode 100644 assets/uswds/material-icons/wifi_tethering.svg create mode 100644 assets/uswds/material-icons/wine_bar.svg create mode 100644 assets/uswds/material-icons/work.svg create mode 100644 assets/uswds/material-icons/work_off.svg create mode 100644 assets/uswds/material-icons/work_outline.svg create mode 100644 assets/uswds/material-icons/workspaces_filled.svg create mode 100644 assets/uswds/material-icons/workspaces_outline.svg create mode 100644 assets/uswds/material-icons/wrap_text.svg create mode 100755 assets/uswds/material-icons/wrong_location.svg create mode 100644 assets/uswds/material-icons/wysiwyg.svg create mode 100644 assets/uswds/material-icons/youtube_searched_for.svg create mode 100644 assets/uswds/material-icons/zoom_in.svg create mode 100644 assets/uswds/material-icons/zoom_out.svg create mode 100644 assets/uswds/material-icons/zoom_out_map.svg create mode 100644 assets/uswds/minus-alt.svg create mode 100644 assets/uswds/minus.svg create mode 100644 assets/uswds/plus-alt.svg create mode 100644 assets/uswds/plus.svg create mode 100755 assets/uswds/search-alt.svg create mode 100644 assets/uswds/search-primary.svg create mode 100755 assets/uswds/search.svg create mode 100644 assets/uswds/social-icons/facebook25.png create mode 100755 assets/uswds/social-icons/facebook25.svg create mode 100644 assets/uswds/social-icons/instagram25.png create mode 100644 assets/uswds/social-icons/instagram25.svg create mode 100644 assets/uswds/social-icons/rss25.png create mode 100755 assets/uswds/social-icons/rss25.svg create mode 100644 assets/uswds/social-icons/twitter16.png create mode 100755 assets/uswds/social-icons/twitter16.svg create mode 100644 assets/uswds/social-icons/youtube15.png create mode 100755 assets/uswds/social-icons/youtube15.svg create mode 100644 assets/uswds/sprite.svg create mode 100644 assets/uswds/us_flag_small.png create mode 100644 assets/uswds/usa-icons-bg/add--white.svg create mode 100644 assets/uswds/usa-icons-bg/check--blue-60v.svg create mode 100644 assets/uswds/usa-icons-bg/check_circle--white.svg create mode 100644 assets/uswds/usa-icons-bg/error--white.svg create mode 100644 assets/uswds/usa-icons-bg/expand_less--white.svg create mode 100644 assets/uswds/usa-icons-bg/expand_more--blue-warm-70v.svg create mode 100644 assets/uswds/usa-icons-bg/expand_more--white.svg create mode 100644 assets/uswds/usa-icons-bg/info--white.svg create mode 100644 assets/uswds/usa-icons-bg/launch--blue-60v.svg create mode 100644 assets/uswds/usa-icons-bg/launch--blue-70v.svg create mode 100644 assets/uswds/usa-icons-bg/launch--gray-5.svg create mode 100644 assets/uswds/usa-icons-bg/launch--white.svg create mode 100644 assets/uswds/usa-icons-bg/remove--white.svg create mode 100644 assets/uswds/usa-icons-bg/search--white.svg create mode 100644 assets/uswds/usa-icons-bg/warning--white.svg create mode 100644 assets/uswds/usa-icons/accessibility_new.svg create mode 100644 assets/uswds/usa-icons/accessible_forward.svg create mode 100644 assets/uswds/usa-icons/account_balance.svg create mode 100644 assets/uswds/usa-icons/account_box.svg create mode 100644 assets/uswds/usa-icons/account_circle.svg create mode 100644 assets/uswds/usa-icons/add.svg create mode 100644 assets/uswds/usa-icons/add_circle.svg create mode 100644 assets/uswds/usa-icons/add_circle_outline.svg create mode 100644 assets/uswds/usa-icons/alarm.svg create mode 100644 assets/uswds/usa-icons/alternate_email.svg create mode 100644 assets/uswds/usa-icons/announcement.svg create mode 100644 assets/uswds/usa-icons/api.svg create mode 100644 assets/uswds/usa-icons/arrow_back.svg create mode 100644 assets/uswds/usa-icons/arrow_downward.svg create mode 100644 assets/uswds/usa-icons/arrow_drop_down.svg create mode 100644 assets/uswds/usa-icons/arrow_drop_up.svg create mode 100644 assets/uswds/usa-icons/arrow_forward.svg create mode 100644 assets/uswds/usa-icons/arrow_upward.svg create mode 100644 assets/uswds/usa-icons/assessment.svg create mode 100644 assets/uswds/usa-icons/attach_file.svg create mode 100644 assets/uswds/usa-icons/attach_money.svg create mode 100644 assets/uswds/usa-icons/autorenew.svg create mode 100644 assets/uswds/usa-icons/backpack.svg create mode 100755 assets/uswds/usa-icons/bathtub.svg create mode 100644 assets/uswds/usa-icons/bedding.svg create mode 100644 assets/uswds/usa-icons/bookmark.svg create mode 100644 assets/uswds/usa-icons/bug_report.svg create mode 100644 assets/uswds/usa-icons/build.svg create mode 100644 assets/uswds/usa-icons/calendar_today.svg create mode 100644 assets/uswds/usa-icons/campaign.svg create mode 100644 assets/uswds/usa-icons/camping.svg create mode 100644 assets/uswds/usa-icons/cancel.svg create mode 100644 assets/uswds/usa-icons/chat.svg create mode 100644 assets/uswds/usa-icons/check.svg create mode 100644 assets/uswds/usa-icons/check_box_outline_blank.svg create mode 100644 assets/uswds/usa-icons/check_circle.svg create mode 100644 assets/uswds/usa-icons/check_circle_outline.svg create mode 100644 assets/uswds/usa-icons/checkroom.svg create mode 100755 assets/uswds/usa-icons/chevron_left.svg create mode 100755 assets/uswds/usa-icons/chevron_right.svg create mode 100644 assets/uswds/usa-icons/clean_hands.svg create mode 100644 assets/uswds/usa-icons/close.svg create mode 100644 assets/uswds/usa-icons/closed_caption.svg create mode 100644 assets/uswds/usa-icons/clothes.svg create mode 100644 assets/uswds/usa-icons/cloud.svg create mode 100644 assets/uswds/usa-icons/code.svg create mode 100644 assets/uswds/usa-icons/comment.svg create mode 100644 assets/uswds/usa-icons/connect_without_contact.svg create mode 100755 assets/uswds/usa-icons/construction.svg create mode 100644 assets/uswds/usa-icons/construction_worker.svg create mode 100644 assets/uswds/usa-icons/contact_page.svg create mode 100644 assets/uswds/usa-icons/content_copy.svg create mode 100644 assets/uswds/usa-icons/coronavirus.svg create mode 100644 assets/uswds/usa-icons/credit_card.svg create mode 100755 assets/uswds/usa-icons/deck.svg create mode 100644 assets/uswds/usa-icons/delete.svg create mode 100644 assets/uswds/usa-icons/device_thermostat.svg create mode 100644 assets/uswds/usa-icons/directions.svg create mode 100644 assets/uswds/usa-icons/directions_bike.svg create mode 100644 assets/uswds/usa-icons/directions_bus.svg create mode 100644 assets/uswds/usa-icons/directions_car.svg create mode 100644 assets/uswds/usa-icons/directions_walk.svg create mode 100644 assets/uswds/usa-icons/do_not_disturb.svg create mode 100644 assets/uswds/usa-icons/do_not_touch.svg create mode 100644 assets/uswds/usa-icons/drag_handle.svg create mode 100755 assets/uswds/usa-icons/eco.svg create mode 100644 assets/uswds/usa-icons/edit.svg create mode 100755 assets/uswds/usa-icons/electrical_services.svg create mode 100755 assets/uswds/usa-icons/emoji_events.svg create mode 100644 assets/uswds/usa-icons/error.svg create mode 100644 assets/uswds/usa-icons/error_outline.svg create mode 100644 assets/uswds/usa-icons/event.svg create mode 100644 assets/uswds/usa-icons/expand_less.svg create mode 100644 assets/uswds/usa-icons/expand_more.svg create mode 100644 assets/uswds/usa-icons/facebook.svg create mode 100644 assets/uswds/usa-icons/fast_forward.svg create mode 100644 assets/uswds/usa-icons/fast_rewind.svg create mode 100644 assets/uswds/usa-icons/favorite.svg create mode 100644 assets/uswds/usa-icons/favorite_border.svg create mode 100644 assets/uswds/usa-icons/file_download.svg create mode 100644 assets/uswds/usa-icons/file_present.svg create mode 100644 assets/uswds/usa-icons/file_upload.svg create mode 100644 assets/uswds/usa-icons/filter_alt.svg create mode 100644 assets/uswds/usa-icons/filter_list.svg create mode 100644 assets/uswds/usa-icons/fingerprint.svg create mode 100644 assets/uswds/usa-icons/first_page.svg create mode 100644 assets/uswds/usa-icons/flag.svg create mode 100644 assets/uswds/usa-icons/flickr.svg create mode 100644 assets/uswds/usa-icons/flight.svg create mode 100644 assets/uswds/usa-icons/flooding.svg create mode 100644 assets/uswds/usa-icons/folder.svg create mode 100644 assets/uswds/usa-icons/folder_open.svg create mode 100644 assets/uswds/usa-icons/format_quote.svg create mode 100644 assets/uswds/usa-icons/format_size.svg create mode 100644 assets/uswds/usa-icons/forum.svg create mode 100644 assets/uswds/usa-icons/github.svg create mode 100644 assets/uswds/usa-icons/grid_view.svg create mode 100644 assets/uswds/usa-icons/group_add.svg create mode 100644 assets/uswds/usa-icons/groups.svg create mode 100644 assets/uswds/usa-icons/hearing.svg create mode 100644 assets/uswds/usa-icons/help.svg create mode 100644 assets/uswds/usa-icons/help_outline.svg create mode 100644 assets/uswds/usa-icons/highlight_off.svg create mode 100644 assets/uswds/usa-icons/history.svg create mode 100644 assets/uswds/usa-icons/home.svg create mode 100644 assets/uswds/usa-icons/hospital.svg create mode 100644 assets/uswds/usa-icons/hotel.svg create mode 100644 assets/uswds/usa-icons/hourglass_empty.svg create mode 100644 assets/uswds/usa-icons/hurricane.svg create mode 100644 assets/uswds/usa-icons/identification.svg create mode 100644 assets/uswds/usa-icons/image.svg create mode 100644 assets/uswds/usa-icons/info.svg create mode 100644 assets/uswds/usa-icons/info_outline.svg create mode 100755 assets/uswds/usa-icons/insights.svg create mode 100644 assets/uswds/usa-icons/instagram.svg create mode 100644 assets/uswds/usa-icons/keyboard.svg create mode 100644 assets/uswds/usa-icons/label.svg create mode 100644 assets/uswds/usa-icons/language.svg create mode 100644 assets/uswds/usa-icons/last_page.svg create mode 100644 assets/uswds/usa-icons/launch.svg create mode 100644 assets/uswds/usa-icons/lightbulb.svg create mode 100644 assets/uswds/usa-icons/lightbulb_outline.svg create mode 100644 assets/uswds/usa-icons/link.svg create mode 100644 assets/uswds/usa-icons/link_off.svg create mode 100644 assets/uswds/usa-icons/list.svg create mode 100644 assets/uswds/usa-icons/local_cafe.svg create mode 100644 assets/uswds/usa-icons/local_fire_department.svg create mode 100644 assets/uswds/usa-icons/local_gas_station.svg create mode 100644 assets/uswds/usa-icons/local_grocery_store.svg create mode 100644 assets/uswds/usa-icons/local_hospital.svg create mode 100644 assets/uswds/usa-icons/local_laundry_service.svg create mode 100644 assets/uswds/usa-icons/local_library.svg create mode 100644 assets/uswds/usa-icons/local_offer.svg create mode 100644 assets/uswds/usa-icons/local_parking.svg create mode 100644 assets/uswds/usa-icons/local_pharmacy.svg create mode 100644 assets/uswds/usa-icons/local_police.svg create mode 100644 assets/uswds/usa-icons/local_taxi.svg create mode 100644 assets/uswds/usa-icons/location_city.svg create mode 100644 assets/uswds/usa-icons/location_on.svg create mode 100644 assets/uswds/usa-icons/lock.svg create mode 100644 assets/uswds/usa-icons/lock_open.svg create mode 100644 assets/uswds/usa-icons/lock_outline.svg create mode 100755 assets/uswds/usa-icons/login.svg create mode 100644 assets/uswds/usa-icons/logout.svg create mode 100644 assets/uswds/usa-icons/loop.svg create mode 100644 assets/uswds/usa-icons/mail.svg create mode 100644 assets/uswds/usa-icons/mail_outline.svg create mode 100644 assets/uswds/usa-icons/map.svg create mode 100644 assets/uswds/usa-icons/masks.svg create mode 100755 assets/uswds/usa-icons/medical_services.svg create mode 100644 assets/uswds/usa-icons/menu.svg create mode 100755 assets/uswds/usa-icons/military_tech.svg create mode 100644 assets/uswds/usa-icons/more_horiz.svg create mode 100644 assets/uswds/usa-icons/more_vert.svg create mode 100644 assets/uswds/usa-icons/my_location.svg create mode 100644 assets/uswds/usa-icons/navigate_before.svg create mode 100644 assets/uswds/usa-icons/navigate_far_before.svg create mode 100644 assets/uswds/usa-icons/navigate_far_next.svg create mode 100644 assets/uswds/usa-icons/navigate_next.svg create mode 100644 assets/uswds/usa-icons/near_me.svg create mode 100644 assets/uswds/usa-icons/notifications.svg create mode 100644 assets/uswds/usa-icons/notifications_active.svg create mode 100644 assets/uswds/usa-icons/notifications_none.svg create mode 100644 assets/uswds/usa-icons/notifications_off.svg create mode 100755 assets/uswds/usa-icons/park.svg create mode 100644 assets/uswds/usa-icons/people.svg create mode 100644 assets/uswds/usa-icons/person.svg create mode 100644 assets/uswds/usa-icons/pets.svg create mode 100644 assets/uswds/usa-icons/phone.svg create mode 100644 assets/uswds/usa-icons/photo_camera.svg create mode 100644 assets/uswds/usa-icons/print.svg create mode 100644 assets/uswds/usa-icons/priority_high.svg create mode 100644 assets/uswds/usa-icons/public.svg create mode 100755 assets/uswds/usa-icons/push_pin.svg create mode 100644 assets/uswds/usa-icons/radio_button_unchecked.svg create mode 100644 assets/uswds/usa-icons/rain.svg create mode 100644 assets/uswds/usa-icons/reduce_capacity.svg create mode 100644 assets/uswds/usa-icons/remove.svg create mode 100644 assets/uswds/usa-icons/report.svg create mode 100644 assets/uswds/usa-icons/restaurant.svg create mode 100644 assets/uswds/usa-icons/rss_feed.svg create mode 100644 assets/uswds/usa-icons/safety_divider.svg create mode 100644 assets/uswds/usa-icons/sanitizer.svg create mode 100644 assets/uswds/usa-icons/save_alt.svg create mode 100644 assets/uswds/usa-icons/schedule.svg create mode 100644 assets/uswds/usa-icons/school.svg create mode 100755 assets/uswds/usa-icons/science.svg create mode 100644 assets/uswds/usa-icons/search.svg create mode 100644 assets/uswds/usa-icons/security.svg create mode 100644 assets/uswds/usa-icons/send.svg create mode 100644 assets/uswds/usa-icons/sentiment_dissatisfied.svg create mode 100644 assets/uswds/usa-icons/sentiment_neutral.svg create mode 100644 assets/uswds/usa-icons/sentiment_satisfied.svg create mode 100644 assets/uswds/usa-icons/sentiment_satisfied_alt.svg create mode 100644 assets/uswds/usa-icons/sentiment_very_dissatisfied.svg create mode 100644 assets/uswds/usa-icons/settings.svg create mode 100644 assets/uswds/usa-icons/severe_weather.svg create mode 100644 assets/uswds/usa-icons/share.svg create mode 100644 assets/uswds/usa-icons/shield.svg create mode 100644 assets/uswds/usa-icons/shopping_basket.svg create mode 100644 assets/uswds/usa-icons/snow.svg create mode 100644 assets/uswds/usa-icons/soap.svg create mode 100644 assets/uswds/usa-icons/social_distance.svg create mode 100644 assets/uswds/usa-icons/sort_arrow.svg create mode 100644 assets/uswds/usa-icons/spellcheck.svg create mode 100644 assets/uswds/usa-icons/star.svg create mode 100644 assets/uswds/usa-icons/star_half.svg create mode 100644 assets/uswds/usa-icons/star_outline.svg create mode 100644 assets/uswds/usa-icons/store.svg create mode 100755 assets/uswds/usa-icons/support.svg create mode 100755 assets/uswds/usa-icons/support_agent.svg create mode 100644 assets/uswds/usa-icons/text_fields.svg create mode 100755 assets/uswds/usa-icons/thumb_down_alt.svg create mode 100644 assets/uswds/usa-icons/thumb_up_alt.svg create mode 100644 assets/uswds/usa-icons/timer.svg create mode 100644 assets/uswds/usa-icons/toggle_off.svg create mode 100644 assets/uswds/usa-icons/toggle_on.svg create mode 100644 assets/uswds/usa-icons/topic.svg create mode 100644 assets/uswds/usa-icons/tornado.svg create mode 100644 assets/uswds/usa-icons/translate.svg create mode 100644 assets/uswds/usa-icons/trending_down.svg create mode 100644 assets/uswds/usa-icons/trending_up.svg create mode 100644 assets/uswds/usa-icons/twitter.svg create mode 100644 assets/uswds/usa-icons/undo.svg create mode 100644 assets/uswds/usa-icons/unfold_less.svg create mode 100644 assets/uswds/usa-icons/unfold_more.svg create mode 100644 assets/uswds/usa-icons/update.svg create mode 100644 assets/uswds/usa-icons/upload_file.svg create mode 100755 assets/uswds/usa-icons/verified.svg create mode 100644 assets/uswds/usa-icons/verified_user.svg create mode 100644 assets/uswds/usa-icons/visibility.svg create mode 100644 assets/uswds/usa-icons/visibility_off.svg create mode 100644 assets/uswds/usa-icons/volume_off.svg create mode 100644 assets/uswds/usa-icons/warning.svg create mode 100644 assets/uswds/usa-icons/wash.svg create mode 100644 assets/uswds/usa-icons/wifi.svg create mode 100644 assets/uswds/usa-icons/work.svg create mode 100644 assets/uswds/usa-icons/youtube.svg create mode 100644 assets/uswds/usa-icons/zoom_in.svg create mode 100644 assets/uswds/usa-icons/zoom_out.svg create mode 100644 assets/uswds/usa-icons/zoom_out_map.svg create mode 100644 assets/uswds/uswds-icons/bedding.svg create mode 100644 assets/uswds/uswds-icons/camping.svg create mode 100644 assets/uswds/uswds-icons/chevron_left.svg create mode 100644 assets/uswds/uswds-icons/chevron_right.svg create mode 100644 assets/uswds/uswds-icons/clothes.svg create mode 100644 assets/uswds/uswds-icons/construction_worker.svg create mode 100644 assets/uswds/uswds-icons/flickr.svg create mode 100644 assets/uswds/uswds-icons/flooding.svg create mode 100644 assets/uswds/uswds-icons/github.svg create mode 100644 assets/uswds/uswds-icons/hospital.svg create mode 100644 assets/uswds/uswds-icons/hurricane.svg create mode 100644 assets/uswds/uswds-icons/identification.svg create mode 100644 assets/uswds/uswds-icons/instagram.svg create mode 100644 assets/uswds/uswds-icons/navigate_far_before.svg create mode 100644 assets/uswds/uswds-icons/navigate_far_next.svg create mode 100644 assets/uswds/uswds-icons/rain.svg create mode 100644 assets/uswds/uswds-icons/severe_weather.svg create mode 100644 assets/uswds/uswds-icons/snow.svg create mode 100644 assets/uswds/uswds-icons/sort_arrow.svg create mode 100644 assets/uswds/uswds-icons/tornado.svg create mode 100644 assets/uswds/uswds-icons/twitter.svg create mode 100644 assets/uswds/uswds-icons/youtube.svg diff --git a/Gemfile.lock b/Gemfile.lock index be470950..50496dae 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ GEM remote: https://rubygems.org/ specs: - addressable (2.8.5) + addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) autoprefixer-rails (9.8.6.5) execjs @@ -27,7 +27,7 @@ GEM http_parser.rb (0.8.0) i18n (1.14.1) concurrent-ruby (~> 1.0) - jekyll (3.9.3) + jekyll (3.9.4) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) @@ -62,19 +62,17 @@ GEM rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - libv8-node (18.16.0.0) + libv8-node (18.16.0.0-arm64-darwin) liquid (4.0.4) listen (3.8.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.3.6) - mini_portile2 (2.8.5) mini_racer (0.8.0) libv8-node (~> 18.16.0.0) - nokogiri (1.15.5) - mini_portile2 (~> 2.8.2) + nokogiri (1.16.0-arm64-darwin) racc (~> 1.4) - parallel (1.23.0) + parallel (1.24.0) pathutil (0.16.2) forwardable-extended (~> 2.6) public_suffix (5.0.4) @@ -101,7 +99,7 @@ GEM yell (2.2.2) PLATFORMS - ruby + arm64-darwin DEPENDENCIES html-proofer (~> 3.18) @@ -123,4 +121,4 @@ RUBY VERSION ruby 3.1.4p223 BUNDLED WITH - 2.4.19 + 2.5.1 diff --git a/_config.yml b/_config.yml index f7218959..bbf4a6f7 100644 --- a/_config.yml +++ b/_config.yml @@ -224,6 +224,27 @@ autoprefixer: sass: source_dir: _sass load_paths: + - assets/favicons + - assets/images + - assets/images/agencies + - assets/images/banners + - assets/images/fellows/2012 + - assets/images/fellows/2013 + - assets/images/fellows/2014 + - assets/images/fellows/2015 + - assets/images/fellows/2016 + - assets/images/fellows/2017 + - assets/images/fellows/2018 + - assets/images/fellows/2019 + - assets/images/fellows/2020 + - assets/images/fellows/2021 + - assets/images/fellows/2022 + - assets/images/fellows/2023 + - assets/images/press + - assets/images/projects + - assets/images/icons + - assets/images/logo + - node_modules/uswds/dist/ - node_modules/uswds/dist/img - node_modules/uswds/dist/js - node_modules/uswds/dist/scss diff --git a/_includes/meta.html b/_includes/meta.html index 2599502e..9dbc9956 100644 --- a/_includes/meta.html +++ b/_includes/meta.html @@ -96,7 +96,7 @@ - + \ No newline at end of file diff --git a/_projects/diu-tech-transfer.md b/_projects/diu-tech-transfer.md index d2ab7f16..3f129758 100644 --- a/_projects/diu-tech-transfer.md +++ b/_projects/diu-tech-transfer.md @@ -5,7 +5,7 @@ agency_abbrev: "DIU" agency_logo: "/assets/images/agencies/DIU.png" title: "Exploring China's Technology Transfer Strategy" summary: "Exploring China’s participation in U.S. venture deals and the passing of the Foreign Investment Risk Review Modernization Act of 2018 (FIRRMA)!" -cover_art: "diux-case-study.jpg" +cover_art: "/assets/images/projects/diux-case-study.jpg" project_challenge: "The U.S. government did not have a holistic view of how fast China's technology transfer is occurring or the multiple methods China uses for that transfer, the level of Chinese investment in U.S. technology, or a consolidated view of what technologies we should be protecting." partner_description: "DIU's mission is to accelerate commercial technology for national security. They are a fast-moving government entity that provides recurring revenue to companies to solve national security problems." project_link: https://www.diu.mil diff --git a/_projects/diux-startups.md b/_projects/diux-startups.md index 7a9cbe00..247ac91b 100644 --- a/_projects/diux-startups.md +++ b/_projects/diux-startups.md @@ -5,7 +5,7 @@ agency_abbrev: "DIU" agency_logo: "/assets/images/agencies/DIU.png" title: "DIUx Startup Collaboration" summary: "Helping the Defense Innovation Unit Experimental bridge the gap between the Department of Defense and the tech community to better access innovative and emerging technologies to solve critical national security challenges" -cover_art: "DIUX_Small_Hero.jpg" +cover_art: "/assets/images/projects/DIUX_Small_Hero.jpg" project_challenge: "How might the Department of Defense better collaborate with start-ups?" partner_description: "DIU's mission is to accelerate commercial technology for national security. They are a fast-moving government entity that provides recurring revenue to companies to solve national security problems." project_link: https://www.diu.mil diff --git a/_projects/dot-equitable-and-efficient-infrastructure.md b/_projects/dot-equitable-and-efficient-infrastructure.md index 86e6eac6..10781c03 100644 --- a/_projects/dot-equitable-and-efficient-infrastructure.md +++ b/_projects/dot-equitable-and-efficient-infrastructure.md @@ -5,7 +5,7 @@ agency_abbrev: "DOT" agency_logo: "/assets/images/agencies/DOT.png" title: "Ensuring our nation's future infrastructure is equitable and efficient" summary: "Connecting strategy, design, and public needs to lead the implementation of an equity assessment and the creation of a platform to address the historic failure to invest sufficiently, justly and equally in underserved communities." -cover_art: "dot_home.jpg" +cover_art: "/assets/images/projects/dot_home.jpg" project_challenge: "With myriad new and emerging technologies poised to transform the way we move, how can PIFs help ensure our country’s current and future transportation systems are equitable and efficient?" partner_description: "The U.S. Department of Transportation’s (DOT) mission is to ensure America has the safest, most efficient and modern transportation system in the world, which boosts our economic productivity and global competitiveness and enhances the quality of life in communities both rural and urban. diff --git a/_projects/fbi-risk-management.md b/_projects/fbi-risk-management.md index d2a27eb2..6bb347fe 100644 --- a/_projects/fbi-risk-management.md +++ b/_projects/fbi-risk-management.md @@ -5,7 +5,7 @@ agency_abbrev: "FBI" agency_logo: "/assets/images/agencies/FBI.png" title: "Risk management at the FBI" summary: "Defining an Ecosystem to Help the Private Sector Manage Risk and Mitigate Threats" -cover_art: "computer-background.jpg" +cover_art: "/assets/images/projects/computer-background.jpg" project_challenge: "In collaboration with the FBI, the Presidential Innovation Fellows focused on the challenge of defining an ecosystem to help the private sector manage risk and mitigate threats, as part of the overall strategy to protect the US economy" partner_description: "The Federal Bureau of Investigation (FBI) is the domestic intelligence and security service of the United States and its principal federal law enforcement agency" project_link: https://www.fbi.gov diff --git a/_projects/hhs-accelerating-telehealth-awareness-and-adoption.md b/_projects/hhs-accelerating-telehealth-awareness-and-adoption.md index d6f263bc..79d28bfb 100644 --- a/_projects/hhs-accelerating-telehealth-awareness-and-adoption.md +++ b/_projects/hhs-accelerating-telehealth-awareness-and-adoption.md @@ -5,7 +5,7 @@ agency_abbrev: "the project" agency_logo: "/assets/images/agencies/HHS.png" title: "Accelerating telehealth awareness and adoption during the COVID-19 pandemic" summary: "Co-creating a cross-agency initiative to address challenges seen in adopting telehealth and serve 1M+ health care providers and 300M+ patients across the U.S." -cover_art: "hhs-telehealth-case-study.png" +cover_art: "/assets/images/projects/hhs-telehealth-case-study.png" project_challenge: "The public shouldn’t have to choose between social distancing and receiving medical care. How might we expedite awareness and adoption of telehealth at the peak of a public health emergency?" partner_description: "Presidential Innovation Fellows (PIF) worked with Health Resources and Services Administration (HRSA), the U.S. Department of Health and Human Services, the White House Office of Science and Technology Policy (OSTP), and the Office of the Surgeon General (OSG) to lead a cross-agency initiative to address challenges seen in adopting telehealth and serve 1M+ health care providers and 300M+ patients across the U.S." project_link: https://telehealth.hhs.gov diff --git a/_projects/nasa-asteroid-grand-challenge.md b/_projects/nasa-asteroid-grand-challenge.md index 4812cb60..cd3bf456 100644 --- a/_projects/nasa-asteroid-grand-challenge.md +++ b/_projects/nasa-asteroid-grand-challenge.md @@ -5,7 +5,7 @@ agency_abbrev: "NASA" agency_logo: "/assets/images/agencies/NASA.png" title: "Asteroid Grand Challenge and Citizenscience.gov" summary: "Designing and guiding open science and innovation research strategies for Earth and planetary science" -cover_art: "nasa-challenge-case-study.jpg" +cover_art: "/assets/images/projects/nasa-challenge-case-study.jpg" project_challenge: "Citizen science can augment traditional scientific approaches for collecting and analyzing data for asteroids as well as other fields, but technical, policy and institutional barriers need to be addressed." partner_description: "Designing and guiding open science and innovation research strategies for Earth and planetary science" project_link: https://nasa.gov diff --git a/_projects/nci-cancer-moonshot.md b/_projects/nci-cancer-moonshot.md index a0386991..06ecfd7d 100644 --- a/_projects/nci-cancer-moonshot.md +++ b/_projects/nci-cancer-moonshot.md @@ -5,7 +5,7 @@ agency_abbrev: "NIH" agency_logo: "/assets/images/agencies/NIH.png" title: "Vice President Biden’s Cancer Moonshot" summary: "Reimagining cancer clinical trials increasing awareness and access for patients." -cover_art: "nci-cancer-moonshot.jpg" +cover_art: "/assets/images/projects/nci-cancer-moonshot.jpg" project_challenge: "Reimagining cancer clinical trials increasing awareness and access for patients." partner_description: "Accurate, up-to-date, comprehensive cancer information from the U.S. government's principal agency for cancer research" project_link: https://clinicaltrialsapi.cancer.gov diff --git a/_projects/nih-uniting-communications-and-science.md b/_projects/nih-uniting-communications-and-science.md index f7b37762..58396970 100644 --- a/_projects/nih-uniting-communications-and-science.md +++ b/_projects/nih-uniting-communications-and-science.md @@ -3,7 +3,7 @@ id: nih-uniting-communications-and-science agency: "National Institutes of Health" agency_abbrev: "the NIH All of Us Research Program" agency_logo: "/assets/images/agencies/NIH.png" -cover_art: "nih-uniting-communications-and-science.jpg" +cover_art: "/assets/images/projects/nih-uniting-communications-and-science.jpg" title: "Uniting communications and science to increase diverse representation in precision medicine research" summary: "Presidential Innovation Fellows (PIF) leveraged their expertise across marketing and data to help launch unprecedented health research initiatives." project_challenge: "How might we ensure that precision medicine serves diverse populations and researchers?" diff --git a/_projects/onc-blue-button-initiative.md b/_projects/onc-blue-button-initiative.md index 4e73b3d5..0aba1b11 100644 --- a/_projects/onc-blue-button-initiative.md +++ b/_projects/onc-blue-button-initiative.md @@ -5,7 +5,7 @@ agency_abbrev: "ONC" agency_logo: "/assets/images/agencies/ONC.png" title: "Blue Button Initiative" summary: "Increasing Americans' access to their own health information electronically" -cover_art: "health-tech-cover-art.jpg" +cover_art: "/assets/images/projects/health-tech-cover-art.jpg" project_challenge: "Increase the transparency and access to their health information, in order to make more informed decisions about their health, care for their family members, and share information with their providers" partner_description: "The Office of the National Coordinator for Health Information Technology (ONC) is a staff division of the Office of the Secretary, within the U.S. Department of Health and Human Services. ONC leads national health IT efforts, charged as the principal federal entity to coordinate nationwide efforts to implement and use the most advanced health information technology and the electronic exchange of health information" project_link: https://www.healthit.gov/topic/patient-access-information-individuals-get-it-check-it-use-it/blue-button diff --git a/_projects/smithsonian-digitizing-the-herbarium.md b/_projects/smithsonian-digitizing-the-herbarium.md index 11891dab..ea263e88 100644 --- a/_projects/smithsonian-digitizing-the-herbarium.md +++ b/_projects/smithsonian-digitizing-the-herbarium.md @@ -5,7 +5,7 @@ agency_abbrev: "Smithsonian" agency_logo: "/assets/images/agencies/Smithsonian.png" title: "Digitizing the Smithsonian Institution's Herbarium" summary: "Bringing fresh perspective and critical expertise to the important work of sharing our treasures with millions of people online" -cover_art: "smithsonian-transcription.jpg" +cover_art: "/assets/images/projects/smithsonian-transcription.jpg" project_challenge: "Make the Smithsonian Institution's digitization of 137 million+ artifacts more findable, useful and informative to researchers and members of the public" partner_description: "The Smithsonian Institution is the world's largest museum and research complex, with 19 museums, 9 research centers, and affiliates around the world." project_link: https://transcription.si.edu diff --git a/_projects/usmc-logistics.md b/_projects/usmc-logistics.md index 7d233f04..8695b1d5 100644 --- a/_projects/usmc-logistics.md +++ b/_projects/usmc-logistics.md @@ -5,7 +5,7 @@ agency_abbrev: "USMC" agency_logo: "/assets/images/agencies/USMC.png" title: "Logistics digital transformation at USMC" summary: "Helping the USMC conduct a digital and data transformation to improve logistics and keep our nation’s Marines safe" -cover_art: "helicopter.jpg" +cover_art: "/assets/images/projects/helicopter.jpg" project_challenge: "How might we help the USMC modernize all areas of logistics: people, process and technology?" partner_description: "The Marine Corps Deputy Commandant for Installations and Logistics (DC I&L) is responsible for formulating Marine Corps logistics plans, policies, and concepts, exercising staff supervision over joint and Marine Corps logistics matters, logistics manpower matters, logistics analysis, mobility, lift requirements, sustainability productivity, material readiness, logistics information systems, security assistance, fiscal matters for appropriate division sponsored programs, and coordinating the logistics aspects of prepositioning programs." project_link: https://www.marines.mil diff --git a/_projects/va-cto-benefits.md b/_projects/va-cto-benefits.md index 8f5c0050..c2b25b1a 100644 --- a/_projects/va-cto-benefits.md +++ b/_projects/va-cto-benefits.md @@ -5,7 +5,7 @@ agency_abbrev: "VA" agency_logo: "/assets/images/agencies/VA.png" title: "Transforming the Veteran’s experience" summary: "Using artificial intelligence and natural language processing to automate the benefits process with the U.S. Department of Veteran’s Affairs" -cover_art: "va-cto.jpg" +cover_art: "/assets/images/projects/va-cto.jpg" project_challenge: "How might we deliver better services to our nation's veterans?" partner_description: "The U.S. Department of Veterans Affairs provides near-comprehensive healthcare services to eligible military veterans at VA medical centers and outpatient clinics located throughout the country; several non-healthcare benefits including disability compensation, vocational rehabilitation, education assistance, home loans, and life insurance; and provides burial and memorial benefits to eligible veterans and family members at 135 national cemeteries." project_link: https://www.va.gov diff --git a/_projects/va-cto.md b/_projects/va-cto.md index ed2834db..b3b365e1 100644 --- a/_projects/va-cto.md +++ b/_projects/va-cto.md @@ -5,7 +5,7 @@ agency_abbrev: "VA" agency_logo: "/assets/images/agencies/VA.png" title: "Improving services for veterans" summary: "Helping the U.S. Department of Veterans Affairs better support veterans transitioning from military to civilian life, improving data sharing to enable medical research and improved health outcomes for veterans, and reducing the processing time for medical claims" -cover_art: "va-cto.jpg" +cover_art: "/assets/images/projects/va-cto.jpg" project_challenge: "How might we deliver better services to our nation's veterans?" partner_description: "The U.S. Department of Veterans Affairs provides near-comprehensive healthcare services to eligible military veterans at VA medical centers and outpatient clinics located throughout the country; several non-healthcare benefits including disability compensation, vocational rehabilitation, education assistance, home loans, and life insurance; and provides burial and memorial benefits to eligible veterans and family members at 135 national cemeteries." project_link: https://www.va.gov diff --git a/_projects/va-using-machine-learning-to-deliver-veterans-benefits-faster.md b/_projects/va-using-machine-learning-to-deliver-veterans-benefits-faster.md index 87fdf0ee..a4ace3b9 100644 --- a/_projects/va-using-machine-learning-to-deliver-veterans-benefits-faster.md +++ b/_projects/va-using-machine-learning-to-deliver-veterans-benefits-faster.md @@ -5,7 +5,7 @@ agency_abbrev: "VA" agency_logo: "/assets/images/agencies/VA.png" title: "Using machine learning to deliver veterans’ benefits faster" summary: "Getting veterans their benefits in days, not months" -cover_art: "va-cto-nelson-colon-vargas.jpg" +cover_art: "/assets/images/projects/va-cto-nelson-colon-vargas.jpg" project_challenge: "Veterans submit 1.5M+ claims/year for disability compensation and pension benefits, and 65-80% of those claims are submitted via mail or fax. Unfortunately, 98.2% of attempts to submit claims online fail. Processing also delays how quickly veterans receive and use their benefits." partner_description: "The U.S. Department of Veterans Affairs provides near-comprehensive healthcare services to eligible military veterans at VA medical centers and outpatient clinics located throughout the country; several non-healthcare benefits including disability compensation, vocational rehabilitation, education assistance, home loans, and life insurance; and provides burial and memorial benefits to eligible veterans and family members at 135 national cemeteries." project_link: https://www.va.gov diff --git a/assets/css/_sass/_mixins.scss b/_sass/_mixins.scss similarity index 100% rename from assets/css/_sass/_mixins.scss rename to _sass/_mixins.scss diff --git a/assets/css/_sass/_uswds-settings.scss b/_sass/_uswds-settings.scss similarity index 100% rename from assets/css/_sass/_uswds-settings.scss rename to _sass/_uswds-settings.scss diff --git a/assets/css/_sass/_utilities.scss b/_sass/_utilities.scss similarity index 100% rename from assets/css/_sass/_utilities.scss rename to _sass/_utilities.scss diff --git a/assets/css/_sass/custom/_anchor.scss b/_sass/custom/_anchor.scss similarity index 94% rename from assets/css/_sass/custom/_anchor.scss rename to _sass/custom/_anchor.scss index d3ca1b0d..aa09b890 100644 --- a/assets/css/_sass/custom/_anchor.scss +++ b/_sass/custom/_anchor.scss @@ -136,13 +136,13 @@ } } .usa-accordion__button[aria-expanded=false]{ - background-image: url(asset_path("angle-arrow-down-white.svg")),-webkit-gradient(linear,left top,left bottom,from(transparent),to(transparent)); + background-image: url("/assets/images/icons/angle-arrow-down-white.svg"),-webkit-gradient(linear,left top,left bottom,from(transparent),to(transparent)); background-size: .85rem; background-repeat: no-repeat; background-position: 6.65em center; } .usa-accordion__button[aria-expanded=true]{ - background-image: url(asset_path("angle-arrow-up-white.svg")),-webkit-gradient(linear,left top,left bottom,from(transparent),to(transparent)); + background-image: url("/assets/images/icons/angle-arrow-up-white.svg"),-webkit-gradient(linear,left top,left bottom,from(transparent),to(transparent)); background-size: .85rem; background-repeat: no-repeat; background-position: 6.65em center; diff --git a/assets/css/_sass/custom/_breadcrumb.scss b/_sass/custom/_breadcrumb.scss similarity index 100% rename from assets/css/_sass/custom/_breadcrumb.scss rename to _sass/custom/_breadcrumb.scss diff --git a/assets/css/_sass/custom/_filters.scss b/_sass/custom/_filters.scss similarity index 92% rename from assets/css/_sass/custom/_filters.scss rename to _sass/custom/_filters.scss index f5326bce..dae49490 100644 --- a/assets/css/_sass/custom/_filters.scss +++ b/_sass/custom/_filters.scss @@ -16,7 +16,7 @@ border-radius: 20px; padding: 0 15px; padding-left: 35px; - background-image: url(asset_path("icons/search.svg")); + background-image: url("/assets/images/icons/search.svg"); background-size: 16px; background-position-x: 10px; background-position-y: center; @@ -49,7 +49,7 @@ } .usa-select { - background-image: url(asset_path("icons/caret-down.svg")); + background-image: url("/assets/images/icons/caret-down.svg"); background-color: transparent; background-size: 14px; padding-bottom: .3rem; diff --git a/assets/css/_sass/custom/_footer-tagline.scss b/_sass/custom/_footer-tagline.scss similarity index 93% rename from assets/css/_sass/custom/_footer-tagline.scss rename to _sass/custom/_footer-tagline.scss index 74f61b83..649833fc 100644 --- a/assets/css/_sass/custom/_footer-tagline.scss +++ b/_sass/custom/_footer-tagline.scss @@ -1,7 +1,7 @@ .footer-tagline { @include u-bg('primary'); @include overlay-base(360px); - background-image: url(asset_path("banner-homecoming-eeob-bw.jpg")); + background-image: url("/assets/images/banners/banner-homecoming-eeob-bw.jpg"); background-size: cover; background-position: 0 25%; } diff --git a/assets/css/_sass/custom/_image.scss b/_sass/custom/_image.scss similarity index 100% rename from assets/css/_sass/custom/_image.scss rename to _sass/custom/_image.scss diff --git a/assets/css/_sass/custom/_list-fellows.scss b/_sass/custom/_list-fellows.scss similarity index 100% rename from assets/css/_sass/custom/_list-fellows.scss rename to _sass/custom/_list-fellows.scss diff --git a/assets/css/_sass/custom/_pagination.scss b/_sass/custom/_pagination.scss similarity index 100% rename from assets/css/_sass/custom/_pagination.scss rename to _sass/custom/_pagination.scss diff --git a/assets/css/_sass/custom/_partner.scss b/_sass/custom/_partner.scss similarity index 100% rename from assets/css/_sass/custom/_partner.scss rename to _sass/custom/_partner.scss diff --git a/assets/css/_sass/custom/_project-item.scss b/_sass/custom/_project-item.scss similarity index 100% rename from assets/css/_sass/custom/_project-item.scss rename to _sass/custom/_project-item.scss diff --git a/assets/css/_sass/custom/_project-team.scss b/_sass/custom/_project-team.scss similarity index 100% rename from assets/css/_sass/custom/_project-team.scss rename to _sass/custom/_project-team.scss diff --git a/assets/css/_sass/custom/_project.scss b/_sass/custom/_project.scss similarity index 76% rename from assets/css/_sass/custom/_project.scss rename to _sass/custom/_project.scss index f246790f..5c5639f7 100644 --- a/assets/css/_sass/custom/_project.scss +++ b/_sass/custom/_project.scss @@ -1,5 +1,5 @@ .project-question { - background-image: url(asset_path("question.svg")), linear-gradient(transparent, transparent); + background-image: url("/assets/images/icons/question.svg"), linear-gradient(transparent, transparent); background-position: units('205') units('205'); background-repeat: no-repeat; background-size: units(7); diff --git a/assets/css/_sass/custom/_quote.scss b/_sass/custom/_quote.scss similarity index 100% rename from assets/css/_sass/custom/_quote.scss rename to _sass/custom/_quote.scss diff --git a/assets/css/_sass/custom/_site-card.scss b/_sass/custom/_site-card.scss similarity index 100% rename from assets/css/_sass/custom/_site-card.scss rename to _sass/custom/_site-card.scss diff --git a/assets/css/_sass/custom/_skipnav.scss b/_sass/custom/_skipnav.scss similarity index 100% rename from assets/css/_sass/custom/_skipnav.scss rename to _sass/custom/_skipnav.scss diff --git a/assets/css/_sass/custom/story.scss b/_sass/custom/_story.scss similarity index 100% rename from assets/css/_sass/custom/story.scss rename to _sass/custom/_story.scss diff --git a/assets/css/_sass/custom/_typography.scss b/_sass/custom/_typography.scss similarity index 100% rename from assets/css/_sass/custom/_typography.scss rename to _sass/custom/_typography.scss diff --git a/assets/css/_sass/custom/_work-box.scss b/_sass/custom/_work-box.scss similarity index 100% rename from assets/css/_sass/custom/_work-box.scss rename to _sass/custom/_work-box.scss diff --git a/assets/css/_sass/searchgov/_form.scss b/_sass/searchgov/_form.scss similarity index 92% rename from assets/css/_sass/searchgov/_form.scss rename to _sass/searchgov/_form.scss index 5474a00a..20fa0dad 100644 --- a/assets/css/_sass/searchgov/_form.scss +++ b/_sass/searchgov/_form.scss @@ -25,7 +25,7 @@ $transition: width .25s; border: none; background-color: white; @include at-media('desktop') { - background-image: url(asset_path("icons/search.svg")); + background-image: url("/assets/images/icons/search.svg"); background-repeat: no-repeat; background-position: center center; background-size: 1rem; @@ -66,7 +66,7 @@ $transition: width .25s; .usa-search--small [type="submit"], .usa-search--small .usa-search__submit { - background-image: url(asset_path("icons/search.svg")); + background-image: url("/assets/images/icons/search.svg"); width: 20px; border-radius: 0; background-color: transparent; diff --git a/assets/css/_sass/uswds-overrides/_banner.scss b/_sass/uswds-overrides/_banner.scss similarity index 100% rename from assets/css/_sass/uswds-overrides/_banner.scss rename to _sass/uswds-overrides/_banner.scss diff --git a/assets/css/_sass/uswds-overrides/_button.scss b/_sass/uswds-overrides/_button.scss similarity index 100% rename from assets/css/_sass/uswds-overrides/_button.scss rename to _sass/uswds-overrides/_button.scss diff --git a/assets/css/_sass/uswds-overrides/_footer.scss b/_sass/uswds-overrides/_footer.scss similarity index 100% rename from assets/css/_sass/uswds-overrides/_footer.scss rename to _sass/uswds-overrides/_footer.scss diff --git a/assets/css/_sass/uswds-overrides/_form.scss b/_sass/uswds-overrides/_form.scss similarity index 100% rename from assets/css/_sass/uswds-overrides/_form.scss rename to _sass/uswds-overrides/_form.scss diff --git a/assets/css/_sass/uswds-overrides/_graphic-list.scss b/_sass/uswds-overrides/_graphic-list.scss similarity index 100% rename from assets/css/_sass/uswds-overrides/_graphic-list.scss rename to _sass/uswds-overrides/_graphic-list.scss diff --git a/assets/css/_sass/uswds-overrides/_hero.scss b/_sass/uswds-overrides/_hero.scss similarity index 74% rename from assets/css/_sass/uswds-overrides/_hero.scss rename to _sass/uswds-overrides/_hero.scss index 42dbf1fa..577ef3d6 100644 --- a/assets/css/_sass/uswds-overrides/_hero.scss +++ b/_sass/uswds-overrides/_hero.scss @@ -1,5 +1,5 @@ .usa-hero { - background-image: url(asset_path("highlight-fellows-nasa-bw--cropped.jpg")); + background-image: url("/assets/images/banners/highlight-fellows-nasa-bw--cropped.jpg"); background-position: 50% 25%; background-size: cover; padding: 0; @@ -62,29 +62,29 @@ .home .usa-hero { @include hero-short; - background-image: url(asset_path("hero-pif.jpg")); + background-image: url("/assets/images/banners/hero-pif.jpg"); } .about .usa-hero { @include hero-short; - background-image: url(asset_path("banner-design-users-bw.jpg")); + background-image: url("/assets/images/banners/banner-design-users-bw.jpg"); background-position: center right 15%; } .fellows .usa-hero { @include hero-short; - background-image: url(asset_path("banner-homecoming-eeob-bw.jpg")); + background-image: url("/assets/images/banners/banner-homecoming-eeob-bw.jpg"); } .agencies .usa-hero { @include hero-short; - background-image: url(asset_path("banner-orientation-acq-bw.jpg")); + background-image: url("/assets/images/banners/banner-orientation-acq-bw.jpg"); background-position: center right 15%; } .apply .usa-hero { @include hero-short; - background-image: url(asset_path("banner-apply-bw.jpeg")); + background-image: url("/assets/images/banners/banner-apply-bw.jpeg"); } .usa-hero.project { @include hero-short; - background-image: url(asset_path("banner-orientation-eeob-bw.jpg")); + background-image: url("/assets/images/banners/banner-orientation-eeob-bw.jpg"); background-position: top left 15%; } .usa-hero.faq { diff --git a/assets/css/_sass/uswds-overrides/_intro.scss b/_sass/uswds-overrides/_intro.scss similarity index 100% rename from assets/css/_sass/uswds-overrides/_intro.scss rename to _sass/uswds-overrides/_intro.scss diff --git a/assets/css/_sass/uswds-overrides/_list.scss b/_sass/uswds-overrides/_list.scss similarity index 100% rename from assets/css/_sass/uswds-overrides/_list.scss rename to _sass/uswds-overrides/_list.scss diff --git a/assets/css/_sass/uswds-overrides/_logo.scss b/_sass/uswds-overrides/_logo.scss similarity index 100% rename from assets/css/_sass/uswds-overrides/_logo.scss rename to _sass/uswds-overrides/_logo.scss diff --git a/assets/css/_sass/uswds-overrides/_menu.scss b/_sass/uswds-overrides/_menu.scss similarity index 100% rename from assets/css/_sass/uswds-overrides/_menu.scss rename to _sass/uswds-overrides/_menu.scss diff --git a/assets/css/_sass/uswds-overrides/_nav.scss b/_sass/uswds-overrides/_nav.scss similarity index 100% rename from assets/css/_sass/uswds-overrides/_nav.scss rename to _sass/uswds-overrides/_nav.scss diff --git a/assets/css/_sass/uswds-overrides/_section.scss b/_sass/uswds-overrides/_section.scss similarity index 100% rename from assets/css/_sass/uswds-overrides/_section.scss rename to _sass/uswds-overrides/_section.scss diff --git a/assets/css/_sass/uswds-overrides/_social-link.scss b/_sass/uswds-overrides/_social-link.scss similarity index 57% rename from assets/css/_sass/uswds-overrides/_social-link.scss rename to _sass/uswds-overrides/_social-link.scss index 8ba3dc2f..78618a33 100644 --- a/assets/css/_sass/uswds-overrides/_social-link.scss +++ b/_sass/uswds-overrides/_social-link.scss @@ -4,6 +4,6 @@ } .usa-social-link--linkedin { - background-image: url(asset_path("linkedin.svg")), linear-gradient(transparent, transparent); + background-image: url("/assets/images/icons/linkedin.svg"), linear-gradient(transparent, transparent); background-repeat: no-repeat; } diff --git a/assets/css/_sass/index.scss b/assets/css/index.scss similarity index 100% rename from assets/css/_sass/index.scss rename to assets/css/index.scss diff --git a/assets/css/styles.scss b/assets/css/styles.scss new file mode 100644 index 00000000..cdc7da05 --- /dev/null +++ b/assets/css/styles.scss @@ -0,0 +1,129 @@ +--- +--- +// https://jekyllrb.com/docs/assets/ +/* +* * * * * ============================== +* * * * * ============================== +* * * * * ============================== +* * * * * ============================== +======================================== +======================================== +======================================== +*/ + +// ------------------------------------- +// Import individual theme settings +@import "theme/uswds-theme-general"; +@import "theme/uswds-theme-typography"; +@import "theme/uswds-theme-spacing"; +@import "theme/uswds-theme-color"; +@import "theme/uswds-theme-utilities"; +@import "theme/uswds-theme-components"; + +// Set correct paths for use with asset pipeline +$theme-font-path: "../uswds/fonts"; +$theme-image-path: "../uswds/img"; + +// ------------------------------------- +// Import individual USWDS packages... +@import "scss/packages/required"; +@import "scss/packages/global"; + +@import "scss/packages/uswds-components"; +@import "scss/packages/uswds-utilities"; + +/* +---------------------------------------- +USWDS THEME CUSTOM STYLES +---------------------------------------- +!! Copy this file to your project's + sass root. Don't edit the version + in node_modules. +---------------------------------------- +Custom project SASS goes here. + +i.e. +@include u-padding-right('05'); +---------------------------------------- +*/ + +@import "uswds-settings"; + +// Import the US Web Design System SASS. +@import "uswds"; + +// Custom Mixins +@import "mixins"; + +// Custom Utilities +@import "utilities"; + +// USWDS Overrides +@import "uswds-overrides/button"; +@import "uswds-overrides/nav"; +@import "uswds-overrides/intro"; +@import "uswds-overrides/hero"; +@import "uswds-overrides/list"; +@import "uswds-overrides/graphic-list"; +@import "uswds-overrides/social-link"; +@import "uswds-overrides/footer"; +@import "uswds-overrides/section"; +@import "uswds-overrides/logo"; +@import "uswds-overrides/menu"; +@import "uswds-overrides/banner"; +@import "uswds-overrides/form"; + +// Search.gov override +@import "searchgov/form"; + +// Custom Styles +@import "custom/anchor"; +@import "custom/pagination"; +@import "custom/breadcrumb"; +@import "custom/project"; +@import "custom/image"; +@import "custom/partner"; +@import "custom/project-item"; +@import "custom/list-fellows"; +@import "custom/site-card"; +@import "custom/work-box"; +@import "custom/typography"; +@import "custom/quote"; +@import "custom/footer-tagline"; +@import "custom/skipnav"; +@import "custom/story"; +@import "custom/project-team"; +@import "custom/filters"; + + +// default mode hide banner +.usa-banner__content { + display: hidden; +} + +@media screen and (min-width: 640px) { + .tablet\:width-1\/3 { + width: 33%; + } + .tablet\:float-left { + float: left; + } +} + +@media screen and (min-width: 640px) { + .paginate-link { + display: initial; + } + .paginate-button { + display: none; + } +} + +@media screen and (max-width: 640px) { + .paginate-link { + display: none; + } + .paginate-button { + display: block; + } +} \ No newline at end of file diff --git a/assets/js/uswds-init.js b/assets/js/uswds-init.js new file mode 100644 index 00000000..1bc61719 --- /dev/null +++ b/assets/js/uswds-init.js @@ -0,0 +1,40 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 0) { + poll(); + } else {// USWDS library failed to load + } + }, 100); + }; + + poll(); +} + +},{}]},{},[1]) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvanMvdXN3ZHMtaW5pdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0FDQUEsSUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVAsQ0FBZ0IsZUFBaEM7QUFDQSxJQUFNLFlBQVksR0FBRyxnQkFBckI7O0FBRUEsU0FBUyxlQUFULEdBQTJCO0FBQ3pCLEVBQUEsT0FBTyxDQUFDLFNBQVIsZUFBeUIsWUFBekI7QUFDRDs7QUFFRCxTQUFTLFdBQVQsR0FBdUI7QUFDckIsRUFBQSxPQUFPLENBQUMsU0FBUixHQUFvQixPQUFPLENBQUMsU0FBUixDQUFrQixPQUFsQixDQUEwQixZQUExQixFQUF3QyxFQUF4QyxDQUFwQjtBQUNELEMsQ0FFRDs7O0FBQ0EsSUFBSSxtQkFBbUIsTUFBTSxDQUFDLFFBQTFCLElBQXNDLHNCQUFzQixNQUFoRSxFQUF3RTtBQUN0RSxFQUFBLGVBQWU7QUFFZixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsV0FBRCxFQUFjLElBQWQsQ0FBM0I7QUFDQSxNQUFJLE9BQU8sR0FBRyxHQUFkOztBQUVBLE1BQU0sSUFBSSxHQUFHLFNBQVAsSUFBTyxHQUFNO0FBQ2pCLElBQUEsVUFBVSxDQUFDLFlBQU07QUFDZixNQUFBLE9BQU8sSUFBSSxDQUFYOztBQUNBLFVBQUksT0FBTyxZQUFQLEtBQXdCLFdBQTVCLEVBQXlDO0FBQ3ZDO0FBQ0EsUUFBQSxZQUFZLENBQUMsUUFBRCxDQUFaO0FBQ0EsUUFBQSxVQUFVLENBQUMsV0FBRCxFQUFjLEdBQWQsQ0FBVjtBQUNELE9BSkQsTUFJTyxJQUFJLE9BQU8sR0FBRyxDQUFkLEVBQWlCO0FBQ3RCLFFBQUEsSUFBSTtBQUNMLE9BRk0sTUFFQSxDQUNMO0FBQ0Q7QUFDRixLQVhTLEVBV1AsR0FYTyxDQUFWO0FBWUQsR0FiRDs7QUFlQSxFQUFBLElBQUk7QUFDTCIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsImNvbnN0IGRvY0VsZW0gPSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuY29uc3QgbG9hZGluZ0NsYXNzID0gXCJ1c2EtanMtbG9hZGluZ1wiO1xuXG5mdW5jdGlvbiBhZGRMb2FkaW5nQ2xhc3MoKSB7XG4gIGRvY0VsZW0uY2xhc3NOYW1lICs9IGAgJHtsb2FkaW5nQ2xhc3N9YDtcbn1cblxuZnVuY3Rpb24gcmV2ZXJ0Q2xhc3MoKSB7XG4gIGRvY0VsZW0uY2xhc3NOYW1lID0gZG9jRWxlbS5jbGFzc05hbWUucmVwbGFjZShsb2FkaW5nQ2xhc3MsIFwiXCIpO1xufVxuXG4vLyBCYXNlZCBvbiBodHRwczovL3d3dy5maWxhbWVudGdyb3VwLmNvbS9sYWIvZW5oYW5jaW5nLW9wdGltaXN0aWNhbGx5Lmh0bWxcbmlmIChcInF1ZXJ5U2VsZWN0b3JcIiBpbiB3aW5kb3cuZG9jdW1lbnQgJiYgXCJhZGRFdmVudExpc3RlbmVyXCIgaW4gd2luZG93KSB7XG4gIGFkZExvYWRpbmdDbGFzcygpO1xuXG4gIGNvbnN0IGZhbGxiYWNrID0gc2V0VGltZW91dChyZXZlcnRDbGFzcywgODAwMCk7XG4gIGxldCB0aW1lb3V0ID0gMTAwO1xuXG4gIGNvbnN0IHBvbGwgPSAoKSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aW1lb3V0ICs9IDE7XG4gICAgICBpZiAodHlwZW9mIHVzd2RzUHJlc2VudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAvLyBVU1dEUyBsaWJyYXJ5IGxvYWRlZFxuICAgICAgICBjbGVhclRpbWVvdXQoZmFsbGJhY2spO1xuICAgICAgICBzZXRUaW1lb3V0KHJldmVydENsYXNzLCAxMDApO1xuICAgICAgfSBlbHNlIGlmICh0aW1lb3V0ID4gMCkge1xuICAgICAgICBwb2xsKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVU1dEUyBsaWJyYXJ5IGZhaWxlZCB0byBsb2FkXG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfTtcblxuICBwb2xsKCk7XG59XG4iXX0= diff --git a/assets/js/uswds-init.min.js b/assets/js/uswds-init.min.js new file mode 100644 index 00000000..14d4de49 --- /dev/null +++ b/assets/js/uswds-init.min.js @@ -0,0 +1,2 @@ +!function r(o,i,u){function c(n,e){if(!i[n]){if(!o[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(s)return s(n,!0);throw(t=new Error("Cannot find module '"+n+"'")).code="MODULE_NOT_FOUND",t}t=i[n]={exports:{}},o[n][0].call(t.exports,function(e){return c(o[n][1][e]||e)},t,t.exports,r,o,i,u)}return i[n].exports}for(var s="function"==typeof require&&require,e=0;e {\n setTimeout(() => {\n timeout += 1;\n if (typeof uswdsPresent !== \"undefined\") {\n // USWDS library loaded\n clearTimeout(fallback);\n setTimeout(revertClass, 100);\n } else if (timeout > 0) {\n poll();\n } else {\n // USWDS library failed to load\n }\n }, 100);\n };\n\n poll();\n}\n"]} \ No newline at end of file diff --git a/assets/js/uswds.js b/assets/js/uswds.js new file mode 100644 index 00000000..4d1d7cf7 --- /dev/null +++ b/assets/js/uswds.js @@ -0,0 +1,6542 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i'], + 191: ['/', '?'], + 192: ['`', '~'], + 219: ['[', '{'], + 220: ['\\', '|'], + 221: [']', '}'], + 222: ["'", '"'], + 224: 'Meta', + 225: 'AltGraph', + 246: 'Attn', + 247: 'CrSel', + 248: 'ExSel', + 249: 'EraseEof', + 250: 'Play', + 251: 'ZoomOut' + } + }; // Function keys (F1-24). + + var i; + + for (i = 1; i < 25; i++) { + keyboardeventKeyPolyfill.keys[111 + i] = 'F' + i; + } // Printable ASCII characters. + + + var letter = ''; + + for (i = 65; i < 91; i++) { + letter = String.fromCharCode(i); + keyboardeventKeyPolyfill.keys[i] = [letter.toLowerCase(), letter.toUpperCase()]; + } + + function polyfill() { + if (!('KeyboardEvent' in window) || 'key' in KeyboardEvent.prototype) { + return false; + } // Polyfill `key` on `KeyboardEvent`. + + + var proto = { + get: function get(x) { + var key = keyboardeventKeyPolyfill.keys[this.which || this.keyCode]; + + if (Array.isArray(key)) { + key = key[+this.shiftKey]; + } + + return key; + } + }; + Object.defineProperty(KeyboardEvent.prototype, 'key', proto); + return proto; + } + + if (typeof define === 'function' && define.amd) { + define('keyboardevent-key-polyfill', keyboardeventKeyPolyfill); + } else if (typeof exports !== 'undefined' && typeof module !== 'undefined') { + module.exports = keyboardeventKeyPolyfill; + } else if (window) { + window.keyboardeventKeyPolyfill = keyboardeventKeyPolyfill; + } +})(); + +},{}],6:[function(require,module,exports){ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ +'use strict'; +/* eslint-disable no-unused-vars */ + +var getOwnPropertySymbols = Object.getOwnPropertySymbols; +var hasOwnProperty = Object.prototype.hasOwnProperty; +var propIsEnumerable = Object.prototype.propertyIsEnumerable; + +function toObject(val) { + if (val === null || val === undefined) { + throw new TypeError('Object.assign cannot be called with null or undefined'); + } + + return Object(val); +} + +function shouldUseNative() { + try { + if (!Object.assign) { + return false; + } // Detect buggy property enumeration order in older V8 versions. + // https://bugs.chromium.org/p/v8/issues/detail?id=4118 + + + var test1 = new String('abc'); // eslint-disable-line no-new-wrappers + + test1[5] = 'de'; + + if (Object.getOwnPropertyNames(test1)[0] === '5') { + return false; + } // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + + + var test2 = {}; + + for (var i = 0; i < 10; i++) { + test2['_' + String.fromCharCode(i)] = i; + } + + var order2 = Object.getOwnPropertyNames(test2).map(function (n) { + return test2[n]; + }); + + if (order2.join('') !== '0123456789') { + return false; + } // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + + + var test3 = {}; + 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { + test3[letter] = letter; + }); + + if (Object.keys(Object.assign({}, test3)).join('') !== 'abcdefghijklmnopqrst') { + return false; + } + + return true; + } catch (err) { + // We don't expect any of the above to throw, but better to be safe. + return false; + } +} + +module.exports = shouldUseNative() ? Object.assign : function (target, source) { + var from; + var to = toObject(target); + var symbols; + + for (var s = 1; s < arguments.length; s++) { + from = Object(arguments[s]); + + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + + if (getOwnPropertySymbols) { + symbols = getOwnPropertySymbols(from); + + for (var i = 0; i < symbols.length; i++) { + if (propIsEnumerable.call(from, symbols[i])) { + to[symbols[i]] = from[symbols[i]]; + } + } + } + } + + return to; +}; + +},{}],7:[function(require,module,exports){ +"use strict"; + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var assign = require('object-assign'); + +var delegate = require('../delegate'); + +var delegateAll = require('../delegateAll'); + +var DELEGATE_PATTERN = /^(.+):delegate\((.+)\)$/; +var SPACE = ' '; + +var getListeners = function getListeners(type, handler) { + var match = type.match(DELEGATE_PATTERN); + var selector; + + if (match) { + type = match[1]; + selector = match[2]; + } + + var options; + + if (_typeof(handler) === 'object') { + options = { + capture: popKey(handler, 'capture'), + passive: popKey(handler, 'passive') + }; + } + + var listener = { + selector: selector, + delegate: _typeof(handler) === 'object' ? delegateAll(handler) : selector ? delegate(selector, handler) : handler, + options: options + }; + + if (type.indexOf(SPACE) > -1) { + return type.split(SPACE).map(function (_type) { + return assign({ + type: _type + }, listener); + }); + } else { + listener.type = type; + return [listener]; + } +}; + +var popKey = function popKey(obj, key) { + var value = obj[key]; + delete obj[key]; + return value; +}; + +module.exports = function behavior(events, props) { + var listeners = Object.keys(events).reduce(function (memo, type) { + var listeners = getListeners(type, events[type]); + return memo.concat(listeners); + }, []); + return assign({ + add: function addBehavior(element) { + listeners.forEach(function (listener) { + element.addEventListener(listener.type, listener.delegate, listener.options); + }); + }, + remove: function removeBehavior(element) { + listeners.forEach(function (listener) { + element.removeEventListener(listener.type, listener.delegate, listener.options); + }); + } + }, props); +}; + +},{"../delegate":9,"../delegateAll":10,"object-assign":6}],8:[function(require,module,exports){ +"use strict"; + +module.exports = function compose(functions) { + return function (e) { + return functions.some(function (fn) { + return fn.call(this, e) === false; + }, this); + }; +}; + +},{}],9:[function(require,module,exports){ +"use strict"; + +// polyfill Element.prototype.closest +require('element-closest'); + +module.exports = function delegate(selector, fn) { + return function delegation(event) { + var target = event.target.closest(selector); + + if (target) { + return fn.call(target, event); + } + }; +}; + +},{"element-closest":4}],10:[function(require,module,exports){ +"use strict"; + +var delegate = require('../delegate'); + +var compose = require('../compose'); + +var SPLAT = '*'; + +module.exports = function delegateAll(selectors) { + var keys = Object.keys(selectors); // XXX optimization: if there is only one handler and it applies to + // all elements (the "*" CSS selector), then just return that + // handler + + if (keys.length === 1 && keys[0] === SPLAT) { + return selectors[SPLAT]; + } + + var delegates = keys.reduce(function (memo, selector) { + memo.push(delegate(selector, selectors[selector])); + return memo; + }, []); + return compose(delegates); +}; + +},{"../compose":8,"../delegate":9}],11:[function(require,module,exports){ +"use strict"; + +module.exports = function ignore(element, fn) { + return function ignorance(e) { + if (element !== e.target && !element.contains(e.target)) { + return fn.call(this, e); + } + }; +}; + +},{}],12:[function(require,module,exports){ +"use strict"; + +module.exports = { + behavior: require('./behavior'), + delegate: require('./delegate'), + delegateAll: require('./delegateAll'), + ignore: require('./ignore'), + keymap: require('./keymap') +}; + +},{"./behavior":7,"./delegate":9,"./delegateAll":10,"./ignore":11,"./keymap":13}],13:[function(require,module,exports){ +"use strict"; + +require('keyboardevent-key-polyfill'); // these are the only relevant modifiers supported on all platforms, +// according to MDN: +// + + +var MODIFIERS = { + 'Alt': 'altKey', + 'Control': 'ctrlKey', + 'Ctrl': 'ctrlKey', + 'Shift': 'shiftKey' +}; +var MODIFIER_SEPARATOR = '+'; + +var getEventKey = function getEventKey(event, hasModifiers) { + var key = event.key; + + if (hasModifiers) { + for (var modifier in MODIFIERS) { + if (event[MODIFIERS[modifier]] === true) { + key = [modifier, key].join(MODIFIER_SEPARATOR); + } + } + } + + return key; +}; + +module.exports = function keymap(keys) { + var hasModifiers = Object.keys(keys).some(function (key) { + return key.indexOf(MODIFIER_SEPARATOR) > -1; + }); + return function (event) { + var key = getEventKey(event, hasModifiers); + return [key, key.toLowerCase()].reduce(function (result, _key) { + if (_key in keys) { + result = keys[key].call(this, event); + } + + return result; + }, undefined); + }; +}; + +module.exports.MODIFIERS = MODIFIERS; + +},{"keyboardevent-key-polyfill":5}],14:[function(require,module,exports){ +"use strict"; + +module.exports = function once(listener, options) { + var wrapped = function wrappedOnce(e) { + e.currentTarget.removeEventListener(e.type, wrapped, options); + return listener.call(this, e); + }; + + return wrapped; +}; + +},{}],15:[function(require,module,exports){ +'use strict'; + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var RE_TRIM = /(^\s+)|(\s+$)/g; +var RE_SPLIT = /\s+/; +var trim = String.prototype.trim ? function (str) { + return str.trim(); +} : function (str) { + return str.replace(RE_TRIM, ''); +}; + +var queryById = function queryById(id) { + return this.querySelector('[id="' + id.replace(/"/g, '\\"') + '"]'); +}; + +module.exports = function resolveIds(ids, doc) { + if (typeof ids !== 'string') { + throw new Error('Expected a string but got ' + _typeof(ids)); + } + + if (!doc) { + doc = window.document; + } + + var getElementById = doc.getElementById ? doc.getElementById.bind(doc) : queryById.bind(doc); + ids = trim(ids).split(RE_SPLIT); // XXX we can short-circuit here because trimming and splitting a + // string of just whitespace produces an array containing a single, + // empty string + + if (ids.length === 1 && ids[0] === '') { + return []; + } + + return ids.map(function (id) { + var el = getElementById(id); + + if (!el) { + throw new Error('no element with id: "' + id + '"'); + } + + return el; + }); +}; + +},{}],16:[function(require,module,exports){ +"use strict"; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var select = require("../utils/select"); + +var behavior = require("../utils/behavior"); + +var toggle = require("../utils/toggle"); + +var isElementInViewport = require("../utils/is-in-viewport"); + +var _require = require("../events"), + CLICK = _require.CLICK; + +var _require2 = require("../config"), + PREFIX = _require2.prefix; + +var ACCORDION = ".".concat(PREFIX, "-accordion, .").concat(PREFIX, "-accordion--bordered"); +var BUTTON = ".".concat(PREFIX, "-accordion__button[aria-controls]"); +var EXPANDED = "aria-expanded"; +var MULTISELECTABLE = "aria-multiselectable"; +/** + * Get an Array of button elements belonging directly to the given + * accordion element. + * @param {HTMLElement} accordion + * @return {array} + */ + +var getAccordionButtons = function getAccordionButtons(accordion) { + var buttons = select(BUTTON, accordion); + return buttons.filter(function (button) { + return button.closest(ACCORDION) === accordion; + }); +}; +/** + * Toggle a button's "pressed" state, optionally providing a target + * state. + * + * @param {HTMLButtonElement} button + * @param {boolean?} expanded If no state is provided, the current + * state will be toggled (from false to true, and vice-versa). + * @return {boolean} the resulting state + */ + + +var toggleButton = function toggleButton(button, expanded) { + var accordion = button.closest(ACCORDION); + var safeExpanded = expanded; + + if (!accordion) { + throw new Error("".concat(BUTTON, " is missing outer ").concat(ACCORDION)); + } + + safeExpanded = toggle(button, expanded); // XXX multiselectable is opt-in, to preserve legacy behavior + + var multiselectable = accordion.getAttribute(MULTISELECTABLE) === "true"; + + if (safeExpanded && !multiselectable) { + getAccordionButtons(accordion).forEach(function (other) { + if (other !== button) { + toggle(other, false); + } + }); + } +}; +/** + * @param {HTMLButtonElement} button + * @return {boolean} true + */ + + +var showButton = function showButton(button) { + return toggleButton(button, true); +}; +/** + * @param {HTMLButtonElement} button + * @return {boolean} false + */ + + +var hideButton = function hideButton(button) { + return toggleButton(button, false); +}; + +var accordion = behavior(_defineProperty({}, CLICK, _defineProperty({}, BUTTON, function (event) { + event.preventDefault(); + toggleButton(this); + + if (this.getAttribute(EXPANDED) === "true") { + // We were just expanded, but if another accordion was also just + // collapsed, we may no longer be in the viewport. This ensures + // that we are still visible, so the user isn't confused. + if (!isElementInViewport(this)) this.scrollIntoView(); + } +})), { + init: function init(root) { + select(BUTTON, root).forEach(function (button) { + var expanded = button.getAttribute(EXPANDED) === "true"; + toggleButton(button, expanded); + }); + }, + ACCORDION: ACCORDION, + BUTTON: BUTTON, + show: showButton, + hide: hideButton, + toggle: toggleButton, + getButtons: getAccordionButtons +}); +module.exports = accordion; + +},{"../config":35,"../events":36,"../utils/behavior":44,"../utils/is-in-viewport":46,"../utils/select":49,"../utils/toggle":52}],17:[function(require,module,exports){ +"use strict"; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var behavior = require("../utils/behavior"); + +var _require = require("../events"), + CLICK = _require.CLICK; + +var _require2 = require("../config"), + PREFIX = _require2.prefix; + +var HEADER = ".".concat(PREFIX, "-banner__header"); +var EXPANDED_CLASS = "".concat(PREFIX, "-banner__header--expanded"); + +var toggleBanner = function toggleEl(event) { + event.preventDefault(); + this.closest(HEADER).classList.toggle(EXPANDED_CLASS); +}; + +module.exports = behavior(_defineProperty({}, CLICK, _defineProperty({}, "".concat(HEADER, " [aria-controls]"), toggleBanner))); + +},{"../config":35,"../events":36,"../utils/behavior":44}],18:[function(require,module,exports){ +"use strict"; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var select = require("../utils/select"); + +var behavior = require("../utils/behavior"); + +var _require = require("../config"), + PREFIX = _require.prefix; + +var CHARACTER_COUNT = ".".concat(PREFIX, "-character-count"); +var INPUT = ".".concat(PREFIX, "-character-count__field"); +var MESSAGE = ".".concat(PREFIX, "-character-count__message"); +var VALIDATION_MESSAGE = "The content is too long."; +var MESSAGE_INVALID_CLASS = "".concat(PREFIX, "-character-count__message--invalid"); +/** + * The elements within the character count. + * @typedef {Object} CharacterCountElements + * @property {HTMLDivElement} characterCountEl + * @property {HTMLSpanElement} messageEl + */ + +/** + * Returns the root and message element + * for an character count input + * + * @param {HTMLInputElement|HTMLTextAreaElement} inputEl The character count input element + * @returns {CharacterCountElements} elements The root and message element. + */ + +var getCharacterCountElements = function getCharacterCountElements(inputEl) { + var characterCountEl = inputEl.closest(CHARACTER_COUNT); + + if (!characterCountEl) { + throw new Error("".concat(INPUT, " is missing outer ").concat(CHARACTER_COUNT)); + } + + var messageEl = characterCountEl.querySelector(MESSAGE); + + if (!messageEl) { + throw new Error("".concat(CHARACTER_COUNT, " is missing inner ").concat(MESSAGE)); + } + + return { + characterCountEl: characterCountEl, + messageEl: messageEl + }; +}; +/** + * Update the character count component + * + * @param {HTMLInputElement|HTMLTextAreaElement} inputEl The character count input element + */ + + +var updateCountMessage = function updateCountMessage(inputEl) { + var _getCharacterCountEle = getCharacterCountElements(inputEl), + characterCountEl = _getCharacterCountEle.characterCountEl, + messageEl = _getCharacterCountEle.messageEl; + + var maxlength = parseInt(characterCountEl.getAttribute("data-maxlength"), 10); + if (!maxlength) return; + var newMessage = ""; + var currentLength = inputEl.value.length; + var isOverLimit = currentLength && currentLength > maxlength; + + if (currentLength === 0) { + newMessage = "".concat(maxlength, " characters allowed"); + } else { + var difference = Math.abs(maxlength - currentLength); + var characters = "character".concat(difference === 1 ? "" : "s"); + var guidance = isOverLimit ? "over limit" : "left"; + newMessage = "".concat(difference, " ").concat(characters, " ").concat(guidance); + } + + messageEl.classList.toggle(MESSAGE_INVALID_CLASS, isOverLimit); + messageEl.innerHTML = newMessage; + + if (isOverLimit && !inputEl.validationMessage) { + inputEl.setCustomValidity(VALIDATION_MESSAGE); + } + + if (!isOverLimit && inputEl.validationMessage === VALIDATION_MESSAGE) { + inputEl.setCustomValidity(""); + } +}; +/** + * Setup the character count component + * + * @param {HTMLInputElement|HTMLTextAreaElement} inputEl The character count input element + */ + + +var setupAttributes = function setupAttributes(inputEl) { + var _getCharacterCountEle2 = getCharacterCountElements(inputEl), + characterCountEl = _getCharacterCountEle2.characterCountEl; + + var maxlength = inputEl.getAttribute("maxlength"); + if (!maxlength) return; + inputEl.removeAttribute("maxlength"); + characterCountEl.setAttribute("data-maxlength", maxlength); +}; + +var characterCount = behavior({ + input: _defineProperty({}, INPUT, function () { + updateCountMessage(this); + }) +}, { + init: function init(root) { + select(INPUT, root).forEach(function (input) { + setupAttributes(input); + updateCountMessage(input); + }); + }, + MESSAGE_INVALID_CLASS: MESSAGE_INVALID_CLASS, + VALIDATION_MESSAGE: VALIDATION_MESSAGE +}); +module.exports = characterCount; + +},{"../config":35,"../utils/behavior":44,"../utils/select":49}],19:[function(require,module,exports){ +"use strict"; + +var _CLICK, _keydown, _behavior; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var keymap = require("receptor/keymap"); + +var select = require("../utils/select"); + +var behavior = require("../utils/behavior"); + +var _require = require("../config"), + PREFIX = _require.prefix; + +var _require2 = require("../events"), + CLICK = _require2.CLICK; + +var COMBO_BOX_CLASS = "".concat(PREFIX, "-combo-box"); +var COMBO_BOX_PRISTINE_CLASS = "".concat(COMBO_BOX_CLASS, "--pristine"); +var SELECT_CLASS = "".concat(COMBO_BOX_CLASS, "__select"); +var INPUT_CLASS = "".concat(COMBO_BOX_CLASS, "__input"); +var CLEAR_INPUT_BUTTON_CLASS = "".concat(COMBO_BOX_CLASS, "__clear-input"); +var CLEAR_INPUT_BUTTON_WRAPPER_CLASS = "".concat(CLEAR_INPUT_BUTTON_CLASS, "__wrapper"); +var INPUT_BUTTON_SEPARATOR_CLASS = "".concat(COMBO_BOX_CLASS, "__input-button-separator"); +var TOGGLE_LIST_BUTTON_CLASS = "".concat(COMBO_BOX_CLASS, "__toggle-list"); +var TOGGLE_LIST_BUTTON_WRAPPER_CLASS = "".concat(TOGGLE_LIST_BUTTON_CLASS, "__wrapper"); +var LIST_CLASS = "".concat(COMBO_BOX_CLASS, "__list"); +var LIST_OPTION_CLASS = "".concat(COMBO_BOX_CLASS, "__list-option"); +var LIST_OPTION_FOCUSED_CLASS = "".concat(LIST_OPTION_CLASS, "--focused"); +var LIST_OPTION_SELECTED_CLASS = "".concat(LIST_OPTION_CLASS, "--selected"); +var STATUS_CLASS = "".concat(COMBO_BOX_CLASS, "__status"); +var COMBO_BOX = ".".concat(COMBO_BOX_CLASS); +var SELECT = ".".concat(SELECT_CLASS); +var INPUT = ".".concat(INPUT_CLASS); +var CLEAR_INPUT_BUTTON = ".".concat(CLEAR_INPUT_BUTTON_CLASS); +var TOGGLE_LIST_BUTTON = ".".concat(TOGGLE_LIST_BUTTON_CLASS); +var LIST = ".".concat(LIST_CLASS); +var LIST_OPTION = ".".concat(LIST_OPTION_CLASS); +var LIST_OPTION_FOCUSED = ".".concat(LIST_OPTION_FOCUSED_CLASS); +var LIST_OPTION_SELECTED = ".".concat(LIST_OPTION_SELECTED_CLASS); +var STATUS = ".".concat(STATUS_CLASS); +var DEFAULT_FILTER = ".*{{query}}.*"; + +var noop = function noop() {}; +/** + * set the value of the element and dispatch a change event + * + * @param {HTMLInputElement|HTMLSelectElement} el The element to update + * @param {string} value The new value of the element + */ + + +var changeElementValue = function changeElementValue(el) { + var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var elementToChange = el; + elementToChange.value = value; + var event = new CustomEvent("change", { + bubbles: true, + cancelable: true, + detail: { + value: value + } + }); + elementToChange.dispatchEvent(event); +}; +/** + * The elements within the combo box. + * @typedef {Object} ComboBoxContext + * @property {HTMLElement} comboBoxEl + * @property {HTMLSelectElement} selectEl + * @property {HTMLInputElement} inputEl + * @property {HTMLUListElement} listEl + * @property {HTMLDivElement} statusEl + * @property {HTMLLIElement} focusedOptionEl + * @property {HTMLLIElement} selectedOptionEl + * @property {HTMLButtonElement} toggleListBtnEl + * @property {HTMLButtonElement} clearInputBtnEl + * @property {boolean} isPristine + * @property {boolean} disableFiltering + */ + +/** + * Get an object of elements belonging directly to the given + * combo box component. + * + * @param {HTMLElement} el the element within the combo box + * @returns {ComboBoxContext} elements + */ + + +var getComboBoxContext = function getComboBoxContext(el) { + var comboBoxEl = el.closest(COMBO_BOX); + + if (!comboBoxEl) { + throw new Error("Element is missing outer ".concat(COMBO_BOX)); + } + + var selectEl = comboBoxEl.querySelector(SELECT); + var inputEl = comboBoxEl.querySelector(INPUT); + var listEl = comboBoxEl.querySelector(LIST); + var statusEl = comboBoxEl.querySelector(STATUS); + var focusedOptionEl = comboBoxEl.querySelector(LIST_OPTION_FOCUSED); + var selectedOptionEl = comboBoxEl.querySelector(LIST_OPTION_SELECTED); + var toggleListBtnEl = comboBoxEl.querySelector(TOGGLE_LIST_BUTTON); + var clearInputBtnEl = comboBoxEl.querySelector(CLEAR_INPUT_BUTTON); + var isPristine = comboBoxEl.classList.contains(COMBO_BOX_PRISTINE_CLASS); + var disableFiltering = comboBoxEl.dataset.disableFiltering === "true"; + return { + comboBoxEl: comboBoxEl, + selectEl: selectEl, + inputEl: inputEl, + listEl: listEl, + statusEl: statusEl, + focusedOptionEl: focusedOptionEl, + selectedOptionEl: selectedOptionEl, + toggleListBtnEl: toggleListBtnEl, + clearInputBtnEl: clearInputBtnEl, + isPristine: isPristine, + disableFiltering: disableFiltering + }; +}; +/** + * Disable the combo-box component + * + * @param {HTMLInputElement} el An element within the combo box component + */ + + +var disable = function disable(el) { + var _getComboBoxContext = getComboBoxContext(el), + inputEl = _getComboBoxContext.inputEl, + toggleListBtnEl = _getComboBoxContext.toggleListBtnEl, + clearInputBtnEl = _getComboBoxContext.clearInputBtnEl; + + clearInputBtnEl.hidden = true; + clearInputBtnEl.disabled = true; + toggleListBtnEl.disabled = true; + inputEl.disabled = true; +}; +/** + * Enable the combo-box component + * + * @param {HTMLInputElement} el An element within the combo box component + */ + + +var enable = function enable(el) { + var _getComboBoxContext2 = getComboBoxContext(el), + inputEl = _getComboBoxContext2.inputEl, + toggleListBtnEl = _getComboBoxContext2.toggleListBtnEl, + clearInputBtnEl = _getComboBoxContext2.clearInputBtnEl; + + clearInputBtnEl.hidden = false; + clearInputBtnEl.disabled = false; + toggleListBtnEl.disabled = false; + inputEl.disabled = false; +}; +/** + * Enhance a select element into a combo box component. + * + * @param {HTMLElement} _comboBoxEl The initial element of the combo box component + */ + + +var enhanceComboBox = function enhanceComboBox(_comboBoxEl) { + var comboBoxEl = _comboBoxEl.closest(COMBO_BOX); + + if (comboBoxEl.dataset.enhanced) return; + var selectEl = comboBoxEl.querySelector("select"); + + if (!selectEl) { + throw new Error("".concat(COMBO_BOX, " is missing inner select")); + } + + var selectId = selectEl.id; + var selectLabel = document.querySelector("label[for=\"".concat(selectId, "\"]")); + var listId = "".concat(selectId, "--list"); + var listIdLabel = "".concat(selectId, "-label"); + var assistiveHintID = "".concat(selectId, "--assistiveHint"); + var additionalAttributes = []; + var defaultValue = comboBoxEl.dataset.defaultValue; + var placeholder = comboBoxEl.dataset.placeholder; + var selectedOption; + + if (placeholder) { + additionalAttributes.push("placeholder=\"".concat(placeholder, "\"")); + } + + if (defaultValue) { + for (var i = 0, len = selectEl.options.length; i < len; i += 1) { + var optionEl = selectEl.options[i]; + + if (optionEl.value === defaultValue) { + selectedOption = optionEl; + break; + } + } + } + /** + * Throw error if combobox is missing a label or label is missing + * `for` attribute. Otherwise, set the ID to match the
    aria-labelledby + */ + + + if (!selectLabel || !selectLabel.matches("label[for=\"".concat(selectId, "\"]"))) { + throw new Error("".concat(COMBO_BOX, " for ").concat(selectId, " is either missing a label or a \"for\" attribute")); + } else { + selectLabel.setAttribute("id", listIdLabel); + } + + selectLabel.setAttribute("id", listIdLabel); + selectEl.setAttribute("aria-hidden", "true"); + selectEl.setAttribute("tabindex", "-1"); + selectEl.classList.add("usa-sr-only", SELECT_CLASS); + selectEl.id = ""; + selectEl.value = ""; + ["required", "aria-label", "aria-labelledby"].forEach(function (name) { + if (selectEl.hasAttribute(name)) { + var value = selectEl.getAttribute(name); + additionalAttributes.push("".concat(name, "=\"").concat(value, "\"")); + selectEl.removeAttribute(name); + } + }); + comboBoxEl.insertAdjacentHTML("beforeend", [""), "\n \n "), " "), "\n \n "), "
"), "
"), "\n When autocomplete results are available use up and down arrows to review and enter to select.\n Touch device users, explore by touch or with swipe gestures.\n ")].join("")); + + if (selectedOption) { + var _getComboBoxContext3 = getComboBoxContext(comboBoxEl), + inputEl = _getComboBoxContext3.inputEl; + + changeElementValue(selectEl, selectedOption.value); + changeElementValue(inputEl, selectedOption.text); + comboBoxEl.classList.add(COMBO_BOX_PRISTINE_CLASS); + } + + if (selectEl.disabled) { + disable(comboBoxEl); + selectEl.disabled = false; + } + + comboBoxEl.dataset.enhanced = "true"; +}; +/** + * Manage the focused element within the list options when + * navigating via keyboard. + * + * @param {HTMLElement} el An anchor element within the combo box component + * @param {HTMLElement} nextEl An element within the combo box component + * @param {Object} options options + * @param {boolean} options.skipFocus skip focus of highlighted item + * @param {boolean} options.preventScroll should skip procedure to scroll to element + */ + + +var highlightOption = function highlightOption(el, nextEl) { + var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, + skipFocus = _ref.skipFocus, + preventScroll = _ref.preventScroll; + + var _getComboBoxContext4 = getComboBoxContext(el), + inputEl = _getComboBoxContext4.inputEl, + listEl = _getComboBoxContext4.listEl, + focusedOptionEl = _getComboBoxContext4.focusedOptionEl; + + if (focusedOptionEl) { + focusedOptionEl.classList.remove(LIST_OPTION_FOCUSED_CLASS); + focusedOptionEl.setAttribute("tabIndex", "-1"); + } + + if (nextEl) { + inputEl.setAttribute("aria-activedescendant", nextEl.id); + nextEl.setAttribute("tabIndex", "0"); + nextEl.classList.add(LIST_OPTION_FOCUSED_CLASS); + + if (!preventScroll) { + var optionBottom = nextEl.offsetTop + nextEl.offsetHeight; + var currentBottom = listEl.scrollTop + listEl.offsetHeight; + + if (optionBottom > currentBottom) { + listEl.scrollTop = optionBottom - listEl.offsetHeight; + } + + if (nextEl.offsetTop < listEl.scrollTop) { + listEl.scrollTop = nextEl.offsetTop; + } + } + + if (!skipFocus) { + nextEl.focus({ + preventScroll: preventScroll + }); + } + } else { + inputEl.setAttribute("aria-activedescendant", ""); + inputEl.focus(); + } +}; +/** + * Generate a dynamic regular expression based off of a replaceable and possibly filtered value. + * + * @param {string} el An element within the combo box component + * @param {string} query The value to use in the regular expression + * @param {object} extras An object of regular expressions to replace and filter the query + */ + + +var generateDynamicRegExp = function generateDynamicRegExp(filter) { + var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var extras = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + var escapeRegExp = function escapeRegExp(text) { + return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + }; + + var find = filter.replace(/{{(.*?)}}/g, function (m, $1) { + var key = $1.trim(); + var queryFilter = extras[key]; + + if (key !== "query" && queryFilter) { + var matcher = new RegExp(queryFilter, "i"); + var matches = query.match(matcher); + + if (matches) { + return escapeRegExp(matches[1]); + } + + return ""; + } + + return escapeRegExp(query); + }); + find = "^(?:" + find + ")$"; + return new RegExp(find, "i"); +}; +/** + * Display the option list of a combo box component. + * + * @param {HTMLElement} el An element within the combo box component + */ + + +var displayList = function displayList(el) { + var _getComboBoxContext5 = getComboBoxContext(el), + comboBoxEl = _getComboBoxContext5.comboBoxEl, + selectEl = _getComboBoxContext5.selectEl, + inputEl = _getComboBoxContext5.inputEl, + listEl = _getComboBoxContext5.listEl, + statusEl = _getComboBoxContext5.statusEl, + isPristine = _getComboBoxContext5.isPristine, + disableFiltering = _getComboBoxContext5.disableFiltering; + + var selectedItemId; + var firstFoundId; + var listOptionBaseId = "".concat(listEl.id, "--option-"); + var inputValue = (inputEl.value || "").toLowerCase(); + var filter = comboBoxEl.dataset.filter || DEFAULT_FILTER; + var regex = generateDynamicRegExp(filter, inputValue, comboBoxEl.dataset); + var options = []; + + for (var i = 0, len = selectEl.options.length; i < len; i += 1) { + var optionEl = selectEl.options[i]; + var optionId = "".concat(listOptionBaseId).concat(options.length); + + if (optionEl.value && (disableFiltering || isPristine || !inputValue || regex.test(optionEl.text))) { + if (selectEl.value && optionEl.value === selectEl.value) { + selectedItemId = optionId; + } + + if (disableFiltering && !firstFoundId && regex.test(optionEl.text)) { + firstFoundId = optionId; + } + + options.push(optionEl); + } + } + + var numOptions = options.length; + var optionHtml = options.map(function (option, index) { + var optionId = "".concat(listOptionBaseId).concat(index); + var classes = [LIST_OPTION_CLASS]; + var tabindex = "-1"; + var ariaSelected = "false"; + + if (optionId === selectedItemId) { + classes.push(LIST_OPTION_SELECTED_CLASS, LIST_OPTION_FOCUSED_CLASS); + tabindex = "0"; + ariaSelected = "true"; + } + + if (!selectedItemId && index === 0) { + classes.push(LIST_OPTION_FOCUSED_CLASS); + tabindex = "0"; + } + + return "").concat(option.text, ""); + }).join(""); + var noResults = "
  • No results found
  • "); + listEl.hidden = false; + listEl.innerHTML = numOptions ? optionHtml : noResults; + inputEl.setAttribute("aria-expanded", "true"); + statusEl.innerHTML = numOptions ? "".concat(numOptions, " result").concat(numOptions > 1 ? "s" : "", " available.") : "No results."; + var itemToFocus; + + if (isPristine && selectedItemId) { + itemToFocus = listEl.querySelector("#" + selectedItemId); + } else if (disableFiltering && firstFoundId) { + itemToFocus = listEl.querySelector("#" + firstFoundId); + } + + if (itemToFocus) { + highlightOption(listEl, itemToFocus, { + skipFocus: true + }); + } +}; +/** + * Hide the option list of a combo box component. + * + * @param {HTMLElement} el An element within the combo box component + */ + + +var hideList = function hideList(el) { + var _getComboBoxContext6 = getComboBoxContext(el), + inputEl = _getComboBoxContext6.inputEl, + listEl = _getComboBoxContext6.listEl, + statusEl = _getComboBoxContext6.statusEl, + focusedOptionEl = _getComboBoxContext6.focusedOptionEl; + + statusEl.innerHTML = ""; + inputEl.setAttribute("aria-expanded", "false"); + inputEl.setAttribute("aria-activedescendant", ""); + + if (focusedOptionEl) { + focusedOptionEl.classList.remove(LIST_OPTION_FOCUSED_CLASS); + } + + listEl.scrollTop = 0; + listEl.hidden = true; +}; +/** + * Select an option list of the combo box component. + * + * @param {HTMLElement} listOptionEl The list option being selected + */ + + +var selectItem = function selectItem(listOptionEl) { + var _getComboBoxContext7 = getComboBoxContext(listOptionEl), + comboBoxEl = _getComboBoxContext7.comboBoxEl, + selectEl = _getComboBoxContext7.selectEl, + inputEl = _getComboBoxContext7.inputEl; + + changeElementValue(selectEl, listOptionEl.dataset.value); + changeElementValue(inputEl, listOptionEl.textContent); + comboBoxEl.classList.add(COMBO_BOX_PRISTINE_CLASS); + hideList(comboBoxEl); + inputEl.focus(); +}; +/** + * Clear the input of the combo box + * + * @param {HTMLButtonElement} clearButtonEl The clear input button + */ + + +var clearInput = function clearInput(clearButtonEl) { + var _getComboBoxContext8 = getComboBoxContext(clearButtonEl), + comboBoxEl = _getComboBoxContext8.comboBoxEl, + listEl = _getComboBoxContext8.listEl, + selectEl = _getComboBoxContext8.selectEl, + inputEl = _getComboBoxContext8.inputEl; + + var listShown = !listEl.hidden; + if (selectEl.value) changeElementValue(selectEl); + if (inputEl.value) changeElementValue(inputEl); + comboBoxEl.classList.remove(COMBO_BOX_PRISTINE_CLASS); + if (listShown) displayList(comboBoxEl); + inputEl.focus(); +}; +/** + * Reset the select based off of currently set select value + * + * @param {HTMLElement} el An element within the combo box component + */ + + +var resetSelection = function resetSelection(el) { + var _getComboBoxContext9 = getComboBoxContext(el), + comboBoxEl = _getComboBoxContext9.comboBoxEl, + selectEl = _getComboBoxContext9.selectEl, + inputEl = _getComboBoxContext9.inputEl; + + var selectValue = selectEl.value; + var inputValue = (inputEl.value || "").toLowerCase(); + + if (selectValue) { + for (var i = 0, len = selectEl.options.length; i < len; i += 1) { + var optionEl = selectEl.options[i]; + + if (optionEl.value === selectValue) { + if (inputValue !== optionEl.text) { + changeElementValue(inputEl, optionEl.text); + } + + comboBoxEl.classList.add(COMBO_BOX_PRISTINE_CLASS); + return; + } + } + } + + if (inputValue) { + changeElementValue(inputEl); + } +}; +/** + * Select an option list of the combo box component based off of + * having a current focused list option or + * having test that completely matches a list option. + * Otherwise it clears the input and select. + * + * @param {HTMLElement} el An element within the combo box component + */ + + +var completeSelection = function completeSelection(el) { + var _getComboBoxContext10 = getComboBoxContext(el), + comboBoxEl = _getComboBoxContext10.comboBoxEl, + selectEl = _getComboBoxContext10.selectEl, + inputEl = _getComboBoxContext10.inputEl, + statusEl = _getComboBoxContext10.statusEl; + + statusEl.textContent = ""; + var inputValue = (inputEl.value || "").toLowerCase(); + + if (inputValue) { + for (var i = 0, len = selectEl.options.length; i < len; i += 1) { + var optionEl = selectEl.options[i]; + + if (optionEl.text.toLowerCase() === inputValue) { + changeElementValue(selectEl, optionEl.value); + changeElementValue(inputEl, optionEl.text); + comboBoxEl.classList.add(COMBO_BOX_PRISTINE_CLASS); + return; + } + } + } + + resetSelection(comboBoxEl); +}; +/** + * Handle the escape event within the combo box component. + * + * @param {KeyboardEvent} event An event within the combo box component + */ + + +var handleEscape = function handleEscape(event) { + var _getComboBoxContext11 = getComboBoxContext(event.target), + comboBoxEl = _getComboBoxContext11.comboBoxEl, + inputEl = _getComboBoxContext11.inputEl; + + hideList(comboBoxEl); + resetSelection(comboBoxEl); + inputEl.focus(); +}; +/** + * Handle the down event within the combo box component. + * + * @param {KeyboardEvent} event An event within the combo box component + */ + + +var handleDownFromInput = function handleDownFromInput(event) { + var _getComboBoxContext12 = getComboBoxContext(event.target), + comboBoxEl = _getComboBoxContext12.comboBoxEl, + listEl = _getComboBoxContext12.listEl; + + if (listEl.hidden) { + displayList(comboBoxEl); + } + + var nextOptionEl = listEl.querySelector(LIST_OPTION_FOCUSED) || listEl.querySelector(LIST_OPTION); + + if (nextOptionEl) { + highlightOption(comboBoxEl, nextOptionEl); + } + + event.preventDefault(); +}; +/** + * Handle the enter event from an input element within the combo box component. + * + * @param {KeyboardEvent} event An event within the combo box component + */ + + +var handleEnterFromInput = function handleEnterFromInput(event) { + var _getComboBoxContext13 = getComboBoxContext(event.target), + comboBoxEl = _getComboBoxContext13.comboBoxEl, + listEl = _getComboBoxContext13.listEl; + + var listShown = !listEl.hidden; + completeSelection(comboBoxEl); + + if (listShown) { + hideList(comboBoxEl); + } + + event.preventDefault(); +}; +/** + * Handle the down event within the combo box component. + * + * @param {KeyboardEvent} event An event within the combo box component + */ + + +var handleDownFromListOption = function handleDownFromListOption(event) { + var focusedOptionEl = event.target; + var nextOptionEl = focusedOptionEl.nextSibling; + + if (nextOptionEl) { + highlightOption(focusedOptionEl, nextOptionEl); + } + + event.preventDefault(); +}; +/** + * Handle the tab event from an list option element within the combo box component. + * + * @param {KeyboardEvent} event An event within the combo box component + */ + + +var handleTabFromListOption = function handleTabFromListOption(event) { + selectItem(event.target); + event.preventDefault(); +}; +/** + * Handle the enter event from list option within the combo box component. + * + * @param {KeyboardEvent} event An event within the combo box component + */ + + +var handleEnterFromListOption = function handleEnterFromListOption(event) { + selectItem(event.target); + event.preventDefault(); +}; +/** + * Handle the up event from list option within the combo box component. + * + * @param {KeyboardEvent} event An event within the combo box component + */ + + +var handleUpFromListOption = function handleUpFromListOption(event) { + var _getComboBoxContext14 = getComboBoxContext(event.target), + comboBoxEl = _getComboBoxContext14.comboBoxEl, + listEl = _getComboBoxContext14.listEl, + focusedOptionEl = _getComboBoxContext14.focusedOptionEl; + + var nextOptionEl = focusedOptionEl && focusedOptionEl.previousSibling; + var listShown = !listEl.hidden; + highlightOption(comboBoxEl, nextOptionEl); + + if (listShown) { + event.preventDefault(); + } + + if (!nextOptionEl) { + hideList(comboBoxEl); + } +}; +/** + * Select list option on the mousemove event. + * + * @param {MouseEvent} event The mousemove event + * @param {HTMLLIElement} listOptionEl An element within the combo box component + */ + + +var handleMousemove = function handleMousemove(listOptionEl) { + var isCurrentlyFocused = listOptionEl.classList.contains(LIST_OPTION_FOCUSED_CLASS); + if (isCurrentlyFocused) return; + highlightOption(listOptionEl, listOptionEl, { + preventScroll: true + }); +}; +/** + * Toggle the list when the button is clicked + * + * @param {HTMLElement} el An element within the combo box component + */ + + +var toggleList = function toggleList(el) { + var _getComboBoxContext15 = getComboBoxContext(el), + comboBoxEl = _getComboBoxContext15.comboBoxEl, + listEl = _getComboBoxContext15.listEl, + inputEl = _getComboBoxContext15.inputEl; + + if (listEl.hidden) { + displayList(comboBoxEl); + } else { + hideList(comboBoxEl); + } + + inputEl.focus(); +}; +/** + * Handle click from input + * + * @param {HTMLInputElement} el An element within the combo box component + */ + + +var handleClickFromInput = function handleClickFromInput(el) { + var _getComboBoxContext16 = getComboBoxContext(el), + comboBoxEl = _getComboBoxContext16.comboBoxEl, + listEl = _getComboBoxContext16.listEl; + + if (listEl.hidden) { + displayList(comboBoxEl); + } +}; + +var comboBox = behavior((_behavior = {}, _defineProperty(_behavior, CLICK, (_CLICK = {}, _defineProperty(_CLICK, INPUT, function () { + if (this.disabled) return; + handleClickFromInput(this); +}), _defineProperty(_CLICK, TOGGLE_LIST_BUTTON, function () { + if (this.disabled) return; + toggleList(this); +}), _defineProperty(_CLICK, LIST_OPTION, function () { + if (this.disabled) return; + selectItem(this); +}), _defineProperty(_CLICK, CLEAR_INPUT_BUTTON, function () { + if (this.disabled) return; + clearInput(this); +}), _CLICK)), _defineProperty(_behavior, "focusout", _defineProperty({}, COMBO_BOX, function (event) { + if (!this.contains(event.relatedTarget)) { + resetSelection(this); + hideList(this); + } +})), _defineProperty(_behavior, "keydown", (_keydown = {}, _defineProperty(_keydown, COMBO_BOX, keymap({ + Escape: handleEscape +})), _defineProperty(_keydown, INPUT, keymap({ + Enter: handleEnterFromInput, + ArrowDown: handleDownFromInput, + Down: handleDownFromInput +})), _defineProperty(_keydown, LIST_OPTION, keymap({ + ArrowUp: handleUpFromListOption, + Up: handleUpFromListOption, + ArrowDown: handleDownFromListOption, + Down: handleDownFromListOption, + Enter: handleEnterFromListOption, + Tab: handleTabFromListOption, + "Shift+Tab": noop +})), _keydown)), _defineProperty(_behavior, "input", _defineProperty({}, INPUT, function () { + var comboBoxEl = this.closest(COMBO_BOX); + comboBoxEl.classList.remove(COMBO_BOX_PRISTINE_CLASS); + displayList(this); +})), _defineProperty(_behavior, "mousemove", _defineProperty({}, LIST_OPTION, function () { + handleMousemove(this); +})), _behavior), { + init: function init(root) { + select(COMBO_BOX, root).forEach(function (comboBoxEl) { + enhanceComboBox(comboBoxEl); + }); + }, + getComboBoxContext: getComboBoxContext, + enhanceComboBox: enhanceComboBox, + generateDynamicRegExp: generateDynamicRegExp, + disable: disable, + enable: enable, + displayList: displayList, + hideList: hideList, + COMBO_BOX_CLASS: COMBO_BOX_CLASS +}); +module.exports = comboBox; + +},{"../config":35,"../events":36,"../utils/behavior":44,"../utils/select":49,"receptor/keymap":13}],20:[function(require,module,exports){ +"use strict"; + +var _CLICK, _keydown, _focusout, _datePickerEvents; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +var keymap = require("receptor/keymap"); + +var behavior = require("../utils/behavior"); + +var select = require("../utils/select"); + +var _require = require("../config"), + PREFIX = _require.prefix; + +var _require2 = require("../events"), + CLICK = _require2.CLICK; + +var activeElement = require("../utils/active-element"); + +var isIosDevice = require("../utils/is-ios-device"); + +var DATE_PICKER_CLASS = "".concat(PREFIX, "-date-picker"); +var DATE_PICKER_WRAPPER_CLASS = "".concat(DATE_PICKER_CLASS, "__wrapper"); +var DATE_PICKER_INITIALIZED_CLASS = "".concat(DATE_PICKER_CLASS, "--initialized"); +var DATE_PICKER_ACTIVE_CLASS = "".concat(DATE_PICKER_CLASS, "--active"); +var DATE_PICKER_INTERNAL_INPUT_CLASS = "".concat(DATE_PICKER_CLASS, "__internal-input"); +var DATE_PICKER_EXTERNAL_INPUT_CLASS = "".concat(DATE_PICKER_CLASS, "__external-input"); +var DATE_PICKER_BUTTON_CLASS = "".concat(DATE_PICKER_CLASS, "__button"); +var DATE_PICKER_CALENDAR_CLASS = "".concat(DATE_PICKER_CLASS, "__calendar"); +var DATE_PICKER_STATUS_CLASS = "".concat(DATE_PICKER_CLASS, "__status"); +var CALENDAR_DATE_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__date"); +var CALENDAR_DATE_FOCUSED_CLASS = "".concat(CALENDAR_DATE_CLASS, "--focused"); +var CALENDAR_DATE_SELECTED_CLASS = "".concat(CALENDAR_DATE_CLASS, "--selected"); +var CALENDAR_DATE_PREVIOUS_MONTH_CLASS = "".concat(CALENDAR_DATE_CLASS, "--previous-month"); +var CALENDAR_DATE_CURRENT_MONTH_CLASS = "".concat(CALENDAR_DATE_CLASS, "--current-month"); +var CALENDAR_DATE_NEXT_MONTH_CLASS = "".concat(CALENDAR_DATE_CLASS, "--next-month"); +var CALENDAR_DATE_RANGE_DATE_CLASS = "".concat(CALENDAR_DATE_CLASS, "--range-date"); +var CALENDAR_DATE_TODAY_CLASS = "".concat(CALENDAR_DATE_CLASS, "--today"); +var CALENDAR_DATE_RANGE_DATE_START_CLASS = "".concat(CALENDAR_DATE_CLASS, "--range-date-start"); +var CALENDAR_DATE_RANGE_DATE_END_CLASS = "".concat(CALENDAR_DATE_CLASS, "--range-date-end"); +var CALENDAR_DATE_WITHIN_RANGE_CLASS = "".concat(CALENDAR_DATE_CLASS, "--within-range"); +var CALENDAR_PREVIOUS_YEAR_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__previous-year"); +var CALENDAR_PREVIOUS_MONTH_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__previous-month"); +var CALENDAR_NEXT_YEAR_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__next-year"); +var CALENDAR_NEXT_MONTH_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__next-month"); +var CALENDAR_MONTH_SELECTION_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__month-selection"); +var CALENDAR_YEAR_SELECTION_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__year-selection"); +var CALENDAR_MONTH_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__month"); +var CALENDAR_MONTH_FOCUSED_CLASS = "".concat(CALENDAR_MONTH_CLASS, "--focused"); +var CALENDAR_MONTH_SELECTED_CLASS = "".concat(CALENDAR_MONTH_CLASS, "--selected"); +var CALENDAR_YEAR_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__year"); +var CALENDAR_YEAR_FOCUSED_CLASS = "".concat(CALENDAR_YEAR_CLASS, "--focused"); +var CALENDAR_YEAR_SELECTED_CLASS = "".concat(CALENDAR_YEAR_CLASS, "--selected"); +var CALENDAR_PREVIOUS_YEAR_CHUNK_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__previous-year-chunk"); +var CALENDAR_NEXT_YEAR_CHUNK_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__next-year-chunk"); +var CALENDAR_DATE_PICKER_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__date-picker"); +var CALENDAR_MONTH_PICKER_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__month-picker"); +var CALENDAR_YEAR_PICKER_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__year-picker"); +var CALENDAR_TABLE_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__table"); +var CALENDAR_ROW_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__row"); +var CALENDAR_CELL_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__cell"); +var CALENDAR_CELL_CENTER_ITEMS_CLASS = "".concat(CALENDAR_CELL_CLASS, "--center-items"); +var CALENDAR_MONTH_LABEL_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__month-label"); +var CALENDAR_DAY_OF_WEEK_CLASS = "".concat(DATE_PICKER_CALENDAR_CLASS, "__day-of-week"); +var DATE_PICKER = ".".concat(DATE_PICKER_CLASS); +var DATE_PICKER_BUTTON = ".".concat(DATE_PICKER_BUTTON_CLASS); +var DATE_PICKER_INTERNAL_INPUT = ".".concat(DATE_PICKER_INTERNAL_INPUT_CLASS); +var DATE_PICKER_EXTERNAL_INPUT = ".".concat(DATE_PICKER_EXTERNAL_INPUT_CLASS); +var DATE_PICKER_CALENDAR = ".".concat(DATE_PICKER_CALENDAR_CLASS); +var DATE_PICKER_STATUS = ".".concat(DATE_PICKER_STATUS_CLASS); +var CALENDAR_DATE = ".".concat(CALENDAR_DATE_CLASS); +var CALENDAR_DATE_FOCUSED = ".".concat(CALENDAR_DATE_FOCUSED_CLASS); +var CALENDAR_DATE_CURRENT_MONTH = ".".concat(CALENDAR_DATE_CURRENT_MONTH_CLASS); +var CALENDAR_PREVIOUS_YEAR = ".".concat(CALENDAR_PREVIOUS_YEAR_CLASS); +var CALENDAR_PREVIOUS_MONTH = ".".concat(CALENDAR_PREVIOUS_MONTH_CLASS); +var CALENDAR_NEXT_YEAR = ".".concat(CALENDAR_NEXT_YEAR_CLASS); +var CALENDAR_NEXT_MONTH = ".".concat(CALENDAR_NEXT_MONTH_CLASS); +var CALENDAR_YEAR_SELECTION = ".".concat(CALENDAR_YEAR_SELECTION_CLASS); +var CALENDAR_MONTH_SELECTION = ".".concat(CALENDAR_MONTH_SELECTION_CLASS); +var CALENDAR_MONTH = ".".concat(CALENDAR_MONTH_CLASS); +var CALENDAR_YEAR = ".".concat(CALENDAR_YEAR_CLASS); +var CALENDAR_PREVIOUS_YEAR_CHUNK = ".".concat(CALENDAR_PREVIOUS_YEAR_CHUNK_CLASS); +var CALENDAR_NEXT_YEAR_CHUNK = ".".concat(CALENDAR_NEXT_YEAR_CHUNK_CLASS); +var CALENDAR_DATE_PICKER = ".".concat(CALENDAR_DATE_PICKER_CLASS); +var CALENDAR_MONTH_PICKER = ".".concat(CALENDAR_MONTH_PICKER_CLASS); +var CALENDAR_YEAR_PICKER = ".".concat(CALENDAR_YEAR_PICKER_CLASS); +var CALENDAR_MONTH_FOCUSED = ".".concat(CALENDAR_MONTH_FOCUSED_CLASS); +var CALENDAR_YEAR_FOCUSED = ".".concat(CALENDAR_YEAR_FOCUSED_CLASS); +var VALIDATION_MESSAGE = "Please enter a valid date"; +var MONTH_LABELS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; +var DAY_OF_WEEK_LABELS = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; +var ENTER_KEYCODE = 13; +var YEAR_CHUNK = 12; +var DEFAULT_MIN_DATE = "0000-01-01"; +var DEFAULT_EXTERNAL_DATE_FORMAT = "MM/DD/YYYY"; +var INTERNAL_DATE_FORMAT = "YYYY-MM-DD"; +var NOT_DISABLED_SELECTOR = ":not([disabled])"; + +var processFocusableSelectors = function processFocusableSelectors() { + for (var _len = arguments.length, selectors = new Array(_len), _key = 0; _key < _len; _key++) { + selectors[_key] = arguments[_key]; + } + + return selectors.map(function (query) { + return query + NOT_DISABLED_SELECTOR; + }).join(", "); +}; + +var DATE_PICKER_FOCUSABLE = processFocusableSelectors(CALENDAR_PREVIOUS_YEAR, CALENDAR_PREVIOUS_MONTH, CALENDAR_YEAR_SELECTION, CALENDAR_MONTH_SELECTION, CALENDAR_NEXT_YEAR, CALENDAR_NEXT_MONTH, CALENDAR_DATE_FOCUSED); +var MONTH_PICKER_FOCUSABLE = processFocusableSelectors(CALENDAR_MONTH_FOCUSED); +var YEAR_PICKER_FOCUSABLE = processFocusableSelectors(CALENDAR_PREVIOUS_YEAR_CHUNK, CALENDAR_NEXT_YEAR_CHUNK, CALENDAR_YEAR_FOCUSED); // #region Date Manipulation Functions + +/** + * Keep date within month. Month would only be over by 1 to 3 days + * + * @param {Date} dateToCheck the date object to check + * @param {number} month the correct month + * @returns {Date} the date, corrected if needed + */ + +var keepDateWithinMonth = function keepDateWithinMonth(dateToCheck, month) { + if (month !== dateToCheck.getMonth()) { + dateToCheck.setDate(0); + } + + return dateToCheck; +}; +/** + * Set date from month day year + * + * @param {number} year the year to set + * @param {number} month the month to set (zero-indexed) + * @param {number} date the date to set + * @returns {Date} the set date + */ + + +var setDate = function setDate(year, month, date) { + var newDate = new Date(0); + newDate.setFullYear(year, month, date); + return newDate; +}; +/** + * todays date + * + * @returns {Date} todays date + */ + + +var today = function today() { + var newDate = new Date(); + var day = newDate.getDate(); + var month = newDate.getMonth(); + var year = newDate.getFullYear(); + return setDate(year, month, day); +}; +/** + * Set date to first day of the month + * + * @param {number} date the date to adjust + * @returns {Date} the adjusted date + */ + + +var startOfMonth = function startOfMonth(date) { + var newDate = new Date(0); + newDate.setFullYear(date.getFullYear(), date.getMonth(), 1); + return newDate; +}; +/** + * Set date to last day of the month + * + * @param {number} date the date to adjust + * @returns {Date} the adjusted date + */ + + +var lastDayOfMonth = function lastDayOfMonth(date) { + var newDate = new Date(0); + newDate.setFullYear(date.getFullYear(), date.getMonth() + 1, 0); + return newDate; +}; +/** + * Add days to date + * + * @param {Date} _date the date to adjust + * @param {number} numDays the difference in days + * @returns {Date} the adjusted date + */ + + +var addDays = function addDays(_date, numDays) { + var newDate = new Date(_date.getTime()); + newDate.setDate(newDate.getDate() + numDays); + return newDate; +}; +/** + * Subtract days from date + * + * @param {Date} _date the date to adjust + * @param {number} numDays the difference in days + * @returns {Date} the adjusted date + */ + + +var subDays = function subDays(_date, numDays) { + return addDays(_date, -numDays); +}; +/** + * Add weeks to date + * + * @param {Date} _date the date to adjust + * @param {number} numWeeks the difference in weeks + * @returns {Date} the adjusted date + */ + + +var addWeeks = function addWeeks(_date, numWeeks) { + return addDays(_date, numWeeks * 7); +}; +/** + * Subtract weeks from date + * + * @param {Date} _date the date to adjust + * @param {number} numWeeks the difference in weeks + * @returns {Date} the adjusted date + */ + + +var subWeeks = function subWeeks(_date, numWeeks) { + return addWeeks(_date, -numWeeks); +}; +/** + * Set date to the start of the week (Sunday) + * + * @param {Date} _date the date to adjust + * @returns {Date} the adjusted date + */ + + +var startOfWeek = function startOfWeek(_date) { + var dayOfWeek = _date.getDay(); + + return subDays(_date, dayOfWeek); +}; +/** + * Set date to the end of the week (Saturday) + * + * @param {Date} _date the date to adjust + * @param {number} numWeeks the difference in weeks + * @returns {Date} the adjusted date + */ + + +var endOfWeek = function endOfWeek(_date) { + var dayOfWeek = _date.getDay(); + + return addDays(_date, 6 - dayOfWeek); +}; +/** + * Add months to date and keep date within month + * + * @param {Date} _date the date to adjust + * @param {number} numMonths the difference in months + * @returns {Date} the adjusted date + */ + + +var addMonths = function addMonths(_date, numMonths) { + var newDate = new Date(_date.getTime()); + var dateMonth = (newDate.getMonth() + 12 + numMonths) % 12; + newDate.setMonth(newDate.getMonth() + numMonths); + keepDateWithinMonth(newDate, dateMonth); + return newDate; +}; +/** + * Subtract months from date + * + * @param {Date} _date the date to adjust + * @param {number} numMonths the difference in months + * @returns {Date} the adjusted date + */ + + +var subMonths = function subMonths(_date, numMonths) { + return addMonths(_date, -numMonths); +}; +/** + * Add years to date and keep date within month + * + * @param {Date} _date the date to adjust + * @param {number} numYears the difference in years + * @returns {Date} the adjusted date + */ + + +var addYears = function addYears(_date, numYears) { + return addMonths(_date, numYears * 12); +}; +/** + * Subtract years from date + * + * @param {Date} _date the date to adjust + * @param {number} numYears the difference in years + * @returns {Date} the adjusted date + */ + + +var subYears = function subYears(_date, numYears) { + return addYears(_date, -numYears); +}; +/** + * Set months of date + * + * @param {Date} _date the date to adjust + * @param {number} month zero-indexed month to set + * @returns {Date} the adjusted date + */ + + +var setMonth = function setMonth(_date, month) { + var newDate = new Date(_date.getTime()); + newDate.setMonth(month); + keepDateWithinMonth(newDate, month); + return newDate; +}; +/** + * Set year of date + * + * @param {Date} _date the date to adjust + * @param {number} year the year to set + * @returns {Date} the adjusted date + */ + + +var setYear = function setYear(_date, year) { + var newDate = new Date(_date.getTime()); + var month = newDate.getMonth(); + newDate.setFullYear(year); + keepDateWithinMonth(newDate, month); + return newDate; +}; +/** + * Return the earliest date + * + * @param {Date} dateA date to compare + * @param {Date} dateB date to compare + * @returns {Date} the earliest date + */ + + +var min = function min(dateA, dateB) { + var newDate = dateA; + + if (dateB < dateA) { + newDate = dateB; + } + + return new Date(newDate.getTime()); +}; +/** + * Return the latest date + * + * @param {Date} dateA date to compare + * @param {Date} dateB date to compare + * @returns {Date} the latest date + */ + + +var max = function max(dateA, dateB) { + var newDate = dateA; + + if (dateB > dateA) { + newDate = dateB; + } + + return new Date(newDate.getTime()); +}; +/** + * Check if dates are the in the same year + * + * @param {Date} dateA date to compare + * @param {Date} dateB date to compare + * @returns {boolean} are dates in the same year + */ + + +var isSameYear = function isSameYear(dateA, dateB) { + return dateA && dateB && dateA.getFullYear() === dateB.getFullYear(); +}; +/** + * Check if dates are the in the same month + * + * @param {Date} dateA date to compare + * @param {Date} dateB date to compare + * @returns {boolean} are dates in the same month + */ + + +var isSameMonth = function isSameMonth(dateA, dateB) { + return isSameYear(dateA, dateB) && dateA.getMonth() === dateB.getMonth(); +}; +/** + * Check if dates are the same date + * + * @param {Date} dateA the date to compare + * @param {Date} dateA the date to compare + * @returns {boolean} are dates the same date + */ + + +var isSameDay = function isSameDay(dateA, dateB) { + return isSameMonth(dateA, dateB) && dateA.getDate() === dateB.getDate(); +}; +/** + * return a new date within minimum and maximum date + * + * @param {Date} date date to check + * @param {Date} minDate minimum date to allow + * @param {Date} maxDate maximum date to allow + * @returns {Date} the date between min and max + */ + + +var keepDateBetweenMinAndMax = function keepDateBetweenMinAndMax(date, minDate, maxDate) { + var newDate = date; + + if (date < minDate) { + newDate = minDate; + } else if (maxDate && date > maxDate) { + newDate = maxDate; + } + + return new Date(newDate.getTime()); +}; +/** + * Check if dates is valid. + * + * @param {Date} date date to check + * @param {Date} minDate minimum date to allow + * @param {Date} maxDate maximum date to allow + * @return {boolean} is there a day within the month within min and max dates + */ + + +var isDateWithinMinAndMax = function isDateWithinMinAndMax(date, minDate, maxDate) { + return date >= minDate && (!maxDate || date <= maxDate); +}; +/** + * Check if dates month is invalid. + * + * @param {Date} date date to check + * @param {Date} minDate minimum date to allow + * @param {Date} maxDate maximum date to allow + * @return {boolean} is the month outside min or max dates + */ + + +var isDatesMonthOutsideMinOrMax = function isDatesMonthOutsideMinOrMax(date, minDate, maxDate) { + return lastDayOfMonth(date) < minDate || maxDate && startOfMonth(date) > maxDate; +}; +/** + * Check if dates year is invalid. + * + * @param {Date} date date to check + * @param {Date} minDate minimum date to allow + * @param {Date} maxDate maximum date to allow + * @return {boolean} is the month outside min or max dates + */ + + +var isDatesYearOutsideMinOrMax = function isDatesYearOutsideMinOrMax(date, minDate, maxDate) { + return lastDayOfMonth(setMonth(date, 11)) < minDate || maxDate && startOfMonth(setMonth(date, 0)) > maxDate; +}; +/** + * Parse a date with format M-D-YY + * + * @param {string} dateString the date string to parse + * @param {string} dateFormat the format of the date string + * @param {boolean} adjustDate should the date be adjusted + * @returns {Date} the parsed date + */ + + +var parseDateString = function parseDateString(dateString) { + var dateFormat = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : INTERNAL_DATE_FORMAT; + var adjustDate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var date; + var month; + var day; + var year; + var parsed; + + if (dateString) { + var monthStr, dayStr, yearStr; + + if (dateFormat === DEFAULT_EXTERNAL_DATE_FORMAT) { + var _dateString$split = dateString.split("/"); + + var _dateString$split2 = _slicedToArray(_dateString$split, 3); + + monthStr = _dateString$split2[0]; + dayStr = _dateString$split2[1]; + yearStr = _dateString$split2[2]; + } else { + var _dateString$split3 = dateString.split("-"); + + var _dateString$split4 = _slicedToArray(_dateString$split3, 3); + + yearStr = _dateString$split4[0]; + monthStr = _dateString$split4[1]; + dayStr = _dateString$split4[2]; + } + + if (yearStr) { + parsed = parseInt(yearStr, 10); + + if (!Number.isNaN(parsed)) { + year = parsed; + + if (adjustDate) { + year = Math.max(0, year); + + if (yearStr.length < 3) { + var currentYear = today().getFullYear(); + var currentYearStub = currentYear - currentYear % Math.pow(10, yearStr.length); + year = currentYearStub + parsed; + } + } + } + } + + if (monthStr) { + parsed = parseInt(monthStr, 10); + + if (!Number.isNaN(parsed)) { + month = parsed; + + if (adjustDate) { + month = Math.max(1, month); + month = Math.min(12, month); + } + } + } + + if (month && dayStr && year != null) { + parsed = parseInt(dayStr, 10); + + if (!Number.isNaN(parsed)) { + day = parsed; + + if (adjustDate) { + var lastDayOfTheMonth = setDate(year, month, 0).getDate(); + day = Math.max(1, day); + day = Math.min(lastDayOfTheMonth, day); + } + } + } + + if (month && day && year != null) { + date = setDate(year, month - 1, day); + } + } + + return date; +}; +/** + * Format a date to format MM-DD-YYYY + * + * @param {Date} date the date to format + * @param {string} dateFormat the format of the date string + * @returns {string} the formatted date string + */ + + +var formatDate = function formatDate(date) { + var dateFormat = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : INTERNAL_DATE_FORMAT; + + var padZeros = function padZeros(value, length) { + return "0000".concat(value).slice(-length); + }; + + var month = date.getMonth() + 1; + var day = date.getDate(); + var year = date.getFullYear(); + + if (dateFormat === DEFAULT_EXTERNAL_DATE_FORMAT) { + return [padZeros(month, 2), padZeros(day, 2), padZeros(year, 4)].join("/"); + } + + return [padZeros(year, 4), padZeros(month, 2), padZeros(day, 2)].join("-"); +}; // #endregion Date Manipulation Functions + +/** + * Create a grid string from an array of html strings + * + * @param {string[]} htmlArray the array of html items + * @param {number} rowSize the length of a row + * @returns {string} the grid string + */ + + +var listToGridHtml = function listToGridHtml(htmlArray, rowSize) { + var grid = []; + var row = []; + var i = 0; + + while (i < htmlArray.length) { + row = []; + + while (i < htmlArray.length && row.length < rowSize) { + row.push("".concat(htmlArray[i], "")); + i += 1; + } + + grid.push("".concat(row.join(""), "")); + } + + return grid.join(""); +}; +/** + * set the value of the element and dispatch a change event + * + * @param {HTMLInputElement} el The element to update + * @param {string} value The new value of the element + */ + + +var changeElementValue = function changeElementValue(el) { + var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var elementToChange = el; + elementToChange.value = value; + var event = new CustomEvent("change", { + bubbles: true, + cancelable: true, + detail: { + value: value + } + }); + elementToChange.dispatchEvent(event); +}; +/** + * The properties and elements within the date picker. + * @typedef {Object} DatePickerContext + * @property {HTMLDivElement} calendarEl + * @property {HTMLElement} datePickerEl + * @property {HTMLInputElement} internalInputEl + * @property {HTMLInputElement} externalInputEl + * @property {HTMLDivElement} statusEl + * @property {HTMLDivElement} firstYearChunkEl + * @property {Date} calendarDate + * @property {Date} minDate + * @property {Date} maxDate + * @property {Date} selectedDate + * @property {Date} rangeDate + * @property {Date} defaultDate + */ + +/** + * Get an object of the properties and elements belonging directly to the given + * date picker component. + * + * @param {HTMLElement} el the element within the date picker + * @returns {DatePickerContext} elements + */ + + +var getDatePickerContext = function getDatePickerContext(el) { + var datePickerEl = el.closest(DATE_PICKER); + + if (!datePickerEl) { + throw new Error("Element is missing outer ".concat(DATE_PICKER)); + } + + var internalInputEl = datePickerEl.querySelector(DATE_PICKER_INTERNAL_INPUT); + var externalInputEl = datePickerEl.querySelector(DATE_PICKER_EXTERNAL_INPUT); + var calendarEl = datePickerEl.querySelector(DATE_PICKER_CALENDAR); + var toggleBtnEl = datePickerEl.querySelector(DATE_PICKER_BUTTON); + var statusEl = datePickerEl.querySelector(DATE_PICKER_STATUS); + var firstYearChunkEl = datePickerEl.querySelector(CALENDAR_YEAR); + var inputDate = parseDateString(externalInputEl.value, DEFAULT_EXTERNAL_DATE_FORMAT, true); + var selectedDate = parseDateString(internalInputEl.value); + var calendarDate = parseDateString(calendarEl.dataset.value); + var minDate = parseDateString(datePickerEl.dataset.minDate); + var maxDate = parseDateString(datePickerEl.dataset.maxDate); + var rangeDate = parseDateString(datePickerEl.dataset.rangeDate); + var defaultDate = parseDateString(datePickerEl.dataset.defaultDate); + + if (minDate && maxDate && minDate > maxDate) { + throw new Error("Minimum date cannot be after maximum date"); + } + + return { + calendarDate: calendarDate, + minDate: minDate, + toggleBtnEl: toggleBtnEl, + selectedDate: selectedDate, + maxDate: maxDate, + firstYearChunkEl: firstYearChunkEl, + datePickerEl: datePickerEl, + inputDate: inputDate, + internalInputEl: internalInputEl, + externalInputEl: externalInputEl, + calendarEl: calendarEl, + rangeDate: rangeDate, + defaultDate: defaultDate, + statusEl: statusEl + }; +}; +/** + * Disable the date picker component + * + * @param {HTMLElement} el An element within the date picker component + */ + + +var disable = function disable(el) { + var _getDatePickerContext = getDatePickerContext(el), + externalInputEl = _getDatePickerContext.externalInputEl, + toggleBtnEl = _getDatePickerContext.toggleBtnEl; + + toggleBtnEl.disabled = true; + externalInputEl.disabled = true; +}; +/** + * Enable the date picker component + * + * @param {HTMLElement} el An element within the date picker component + */ + + +var enable = function enable(el) { + var _getDatePickerContext2 = getDatePickerContext(el), + externalInputEl = _getDatePickerContext2.externalInputEl, + toggleBtnEl = _getDatePickerContext2.toggleBtnEl; + + toggleBtnEl.disabled = false; + externalInputEl.disabled = false; +}; // #region Validation + +/** + * Validate the value in the input as a valid date of format M/D/YYYY + * + * @param {HTMLElement} el An element within the date picker component + */ + + +var isDateInputInvalid = function isDateInputInvalid(el) { + var _getDatePickerContext3 = getDatePickerContext(el), + externalInputEl = _getDatePickerContext3.externalInputEl, + minDate = _getDatePickerContext3.minDate, + maxDate = _getDatePickerContext3.maxDate; + + var dateString = externalInputEl.value; + var isInvalid = false; + + if (dateString) { + isInvalid = true; + var dateStringParts = dateString.split("/"); + + var _dateStringParts$map = dateStringParts.map(function (str) { + var value; + var parsed = parseInt(str, 10); + if (!Number.isNaN(parsed)) value = parsed; + return value; + }), + _dateStringParts$map2 = _slicedToArray(_dateStringParts$map, 3), + month = _dateStringParts$map2[0], + day = _dateStringParts$map2[1], + year = _dateStringParts$map2[2]; + + if (month && day && year != null) { + var checkDate = setDate(year, month - 1, day); + + if (checkDate.getMonth() === month - 1 && checkDate.getDate() === day && checkDate.getFullYear() === year && dateStringParts[2].length === 4 && isDateWithinMinAndMax(checkDate, minDate, maxDate)) { + isInvalid = false; + } + } + } + + return isInvalid; +}; +/** + * Validate the value in the input as a valid date of format M/D/YYYY + * + * @param {HTMLElement} el An element within the date picker component + */ + + +var validateDateInput = function validateDateInput(el) { + var _getDatePickerContext4 = getDatePickerContext(el), + externalInputEl = _getDatePickerContext4.externalInputEl; + + var isInvalid = isDateInputInvalid(externalInputEl); + + if (isInvalid && !externalInputEl.validationMessage) { + externalInputEl.setCustomValidity(VALIDATION_MESSAGE); + } + + if (!isInvalid && externalInputEl.validationMessage === VALIDATION_MESSAGE) { + externalInputEl.setCustomValidity(""); + } +}; // #endregion Validation + +/** + * Enable the date picker component + * + * @param {HTMLElement} el An element within the date picker component + */ + + +var reconcileInputValues = function reconcileInputValues(el) { + var _getDatePickerContext5 = getDatePickerContext(el), + internalInputEl = _getDatePickerContext5.internalInputEl, + inputDate = _getDatePickerContext5.inputDate; + + var newValue = ""; + + if (inputDate && !isDateInputInvalid(el)) { + newValue = formatDate(inputDate); + } + + if (internalInputEl.value !== newValue) { + changeElementValue(internalInputEl, newValue); + } +}; +/** + * Select the value of the date picker inputs. + * + * @param {HTMLButtonElement} el An element within the date picker component + * @param {string} dateString The date string to update in YYYY-MM-DD format + */ + + +var setCalendarValue = function setCalendarValue(el, dateString) { + var parsedDate = parseDateString(dateString); + + if (parsedDate) { + var formattedDate = formatDate(parsedDate, DEFAULT_EXTERNAL_DATE_FORMAT); + + var _getDatePickerContext6 = getDatePickerContext(el), + datePickerEl = _getDatePickerContext6.datePickerEl, + internalInputEl = _getDatePickerContext6.internalInputEl, + externalInputEl = _getDatePickerContext6.externalInputEl; + + changeElementValue(internalInputEl, dateString); + changeElementValue(externalInputEl, formattedDate); + validateDateInput(datePickerEl); + } +}; +/** + * Enhance an input with the date picker elements + * + * @param {HTMLElement} el The initial wrapping element of the date picker component + */ + + +var enhanceDatePicker = function enhanceDatePicker(el) { + var datePickerEl = el.closest(DATE_PICKER); + var defaultValue = datePickerEl.dataset.defaultValue; + var internalInputEl = datePickerEl.querySelector("input"); + + if (!internalInputEl) { + throw new Error("".concat(DATE_PICKER, " is missing inner input")); + } + + if (internalInputEl.value) { + internalInputEl.value = ""; + } + + var minDate = parseDateString(datePickerEl.dataset.minDate || internalInputEl.getAttribute("min")); + datePickerEl.dataset.minDate = minDate ? formatDate(minDate) : DEFAULT_MIN_DATE; + var maxDate = parseDateString(datePickerEl.dataset.maxDate || internalInputEl.getAttribute("max")); + + if (maxDate) { + datePickerEl.dataset.maxDate = formatDate(maxDate); + } + + var calendarWrapper = document.createElement("div"); + calendarWrapper.classList.add(DATE_PICKER_WRAPPER_CLASS); + calendarWrapper.tabIndex = "-1"; + var externalInputEl = internalInputEl.cloneNode(); + externalInputEl.classList.add(DATE_PICKER_EXTERNAL_INPUT_CLASS); + externalInputEl.type = "text"; + externalInputEl.name = ""; + calendarWrapper.appendChild(externalInputEl); + calendarWrapper.insertAdjacentHTML("beforeend", [""), ""), "
    ")].join("")); + internalInputEl.setAttribute("aria-hidden", "true"); + internalInputEl.setAttribute("tabindex", "-1"); + internalInputEl.classList.add("usa-sr-only", DATE_PICKER_INTERNAL_INPUT_CLASS); + internalInputEl.id = ""; + internalInputEl.required = false; + datePickerEl.appendChild(calendarWrapper); + datePickerEl.classList.add(DATE_PICKER_INITIALIZED_CLASS); + + if (defaultValue) { + setCalendarValue(datePickerEl, defaultValue); + } + + if (internalInputEl.disabled) { + disable(datePickerEl); + internalInputEl.disabled = false; + } +}; // #region Calendar - Date Selection View + +/** + * render the calendar. + * + * @param {HTMLElement} el An element within the date picker component + * @param {Date} _dateToDisplay a date to render on the calendar + * @returns {HTMLElement} a reference to the new calendar element + */ + + +var renderCalendar = function renderCalendar(el, _dateToDisplay) { + var _getDatePickerContext7 = getDatePickerContext(el), + datePickerEl = _getDatePickerContext7.datePickerEl, + calendarEl = _getDatePickerContext7.calendarEl, + statusEl = _getDatePickerContext7.statusEl, + selectedDate = _getDatePickerContext7.selectedDate, + maxDate = _getDatePickerContext7.maxDate, + minDate = _getDatePickerContext7.minDate, + rangeDate = _getDatePickerContext7.rangeDate; + + var todaysDate = today(); + var dateToDisplay = _dateToDisplay || todaysDate; + var calendarWasHidden = calendarEl.hidden; + var focusedDate = addDays(dateToDisplay, 0); + var focusedMonth = dateToDisplay.getMonth(); + var focusedYear = dateToDisplay.getFullYear(); + var prevMonth = subMonths(dateToDisplay, 1); + var nextMonth = addMonths(dateToDisplay, 1); + var currentFormattedDate = formatDate(dateToDisplay); + var firstOfMonth = startOfMonth(dateToDisplay); + var prevButtonsDisabled = isSameMonth(dateToDisplay, minDate); + var nextButtonsDisabled = isSameMonth(dateToDisplay, maxDate); + var rangeConclusionDate = selectedDate || dateToDisplay; + var rangeStartDate = rangeDate && min(rangeConclusionDate, rangeDate); + var rangeEndDate = rangeDate && max(rangeConclusionDate, rangeDate); + var withinRangeStartDate = rangeDate && addDays(rangeStartDate, 1); + var withinRangeEndDate = rangeDate && subDays(rangeEndDate, 1); + var monthLabel = MONTH_LABELS[focusedMonth]; + + var generateDateHtml = function generateDateHtml(dateToRender) { + var classes = [CALENDAR_DATE_CLASS]; + var day = dateToRender.getDate(); + var month = dateToRender.getMonth(); + var year = dateToRender.getFullYear(); + var dayOfWeek = dateToRender.getDay(); + var formattedDate = formatDate(dateToRender); + var tabindex = "-1"; + var isDisabled = !isDateWithinMinAndMax(dateToRender, minDate, maxDate); + var isSelected = isSameDay(dateToRender, selectedDate); + + if (isSameMonth(dateToRender, prevMonth)) { + classes.push(CALENDAR_DATE_PREVIOUS_MONTH_CLASS); + } + + if (isSameMonth(dateToRender, focusedDate)) { + classes.push(CALENDAR_DATE_CURRENT_MONTH_CLASS); + } + + if (isSameMonth(dateToRender, nextMonth)) { + classes.push(CALENDAR_DATE_NEXT_MONTH_CLASS); + } + + if (isSelected) { + classes.push(CALENDAR_DATE_SELECTED_CLASS); + } + + if (isSameDay(dateToRender, todaysDate)) { + classes.push(CALENDAR_DATE_TODAY_CLASS); + } + + if (rangeDate) { + if (isSameDay(dateToRender, rangeDate)) { + classes.push(CALENDAR_DATE_RANGE_DATE_CLASS); + } + + if (isSameDay(dateToRender, rangeStartDate)) { + classes.push(CALENDAR_DATE_RANGE_DATE_START_CLASS); + } + + if (isSameDay(dateToRender, rangeEndDate)) { + classes.push(CALENDAR_DATE_RANGE_DATE_END_CLASS); + } + + if (isDateWithinMinAndMax(dateToRender, withinRangeStartDate, withinRangeEndDate)) { + classes.push(CALENDAR_DATE_WITHIN_RANGE_CLASS); + } + } + + if (isSameDay(dateToRender, focusedDate)) { + tabindex = "0"; + classes.push(CALENDAR_DATE_FOCUSED_CLASS); + } + + var monthStr = MONTH_LABELS[month]; + var dayStr = DAY_OF_WEEK_LABELS[dayOfWeek]; + return "").concat(day, ""); + }; // set date to first rendered day + + + dateToDisplay = startOfWeek(firstOfMonth); + var days = []; + + while (days.length < 28 || dateToDisplay.getMonth() === focusedMonth || days.length % 7 !== 0) { + days.push(generateDateHtml(dateToDisplay)); + dateToDisplay = addDays(dateToDisplay, 1); + } + + var datesHtml = listToGridHtml(days, 7); + var newCalendar = calendarEl.cloneNode(); + newCalendar.dataset.value = currentFormattedDate; + newCalendar.style.top = "".concat(datePickerEl.offsetHeight, "px"); + newCalendar.hidden = false; + newCalendar.innerHTML = "
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n ").concat(datesHtml, "\n \n
    SMTWThFS
    \n
    "); + calendarEl.parentNode.replaceChild(newCalendar, calendarEl); + datePickerEl.classList.add(DATE_PICKER_ACTIVE_CLASS); + var statuses = []; + + if (isSameDay(selectedDate, focusedDate)) { + statuses.push("Selected date"); + } + + if (calendarWasHidden) { + statuses.push("You can navigate by day using left and right arrows", "Weeks by using up and down arrows", "Months by using page up and page down keys", "Years by using shift plus page up and shift plus page down", "Home and end keys navigate to the beginning and end of a week"); + statusEl.textContent = ""; + } else { + statuses.push("".concat(monthLabel, " ").concat(focusedYear)); + } + + statusEl.textContent = statuses.join(". "); + return newCalendar; +}; +/** + * Navigate back one year and display the calendar. + * + * @param {HTMLButtonElement} _buttonEl An element within the date picker component + */ + + +var displayPreviousYear = function displayPreviousYear(_buttonEl) { + if (_buttonEl.disabled) return; + + var _getDatePickerContext8 = getDatePickerContext(_buttonEl), + calendarEl = _getDatePickerContext8.calendarEl, + calendarDate = _getDatePickerContext8.calendarDate, + minDate = _getDatePickerContext8.minDate, + maxDate = _getDatePickerContext8.maxDate; + + var date = subYears(calendarDate, 1); + date = keepDateBetweenMinAndMax(date, minDate, maxDate); + var newCalendar = renderCalendar(calendarEl, date); + var nextToFocus = newCalendar.querySelector(CALENDAR_PREVIOUS_YEAR); + + if (nextToFocus.disabled) { + nextToFocus = newCalendar.querySelector(CALENDAR_DATE_PICKER); + } + + nextToFocus.focus(); +}; +/** + * Navigate back one month and display the calendar. + * + * @param {HTMLButtonElement} _buttonEl An element within the date picker component + */ + + +var displayPreviousMonth = function displayPreviousMonth(_buttonEl) { + if (_buttonEl.disabled) return; + + var _getDatePickerContext9 = getDatePickerContext(_buttonEl), + calendarEl = _getDatePickerContext9.calendarEl, + calendarDate = _getDatePickerContext9.calendarDate, + minDate = _getDatePickerContext9.minDate, + maxDate = _getDatePickerContext9.maxDate; + + var date = subMonths(calendarDate, 1); + date = keepDateBetweenMinAndMax(date, minDate, maxDate); + var newCalendar = renderCalendar(calendarEl, date); + var nextToFocus = newCalendar.querySelector(CALENDAR_PREVIOUS_MONTH); + + if (nextToFocus.disabled) { + nextToFocus = newCalendar.querySelector(CALENDAR_DATE_PICKER); + } + + nextToFocus.focus(); +}; +/** + * Navigate forward one month and display the calendar. + * + * @param {HTMLButtonElement} _buttonEl An element within the date picker component + */ + + +var displayNextMonth = function displayNextMonth(_buttonEl) { + if (_buttonEl.disabled) return; + + var _getDatePickerContext10 = getDatePickerContext(_buttonEl), + calendarEl = _getDatePickerContext10.calendarEl, + calendarDate = _getDatePickerContext10.calendarDate, + minDate = _getDatePickerContext10.minDate, + maxDate = _getDatePickerContext10.maxDate; + + var date = addMonths(calendarDate, 1); + date = keepDateBetweenMinAndMax(date, minDate, maxDate); + var newCalendar = renderCalendar(calendarEl, date); + var nextToFocus = newCalendar.querySelector(CALENDAR_NEXT_MONTH); + + if (nextToFocus.disabled) { + nextToFocus = newCalendar.querySelector(CALENDAR_DATE_PICKER); + } + + nextToFocus.focus(); +}; +/** + * Navigate forward one year and display the calendar. + * + * @param {HTMLButtonElement} _buttonEl An element within the date picker component + */ + + +var displayNextYear = function displayNextYear(_buttonEl) { + if (_buttonEl.disabled) return; + + var _getDatePickerContext11 = getDatePickerContext(_buttonEl), + calendarEl = _getDatePickerContext11.calendarEl, + calendarDate = _getDatePickerContext11.calendarDate, + minDate = _getDatePickerContext11.minDate, + maxDate = _getDatePickerContext11.maxDate; + + var date = addYears(calendarDate, 1); + date = keepDateBetweenMinAndMax(date, minDate, maxDate); + var newCalendar = renderCalendar(calendarEl, date); + var nextToFocus = newCalendar.querySelector(CALENDAR_NEXT_YEAR); + + if (nextToFocus.disabled) { + nextToFocus = newCalendar.querySelector(CALENDAR_DATE_PICKER); + } + + nextToFocus.focus(); +}; +/** + * Hide the calendar of a date picker component. + * + * @param {HTMLElement} el An element within the date picker component + */ + + +var hideCalendar = function hideCalendar(el) { + var _getDatePickerContext12 = getDatePickerContext(el), + datePickerEl = _getDatePickerContext12.datePickerEl, + calendarEl = _getDatePickerContext12.calendarEl, + statusEl = _getDatePickerContext12.statusEl; + + datePickerEl.classList.remove(DATE_PICKER_ACTIVE_CLASS); + calendarEl.hidden = true; + statusEl.textContent = ""; +}; +/** + * Select a date within the date picker component. + * + * @param {HTMLButtonElement} calendarDateEl A date element within the date picker component + */ + + +var selectDate = function selectDate(calendarDateEl) { + if (calendarDateEl.disabled) return; + + var _getDatePickerContext13 = getDatePickerContext(calendarDateEl), + datePickerEl = _getDatePickerContext13.datePickerEl, + externalInputEl = _getDatePickerContext13.externalInputEl; + + setCalendarValue(calendarDateEl, calendarDateEl.dataset.value); + hideCalendar(datePickerEl); + externalInputEl.focus(); +}; +/** + * Toggle the calendar. + * + * @param {HTMLButtonElement} el An element within the date picker component + */ + + +var toggleCalendar = function toggleCalendar(el) { + if (el.disabled) return; + + var _getDatePickerContext14 = getDatePickerContext(el), + calendarEl = _getDatePickerContext14.calendarEl, + inputDate = _getDatePickerContext14.inputDate, + minDate = _getDatePickerContext14.minDate, + maxDate = _getDatePickerContext14.maxDate, + defaultDate = _getDatePickerContext14.defaultDate; + + if (calendarEl.hidden) { + var dateToDisplay = keepDateBetweenMinAndMax(inputDate || defaultDate || today(), minDate, maxDate); + var newCalendar = renderCalendar(calendarEl, dateToDisplay); + newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus(); + } else { + hideCalendar(el); + } +}; +/** + * Update the calendar when visible. + * + * @param {HTMLElement} el an element within the date picker + */ + + +var updateCalendarIfVisible = function updateCalendarIfVisible(el) { + var _getDatePickerContext15 = getDatePickerContext(el), + calendarEl = _getDatePickerContext15.calendarEl, + inputDate = _getDatePickerContext15.inputDate, + minDate = _getDatePickerContext15.minDate, + maxDate = _getDatePickerContext15.maxDate; + + var calendarShown = !calendarEl.hidden; + + if (calendarShown && inputDate) { + var dateToDisplay = keepDateBetweenMinAndMax(inputDate, minDate, maxDate); + renderCalendar(calendarEl, dateToDisplay); + } +}; // #endregion Calendar - Date Selection View +// #region Calendar - Month Selection View + +/** + * Display the month selection screen in the date picker. + * + * @param {HTMLButtonElement} el An element within the date picker component + * @returns {HTMLElement} a reference to the new calendar element + */ + + +var displayMonthSelection = function displayMonthSelection(el, monthToDisplay) { + var _getDatePickerContext16 = getDatePickerContext(el), + calendarEl = _getDatePickerContext16.calendarEl, + statusEl = _getDatePickerContext16.statusEl, + calendarDate = _getDatePickerContext16.calendarDate, + minDate = _getDatePickerContext16.minDate, + maxDate = _getDatePickerContext16.maxDate; + + var selectedMonth = calendarDate.getMonth(); + var focusedMonth = monthToDisplay == null ? selectedMonth : monthToDisplay; + var months = MONTH_LABELS.map(function (month, index) { + var monthToCheck = setMonth(calendarDate, index); + var isDisabled = isDatesMonthOutsideMinOrMax(monthToCheck, minDate, maxDate); + var tabindex = "-1"; + var classes = [CALENDAR_MONTH_CLASS]; + var isSelected = index === selectedMonth; + + if (index === focusedMonth) { + tabindex = "0"; + classes.push(CALENDAR_MONTH_FOCUSED_CLASS); + } + + if (isSelected) { + classes.push(CALENDAR_MONTH_SELECTED_CLASS); + } + + return ""); + }); + var monthsHtml = "
    \n \n \n ").concat(listToGridHtml(months, 3), "\n \n
    \n
    "); + var newCalendar = calendarEl.cloneNode(); + newCalendar.innerHTML = monthsHtml; + calendarEl.parentNode.replaceChild(newCalendar, calendarEl); + statusEl.textContent = "Select a month."; + return newCalendar; +}; +/** + * Select a month in the date picker component. + * + * @param {HTMLButtonElement} monthEl An month element within the date picker component + */ + + +var selectMonth = function selectMonth(monthEl) { + if (monthEl.disabled) return; + + var _getDatePickerContext17 = getDatePickerContext(monthEl), + calendarEl = _getDatePickerContext17.calendarEl, + calendarDate = _getDatePickerContext17.calendarDate, + minDate = _getDatePickerContext17.minDate, + maxDate = _getDatePickerContext17.maxDate; + + var selectedMonth = parseInt(monthEl.dataset.value, 10); + var date = setMonth(calendarDate, selectedMonth); + date = keepDateBetweenMinAndMax(date, minDate, maxDate); + var newCalendar = renderCalendar(calendarEl, date); + newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus(); +}; // #endregion Calendar - Month Selection View +// #region Calendar - Year Selection View + +/** + * Display the year selection screen in the date picker. + * + * @param {HTMLButtonElement} el An element within the date picker component + * @param {number} yearToDisplay year to display in year selection + * @returns {HTMLElement} a reference to the new calendar element + */ + + +var displayYearSelection = function displayYearSelection(el, yearToDisplay) { + var _getDatePickerContext18 = getDatePickerContext(el), + calendarEl = _getDatePickerContext18.calendarEl, + statusEl = _getDatePickerContext18.statusEl, + calendarDate = _getDatePickerContext18.calendarDate, + minDate = _getDatePickerContext18.minDate, + maxDate = _getDatePickerContext18.maxDate; + + var selectedYear = calendarDate.getFullYear(); + var focusedYear = yearToDisplay == null ? selectedYear : yearToDisplay; + var yearToChunk = focusedYear; + yearToChunk -= yearToChunk % YEAR_CHUNK; + yearToChunk = Math.max(0, yearToChunk); + var prevYearChunkDisabled = isDatesYearOutsideMinOrMax(setYear(calendarDate, yearToChunk - 1), minDate, maxDate); + var nextYearChunkDisabled = isDatesYearOutsideMinOrMax(setYear(calendarDate, yearToChunk + YEAR_CHUNK), minDate, maxDate); + var years = []; + var yearIndex = yearToChunk; + + while (years.length < YEAR_CHUNK) { + var isDisabled = isDatesYearOutsideMinOrMax(setYear(calendarDate, yearIndex), minDate, maxDate); + var tabindex = "-1"; + var classes = [CALENDAR_YEAR_CLASS]; + var isSelected = yearIndex === selectedYear; + + if (yearIndex === focusedYear) { + tabindex = "0"; + classes.push(CALENDAR_YEAR_FOCUSED_CLASS); + } + + if (isSelected) { + classes.push(CALENDAR_YEAR_SELECTED_CLASS); + } + + years.push("")); + yearIndex += 1; + } + + var yearsHtml = listToGridHtml(years, 3); + var newCalendar = calendarEl.cloneNode(); + newCalendar.innerHTML = "
    \n \n \n \n \n \n \n \n \n
    \n  \n \n \n \n ").concat(yearsHtml, "\n \n
    \n
    \n  \n
    \n
    "); + calendarEl.parentNode.replaceChild(newCalendar, calendarEl); + statusEl.textContent = "Showing years ".concat(yearToChunk, " to ").concat(yearToChunk + YEAR_CHUNK - 1, ". Select a year."); + return newCalendar; +}; +/** + * Navigate back by years and display the year selection screen. + * + * @param {HTMLButtonElement} el An element within the date picker component + */ + + +var displayPreviousYearChunk = function displayPreviousYearChunk(el) { + if (el.disabled) return; + + var _getDatePickerContext19 = getDatePickerContext(el), + calendarEl = _getDatePickerContext19.calendarEl, + calendarDate = _getDatePickerContext19.calendarDate, + minDate = _getDatePickerContext19.minDate, + maxDate = _getDatePickerContext19.maxDate; + + var yearEl = calendarEl.querySelector(CALENDAR_YEAR_FOCUSED); + var selectedYear = parseInt(yearEl.textContent, 10); + var adjustedYear = selectedYear - YEAR_CHUNK; + adjustedYear = Math.max(0, adjustedYear); + var date = setYear(calendarDate, adjustedYear); + var cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate); + var newCalendar = displayYearSelection(calendarEl, cappedDate.getFullYear()); + var nextToFocus = newCalendar.querySelector(CALENDAR_PREVIOUS_YEAR_CHUNK); + + if (nextToFocus.disabled) { + nextToFocus = newCalendar.querySelector(CALENDAR_YEAR_PICKER); + } + + nextToFocus.focus(); +}; +/** + * Navigate forward by years and display the year selection screen. + * + * @param {HTMLButtonElement} el An element within the date picker component + */ + + +var displayNextYearChunk = function displayNextYearChunk(el) { + if (el.disabled) return; + + var _getDatePickerContext20 = getDatePickerContext(el), + calendarEl = _getDatePickerContext20.calendarEl, + calendarDate = _getDatePickerContext20.calendarDate, + minDate = _getDatePickerContext20.minDate, + maxDate = _getDatePickerContext20.maxDate; + + var yearEl = calendarEl.querySelector(CALENDAR_YEAR_FOCUSED); + var selectedYear = parseInt(yearEl.textContent, 10); + var adjustedYear = selectedYear + YEAR_CHUNK; + adjustedYear = Math.max(0, adjustedYear); + var date = setYear(calendarDate, adjustedYear); + var cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate); + var newCalendar = displayYearSelection(calendarEl, cappedDate.getFullYear()); + var nextToFocus = newCalendar.querySelector(CALENDAR_NEXT_YEAR_CHUNK); + + if (nextToFocus.disabled) { + nextToFocus = newCalendar.querySelector(CALENDAR_YEAR_PICKER); + } + + nextToFocus.focus(); +}; +/** + * Select a year in the date picker component. + * + * @param {HTMLButtonElement} yearEl A year element within the date picker component + */ + + +var selectYear = function selectYear(yearEl) { + if (yearEl.disabled) return; + + var _getDatePickerContext21 = getDatePickerContext(yearEl), + calendarEl = _getDatePickerContext21.calendarEl, + calendarDate = _getDatePickerContext21.calendarDate, + minDate = _getDatePickerContext21.minDate, + maxDate = _getDatePickerContext21.maxDate; + + var selectedYear = parseInt(yearEl.innerHTML, 10); + var date = setYear(calendarDate, selectedYear); + date = keepDateBetweenMinAndMax(date, minDate, maxDate); + var newCalendar = renderCalendar(calendarEl, date); + newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus(); +}; // #endregion Calendar - Year Selection View +// #region Calendar Event Handling + +/** + * Hide the calendar. + * + * @param {KeyboardEvent} event the keydown event + */ + + +var handleEscapeFromCalendar = function handleEscapeFromCalendar(event) { + var _getDatePickerContext22 = getDatePickerContext(event.target), + datePickerEl = _getDatePickerContext22.datePickerEl, + externalInputEl = _getDatePickerContext22.externalInputEl; + + hideCalendar(datePickerEl); + externalInputEl.focus(); + event.preventDefault(); +}; // #endregion Calendar Event Handling +// #region Calendar Date Event Handling + +/** + * Adjust the date and display the calendar if needed. + * + * @param {function} adjustDateFn function that returns the adjusted date + */ + + +var adjustCalendar = function adjustCalendar(adjustDateFn) { + return function (event) { + var _getDatePickerContext23 = getDatePickerContext(event.target), + calendarEl = _getDatePickerContext23.calendarEl, + calendarDate = _getDatePickerContext23.calendarDate, + minDate = _getDatePickerContext23.minDate, + maxDate = _getDatePickerContext23.maxDate; + + var date = adjustDateFn(calendarDate); + var cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate); + + if (!isSameDay(calendarDate, cappedDate)) { + var newCalendar = renderCalendar(calendarEl, cappedDate); + newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus(); + } + + event.preventDefault(); + }; +}; +/** + * Navigate back one week and display the calendar. + * + * @param {KeyboardEvent} event the keydown event + */ + + +var handleUpFromDate = adjustCalendar(function (date) { + return subWeeks(date, 1); +}); +/** + * Navigate forward one week and display the calendar. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleDownFromDate = adjustCalendar(function (date) { + return addWeeks(date, 1); +}); +/** + * Navigate back one day and display the calendar. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleLeftFromDate = adjustCalendar(function (date) { + return subDays(date, 1); +}); +/** + * Navigate forward one day and display the calendar. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleRightFromDate = adjustCalendar(function (date) { + return addDays(date, 1); +}); +/** + * Navigate to the start of the week and display the calendar. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleHomeFromDate = adjustCalendar(function (date) { + return startOfWeek(date); +}); +/** + * Navigate to the end of the week and display the calendar. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleEndFromDate = adjustCalendar(function (date) { + return endOfWeek(date); +}); +/** + * Navigate forward one month and display the calendar. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handlePageDownFromDate = adjustCalendar(function (date) { + return addMonths(date, 1); +}); +/** + * Navigate back one month and display the calendar. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handlePageUpFromDate = adjustCalendar(function (date) { + return subMonths(date, 1); +}); +/** + * Navigate forward one year and display the calendar. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleShiftPageDownFromDate = adjustCalendar(function (date) { + return addYears(date, 1); +}); +/** + * Navigate back one year and display the calendar. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleShiftPageUpFromDate = adjustCalendar(function (date) { + return subYears(date, 1); +}); +/** + * display the calendar for the mousemove date. + * + * @param {MouseEvent} event The mousemove event + * @param {HTMLButtonElement} dateEl A date element within the date picker component + */ + +var handleMousemoveFromDate = function handleMousemoveFromDate(dateEl) { + if (dateEl.disabled) return; + var calendarEl = dateEl.closest(DATE_PICKER_CALENDAR); + var currentCalendarDate = calendarEl.dataset.value; + var hoverDate = dateEl.dataset.value; + if (hoverDate === currentCalendarDate) return; + var dateToDisplay = parseDateString(hoverDate); + var newCalendar = renderCalendar(calendarEl, dateToDisplay); + newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus(); +}; // #endregion Calendar Date Event Handling +// #region Calendar Month Event Handling + +/** + * Adjust the month and display the month selection screen if needed. + * + * @param {function} adjustMonthFn function that returns the adjusted month + */ + + +var adjustMonthSelectionScreen = function adjustMonthSelectionScreen(adjustMonthFn) { + return function (event) { + var monthEl = event.target; + var selectedMonth = parseInt(monthEl.dataset.value, 10); + + var _getDatePickerContext24 = getDatePickerContext(monthEl), + calendarEl = _getDatePickerContext24.calendarEl, + calendarDate = _getDatePickerContext24.calendarDate, + minDate = _getDatePickerContext24.minDate, + maxDate = _getDatePickerContext24.maxDate; + + var currentDate = setMonth(calendarDate, selectedMonth); + var adjustedMonth = adjustMonthFn(selectedMonth); + adjustedMonth = Math.max(0, Math.min(11, adjustedMonth)); + var date = setMonth(calendarDate, adjustedMonth); + var cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate); + + if (!isSameMonth(currentDate, cappedDate)) { + var newCalendar = displayMonthSelection(calendarEl, cappedDate.getMonth()); + newCalendar.querySelector(CALENDAR_MONTH_FOCUSED).focus(); + } + + event.preventDefault(); + }; +}; +/** + * Navigate back three months and display the month selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + + +var handleUpFromMonth = adjustMonthSelectionScreen(function (month) { + return month - 3; +}); +/** + * Navigate forward three months and display the month selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleDownFromMonth = adjustMonthSelectionScreen(function (month) { + return month + 3; +}); +/** + * Navigate back one month and display the month selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleLeftFromMonth = adjustMonthSelectionScreen(function (month) { + return month - 1; +}); +/** + * Navigate forward one month and display the month selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleRightFromMonth = adjustMonthSelectionScreen(function (month) { + return month + 1; +}); +/** + * Navigate to the start of the row of months and display the month selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleHomeFromMonth = adjustMonthSelectionScreen(function (month) { + return month - month % 3; +}); +/** + * Navigate to the end of the row of months and display the month selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleEndFromMonth = adjustMonthSelectionScreen(function (month) { + return month + 2 - month % 3; +}); +/** + * Navigate to the last month (December) and display the month selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handlePageDownFromMonth = adjustMonthSelectionScreen(function () { + return 11; +}); +/** + * Navigate to the first month (January) and display the month selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handlePageUpFromMonth = adjustMonthSelectionScreen(function () { + return 0; +}); +/** + * update the focus on a month when the mouse moves. + * + * @param {MouseEvent} event The mousemove event + * @param {HTMLButtonElement} monthEl A month element within the date picker component + */ + +var handleMousemoveFromMonth = function handleMousemoveFromMonth(monthEl) { + if (monthEl.disabled) return; + if (monthEl.classList.contains(CALENDAR_MONTH_FOCUSED_CLASS)) return; + var focusMonth = parseInt(monthEl.dataset.value, 10); + var newCalendar = displayMonthSelection(monthEl, focusMonth); + newCalendar.querySelector(CALENDAR_MONTH_FOCUSED).focus(); +}; // #endregion Calendar Month Event Handling +// #region Calendar Year Event Handling + +/** + * Adjust the year and display the year selection screen if needed. + * + * @param {function} adjustYearFn function that returns the adjusted year + */ + + +var adjustYearSelectionScreen = function adjustYearSelectionScreen(adjustYearFn) { + return function (event) { + var yearEl = event.target; + var selectedYear = parseInt(yearEl.dataset.value, 10); + + var _getDatePickerContext25 = getDatePickerContext(yearEl), + calendarEl = _getDatePickerContext25.calendarEl, + calendarDate = _getDatePickerContext25.calendarDate, + minDate = _getDatePickerContext25.minDate, + maxDate = _getDatePickerContext25.maxDate; + + var currentDate = setYear(calendarDate, selectedYear); + var adjustedYear = adjustYearFn(selectedYear); + adjustedYear = Math.max(0, adjustedYear); + var date = setYear(calendarDate, adjustedYear); + var cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate); + + if (!isSameYear(currentDate, cappedDate)) { + var newCalendar = displayYearSelection(calendarEl, cappedDate.getFullYear()); + newCalendar.querySelector(CALENDAR_YEAR_FOCUSED).focus(); + } + + event.preventDefault(); + }; +}; +/** + * Navigate back three years and display the year selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + + +var handleUpFromYear = adjustYearSelectionScreen(function (year) { + return year - 3; +}); +/** + * Navigate forward three years and display the year selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleDownFromYear = adjustYearSelectionScreen(function (year) { + return year + 3; +}); +/** + * Navigate back one year and display the year selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleLeftFromYear = adjustYearSelectionScreen(function (year) { + return year - 1; +}); +/** + * Navigate forward one year and display the year selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleRightFromYear = adjustYearSelectionScreen(function (year) { + return year + 1; +}); +/** + * Navigate to the start of the row of years and display the year selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleHomeFromYear = adjustYearSelectionScreen(function (year) { + return year - year % 3; +}); +/** + * Navigate to the end of the row of years and display the year selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handleEndFromYear = adjustYearSelectionScreen(function (year) { + return year + 2 - year % 3; +}); +/** + * Navigate to back 12 years and display the year selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handlePageUpFromYear = adjustYearSelectionScreen(function (year) { + return year - YEAR_CHUNK; +}); +/** + * Navigate forward 12 years and display the year selection screen. + * + * @param {KeyboardEvent} event the keydown event + */ + +var handlePageDownFromYear = adjustYearSelectionScreen(function (year) { + return year + YEAR_CHUNK; +}); +/** + * update the focus on a year when the mouse moves. + * + * @param {MouseEvent} event The mousemove event + * @param {HTMLButtonElement} dateEl A year element within the date picker component + */ + +var handleMousemoveFromYear = function handleMousemoveFromYear(yearEl) { + if (yearEl.disabled) return; + if (yearEl.classList.contains(CALENDAR_YEAR_FOCUSED_CLASS)) return; + var focusYear = parseInt(yearEl.dataset.value, 10); + var newCalendar = displayYearSelection(yearEl, focusYear); + newCalendar.querySelector(CALENDAR_YEAR_FOCUSED).focus(); +}; // #endregion Calendar Year Event Handling +// #region Focus Handling Event Handling + + +var tabHandler = function tabHandler(focusable) { + var getFocusableContext = function getFocusableContext(el) { + var _getDatePickerContext26 = getDatePickerContext(el), + calendarEl = _getDatePickerContext26.calendarEl; + + var focusableElements = select(focusable, calendarEl); + var firstTabIndex = 0; + var lastTabIndex = focusableElements.length - 1; + var firstTabStop = focusableElements[firstTabIndex]; + var lastTabStop = focusableElements[lastTabIndex]; + var focusIndex = focusableElements.indexOf(activeElement()); + var isLastTab = focusIndex === lastTabIndex; + var isFirstTab = focusIndex === firstTabIndex; + var isNotFound = focusIndex === -1; + return { + focusableElements: focusableElements, + isNotFound: isNotFound, + firstTabStop: firstTabStop, + isFirstTab: isFirstTab, + lastTabStop: lastTabStop, + isLastTab: isLastTab + }; + }; + + return { + tabAhead: function tabAhead(event) { + var _getFocusableContext = getFocusableContext(event.target), + firstTabStop = _getFocusableContext.firstTabStop, + isLastTab = _getFocusableContext.isLastTab, + isNotFound = _getFocusableContext.isNotFound; + + if (isLastTab || isNotFound) { + event.preventDefault(); + firstTabStop.focus(); + } + }, + tabBack: function tabBack(event) { + var _getFocusableContext2 = getFocusableContext(event.target), + lastTabStop = _getFocusableContext2.lastTabStop, + isFirstTab = _getFocusableContext2.isFirstTab, + isNotFound = _getFocusableContext2.isNotFound; + + if (isFirstTab || isNotFound) { + event.preventDefault(); + lastTabStop.focus(); + } + } + }; +}; + +var datePickerTabEventHandler = tabHandler(DATE_PICKER_FOCUSABLE); +var monthPickerTabEventHandler = tabHandler(MONTH_PICKER_FOCUSABLE); +var yearPickerTabEventHandler = tabHandler(YEAR_PICKER_FOCUSABLE); // #endregion Focus Handling Event Handling +// #region Date Picker Event Delegation Registration / Component + +var datePickerEvents = (_datePickerEvents = {}, _defineProperty(_datePickerEvents, CLICK, (_CLICK = {}, _defineProperty(_CLICK, DATE_PICKER_BUTTON, function () { + toggleCalendar(this); +}), _defineProperty(_CLICK, CALENDAR_DATE, function () { + selectDate(this); +}), _defineProperty(_CLICK, CALENDAR_MONTH, function () { + selectMonth(this); +}), _defineProperty(_CLICK, CALENDAR_YEAR, function () { + selectYear(this); +}), _defineProperty(_CLICK, CALENDAR_PREVIOUS_MONTH, function () { + displayPreviousMonth(this); +}), _defineProperty(_CLICK, CALENDAR_NEXT_MONTH, function () { + displayNextMonth(this); +}), _defineProperty(_CLICK, CALENDAR_PREVIOUS_YEAR, function () { + displayPreviousYear(this); +}), _defineProperty(_CLICK, CALENDAR_NEXT_YEAR, function () { + displayNextYear(this); +}), _defineProperty(_CLICK, CALENDAR_PREVIOUS_YEAR_CHUNK, function () { + displayPreviousYearChunk(this); +}), _defineProperty(_CLICK, CALENDAR_NEXT_YEAR_CHUNK, function () { + displayNextYearChunk(this); +}), _defineProperty(_CLICK, CALENDAR_MONTH_SELECTION, function () { + var newCalendar = displayMonthSelection(this); + newCalendar.querySelector(CALENDAR_MONTH_FOCUSED).focus(); +}), _defineProperty(_CLICK, CALENDAR_YEAR_SELECTION, function () { + var newCalendar = displayYearSelection(this); + newCalendar.querySelector(CALENDAR_YEAR_FOCUSED).focus(); +}), _CLICK)), _defineProperty(_datePickerEvents, "keyup", _defineProperty({}, DATE_PICKER_CALENDAR, function (event) { + var keydown = this.dataset.keydownKeyCode; + + if ("".concat(event.keyCode) !== keydown) { + event.preventDefault(); + } +})), _defineProperty(_datePickerEvents, "keydown", (_keydown = {}, _defineProperty(_keydown, DATE_PICKER_EXTERNAL_INPUT, function (event) { + if (event.keyCode === ENTER_KEYCODE) { + validateDateInput(this); + } +}), _defineProperty(_keydown, CALENDAR_DATE, keymap({ + Up: handleUpFromDate, + ArrowUp: handleUpFromDate, + Down: handleDownFromDate, + ArrowDown: handleDownFromDate, + Left: handleLeftFromDate, + ArrowLeft: handleLeftFromDate, + Right: handleRightFromDate, + ArrowRight: handleRightFromDate, + Home: handleHomeFromDate, + End: handleEndFromDate, + PageDown: handlePageDownFromDate, + PageUp: handlePageUpFromDate, + "Shift+PageDown": handleShiftPageDownFromDate, + "Shift+PageUp": handleShiftPageUpFromDate +})), _defineProperty(_keydown, CALENDAR_DATE_PICKER, keymap({ + Tab: datePickerTabEventHandler.tabAhead, + "Shift+Tab": datePickerTabEventHandler.tabBack +})), _defineProperty(_keydown, CALENDAR_MONTH, keymap({ + Up: handleUpFromMonth, + ArrowUp: handleUpFromMonth, + Down: handleDownFromMonth, + ArrowDown: handleDownFromMonth, + Left: handleLeftFromMonth, + ArrowLeft: handleLeftFromMonth, + Right: handleRightFromMonth, + ArrowRight: handleRightFromMonth, + Home: handleHomeFromMonth, + End: handleEndFromMonth, + PageDown: handlePageDownFromMonth, + PageUp: handlePageUpFromMonth +})), _defineProperty(_keydown, CALENDAR_MONTH_PICKER, keymap({ + Tab: monthPickerTabEventHandler.tabAhead, + "Shift+Tab": monthPickerTabEventHandler.tabBack +})), _defineProperty(_keydown, CALENDAR_YEAR, keymap({ + Up: handleUpFromYear, + ArrowUp: handleUpFromYear, + Down: handleDownFromYear, + ArrowDown: handleDownFromYear, + Left: handleLeftFromYear, + ArrowLeft: handleLeftFromYear, + Right: handleRightFromYear, + ArrowRight: handleRightFromYear, + Home: handleHomeFromYear, + End: handleEndFromYear, + PageDown: handlePageDownFromYear, + PageUp: handlePageUpFromYear +})), _defineProperty(_keydown, CALENDAR_YEAR_PICKER, keymap({ + Tab: yearPickerTabEventHandler.tabAhead, + "Shift+Tab": yearPickerTabEventHandler.tabBack +})), _defineProperty(_keydown, DATE_PICKER_CALENDAR, function (event) { + this.dataset.keydownKeyCode = event.keyCode; +}), _defineProperty(_keydown, DATE_PICKER, function (event) { + var keyMap = keymap({ + Escape: handleEscapeFromCalendar + }); + keyMap(event); +}), _keydown)), _defineProperty(_datePickerEvents, "focusout", (_focusout = {}, _defineProperty(_focusout, DATE_PICKER_EXTERNAL_INPUT, function () { + validateDateInput(this); +}), _defineProperty(_focusout, DATE_PICKER, function (event) { + if (!this.contains(event.relatedTarget)) { + hideCalendar(this); + } +}), _focusout)), _defineProperty(_datePickerEvents, "input", _defineProperty({}, DATE_PICKER_EXTERNAL_INPUT, function () { + reconcileInputValues(this); + updateCalendarIfVisible(this); +})), _datePickerEvents); + +if (!isIosDevice()) { + var _datePickerEvents$mou; + + datePickerEvents.mousemove = (_datePickerEvents$mou = {}, _defineProperty(_datePickerEvents$mou, CALENDAR_DATE_CURRENT_MONTH, function () { + handleMousemoveFromDate(this); + }), _defineProperty(_datePickerEvents$mou, CALENDAR_MONTH, function () { + handleMousemoveFromMonth(this); + }), _defineProperty(_datePickerEvents$mou, CALENDAR_YEAR, function () { + handleMousemoveFromYear(this); + }), _datePickerEvents$mou); +} + +var datePicker = behavior(datePickerEvents, { + init: function init(root) { + select(DATE_PICKER, root).forEach(function (datePickerEl) { + enhanceDatePicker(datePickerEl); + }); + }, + getDatePickerContext: getDatePickerContext, + disable: disable, + enable: enable, + isDateInputInvalid: isDateInputInvalid, + setCalendarValue: setCalendarValue, + validateDateInput: validateDateInput, + renderCalendar: renderCalendar, + updateCalendarIfVisible: updateCalendarIfVisible +}); // #endregion Date Picker Event Delegation Registration / Component + +module.exports = datePicker; + +},{"../config":35,"../events":36,"../utils/active-element":43,"../utils/behavior":44,"../utils/is-ios-device":47,"../utils/select":49,"receptor/keymap":13}],21:[function(require,module,exports){ +"use strict"; + +var _inputChange; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +var behavior = require("../utils/behavior"); + +var select = require("../utils/select"); + +var _require = require("../config"), + PREFIX = _require.prefix; + +var _require2 = require("./date-picker"), + getDatePickerContext = _require2.getDatePickerContext, + isDateInputInvalid = _require2.isDateInputInvalid, + updateCalendarIfVisible = _require2.updateCalendarIfVisible; + +var DATE_PICKER_CLASS = "".concat(PREFIX, "-date-picker"); +var DATE_RANGE_PICKER_CLASS = "".concat(PREFIX, "-date-range-picker"); +var DATE_RANGE_PICKER_RANGE_START_CLASS = "".concat(DATE_RANGE_PICKER_CLASS, "__range-start"); +var DATE_RANGE_PICKER_RANGE_END_CLASS = "".concat(DATE_RANGE_PICKER_CLASS, "__range-end"); +var DATE_PICKER = ".".concat(DATE_PICKER_CLASS); +var DATE_RANGE_PICKER = ".".concat(DATE_RANGE_PICKER_CLASS); +var DATE_RANGE_PICKER_RANGE_START = ".".concat(DATE_RANGE_PICKER_RANGE_START_CLASS); +var DATE_RANGE_PICKER_RANGE_END = ".".concat(DATE_RANGE_PICKER_RANGE_END_CLASS); +var DEFAULT_MIN_DATE = "0000-01-01"; +/** + * The properties and elements within the date range picker. + * @typedef {Object} DateRangePickerContext + * @property {HTMLElement} dateRangePickerEl + * @property {HTMLElement} rangeStartEl + * @property {HTMLElement} rangeEndEl + */ + +/** + * Get an object of the properties and elements belonging directly to the given + * date picker component. + * + * @param {HTMLElement} el the element within the date picker + * @returns {DateRangePickerContext} elements + */ + +var getDateRangePickerContext = function getDateRangePickerContext(el) { + var dateRangePickerEl = el.closest(DATE_RANGE_PICKER); + + if (!dateRangePickerEl) { + throw new Error("Element is missing outer ".concat(DATE_RANGE_PICKER)); + } + + var rangeStartEl = dateRangePickerEl.querySelector(DATE_RANGE_PICKER_RANGE_START); + var rangeEndEl = dateRangePickerEl.querySelector(DATE_RANGE_PICKER_RANGE_END); + return { + dateRangePickerEl: dateRangePickerEl, + rangeStartEl: rangeStartEl, + rangeEndEl: rangeEndEl + }; +}; +/** + * handle update from range start date picker + * + * @param {HTMLElement} el an element within the date range picker + */ + + +var handleRangeStartUpdate = function handleRangeStartUpdate(el) { + var _getDateRangePickerCo = getDateRangePickerContext(el), + dateRangePickerEl = _getDateRangePickerCo.dateRangePickerEl, + rangeStartEl = _getDateRangePickerCo.rangeStartEl, + rangeEndEl = _getDateRangePickerCo.rangeEndEl; + + var _getDatePickerContext = getDatePickerContext(rangeStartEl), + internalInputEl = _getDatePickerContext.internalInputEl; + + var updatedDate = internalInputEl.value; + + if (updatedDate && !isDateInputInvalid(internalInputEl)) { + rangeEndEl.dataset.minDate = updatedDate; + rangeEndEl.dataset.rangeDate = updatedDate; + rangeEndEl.dataset.defaultDate = updatedDate; + } else { + rangeEndEl.dataset.minDate = dateRangePickerEl.dataset.minDate || ""; + rangeEndEl.dataset.rangeDate = ""; + rangeEndEl.dataset.defaultDate = ""; + } + + updateCalendarIfVisible(rangeEndEl); +}; +/** + * handle update from range start date picker + * + * @param {HTMLElement} el an element within the date range picker + */ + + +var handleRangeEndUpdate = function handleRangeEndUpdate(el) { + var _getDateRangePickerCo2 = getDateRangePickerContext(el), + dateRangePickerEl = _getDateRangePickerCo2.dateRangePickerEl, + rangeStartEl = _getDateRangePickerCo2.rangeStartEl, + rangeEndEl = _getDateRangePickerCo2.rangeEndEl; + + var _getDatePickerContext2 = getDatePickerContext(rangeEndEl), + internalInputEl = _getDatePickerContext2.internalInputEl; + + var updatedDate = internalInputEl.value; + + if (updatedDate && !isDateInputInvalid(internalInputEl)) { + rangeStartEl.dataset.maxDate = updatedDate; + rangeStartEl.dataset.rangeDate = updatedDate; + rangeStartEl.dataset.defaultDate = updatedDate; + } else { + rangeStartEl.dataset.maxDate = dateRangePickerEl.dataset.maxDate || ""; + rangeStartEl.dataset.rangeDate = ""; + rangeStartEl.dataset.defaultDate = ""; + } + + updateCalendarIfVisible(rangeStartEl); +}; +/** + * Enhance an input with the date picker elements + * + * @param {HTMLElement} el The initial wrapping element of the date range picker component + */ + + +var enhanceDateRangePicker = function enhanceDateRangePicker(el) { + var dateRangePickerEl = el.closest(DATE_RANGE_PICKER); + + var _select = select(DATE_PICKER, dateRangePickerEl), + _select2 = _slicedToArray(_select, 2), + rangeStart = _select2[0], + rangeEnd = _select2[1]; + + if (!rangeStart) { + throw new Error("".concat(DATE_RANGE_PICKER, " is missing inner two '").concat(DATE_PICKER, "' elements")); + } + + if (!rangeEnd) { + throw new Error("".concat(DATE_RANGE_PICKER, " is missing second '").concat(DATE_PICKER, "' element")); + } + + rangeStart.classList.add(DATE_RANGE_PICKER_RANGE_START_CLASS); + rangeEnd.classList.add(DATE_RANGE_PICKER_RANGE_END_CLASS); + + if (!dateRangePickerEl.dataset.minDate) { + dateRangePickerEl.dataset.minDate = DEFAULT_MIN_DATE; + } + + var minDate = dateRangePickerEl.dataset.minDate; + rangeStart.dataset.minDate = minDate; + rangeEnd.dataset.minDate = minDate; + var maxDate = dateRangePickerEl.dataset.maxDate; + + if (maxDate) { + rangeStart.dataset.maxDate = maxDate; + rangeEnd.dataset.maxDate = maxDate; + } + + handleRangeStartUpdate(dateRangePickerEl); + handleRangeEndUpdate(dateRangePickerEl); +}; + +var dateRangePicker = behavior({ + "input change": (_inputChange = {}, _defineProperty(_inputChange, DATE_RANGE_PICKER_RANGE_START, function () { + handleRangeStartUpdate(this); + }), _defineProperty(_inputChange, DATE_RANGE_PICKER_RANGE_END, function () { + handleRangeEndUpdate(this); + }), _inputChange) +}, { + init: function init(root) { + select(DATE_RANGE_PICKER, root).forEach(function (dateRangePickerEl) { + enhanceDateRangePicker(dateRangePickerEl); + }); + } +}); +module.exports = dateRangePicker; + +},{"../config":35,"../utils/behavior":44,"../utils/select":49,"./date-picker":20}],22:[function(require,module,exports){ +"use strict"; + +var select = require("../utils/select"); + +var behavior = require("../utils/behavior"); + +var _require = require("../config"), + PREFIX = _require.prefix; + +var DROPZONE_CLASS = "".concat(PREFIX, "-file-input"); +var DROPZONE = ".".concat(DROPZONE_CLASS); +var INPUT_CLASS = "".concat(PREFIX, "-file-input__input"); +var TARGET_CLASS = "".concat(PREFIX, "-file-input__target"); +var INPUT = ".".concat(INPUT_CLASS); +var BOX_CLASS = "".concat(PREFIX, "-file-input__box"); +var INSTRUCTIONS_CLASS = "".concat(PREFIX, "-file-input__instructions"); +var PREVIEW_CLASS = "".concat(PREFIX, "-file-input__preview"); +var PREVIEW_HEADING_CLASS = "".concat(PREFIX, "-file-input__preview-heading"); +var DISABLED_CLASS = "".concat(PREFIX, "-file-input--disabled"); +var CHOOSE_CLASS = "".concat(PREFIX, "-file-input__choose"); +var ACCEPTED_FILE_MESSAGE_CLASS = "".concat(PREFIX, "-file-input__accepted-files-message"); +var DRAG_TEXT_CLASS = "".concat(PREFIX, "-file-input__drag-text"); +var DRAG_CLASS = "".concat(PREFIX, "-file-input--drag"); +var LOADING_CLASS = "is-loading"; +var HIDDEN_CLASS = "display-none"; +var INVALID_FILE_CLASS = "has-invalid-file"; +var GENERIC_PREVIEW_CLASS_NAME = "".concat(PREFIX, "-file-input__preview-image"); +var GENERIC_PREVIEW_CLASS = "".concat(GENERIC_PREVIEW_CLASS_NAME, "--generic"); +var PDF_PREVIEW_CLASS = "".concat(GENERIC_PREVIEW_CLASS_NAME, "--pdf"); +var WORD_PREVIEW_CLASS = "".concat(GENERIC_PREVIEW_CLASS_NAME, "--word"); +var VIDEO_PREVIEW_CLASS = "".concat(GENERIC_PREVIEW_CLASS_NAME, "--video"); +var EXCEL_PREVIEW_CLASS = "".concat(GENERIC_PREVIEW_CLASS_NAME, "--excel"); +var SPACER_GIF = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"; +/** + * The properties and elements within the file input. + * @typedef {Object} FileInputContext + * @property {HTMLDivElement} dropZoneEl + * @property {HTMLInputElement} inputEl + */ + +/** + * Get an object of the properties and elements belonging directly to the given + * file input component. + * + * @param {HTMLElement} el the element within the file input + * @returns {FileInputContext} elements + */ + +var getFileInputContext = function getFileInputContext(el) { + var dropZoneEl = el.closest(DROPZONE); + + if (!dropZoneEl) { + throw new Error("Element is missing outer ".concat(DROPZONE)); + } + + var inputEl = dropZoneEl.querySelector(INPUT); + return { + dropZoneEl: dropZoneEl, + inputEl: inputEl + }; +}; +/** + * Disable the file input component + * + * @param {HTMLElement} el An element within the file input component + */ + + +var disable = function disable(el) { + var _getFileInputContext = getFileInputContext(el), + dropZoneEl = _getFileInputContext.dropZoneEl, + inputEl = _getFileInputContext.inputEl; + + inputEl.disabled = true; + dropZoneEl.classList.add(DISABLED_CLASS); + dropZoneEl.setAttribute("aria-disabled", "true"); +}; +/** + * Enable the file input component + * + * @param {HTMLElement} el An element within the file input component + */ + + +var enable = function enable(el) { + var _getFileInputContext2 = getFileInputContext(el), + dropZoneEl = _getFileInputContext2.dropZoneEl, + inputEl = _getFileInputContext2.inputEl; + + inputEl.disabled = false; + dropZoneEl.classList.remove(DISABLED_CLASS); + dropZoneEl.removeAttribute("aria-disabled"); +}; +/** + * Creates an ID name for each file that strips all invalid characters. + * @param {string} name - name of the file added to file input + * @returns {string} same characters as the name with invalid chars removed + */ + + +var makeSafeForID = function makeSafeForID(name) { + return name.replace(/[^a-z0-9]/g, function replaceName(s) { + var c = s.charCodeAt(0); + if (c === 32) return "-"; + if (c >= 65 && c <= 90) return "img_".concat(s.toLowerCase()); + return "__".concat(("000", c.toString(16)).slice(-4)); + }); +}; +/** + * Builds full file input comonent + * @param {HTMLElement} fileInputEl - original file input on page + * @returns {HTMLElement|HTMLElement} - Instructions, target area div + */ + + +var buildFileInput = function buildFileInput(fileInputEl) { + var acceptsMultiple = fileInputEl.hasAttribute("multiple"); + var fileInputParent = document.createElement("div"); + var dropTarget = document.createElement("div"); + var box = document.createElement("div"); + var instructions = document.createElement("div"); + var disabled = fileInputEl.hasAttribute("disabled"); // Adds class names and other attributes + + fileInputEl.classList.remove(DROPZONE_CLASS); + fileInputEl.classList.add(INPUT_CLASS); + fileInputParent.classList.add(DROPZONE_CLASS); + box.classList.add(BOX_CLASS); + instructions.classList.add(INSTRUCTIONS_CLASS); + instructions.setAttribute("aria-hidden", "true"); + dropTarget.classList.add(TARGET_CLASS); // Adds child elements to the DOM + + fileInputEl.parentNode.insertBefore(dropTarget, fileInputEl); + fileInputEl.parentNode.insertBefore(fileInputParent, dropTarget); + dropTarget.appendChild(fileInputEl); + fileInputParent.appendChild(dropTarget); + fileInputEl.parentNode.insertBefore(instructions, fileInputEl); + fileInputEl.parentNode.insertBefore(box, fileInputEl); // Disabled styling + + if (disabled) { + disable(fileInputEl); + } // Sets instruction test based on whether or not multiple files are accepted + + + if (acceptsMultiple) { + instructions.innerHTML = "Drag files here or choose from folder"); + } else { + instructions.innerHTML = "Drag file here or choose from folder"); + } // IE11 and Edge do not support drop files on file inputs, so we've removed text that indicates that + + + if (/rv:11.0/i.test(navigator.userAgent) || /Edge\/\d./i.test(navigator.userAgent)) { + fileInputParent.querySelector(".".concat(DRAG_TEXT_CLASS)).outerHTML = ""; + } + + return { + instructions: instructions, + dropTarget: dropTarget + }; +}; +/** + * Removes image previews, we want to start with a clean list every time files are added to the file input + * @param {HTMLElement} dropTarget - target area div that encases the input + * @param {HTMLElement} instructions - text to inform users to drag or select files + */ + + +var removeOldPreviews = function removeOldPreviews(dropTarget, instructions) { + var filePreviews = dropTarget.querySelectorAll(".".concat(PREVIEW_CLASS)); + var currentPreviewHeading = dropTarget.querySelector(".".concat(PREVIEW_HEADING_CLASS)); + var currentErrorMessage = dropTarget.querySelector(".".concat(ACCEPTED_FILE_MESSAGE_CLASS)); // Remove the heading above the previews + + if (currentPreviewHeading) { + currentPreviewHeading.outerHTML = ""; + } // Remove existing error messages + + + if (currentErrorMessage) { + currentErrorMessage.outerHTML = ""; + dropTarget.classList.remove(INVALID_FILE_CLASS); + } // Get rid of existing previews if they exist, show instructions + + + if (filePreviews !== null) { + if (instructions) { + instructions.classList.remove(HIDDEN_CLASS); + } + + Array.prototype.forEach.call(filePreviews, function removeImages(node) { + node.parentNode.removeChild(node); + }); + } +}; +/** + * When using an Accept attribute, invalid files will be hidden from + * file browser, but they can still be dragged to the input. This + * function prevents them from being dragged and removes error states + * when correct files are added. + * @param {event} e + * @param {HTMLElement} fileInputEl - file input element + * @param {HTMLElement} instructions - text to inform users to drag or select files + * @param {HTMLElement} dropTarget - target area div that encases the input + */ + + +var preventInvalidFiles = function preventInvalidFiles(e, fileInputEl, instructions, dropTarget) { + var acceptedFilesAttr = fileInputEl.getAttribute("accept"); + dropTarget.classList.remove(INVALID_FILE_CLASS); // Runs if only specific files are accepted + + if (acceptedFilesAttr) { + var acceptedFiles = acceptedFilesAttr.split(","); + var errorMessage = document.createElement("div"); // If multiple files are dragged, this iterates through them and look for any files that are not accepted. + + var allFilesAllowed = true; + + for (var i = 0; i < e.dataTransfer.files.length; i += 1) { + var file = e.dataTransfer.files[i]; + + if (allFilesAllowed) { + for (var j = 0; j < acceptedFiles.length; j += 1) { + var fileType = acceptedFiles[j]; + allFilesAllowed = file.name.indexOf(fileType) > 0 || file.type.includes(fileType.replace(/\*/g, "")); + if (allFilesAllowed) break; + } + } else break; + } // If dragged files are not accepted, this removes them from the value of the input and creates and error state + + + if (!allFilesAllowed) { + removeOldPreviews(dropTarget, instructions); + fileInputEl.value = ""; // eslint-disable-line no-param-reassign + + dropTarget.insertBefore(errorMessage, fileInputEl); + errorMessage.innerHTML = "This is not a valid file type."; + errorMessage.classList.add(ACCEPTED_FILE_MESSAGE_CLASS); + dropTarget.classList.add(INVALID_FILE_CLASS); + e.preventDefault(); + e.stopPropagation(); + } + } +}; +/** + * When new files are applied to file input, this function generates previews + * and removes old ones. + * @param {event} e + * @param {HTMLElement} fileInputEl - file input element + * @param {HTMLElement} instructions - text to inform users to drag or select files + * @param {HTMLElement} dropTarget - target area div that encases the input + */ + + +var handleChange = function handleChange(e, fileInputEl, instructions, dropTarget) { + var fileNames = e.target.files; + var filePreviewsHeading = document.createElement("div"); // First, get rid of existing previews + + removeOldPreviews(dropTarget, instructions); // Iterates through files list and creates previews + + var _loop = function _loop(i) { + var reader = new FileReader(); + var fileName = fileNames[i].name; // Starts with a loading image while preview is created + + reader.onloadstart = function createLoadingImage() { + var imageId = makeSafeForID(fileName); + var previewImage = "\"\""); + instructions.insertAdjacentHTML("afterend", "
    ").concat(previewImage).concat(fileName, "
    ")); + }; // Not all files will be able to generate previews. In case this happens, we provide several types "generic previews" based on the file extension. + + + reader.onloadend = function createFilePreview() { + var imageId = makeSafeForID(fileName); + var previewImage = document.getElementById(imageId); + + if (fileName.indexOf(".pdf") > 0) { + previewImage.setAttribute("onerror", "this.onerror=null;this.src=\"".concat(SPACER_GIF, "\"; this.classList.add(\"").concat(PDF_PREVIEW_CLASS, "\")")); + } else if (fileName.indexOf(".doc") > 0 || fileName.indexOf(".pages") > 0) { + previewImage.setAttribute("onerror", "this.onerror=null;this.src=\"".concat(SPACER_GIF, "\"; this.classList.add(\"").concat(WORD_PREVIEW_CLASS, "\")")); + } else if (fileName.indexOf(".xls") > 0 || fileName.indexOf(".numbers") > 0) { + previewImage.setAttribute("onerror", "this.onerror=null;this.src=\"".concat(SPACER_GIF, "\"; this.classList.add(\"").concat(EXCEL_PREVIEW_CLASS, "\")")); + } else if (fileName.indexOf(".mov") > 0 || fileName.indexOf(".mp4") > 0) { + previewImage.setAttribute("onerror", "this.onerror=null;this.src=\"".concat(SPACER_GIF, "\"; this.classList.add(\"").concat(VIDEO_PREVIEW_CLASS, "\")")); + } else { + previewImage.setAttribute("onerror", "this.onerror=null;this.src=\"".concat(SPACER_GIF, "\"; this.classList.add(\"").concat(GENERIC_PREVIEW_CLASS, "\")")); + } // Removes loader and displays preview + + + previewImage.classList.remove(LOADING_CLASS); + previewImage.src = reader.result; + }; + + if (fileNames[i]) { + reader.readAsDataURL(fileNames[i]); + } // Adds heading above file previews, pluralizes if there are multiple + + + if (i === 0) { + dropTarget.insertBefore(filePreviewsHeading, instructions); + filePreviewsHeading.innerHTML = "Selected file Change file"; + } else if (i >= 1) { + dropTarget.insertBefore(filePreviewsHeading, instructions); + filePreviewsHeading.innerHTML = "".concat(i + 1, " files selected Change files"); + } // Hides null state content and sets preview heading class + + + if (filePreviewsHeading) { + instructions.classList.add(HIDDEN_CLASS); + filePreviewsHeading.classList.add(PREVIEW_HEADING_CLASS); + } + }; + + for (var i = 0; i < fileNames.length; i += 1) { + _loop(i); + } +}; + +var fileInput = behavior({}, { + init: function init(root) { + select(DROPZONE, root).forEach(function (fileInputEl) { + var _buildFileInput = buildFileInput(fileInputEl), + instructions = _buildFileInput.instructions, + dropTarget = _buildFileInput.dropTarget; + + dropTarget.addEventListener("dragover", function handleDragOver() { + this.classList.add(DRAG_CLASS); + }, false); + dropTarget.addEventListener("dragleave", function handleDragLeave() { + this.classList.remove(DRAG_CLASS); + }, false); + dropTarget.addEventListener("drop", function handleDrop(e) { + preventInvalidFiles(e, fileInputEl, instructions, dropTarget); + this.classList.remove(DRAG_CLASS); + }, false); // eslint-disable-next-line no-param-reassign + + fileInputEl.onchange = function (e) { + handleChange(e, fileInputEl, instructions, dropTarget); + }; + }); + }, + getFileInputContext: getFileInputContext, + disable: disable, + enable: enable +}); +module.exports = fileInput; + +},{"../config":35,"../utils/behavior":44,"../utils/select":49}],23:[function(require,module,exports){ +"use strict"; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var behavior = require("../utils/behavior"); + +var select = require("../utils/select"); + +var _require = require("../events"), + CLICK = _require.CLICK; + +var _require2 = require("../config"), + PREFIX = _require2.prefix; + +var HIDDEN = "hidden"; +var SCOPE = ".".concat(PREFIX, "-footer--big"); +var NAV = "".concat(SCOPE, " nav"); +var BUTTON = "".concat(NAV, " .").concat(PREFIX, "-footer__primary-link"); +var COLLAPSIBLE = ".".concat(PREFIX, "-footer__primary-content--collapsible"); +var HIDE_MAX_WIDTH = 480; + +function showPanel() { + if (window.innerWidth < HIDE_MAX_WIDTH) { + var collapseEl = this.closest(COLLAPSIBLE); + collapseEl.classList.toggle(HIDDEN); // NB: this *should* always succeed because the button + // selector is scoped to ".{prefix}-footer-big nav" + + var collapsibleEls = select(COLLAPSIBLE, collapseEl.closest(NAV)); + collapsibleEls.forEach(function (el) { + if (el !== collapseEl) { + el.classList.add(HIDDEN); + } + }); + } +} + +var toggleHidden = function toggleHidden(isHidden) { + return select(COLLAPSIBLE).forEach(function (list) { + return list.classList.toggle(HIDDEN, isHidden); + }); +}; + +var resize = function resize(event) { + return toggleHidden(event.matches); +}; + +module.exports = behavior(_defineProperty({}, CLICK, _defineProperty({}, BUTTON, showPanel)), { + // export for use elsewhere + HIDE_MAX_WIDTH: HIDE_MAX_WIDTH, + init: function init() { + toggleHidden(window.innerWidth < HIDE_MAX_WIDTH); + this.mediaQueryList = window.matchMedia("(max-width: ".concat(HIDE_MAX_WIDTH, "px)")); + this.mediaQueryList.addListener(resize); + }, + teardown: function teardown() { + this.mediaQueryList.removeListener(resize); + } +}); + +},{"../config":35,"../events":36,"../utils/behavior":44,"../utils/select":49}],24:[function(require,module,exports){ +"use strict"; + +var accordion = require("./accordion"); + +var banner = require("./banner"); + +var characterCount = require("./character-count"); + +var comboBox = require("./combo-box"); + +var fileInput = require("./file-input"); + +var footer = require("./footer"); + +var inputPrefixSuffix = require("./input-prefix-suffix"); + +var modal = require("./modal"); + +var navigation = require("./navigation"); + +var password = require("./password"); + +var search = require("./search"); + +var skipnav = require("./skipnav"); + +var tooltip = require("./tooltip"); + +var validator = require("./validator"); + +var datePicker = require("./date-picker"); + +var dateRangePicker = require("./date-range-picker"); + +var timePicker = require("./time-picker"); + +var table = require("./table"); + +module.exports = { + accordion: accordion, + banner: banner, + characterCount: characterCount, + comboBox: comboBox, + datePicker: datePicker, + dateRangePicker: dateRangePicker, + fileInput: fileInput, + footer: footer, + inputPrefixSuffix: inputPrefixSuffix, + modal: modal, + navigation: navigation, + password: password, + search: search, + skipnav: skipnav, + table: table, + timePicker: timePicker, + tooltip: tooltip, + validator: validator +}; + +},{"./accordion":16,"./banner":17,"./character-count":18,"./combo-box":19,"./date-picker":20,"./date-range-picker":21,"./file-input":22,"./footer":23,"./input-prefix-suffix":25,"./modal":26,"./navigation":27,"./password":28,"./search":29,"./skipnav":30,"./table":31,"./time-picker":32,"./tooltip":33,"./validator":34}],25:[function(require,module,exports){ +"use strict"; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var behavior = require("../utils/behavior"); + +var select = require("../utils/select"); + +var _require = require("../config"), + PREFIX = _require.prefix; + +var _require2 = require("../events"), + CLICK = _require2.CLICK; + +var CONTAINER = ".".concat(PREFIX, "-input-group"); +var INPUT = "".concat(CONTAINER, " .").concat(PREFIX, "-input"); +var DECORATION = "".concat(CONTAINER, " .").concat(PREFIX, "-input-prefix, ").concat(CONTAINER, " .").concat(PREFIX, "-input-suffix"); +var FOCUS_CLASS = "is-focused"; + +function setFocus(el) { + el.closest(CONTAINER).querySelector(".".concat(PREFIX, "-input")).focus(); +} + +function handleFocus() { + this.closest(CONTAINER).classList.add(FOCUS_CLASS); +} + +function handleBlur() { + this.closest(CONTAINER).classList.remove(FOCUS_CLASS); +} + +var inputPrefixSuffix = behavior(_defineProperty({}, CLICK, _defineProperty({}, DECORATION, function () { + setFocus(this); +})), { + init: function init(root) { + select(INPUT, root).forEach(function (inputEl) { + inputEl.addEventListener("focus", handleFocus, false); + inputEl.addEventListener("blur", handleBlur, false); + }); + } +}); +module.exports = inputPrefixSuffix; + +},{"../config":35,"../events":36,"../utils/behavior":44,"../utils/select":49}],26:[function(require,module,exports){ +"use strict"; + +var _CLICK; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var behavior = require("../utils/behavior"); + +var select = require("../utils/select"); + +var FocusTrap = require("../utils/focus-trap"); + +var ScrollBarWidth = require("../utils/scrollbar-width"); + +var _require = require("../events"), + CLICK = _require.CLICK; + +var _require2 = require("../config"), + PREFIX = _require2.prefix; + +var MODAL_CLASSNAME = "".concat(PREFIX, "-modal"); +var OVERLAY_CLASSNAME = "".concat(MODAL_CLASSNAME, "-overlay"); +var WRAPPER_CLASSNAME = "".concat(MODAL_CLASSNAME, "-wrapper"); +var OPENER_ATTRIBUTE = "data-open-modal"; +var CLOSER_ATTRIBUTE = "data-close-modal"; +var FORCE_ACTION_ATTRIBUTE = "data-force-action"; +var MODAL = ".".concat(MODAL_CLASSNAME); +var INITIAL_FOCUS = ".".concat(WRAPPER_CLASSNAME, " *[data-focus]"); +var CLOSE_BUTTON = "".concat(WRAPPER_CLASSNAME, " *[").concat(CLOSER_ATTRIBUTE, "]"); +var OPENERS = "*[".concat(OPENER_ATTRIBUTE, "][aria-controls]"); +var CLOSERS = "".concat(CLOSE_BUTTON, ", .").concat(OVERLAY_CLASSNAME, ":not([").concat(FORCE_ACTION_ATTRIBUTE, "])"); +var ACTIVE_CLASS = "usa-js-modal--active"; +var PREVENT_CLICK_CLASS = "usa-js-no-click"; +var VISIBLE_CLASS = "is-visible"; +var HIDDEN_CLASS = "is-hidden"; +var nonModals = document.querySelectorAll("body > *:not(".concat(MODAL, "):not([aria-hidden])")); +var modal; + +var isActive = function isActive() { + return document.body.classList.contains(ACTIVE_CLASS); +}; + +var SCROLLBAR_WIDTH = ScrollBarWidth(); +var INITIAL_PADDING = window.getComputedStyle(document.body).getPropertyValue("padding-right"); +var TEMPORARY_PADDING = parseInt(INITIAL_PADDING.replace(/px/, ""), 10) + parseInt(SCROLLBAR_WIDTH.replace(/px/, ""), 10) + "px"; +/** + * Is bound to escape key, closes modal when + */ + +var onMenuClose = function onMenuClose() { + modal.toggleModal.call(modal, false); +}; +/** + * Toggle the visibility of a modal window + * + * @param {KeyboardEvent} event the keydown event + * @returns {boolean} safeActive if mobile is open + */ + + +function toggleModal(event) { + var originalOpener; + var clickedElement = event.target; + var _document = document, + body = _document.body; + var safeActive = !isActive(); + var modalId = clickedElement ? clickedElement.getAttribute("aria-controls") : document.querySelector(".usa-modal-wrapper.is-visible"); + var targetModal = safeActive ? document.getElementById(modalId) : document.querySelector(".usa-modal-wrapper.is-visible"); + var openFocusEl = targetModal.querySelector(INITIAL_FOCUS) ? targetModal.querySelector(INITIAL_FOCUS) : targetModal.querySelector(".usa-modal"); + var returnFocus = document.getElementById(targetModal.getAttribute("data-opener")); + var menuButton = body.querySelector(OPENERS); + var forceUserAction = targetModal.getAttribute(FORCE_ACTION_ATTRIBUTE); // Sets the clicked element to the close button + // so esc key always closes modal + + if (event.type === "keydown" && targetModal !== null) { + clickedElement = targetModal.querySelector(CLOSE_BUTTON); + } // When we're not hitting the escape key… + + + if (clickedElement) { + // Make sure we click the opener + // If it doesn't have an ID, make one + // Store id as data attribute on modal + if (clickedElement.hasAttribute(OPENER_ATTRIBUTE)) { + if (this.getAttribute("id") === null) { + originalOpener = "modal-".concat(Math.floor(Math.random() * 900000) + 100000); + this.setAttribute("id", originalOpener); + } else { + originalOpener = this.getAttribute("id"); + } + + targetModal.setAttribute("data-opener", originalOpener); + } // This basically stops the propagation if the element + // is inside the modal and not a close button or + // element inside a close button + + + if (clickedElement.closest(".".concat(MODAL_CLASSNAME))) { + if (clickedElement.hasAttribute(CLOSER_ATTRIBUTE) || clickedElement.closest("[".concat(CLOSER_ATTRIBUTE, "]"))) {// do nothing. move on. + } else { + event.stopPropagation(); + return false; + } + } + } // Active class shares same as navigation + + + body.classList.toggle(ACTIVE_CLASS, safeActive); + targetModal.classList.toggle(VISIBLE_CLASS, safeActive); + targetModal.classList.toggle(HIDDEN_CLASS, !safeActive); // If user is forced to take an action, adding + // a class to the body that prevents clicking underneath + // overlay + + if (forceUserAction) { + body.classList.toggle(PREVENT_CLICK_CLASS, safeActive); + } // Account for content shifting from body overflow: hidden + // We only check paddingRight in case apps are adding other properties + // to the body element + + + body.style.paddingRight = body.style.paddingRight === TEMPORARY_PADDING ? INITIAL_PADDING : TEMPORARY_PADDING; // Handle the focus actions + + if (safeActive && openFocusEl) { + // The modal window is opened. Focus is set to close button. + // Binds escape key if we're not forcing + // the user to take an action + if (forceUserAction) { + modal.focusTrap = FocusTrap(targetModal); + } else { + modal.focusTrap = FocusTrap(targetModal, { + Escape: onMenuClose + }); + } // Handles focus setting and interactions + + + modal.focusTrap.update(safeActive); + openFocusEl.focus(); // Hides everything that is not the modal from screen readers + + for (var i = 0; i < nonModals.length; i += 1) { + nonModals[i].setAttribute("aria-hidden", "true"); + } + } else if (!safeActive && menuButton && returnFocus) { + // The modal window is closed. + // Non-modals now accesible to screen reader + for (var _i = 0; _i < nonModals.length; _i += 1) { + nonModals[_i].removeAttribute("aria-hidden"); + } // Focus is returned to the opener + + + returnFocus.focus(); + modal.focusTrap.update(safeActive); + } + + return safeActive; +} +/** + * Builds modal window from base HTML + * + * @param {HTMLElement} baseComponent the modal html in the DOM + */ + + +var setUpAttributes = function setUpAttributes(baseComponent) { + var modalContent = baseComponent; + var modalWrapper = document.createElement("div"); + var overlayDiv = document.createElement("div"); + var modalID = baseComponent.getAttribute("id"); + var ariaLabelledBy = baseComponent.getAttribute("aria-labelledby"); + var ariaDescribedBy = baseComponent.getAttribute("aria-describedby"); + var forceUserAction = baseComponent.hasAttribute(FORCE_ACTION_ATTRIBUTE) ? baseComponent.hasAttribute(FORCE_ACTION_ATTRIBUTE) : false; // Rebuild the modal element + + modalContent.parentNode.insertBefore(modalWrapper, modalContent); + modalWrapper.appendChild(modalContent); + modalContent.parentNode.insertBefore(overlayDiv, modalContent); + overlayDiv.appendChild(modalContent); // Add classes and attributes + + modalWrapper.classList.add(HIDDEN_CLASS); + modalWrapper.classList.add(WRAPPER_CLASSNAME); + overlayDiv.classList.add(OVERLAY_CLASSNAME); // Set attributes + + modalWrapper.setAttribute("role", "dialog"); + modalWrapper.setAttribute("id", modalID); + + if (ariaLabelledBy) { + modalWrapper.setAttribute("aria-labelledby", ariaLabelledBy); + } + + if (ariaDescribedBy) { + modalWrapper.setAttribute("aria-describedby", ariaDescribedBy); + } + + if (forceUserAction) { + modalWrapper.setAttribute(FORCE_ACTION_ATTRIBUTE, "true"); + } // Update the base element HTML + + + baseComponent.removeAttribute("id"); + baseComponent.removeAttribute("aria-labelledby"); + baseComponent.removeAttribute("aria-describedby"); + baseComponent.setAttribute("tabindex", "-1"); // Add aria-controls + + var modalClosers = modalWrapper.querySelectorAll(CLOSERS); + select(modalClosers).forEach(function (el) { + el.setAttribute("aria-controls", modalID); + }); // Move all modals to the end of the DOM. Doing this allows us to + // more easily find the elements to hide from screen readers + // when the modal is open. + + document.body.appendChild(modalWrapper); +}; + +modal = behavior(_defineProperty({}, CLICK, (_CLICK = {}, _defineProperty(_CLICK, OPENERS, toggleModal), _defineProperty(_CLICK, CLOSERS, toggleModal), _CLICK)), { + init: function init(root) { + select(MODAL, root).forEach(function (modalWindow) { + setUpAttributes(modalWindow); + }); + select(OPENERS, root).forEach(function (item) { + // Turn anchor links into buttons because of + // VoiceOver on Safari + if (item.nodeName === "A") { + item.setAttribute("role", "button"); + item.addEventListener("click", function (e) { + e.preventDefault(); + }); + } // Can uncomment when aria-haspopup="dialog" is supported + // https://a11ysupport.io/tech/aria/aria-haspopup_attribute + // Most screen readers support aria-haspopup, but might announce + // as opening a menu if "dialog" is not supported. + // item.setAttribute("aria-haspopup", "dialog"); + + }); + }, + focusTrap: null, + toggleModal: toggleModal +}); +module.exports = modal; + +},{"../config":35,"../events":36,"../utils/behavior":44,"../utils/focus-trap":45,"../utils/scrollbar-width":48,"../utils/select":49}],27:[function(require,module,exports){ +"use strict"; + +var _CLICK; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var behavior = require("../utils/behavior"); + +var select = require("../utils/select"); + +var toggle = require("../utils/toggle"); + +var FocusTrap = require("../utils/focus-trap"); + +var accordion = require("./accordion"); + +var ScrollBarWidth = require("../utils/scrollbar-width"); + +var _require = require("../events"), + CLICK = _require.CLICK; + +var _require2 = require("../config"), + PREFIX = _require2.prefix; + +var BODY = "body"; +var NAV = ".".concat(PREFIX, "-nav"); +var NAV_LINKS = "".concat(NAV, " a"); +var NAV_CONTROL = "button.".concat(PREFIX, "-nav__link"); +var OPENERS = ".".concat(PREFIX, "-menu-btn"); +var CLOSE_BUTTON = ".".concat(PREFIX, "-nav__close"); +var OVERLAY = ".".concat(PREFIX, "-overlay"); +var CLOSERS = "".concat(CLOSE_BUTTON, ", .").concat(PREFIX, "-overlay"); +var TOGGLES = [NAV, OVERLAY].join(", "); +var ACTIVE_CLASS = "usa-js-mobile-nav--active"; +var VISIBLE_CLASS = "is-visible"; +var navigation; +var navActive; + +var isActive = function isActive() { + return document.body.classList.contains(ACTIVE_CLASS); +}; + +var SCROLLBAR_WIDTH = ScrollBarWidth(); +var INITIAL_PADDING = window.getComputedStyle(document.body).getPropertyValue('padding-right'); +var TEMPORARY_PADDING = parseInt(INITIAL_PADDING.replace(/px/, ""), 10) + parseInt(SCROLLBAR_WIDTH.replace(/px/, ""), 10) + "px"; + +var toggleNav = function toggleNav(active) { + var _document = document, + body = _document.body; + var safeActive = typeof active === "boolean" ? active : !isActive(); + body.classList.toggle(ACTIVE_CLASS, safeActive); + select(TOGGLES).forEach(function (el) { + return el.classList.toggle(VISIBLE_CLASS, safeActive); + }); + navigation.focusTrap.update(safeActive); + var closeButton = body.querySelector(CLOSE_BUTTON); + var menuButton = body.querySelector(OPENERS); + body.style.paddingRight = body.style.paddingRight === TEMPORARY_PADDING ? INITIAL_PADDING : TEMPORARY_PADDING; + + if (safeActive && closeButton) { + // The mobile nav was just activated, so focus on the close button, + // which is just before all the nav elements in the tab order. + closeButton.focus(); + } else if (!safeActive && document.activeElement === closeButton && menuButton) { + // The mobile nav was just deactivated, and focus was on the close + // button, which is no longer visible. We don't want the focus to + // disappear into the void, so focus on the menu button if it's + // visible (this may have been what the user was just focused on, + // if they triggered the mobile nav by mistake). + menuButton.focus(); + } + + return safeActive; +}; + +var resize = function resize() { + var closer = document.body.querySelector(CLOSE_BUTTON); + + if (isActive() && closer && closer.getBoundingClientRect().width === 0) { + // When the mobile nav is active, and the close box isn't visible, + // we know the user's viewport has been resized to be larger. + // Let's make the page state consistent by deactivating the mobile nav. + navigation.toggleNav.call(closer, false); + } +}; + +var onMenuClose = function onMenuClose() { + return navigation.toggleNav.call(navigation, false); +}; + +var hideActiveNavDropdown = function hideActiveNavDropdown() { + toggle(navActive, false); + navActive = null; +}; + +navigation = behavior(_defineProperty({}, CLICK, (_CLICK = {}, _defineProperty(_CLICK, NAV_CONTROL, function () { + // If another nav is open, close it + if (navActive && navActive !== this) { + hideActiveNavDropdown(); + } // store a reference to the last clicked nav link element, so we + // can hide the dropdown if another element on the page is clicked + + + if (navActive) { + hideActiveNavDropdown(); + } else { + navActive = this; + toggle(navActive, true); + } // Do this so the event handler on the body doesn't fire + + + return false; +}), _defineProperty(_CLICK, BODY, function () { + if (navActive) { + hideActiveNavDropdown(); + } +}), _defineProperty(_CLICK, OPENERS, toggleNav), _defineProperty(_CLICK, CLOSERS, toggleNav), _defineProperty(_CLICK, NAV_LINKS, function () { + // A navigation link has been clicked! We want to collapse any + // hierarchical navigation UI it's a part of, so that the user + // can focus on whatever they've just selected. + // Some navigation links are inside accordions; when they're + // clicked, we want to collapse those accordions. + var acc = this.closest(accordion.ACCORDION); + + if (acc) { + accordion.getButtons(acc).forEach(function (btn) { + return accordion.hide(btn); + }); + } // If the mobile navigation menu is active, we want to hide it. + + + if (isActive()) { + navigation.toggleNav.call(navigation, false); + } +}), _CLICK)), { + init: function init(root) { + var trapContainer = root.querySelector(NAV); + + if (trapContainer) { + navigation.focusTrap = FocusTrap(trapContainer, { + Escape: onMenuClose + }); + } + + resize(); + window.addEventListener("resize", resize, false); + }, + teardown: function teardown() { + window.removeEventListener("resize", resize, false); + navActive = false; + }, + focusTrap: null, + toggleNav: toggleNav +}); +module.exports = navigation; + +},{"../config":35,"../events":36,"../utils/behavior":44,"../utils/focus-trap":45,"../utils/scrollbar-width":48,"../utils/select":49,"../utils/toggle":52,"./accordion":16}],28:[function(require,module,exports){ +"use strict"; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var behavior = require("../utils/behavior"); + +var toggleFormInput = require("../utils/toggle-form-input"); + +var _require = require("../events"), + CLICK = _require.CLICK; + +var _require2 = require("../config"), + PREFIX = _require2.prefix; + +var LINK = ".".concat(PREFIX, "-show-password, .").concat(PREFIX, "-show-multipassword"); + +function toggle(event) { + event.preventDefault(); + toggleFormInput(this); +} + +module.exports = behavior(_defineProperty({}, CLICK, _defineProperty({}, LINK, toggle))); + +},{"../config":35,"../events":36,"../utils/behavior":44,"../utils/toggle-form-input":51}],29:[function(require,module,exports){ +"use strict"; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var ignore = require("receptor/ignore"); + +var behavior = require("../utils/behavior"); + +var select = require("../utils/select"); + +var _require = require("../events"), + CLICK = _require.CLICK; + +var BUTTON = ".js-search-button"; +var FORM = ".js-search-form"; +var INPUT = "[type=search]"; +var CONTEXT = "header"; // XXX + +var lastButton; + +var getForm = function getForm(button) { + var context = button.closest(CONTEXT); + return context ? context.querySelector(FORM) : document.querySelector(FORM); +}; + +var toggleSearch = function toggleSearch(button, active) { + var form = getForm(button); + + if (!form) { + throw new Error("No ".concat(FORM, " found for search toggle in ").concat(CONTEXT, "!")); + } + /* eslint-disable no-param-reassign */ + + + button.hidden = active; + form.hidden = !active; + /* eslint-enable */ + + if (!active) { + return; + } + + var input = form.querySelector(INPUT); + + if (input) { + input.focus(); + } // when the user clicks _outside_ of the form w/ignore(): hide the + // search, then remove the listener + + + var listener = ignore(form, function () { + if (lastButton) { + hideSearch.call(lastButton); // eslint-disable-line no-use-before-define + } + + document.body.removeEventListener(CLICK, listener); + }); // Normally we would just run this code without a timeout, but + // IE11 and Edge will actually call the listener *immediately* because + // they are currently handling this exact type of event, so we'll + // make sure the browser is done handling the current click event, + // if any, before we attach the listener. + + setTimeout(function () { + document.body.addEventListener(CLICK, listener); + }, 0); +}; + +function showSearch() { + toggleSearch(this, true); + lastButton = this; +} + +function hideSearch() { + toggleSearch(this, false); + lastButton = undefined; +} + +var search = behavior(_defineProperty({}, CLICK, _defineProperty({}, BUTTON, showSearch)), { + init: function init(target) { + select(BUTTON, target).forEach(function (button) { + toggleSearch(button, false); + }); + }, + teardown: function teardown() { + // forget the last button clicked + lastButton = undefined; + } +}); +module.exports = search; + +},{"../events":36,"../utils/behavior":44,"../utils/select":49,"receptor/ignore":11}],30:[function(require,module,exports){ +"use strict"; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var once = require("receptor/once"); + +var behavior = require("../utils/behavior"); + +var _require = require("../events"), + CLICK = _require.CLICK; + +var _require2 = require("../config"), + PREFIX = _require2.prefix; + +var LINK = ".".concat(PREFIX, "-skipnav[href^=\"#\"], .").concat(PREFIX, "-footer__return-to-top [href^=\"#\"]"); +var MAINCONTENT = "main-content"; + +function setTabindex() { + // NB: we know because of the selector we're delegating to below that the + // href already begins with '#' + var id = encodeURI(this.getAttribute("href")); + var target = document.getElementById(id === "#" ? MAINCONTENT : id.slice(1)); + + if (target) { + target.style.outline = "0"; + target.setAttribute("tabindex", 0); + target.focus(); + target.addEventListener("blur", once(function () { + target.setAttribute("tabindex", -1); + })); + } else {// throw an error? + } +} + +module.exports = behavior(_defineProperty({}, CLICK, _defineProperty({}, LINK, setTabindex))); + +},{"../config":35,"../events":36,"../utils/behavior":44,"receptor/once":14}],31:[function(require,module,exports){ +"use strict"; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var select = require("../utils/select"); + +var behavior = require("../utils/behavior"); + +var _require = require("../events"), + CLICK = _require.CLICK; + +var _require2 = require("../config"), + PREFIX = _require2.prefix; + +var TABLE = ".".concat(PREFIX, "-table"); +var SORTED = "aria-sort"; +var ASCENDING = "ascending"; +var DESCENDING = "descending"; +var SORT_OVERRIDE = "data-sort-value"; +var ICON_SOURCE = "\n \n \n \n \n \n \n \n \n \n \n \n"); +var SORT_BUTTON_CLASS = "".concat(PREFIX, "-table__header__button"); +var SORT_BUTTON = ".".concat(SORT_BUTTON_CLASS); +var SORTABLE_HEADER = "th[data-sortable]"; +var ANNOUNCEMENT_REGION = ".".concat(PREFIX, "-table__announcement-region[aria-live=\"polite\"]"); +/** Gets the data-sort-value attribute value, if provided — otherwise, gets + * the innerText or textContent — of the child element (HTMLTableCellElement) + * at the specified index of the given table row + * + * @param {number} index + * @param {array} tr + * @return {boolean} + */ + +var getCellValue = function getCellValue(tr, index) { + return tr.children[index].getAttribute(SORT_OVERRIDE) || tr.children[index].innerText || tr.children[index].textContent; +}; +/** + * Compares the values of two row array items at the given index, then sorts by the given direction + * @param {number} index + * @param {string} direction + * @return {boolean} + */ + + +var compareFunction = function compareFunction(index, isAscending) { + return function (thisRow, nextRow) { + // get values to compare from data attribute or cell content + var value1 = getCellValue(isAscending ? thisRow : nextRow, index); + var value2 = getCellValue(isAscending ? nextRow : thisRow, index); // if neither value is empty, and if both values are already numbers, compare numerically + + if (value1 && value2 && !Number.isNaN(Number(value1)) && !Number.isNaN(Number(value2))) { + return value1 - value2; + } // Otherwise, compare alphabetically based on current user locale + + + return value1.toString().localeCompare(value2, navigator.language, { + numeric: true, + ignorePunctuation: true + }); + }; +}; +/** + * Get an Array of column headers elements belonging directly to the given + * table element. + * @param {HTMLTableElement} table + * @return {array} + */ + + +var getColumnHeaders = function getColumnHeaders(table) { + var headers = select(SORTABLE_HEADER, table); + return headers.filter(function (header) { + return header.closest(TABLE) === table; + }); +}; +/** + * Update the button label within the given header element, resetting it + * to the default state (ready to sort ascending) if it's no longer sorted + * @param {HTMLTableHeaderCellElement} header + */ + + +var updateSortLabel = function updateSortLabel(header) { + var headerName = header.innerText; + var sortedAscending = header.getAttribute(SORTED) === ASCENDING; + var isSorted = header.getAttribute(SORTED) === ASCENDING || header.getAttribute(SORTED) === DESCENDING || false; + var headerLabel = "".concat(headerName, "', sortable column, currently ").concat(isSorted ? "".concat(sortedAscending ? "sorted ".concat(ASCENDING) : "sorted ".concat(DESCENDING)) : "unsorted"); + var headerButtonLabel = "Click to sort by ".concat(headerName, " in ").concat(sortedAscending ? DESCENDING : ASCENDING, " order."); + header.setAttribute("aria-label", headerLabel); + header.querySelector(SORT_BUTTON).setAttribute("title", headerButtonLabel); +}; +/** + * Remove the aria-sort attribute on the given header element, and reset the label and button icon + * @param {HTMLTableHeaderCellElement} header + */ + + +var unsetSort = function unsetSort(header) { + header.removeAttribute(SORTED); + updateSortLabel(header); +}; +/** + * Sort rows either ascending or descending, based on a given header's aria-sort attribute + * @param {HTMLTableHeaderCellElement} header + * @param {boolean} isAscending + * @return {boolean} true + */ + + +var sortRows = function sortRows(header, isAscending) { + header.setAttribute(SORTED, isAscending === true ? DESCENDING : ASCENDING); + updateSortLabel(header); + var tbody = header.closest(TABLE).querySelector("tbody"); // We can use Array.from() and Array.sort() instead once we drop IE11 support, likely in the summer of 2021 + // + // Array.from(tbody.querySelectorAll('tr').sort( + // compareFunction( + // Array.from(header.parentNode.children).indexOf(header), + // !isAscending) + // ) + // .forEach(tr => tbody.appendChild(tr) ); + // [].slice.call() turns array-like sets into true arrays so that we can sort them + + var allRows = [].slice.call(tbody.querySelectorAll("tr")); + var allHeaders = [].slice.call(header.parentNode.children); + var thisHeaderIndex = allHeaders.indexOf(header); + allRows.sort(compareFunction(thisHeaderIndex, !isAscending)).forEach(function (tr) { + [].slice.call(tr.children).forEach(function (td) { + return td.removeAttribute("data-sort-active"); + }); + tr.children[thisHeaderIndex].setAttribute("data-sort-active", true); + tbody.appendChild(tr); + }); + return true; +}; +/** + * Update the live region immediately following the table whenever sort changes. + * @param {HTMLTableElement} table + * @param {HTMLTableHeaderCellElement} sortedHeader + */ + + +var updateLiveRegion = function updateLiveRegion(table, sortedHeader) { + var caption = table.querySelector("caption").innerText; + var sortedAscending = sortedHeader.getAttribute(SORTED) === ASCENDING; + var headerLabel = sortedHeader.innerText; + var liveRegion = table.nextElementSibling; + + if (liveRegion && liveRegion.matches(ANNOUNCEMENT_REGION)) { + var sortAnnouncement = "The table named \"".concat(caption, "\" is now sorted by ").concat(headerLabel, " in ").concat(sortedAscending ? ASCENDING : DESCENDING, " order."); + liveRegion.innerText = sortAnnouncement; + } else { + throw new Error("Table containing a sortable column header is not followed by an aria-live region."); + } +}; +/** + * Toggle a header's sort state, optionally providing a target + * state. + * + * @param {HTMLTableHeaderCellElement} header + * @param {boolean?} isAscending If no state is provided, the current + * state will be toggled (from false to true, and vice-versa). + */ + + +var toggleSort = function toggleSort(header, isAscending) { + var table = header.closest(TABLE); + var safeAscending = isAscending; + + if (typeof safeAscending !== "boolean") { + safeAscending = header.getAttribute(SORTED) === ASCENDING; + } + + if (!table) { + throw new Error("".concat(SORTABLE_HEADER, " is missing outer ").concat(TABLE)); + } + + safeAscending = sortRows(header, isAscending); + + if (safeAscending) { + getColumnHeaders(table).forEach(function (otherHeader) { + if (otherHeader !== header) { + unsetSort(otherHeader); + } + }); + updateLiveRegion(table, header); + } +}; +/** + ** Inserts a button with icon inside a sortable header + * @param {HTMLTableHeaderCellElement} header + */ + + +var createHeaderButton = function createHeaderButton(header) { + var buttonEl = document.createElement("button"); + buttonEl.setAttribute("tabindex", "0"); + buttonEl.classList.add(SORT_BUTTON_CLASS); + buttonEl.innerHTML = "".concat(ICON_SOURCE); + header.appendChild(buttonEl); + updateSortLabel(header); +}; + +var table = behavior(_defineProperty({}, CLICK, _defineProperty({}, SORT_BUTTON, function (event) { + event.preventDefault(); + toggleSort(event.target.closest(SORTABLE_HEADER), event.target.closest(SORTABLE_HEADER).getAttribute(SORTED) === ASCENDING); +})), { + init: function init(root) { + var sortableHeaders = select(SORTABLE_HEADER, root); + sortableHeaders.forEach(function (header) { + return createHeaderButton(header); + }); + var firstSorted = sortableHeaders.filter(function (header) { + return header.getAttribute(SORTED) === ASCENDING || header.getAttribute(SORTED) === DESCENDING; + })[0]; + + if (typeof firstSorted === "undefined") { + // no sortable headers found + return; + } + + var sortDir = firstSorted.getAttribute(SORTED); + + if (sortDir === ASCENDING) { + toggleSort(firstSorted, true); + } else if (sortDir === DESCENDING) { + toggleSort(firstSorted, false); + } + }, + TABLE: TABLE, + SORTABLE_HEADER: SORTABLE_HEADER, + SORT_BUTTON: SORT_BUTTON +}); +module.exports = table; + +},{"../config":35,"../events":36,"../utils/behavior":44,"../utils/select":49}],32:[function(require,module,exports){ +"use strict"; + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +var behavior = require("../utils/behavior"); + +var select = require("../utils/select"); + +var _require = require("../config"), + PREFIX = _require.prefix; + +var _require2 = require("./combo-box"), + COMBO_BOX_CLASS = _require2.COMBO_BOX_CLASS, + enhanceComboBox = _require2.enhanceComboBox; + +var TIME_PICKER_CLASS = "".concat(PREFIX, "-time-picker"); +var TIME_PICKER = ".".concat(TIME_PICKER_CLASS); +var MAX_TIME = 60 * 24 - 1; +var MIN_TIME = 0; +var DEFAULT_STEP = 30; +var MIN_STEP = 1; +var FILTER_DATASET = { + filter: "0?{{ hourQueryFilter }}:{{minuteQueryFilter}}.*{{ apQueryFilter }}m?", + apQueryFilter: "([ap])", + hourQueryFilter: "([1-9][0-2]?)", + minuteQueryFilter: "[\\d]+:([0-9]{0,2})" +}; +/** + * Parse a string of hh:mm into minutes + * + * @param {string} timeStr the time string to parse + * @returns {number} the number of minutes + */ + +var parseTimeString = function parseTimeString(timeStr) { + var minutes; + + if (timeStr) { + var _timeStr$split$map = timeStr.split(":").map(function (str) { + var value; + var parsed = parseInt(str, 10); + if (!Number.isNaN(parsed)) value = parsed; + return value; + }), + _timeStr$split$map2 = _slicedToArray(_timeStr$split$map, 2), + hours = _timeStr$split$map2[0], + mins = _timeStr$split$map2[1]; + + if (hours != null && mins != null) { + minutes = hours * 60 + mins; + } + } + + return minutes; +}; +/** + * Enhance an input with the date picker elements + * + * @param {HTMLElement} el The initial wrapping element of the date picker component + */ + + +var transformTimePicker = function transformTimePicker(el) { + var timePickerEl = el.closest(TIME_PICKER); + var initialInputEl = timePickerEl.querySelector("input"); + + if (!initialInputEl) { + throw new Error("".concat(TIME_PICKER, " is missing inner input")); + } + + var selectEl = document.createElement("select"); + ["id", "name", "required", "aria-label", "aria-labelledby"].forEach(function (name) { + if (initialInputEl.hasAttribute(name)) { + var value = initialInputEl.getAttribute(name); + selectEl.setAttribute(name, value); + initialInputEl.removeAttribute(name); + } + }); + + var padZeros = function padZeros(value, length) { + return "0000".concat(value).slice(-length); + }; + + var getTimeContext = function getTimeContext(minutes) { + var minute = minutes % 60; + var hour24 = Math.floor(minutes / 60); + var hour12 = hour24 % 12 || 12; + var ampm = hour24 < 12 ? "am" : "pm"; + return { + minute: minute, + hour24: hour24, + hour12: hour12, + ampm: ampm + }; + }; + + var minTime = Math.max(MIN_TIME, parseTimeString(timePickerEl.dataset.minTime) || MIN_TIME); + var maxTime = Math.min(MAX_TIME, parseTimeString(timePickerEl.dataset.maxTime) || MAX_TIME); + var step = Math.floor(Math.max(MIN_STEP, timePickerEl.dataset.step || DEFAULT_STEP)); + + for (var time = minTime; time <= maxTime; time += step) { + var _getTimeContext = getTimeContext(time), + minute = _getTimeContext.minute, + hour24 = _getTimeContext.hour24, + hour12 = _getTimeContext.hour12, + ampm = _getTimeContext.ampm; + + var option = document.createElement("option"); + option.value = "".concat(padZeros(hour24, 2), ":").concat(padZeros(minute, 2)); + option.text = "".concat(hour12, ":").concat(padZeros(minute, 2)).concat(ampm); + selectEl.appendChild(option); + } + + timePickerEl.classList.add(COMBO_BOX_CLASS); // combo box properties + + Object.keys(FILTER_DATASET).forEach(function (key) { + timePickerEl.dataset[key] = FILTER_DATASET[key]; + }); + timePickerEl.dataset.disableFiltering = "true"; + timePickerEl.appendChild(selectEl); + initialInputEl.style.display = "none"; +}; + +var timePicker = behavior({}, { + init: function init(root) { + select(TIME_PICKER, root).forEach(function (timePickerEl) { + transformTimePicker(timePickerEl); + enhanceComboBox(timePickerEl); + }); + }, + FILTER_DATASET: FILTER_DATASET +}); +module.exports = timePicker; + +},{"../config":35,"../utils/behavior":44,"../utils/select":49,"./combo-box":19}],33:[function(require,module,exports){ +"use strict"; + +// Tooltips +var select = require("../utils/select"); + +var behavior = require("../utils/behavior"); + +var _require = require("../config"), + PREFIX = _require.prefix; + +var isElementInViewport = require("../utils/is-in-viewport"); + +var TOOLTIP = ".".concat(PREFIX, "-tooltip"); +var TOOLTIP_TRIGGER_CLASS = "".concat(PREFIX, "-tooltip__trigger"); +var TOOLTIP_CLASS = "".concat(PREFIX, "-tooltip"); +var TOOLTIP_BODY_CLASS = "".concat(PREFIX, "-tooltip__body"); +var SET_CLASS = "is-set"; +var VISIBLE_CLASS = "is-visible"; +var TRIANGLE_SIZE = 5; +var ADJUST_WIDTH_CLASS = "".concat(PREFIX, "-tooltip__body--wrap"); +/** + * Add one or more listeners to an element + * @param {DOMElement} element - DOM element to add listeners to + * @param {events} eventNames - space separated list of event names, e.g. 'click change' + * @param {Function} listener - function to attach for each event as a listener + */ + +var addListenerMulti = function addListenerMulti(element, eventNames, listener) { + var events = eventNames.split(" "); + + for (var i = 0, iLen = events.length; i < iLen; i += 1) { + element.addEventListener(events[i], listener, false); + } +}; +/** + * Shows the tooltip + * @param {HTMLElement} tooltipTrigger - the element that initializes the tooltip + */ + + +var showToolTip = function showToolTip(tooltipBody, tooltipTrigger, position) { + tooltipBody.setAttribute("aria-hidden", "false"); // This sets up the tooltip body. The opacity is 0, but + // we can begin running the calculations below. + + tooltipBody.classList.add(SET_CLASS); + /** + * Position the tooltip body when the trigger is hovered + * Removes old positioning classnames and reapplies. This allows + * positioning to change in case the user resizes browser or DOM manipulation + * causes tooltip to get clipped from viewport + * + * @param {string} setPos - can be "top", "bottom", "right", "left" + */ + + var setPositionClass = function setPositionClass(setPos) { + tooltipBody.classList.remove("".concat(TOOLTIP_BODY_CLASS, "--top")); + tooltipBody.classList.remove("".concat(TOOLTIP_BODY_CLASS, "--bottom")); + tooltipBody.classList.remove("".concat(TOOLTIP_BODY_CLASS, "--right")); + tooltipBody.classList.remove("".concat(TOOLTIP_BODY_CLASS, "--left")); + tooltipBody.classList.add("".concat(TOOLTIP_BODY_CLASS, "--").concat(setPos)); + }; + /** + * Removes old positioning styles. This allows + * re-positioning to change without inheriting other + * dynamic styles + * + * @param {HTMLElement} e - this is the tooltip body + */ + + + var resetPositionStyles = function resetPositionStyles(e) { + // we don't override anything in the stylesheet when finding alt positions + e.style.top = null; + e.style.bottom = null; + e.style.right = null; + e.style.left = null; + e.style.margin = null; + }; + /** + * get margin offset calculations + * + * @param {HTMLElement} target - this is the tooltip body + * @param {String} propertyValue - this is the tooltip body + */ + + + var offsetMargin = function offsetMargin(target, propertyValue) { + return parseInt(window.getComputedStyle(target).getPropertyValue(propertyValue), 10); + }; // offsetLeft = the left position, and margin of the element, the left + // padding, scrollbar and border of the offsetParent element + // offsetWidth = The offsetWidth property returns the viewable width of an + // element in pixels, including padding, border and scrollbar, but not + // the margin. + + /** + * Calculate margin offset + * tooltip trigger margin(position) offset + tooltipBody offsetWidth + * @param {String} marginPosition + * @param {Number} tooltipBodyOffset + * @param {HTMLElement} trigger + */ + + + var calculateMarginOffset = function calculateMarginOffset(marginPosition, tooltipBodyOffset, trigger) { + var offset = offsetMargin(trigger, "margin-".concat(marginPosition)) > 0 ? tooltipBodyOffset - offsetMargin(trigger, "margin-".concat(marginPosition)) : tooltipBodyOffset; + return offset; + }; + /** + * Positions tooltip at the top + * @param {HTMLElement} e - this is the tooltip body + */ + + + var positionTop = function positionTop(e) { + resetPositionStyles(e); // ensures we start from the same point + // get details on the elements object with + + var topMargin = calculateMarginOffset("top", e.offsetHeight, tooltipTrigger); + var leftMargin = calculateMarginOffset("left", e.offsetWidth, tooltipTrigger); + setPositionClass("top"); + e.style.left = "50%"; // center the element + + e.style.top = "-".concat(TRIANGLE_SIZE, "px"); // consider the psuedo element + // apply our margins based on the offest + + e.style.margin = "-".concat(topMargin, "px 0 0 -").concat(leftMargin / 2, "px"); + }; + /** + * Positions tooltip at the bottom + * @param {HTMLElement} e - this is the tooltip body + */ + + + var positionBottom = function positionBottom(e) { + resetPositionStyles(e); + var leftMargin = calculateMarginOffset("left", e.offsetWidth, tooltipTrigger); + setPositionClass("bottom"); + e.style.left = "50%"; + e.style.margin = "".concat(TRIANGLE_SIZE, "px 0 0 -").concat(leftMargin / 2, "px"); + }; + /** + * Positions tooltip at the right + * @param {HTMLElement} e - this is the tooltip body + */ + + + var positionRight = function positionRight(e) { + resetPositionStyles(e); + var topMargin = calculateMarginOffset("top", e.offsetHeight, tooltipTrigger); + setPositionClass("right"); + e.style.top = "50%"; + e.style.left = "".concat(tooltipTrigger.offsetLeft + tooltipTrigger.offsetWidth + TRIANGLE_SIZE, "px"); + e.style.margin = "-".concat(topMargin / 2, "px 0 0 0"); + }; + /** + * Positions tooltip at the right + * @param {HTMLElement} e - this is the tooltip body + */ + + + var positionLeft = function positionLeft(e) { + resetPositionStyles(e); + var topMargin = calculateMarginOffset("top", e.offsetHeight, tooltipTrigger); // we have to check for some utility margins + + var leftMargin = calculateMarginOffset("left", tooltipTrigger.offsetLeft > e.offsetWidth ? tooltipTrigger.offsetLeft - e.offsetWidth : e.offsetWidth, tooltipTrigger); + setPositionClass("left"); + e.style.top = "50%"; + e.style.left = "-".concat(TRIANGLE_SIZE, "px"); + e.style.margin = "-".concat(topMargin / 2, "px 0 0 ").concat(tooltipTrigger.offsetLeft > e.offsetWidth ? leftMargin : -leftMargin, "px"); // adjust the margin + }; + /** + * We try to set the position based on the + * original intention, but make adjustments + * if the element is clipped out of the viewport + * we constrain the width only as a last resort + * @param {HTMLElement} element(alias tooltipBody) + * @param {Number} attempt (--flag) + */ + + + var maxAttempts = 2; + + function findBestPosition(element) { + var attempt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + // create array of optional positions + var positions = [positionTop, positionBottom, positionRight, positionLeft]; + var hasVisiblePosition = false; // we take a recursive approach + + function tryPositions(i) { + if (i < positions.length) { + var pos = positions[i]; + pos(element); + + if (!isElementInViewport(element)) { + // eslint-disable-next-line no-param-reassign + tryPositions(i += 1); + } else { + hasVisiblePosition = true; + } + } + } + + tryPositions(0); // if we can't find a position we compress it and try again + + if (!hasVisiblePosition) { + element.classList.add(ADJUST_WIDTH_CLASS); + + if (attempt <= maxAttempts) { + // eslint-disable-next-line no-param-reassign + findBestPosition(element, attempt += 1); + } + } + } + + switch (position) { + case "top": + positionTop(tooltipBody); + + if (!isElementInViewport(tooltipBody)) { + findBestPosition(tooltipBody); + } + + break; + + case "bottom": + positionBottom(tooltipBody); + + if (!isElementInViewport(tooltipBody)) { + findBestPosition(tooltipBody); + } + + break; + + case "right": + positionRight(tooltipBody); + + if (!isElementInViewport(tooltipBody)) { + findBestPosition(tooltipBody); + } + + break; + + case "left": + positionLeft(tooltipBody); + + if (!isElementInViewport(tooltipBody)) { + findBestPosition(tooltipBody); + } + + break; + + default: + // skip default case + break; + } + /** + * Actually show the tooltip. The VISIBLE_CLASS + * will change the opacity to 1 + */ + + + setTimeout(function () { + tooltipBody.classList.add(VISIBLE_CLASS); + }, 20); +}; +/** + * Removes all the properties to show and position the tooltip, + * and resets the tooltip position to the original intention + * in case the window is resized or the element is moved through + * DOM maniulation. + * @param {HTMLElement} tooltipBody - The body of the tooltip + */ + + +var hideToolTip = function hideToolTip(tooltipBody) { + tooltipBody.classList.remove(VISIBLE_CLASS); + tooltipBody.classList.remove(SET_CLASS); + tooltipBody.classList.remove(ADJUST_WIDTH_CLASS); + tooltipBody.setAttribute("aria-hidden", "true"); +}; +/** + * Setup the tooltip component + * @param {HTMLElement} tooltipTrigger The element that creates the tooltip + */ + + +var setUpAttributes = function setUpAttributes(tooltipTrigger) { + var tooltipID = "tooltip-".concat(Math.floor(Math.random() * 900000) + 100000); + var tooltipContent = tooltipTrigger.getAttribute("title"); + var wrapper = document.createElement("span"); + var tooltipBody = document.createElement("span"); + var position = tooltipTrigger.getAttribute("data-position") ? tooltipTrigger.getAttribute("data-position") : "top"; + var additionalClasses = tooltipTrigger.getAttribute("data-classes"); // Set up tooltip attributes + + tooltipTrigger.setAttribute("aria-describedby", tooltipID); + tooltipTrigger.setAttribute("tabindex", "0"); + tooltipTrigger.setAttribute("title", ""); + tooltipTrigger.classList.remove(TOOLTIP_CLASS); + tooltipTrigger.classList.add(TOOLTIP_TRIGGER_CLASS); // insert wrapper before el in the DOM tree + + tooltipTrigger.parentNode.insertBefore(wrapper, tooltipTrigger); // set up the wrapper + + wrapper.appendChild(tooltipTrigger); + wrapper.classList.add(TOOLTIP_CLASS); + wrapper.appendChild(tooltipBody); // Apply additional class names to wrapper element + + if (additionalClasses) { + var classesArray = additionalClasses.split(" "); + classesArray.forEach(function (classname) { + return wrapper.classList.add(classname); + }); + } // set up the tooltip body + + + tooltipBody.classList.add(TOOLTIP_BODY_CLASS); + tooltipBody.setAttribute("id", tooltipID); + tooltipBody.setAttribute("role", "tooltip"); + tooltipBody.setAttribute("aria-hidden", "true"); // place the text in the tooltip + + tooltipBody.innerHTML = tooltipContent; + return { + tooltipBody: tooltipBody, + position: position, + tooltipContent: tooltipContent, + wrapper: wrapper + }; +}; // Setup our function to run on various events + + +var tooltip = behavior({}, { + init: function init(root) { + select(TOOLTIP, root).forEach(function (tooltipTrigger) { + var _setUpAttributes = setUpAttributes(tooltipTrigger), + tooltipBody = _setUpAttributes.tooltipBody, + position = _setUpAttributes.position, + tooltipContent = _setUpAttributes.tooltipContent, + wrapper = _setUpAttributes.wrapper; + + if (tooltipContent) { + // Listeners for showing and hiding the tooltip + addListenerMulti(tooltipTrigger, "mouseenter focus", function () { + showToolTip(tooltipBody, tooltipTrigger, position, wrapper); + return false; + }); // Keydown here prevents tooltips from being read twice by + // screen reader. also allows excape key to close it + // (along with any other.) + + addListenerMulti(tooltipTrigger, "mouseleave blur keydown", function () { + hideToolTip(tooltipBody); + return false; + }); + } else {// throw error or let other tooltips on page function? + } + }); + } +}); +module.exports = tooltip; + +},{"../config":35,"../utils/behavior":44,"../utils/is-in-viewport":46,"../utils/select":49}],34:[function(require,module,exports){ +"use strict"; + +var behavior = require("../utils/behavior"); + +var validate = require("../utils/validate-input"); + +function change() { + validate(this); +} + +var validator = behavior({ + "keyup change": { + "input[data-validation-element]": change + } +}); +module.exports = validator; + +},{"../utils/behavior":44,"../utils/validate-input":53}],35:[function(require,module,exports){ +"use strict"; + +module.exports = { + prefix: "usa" +}; + +},{}],36:[function(require,module,exports){ +"use strict"; + +module.exports = { + // This used to be conditionally dependent on whether the + // browser supported touch events; if it did, `CLICK` was set to + // `touchstart`. However, this had downsides: + // + // * It pre-empted mobile browsers' default behavior of detecting + // whether a touch turned into a scroll, thereby preventing + // users from using some of our components as scroll surfaces. + // + // * Some devices, such as the Microsoft Surface Pro, support *both* + // touch and clicks. This meant the conditional effectively dropped + // support for the user's mouse, frustrating users who preferred + // it on those systems. + CLICK: "click" +}; + +},{}],37:[function(require,module,exports){ +"use strict"; + +/* eslint-disable consistent-return */ + +/* eslint-disable func-names */ +(function () { + if (typeof window.CustomEvent === "function") return false; + + function CustomEvent(event, _params) { + var params = _params || { + bubbles: false, + cancelable: false, + detail: null + }; + var evt = document.createEvent("CustomEvent"); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + return evt; + } + + window.CustomEvent = CustomEvent; +})(); + +},{}],38:[function(require,module,exports){ +"use strict"; + +var elproto = window.HTMLElement.prototype; +var HIDDEN = "hidden"; + +if (!(HIDDEN in elproto)) { + Object.defineProperty(elproto, HIDDEN, { + get: function get() { + return this.hasAttribute(HIDDEN); + }, + set: function set(value) { + if (value) { + this.setAttribute(HIDDEN, ""); + } else { + this.removeAttribute(HIDDEN); + } + } + }); +} + +},{}],39:[function(require,module,exports){ +"use strict"; + +// polyfills HTMLElement.prototype.classList and DOMTokenList +require("classlist-polyfill"); // polyfills HTMLElement.prototype.hidden + + +require("./element-hidden"); // polyfills Number.isNaN() + + +require("./number-is-nan"); // polyfills CustomEvent + + +require("./custom-event"); // polyfills svg4everybody + + +require("./svg4everybody"); + +},{"./custom-event":37,"./element-hidden":38,"./number-is-nan":40,"./svg4everybody":41,"classlist-polyfill":1}],40:[function(require,module,exports){ +"use strict"; + +Number.isNaN = Number.isNaN || function isNaN(input) { + // eslint-disable-next-line no-self-compare + return typeof input === "number" && input !== input; +}; + +},{}],41:[function(require,module,exports){ +"use strict"; + +/* eslint-disable */ +!function (factory) { + module.exports = factory(); +}(function () { + /*! svg4everybody v2.1.9 | github.com/jonathantneal/svg4everybody */ + function embed(parent, svg, target, use) { + // if the target exists + if (target) { + // create a document fragment to hold the contents of the target + var fragment = document.createDocumentFragment(), + viewBox = !svg.hasAttribute("viewBox") && target.getAttribute("viewBox"); // conditionally set the viewBox on the svg + + viewBox && svg.setAttribute("viewBox", viewBox); // copy the contents of the clone into the fragment + + for ( // clone the target + var clone = document.importNode ? document.importNode(target, !0) : target.cloneNode(!0), g = document.createElementNS(svg.namespaceURI || "http://www.w3.org/2000/svg", "g"); clone.childNodes.length;) { + g.appendChild(clone.firstChild); + } + + if (use) { + for (var i = 0; use.attributes.length > i; i++) { + var attr = use.attributes[i]; + "xlink:href" !== attr.name && "href" !== attr.name && g.setAttribute(attr.name, attr.value); + } + } + + fragment.appendChild(g), // append the fragment into the svg + parent.appendChild(fragment); + } + } + + function loadreadystatechange(xhr, use) { + // listen to changes in the request + xhr.onreadystatechange = function () { + // if the request is ready + if (4 === xhr.readyState) { + // get the cached html document + var cachedDocument = xhr._cachedDocument; // ensure the cached html document based on the xhr response + + cachedDocument || (cachedDocument = xhr._cachedDocument = document.implementation.createHTMLDocument(""), cachedDocument.body.innerHTML = xhr.responseText, // ensure domains are the same, otherwise we'll have issues appending the + // element in IE 11 + cachedDocument.domain !== document.domain && (cachedDocument.domain = document.domain), xhr._cachedTarget = {}), // clear the xhr embeds list and embed each item + xhr._embeds.splice(0).map(function (item) { + // get the cached target + var target = xhr._cachedTarget[item.id]; // ensure the cached target + + target || (target = xhr._cachedTarget[item.id] = cachedDocument.getElementById(item.id)), // embed the target into the svg + embed(item.parent, item.svg, target, use); + }); + } + }, // test the ready state change immediately + xhr.onreadystatechange(); + } + + function svg4everybody(rawopts) { + function oninterval() { + // if all s in the array are being bypassed, don't proceed. + if (numberOfSvgUseElementsToBypass && uses.length - numberOfSvgUseElementsToBypass <= 0) { + return void requestAnimationFrame(oninterval, 67); + } // if there are s to process, proceed. + // reset the bypass counter, since the counter will be incremented for every bypassed element, + // even ones that were counted before. + + + numberOfSvgUseElementsToBypass = 0; // while the index exists in the live collection + + for ( // get the cached index + var index = 0; index < uses.length;) { + // get the current + var use = uses[index], + parent = use.parentNode, + svg = getSVGAncestor(parent), + src = use.getAttribute("xlink:href") || use.getAttribute("href"); + + if (!src && opts.attributeName && (src = use.getAttribute(opts.attributeName)), svg && src) { + if (polyfill) { + if (!opts.validate || opts.validate(src, svg, use)) { + // remove the element + parent.removeChild(use); // parse the src and get the url and id + + var srcSplit = src.split("#"), + url = srcSplit.shift(), + id = srcSplit.join("#"); // if the link is external + + if (url.length) { + // get the cached xhr request + var xhr = requests[url]; // ensure the xhr request exists + + xhr || (xhr = requests[url] = new XMLHttpRequest(), xhr.open("GET", url), xhr.send(), xhr._embeds = []), // add the svg and id as an item to the xhr embeds list + xhr._embeds.push({ + parent: parent, + svg: svg, + id: id + }), // prepare the xhr ready state change event + loadreadystatechange(xhr, use); + } else { + // embed the local id into the svg + embed(parent, svg, document.getElementById(id), use); + } + } else { + // increase the index when the previous value was not "valid" + ++index, ++numberOfSvgUseElementsToBypass; + } + } + } else { + // increase the index when the previous value was not "valid" + ++index; + } + } // continue the interval + + + requestAnimationFrame(oninterval, 67); + } + + var polyfill, + opts = Object(rawopts), + newerIEUA = /\bTrident\/[567]\b|\bMSIE (?:9|10)\.0\b/, + webkitUA = /\bAppleWebKit\/(\d+)\b/, + olderEdgeUA = /\bEdge\/12\.(\d+)\b/, + edgeUA = /\bEdge\/.(\d+)\b/, + inIframe = window.top !== window.self; + polyfill = "polyfill" in opts ? opts.polyfill : newerIEUA.test(navigator.userAgent) || (navigator.userAgent.match(olderEdgeUA) || [])[1] < 10547 || (navigator.userAgent.match(webkitUA) || [])[1] < 537 || edgeUA.test(navigator.userAgent) && inIframe; // create xhr requests object + + var requests = {}, + requestAnimationFrame = window.requestAnimationFrame || setTimeout, + uses = document.getElementsByTagName("use"), + numberOfSvgUseElementsToBypass = 0; // conditionally start the interval if the polyfill is active + + polyfill && oninterval(); + } + + function getSVGAncestor(node) { + for (var svg = node; "svg" !== svg.nodeName.toLowerCase() && (svg = svg.parentNode);) {} + + return svg; + } + + return svg4everybody; +}); + +},{}],42:[function(require,module,exports){ +"use strict"; + +var domready = require("domready"); + +window.uswdsPresent = true; // GLOBAL variable to indicate that the uswds.js has loaded in the DOM. + +/** + * The 'polyfills' define key ECMAScript 5 methods that may be missing from + * older browsers, so must be loaded first. + */ + +require("./polyfills"); + +var uswds = require("./config"); + +var components = require("./components"); + +var svg4everybody = require("./polyfills/svg4everybody"); + +uswds.components = components; +domready(function () { + var target = document.body; + Object.keys(components).forEach(function (key) { + var behavior = components[key]; + behavior.on(target); + }); + svg4everybody(); +}); +module.exports = uswds; + +},{"./components":24,"./config":35,"./polyfills":39,"./polyfills/svg4everybody":41,"domready":2}],43:[function(require,module,exports){ +"use strict"; + +module.exports = function () { + var htmlDocument = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document; + return htmlDocument.activeElement; +}; + +},{}],44:[function(require,module,exports){ +"use strict"; + +var assign = require("object-assign"); + +var Behavior = require("receptor/behavior"); +/** + * @name sequence + * @param {...Function} seq an array of functions + * @return { closure } callHooks + */ +// We use a named function here because we want it to inherit its lexical scope +// from the behavior props object, not from the module + + +var sequence = function sequence() { + for (var _len = arguments.length, seq = new Array(_len), _key = 0; _key < _len; _key++) { + seq[_key] = arguments[_key]; + } + + return function callHooks() { + var _this = this; + + var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.body; + seq.forEach(function (method) { + if (typeof _this[method] === "function") { + _this[method].call(_this, target); + } + }); + }; +}; +/** + * @name behavior + * @param {object} events + * @param {object?} props + * @return {receptor.behavior} + */ + + +module.exports = function (events, props) { + return Behavior(events, assign({ + on: sequence("init", "add"), + off: sequence("teardown", "remove") + }, props)); +}; + +},{"object-assign":6,"receptor/behavior":7}],45:[function(require,module,exports){ +"use strict"; + +var assign = require("object-assign"); + +var _require = require("receptor"), + keymap = _require.keymap; + +var behavior = require("./behavior"); + +var select = require("./select"); + +var activeElement = require("./active-element"); + +var FOCUSABLE = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex="0"], [contenteditable]'; + +var tabHandler = function tabHandler(context) { + var focusableElements = select(FOCUSABLE, context); + var firstTabStop = focusableElements[0]; + var lastTabStop = focusableElements[focusableElements.length - 1]; // Special rules for when the user is tabbing forward from the last focusable element, + // or when tabbing backwards from the first focusable element + + function tabAhead(event) { + if (activeElement() === lastTabStop) { + event.preventDefault(); + firstTabStop.focus(); + } + } + + function tabBack(event) { + if (activeElement() === firstTabStop) { + event.preventDefault(); + lastTabStop.focus(); + } // This checks if you want to set the initial focus to a container + // instead of an element within, and the user tabs back. + // Then we set the focus to the first + else if (!focusableElements.includes(activeElement())) { + event.preventDefault(); + firstTabStop.focus(); + } + } + + return { + firstTabStop: firstTabStop, + lastTabStop: lastTabStop, + tabAhead: tabAhead, + tabBack: tabBack + }; +}; + +module.exports = function (context) { + var additionalKeyBindings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var tabEventHandler = tabHandler(context); + var bindings = additionalKeyBindings; + var Esc = bindings.Esc, + Escape = bindings.Escape; + if (Escape && !Esc) bindings.Esc = Escape; // TODO: In the future, loop over additional keybindings and pass an array + // of functions, if necessary, to the map keys. Then people implementing + // the focus trap could pass callbacks to fire when tabbing + + var keyMappings = keymap(assign({ + Tab: tabEventHandler.tabAhead, + "Shift+Tab": tabEventHandler.tabBack + }, additionalKeyBindings)); + var focusTrap = behavior({ + keydown: keyMappings + }, { + init: function init() { + // TODO: is this desireable behavior? Should the trap always do this by default or should + // the component getting decorated handle this? + if (tabEventHandler.firstTabStop) { + tabEventHandler.firstTabStop.focus(); + } + }, + update: function update(isActive) { + if (isActive) { + this.on(); + } else { + this.off(); + } + } + }); + return focusTrap; +}; + +},{"./active-element":43,"./behavior":44,"./select":49,"object-assign":6,"receptor":12}],46:[function(require,module,exports){ +"use strict"; + +// https://stackoverflow.com/a/7557433 +function isElementInViewport(el) { + var win = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window; + var docEl = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document.documentElement; + var rect = el.getBoundingClientRect(); + return rect.top >= 0 && rect.left >= 0 && rect.bottom <= (win.innerHeight || docEl.clientHeight) && rect.right <= (win.innerWidth || docEl.clientWidth); +} + +module.exports = isElementInViewport; + +},{}],47:[function(require,module,exports){ +"use strict"; + +// iOS detection from: http://stackoverflow.com/a/9039885/177710 +function isIosDevice() { + return typeof navigator !== "undefined" && (navigator.userAgent.match(/(iPod|iPhone|iPad)/g) || navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1) && !window.MSStream; +} + +module.exports = isIosDevice; + +},{}],48:[function(require,module,exports){ +"use strict"; + +module.exports = function getScrollbarWidth() { + // Creating invisible container + var outer = document.createElement('div'); + outer.style.visibility = 'hidden'; + outer.style.overflow = 'scroll'; // forcing scrollbar to appear + + outer.style.msOverflowStyle = 'scrollbar'; // needed for WinJS apps + + document.body.appendChild(outer); // Creating inner element and placing it in the container + + var inner = document.createElement('div'); + outer.appendChild(inner); // Calculating difference between container's full width and the child width + + var scrollbarWidth = "".concat(outer.offsetWidth - inner.offsetWidth, "px"); // Removing temporary elements from the DOM + + outer.parentNode.removeChild(outer); + return scrollbarWidth; +}; + +},{}],49:[function(require,module,exports){ +"use strict"; + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +/** + * @name isElement + * @desc returns whether or not the given argument is a DOM element. + * @param {any} value + * @return {boolean} + */ +var isElement = function isElement(value) { + return value && _typeof(value) === "object" && value.nodeType === 1; +}; +/** + * @name select + * @desc selects elements from the DOM by class selector or ID selector. + * @param {string} selector - The selector to traverse the DOM with. + * @param {Document|HTMLElement?} context - The context to traverse the DOM + * in. If not provided, it defaults to the document. + * @return {HTMLElement[]} - An array of DOM nodes or an empty array. + */ + + +module.exports = function (selector, context) { + if (typeof selector !== "string") { + return []; + } + + if (!context || !isElement(context)) { + context = window.document; // eslint-disable-line no-param-reassign + } + + var selection = context.querySelectorAll(selector); + return Array.prototype.slice.call(selection); +}; + +},{}],50:[function(require,module,exports){ +"use strict"; + +/** + * Flips given INPUT elements between masked (hiding the field value) and unmasked + * @param {Array.HTMLElement} fields - An array of INPUT elements + * @param {Boolean} mask - Whether the mask should be applied, hiding the field value + */ +module.exports = function (field, mask) { + field.setAttribute("autocapitalize", "off"); + field.setAttribute("autocorrect", "off"); + field.setAttribute("type", mask ? "password" : "text"); +}; + +},{}],51:[function(require,module,exports){ +"use strict"; + +var resolveIdRefs = require("resolve-id-refs"); + +var toggleFieldMask = require("./toggle-field-mask"); + +var CONTROLS = "aria-controls"; +var PRESSED = "aria-pressed"; +var SHOW_ATTR = "data-show-text"; +var HIDE_ATTR = "data-hide-text"; +/** + * Replace the word "Show" (or "show") with "Hide" (or "hide") in a string. + * @param {string} showText + * @return {strong} hideText + */ + +var getHideText = function getHideText(showText) { + return showText.replace(/\bShow\b/i, function (show) { + return "".concat(show[0] === "S" ? "H" : "h", "ide"); + }); +}; +/** + * Component that decorates an HTML element with the ability to toggle the + * masked state of an input field (like a password) when clicked. + * The ids of the fields to be masked will be pulled directly from the button's + * `aria-controls` attribute. + * + * @param {HTMLElement} el Parent element containing the fields to be masked + * @return {boolean} + */ + + +module.exports = function (el) { + // this is the *target* state: + // * if the element has the attr and it's !== "true", pressed is true + // * otherwise, pressed is false + var pressed = el.hasAttribute(PRESSED) && el.getAttribute(PRESSED) !== "true"; + var fields = resolveIdRefs(el.getAttribute(CONTROLS)); + fields.forEach(function (field) { + return toggleFieldMask(field, pressed); + }); + + if (!el.hasAttribute(SHOW_ATTR)) { + el.setAttribute(SHOW_ATTR, el.textContent); + } + + var showText = el.getAttribute(SHOW_ATTR); + var hideText = el.getAttribute(HIDE_ATTR) || getHideText(showText); + el.textContent = pressed ? showText : hideText; // eslint-disable-line no-param-reassign + + el.setAttribute(PRESSED, pressed); + return pressed; +}; + +},{"./toggle-field-mask":50,"resolve-id-refs":15}],52:[function(require,module,exports){ +"use strict"; + +var EXPANDED = "aria-expanded"; +var CONTROLS = "aria-controls"; +var HIDDEN = "hidden"; + +module.exports = function (button, expanded) { + var safeExpanded = expanded; + + if (typeof safeExpanded !== "boolean") { + safeExpanded = button.getAttribute(EXPANDED) === "false"; + } + + button.setAttribute(EXPANDED, safeExpanded); + var id = button.getAttribute(CONTROLS); + var controls = document.getElementById(id); + + if (!controls) { + throw new Error("No toggle target found with id: \"".concat(id, "\"")); + } + + if (safeExpanded) { + controls.removeAttribute(HIDDEN); + } else { + controls.setAttribute(HIDDEN, ""); + } + + return safeExpanded; +}; + +},{}],53:[function(require,module,exports){ +"use strict"; + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +var dataset = require("elem-dataset"); + +var _require = require("../config"), + PREFIX = _require.prefix; + +var CHECKED = "aria-checked"; +var CHECKED_CLASS = "".concat(PREFIX, "-checklist__item--checked"); + +module.exports = function validate(el) { + var data = dataset(el); + var id = data.validationElement; + var checkList = id.charAt(0) === "#" ? document.querySelector(id) : document.getElementById(id); + + if (!checkList) { + throw new Error("No validation element found with id: \"".concat(id, "\"")); + } + + Object.entries(data).forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + if (key.startsWith("validate")) { + var validatorName = key.substr("validate".length).toLowerCase(); + var validatorPattern = new RegExp(value); + var validatorSelector = "[data-validator=\"".concat(validatorName, "\"]"); + var validatorCheckbox = checkList.querySelector(validatorSelector); + + if (!validatorCheckbox) { + throw new Error("No validator checkbox found for: \"".concat(validatorName, "\"")); + } + + var checked = validatorPattern.test(el.value); + validatorCheckbox.classList.toggle(CHECKED_CLASS, checked); + validatorCheckbox.setAttribute(CHECKED, checked); + } + }); +}; + +},{"../config":35,"elem-dataset":3}]},{},[42]) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvY2xhc3NsaXN0LXBvbHlmaWxsL3NyYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9kb21yZWFkeS9yZWFkeS5qcyIsIm5vZGVfbW9kdWxlcy9lbGVtLWRhdGFzZXQvZGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9lbGVtZW50LWNsb3Nlc3QvZWxlbWVudC1jbG9zZXN0LmpzIiwibm9kZV9tb2R1bGVzL2tleWJvYXJkZXZlbnQta2V5LXBvbHlmaWxsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVjZXB0b3IvYmVoYXZpb3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVjZXB0b3IvY29tcG9zZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWNlcHRvci9kZWxlZ2F0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWNlcHRvci9kZWxlZ2F0ZUFsbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWNlcHRvci9pZ25vcmUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVjZXB0b3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVjZXB0b3Iva2V5bWFwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlY2VwdG9yL29uY2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVzb2x2ZS1pZC1yZWZzL2luZGV4LmpzIiwic3JjL2pzL2NvbXBvbmVudHMvYWNjb3JkaW9uLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvYmFubmVyLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvY2hhcmFjdGVyLWNvdW50LmpzIiwic3JjL2pzL2NvbXBvbmVudHMvY29tYm8tYm94LmpzIiwic3JjL2pzL2NvbXBvbmVudHMvZGF0ZS1waWNrZXIuanMiLCJzcmMvanMvY29tcG9uZW50cy9kYXRlLXJhbmdlLXBpY2tlci5qcyIsInNyYy9qcy9jb21wb25lbnRzL2ZpbGUtaW5wdXQuanMiLCJzcmMvanMvY29tcG9uZW50cy9mb290ZXIuanMiLCJzcmMvanMvY29tcG9uZW50cy9pbmRleC5qcyIsInNyYy9qcy9jb21wb25lbnRzL2lucHV0LXByZWZpeC1zdWZmaXguanMiLCJzcmMvanMvY29tcG9uZW50cy9tb2RhbC5qcyIsInNyYy9qcy9jb21wb25lbnRzL25hdmlnYXRpb24uanMiLCJzcmMvanMvY29tcG9uZW50cy9wYXNzd29yZC5qcyIsInNyYy9qcy9jb21wb25lbnRzL3NlYXJjaC5qcyIsInNyYy9qcy9jb21wb25lbnRzL3NraXBuYXYuanMiLCJzcmMvanMvY29tcG9uZW50cy90YWJsZS5qcyIsInNyYy9qcy9jb21wb25lbnRzL3RpbWUtcGlja2VyLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvdG9vbHRpcC5qcyIsInNyYy9qcy9jb21wb25lbnRzL3ZhbGlkYXRvci5qcyIsInNyYy9qcy9jb25maWcuanMiLCJzcmMvanMvZXZlbnRzLmpzIiwic3JjL2pzL3BvbHlmaWxscy9jdXN0b20tZXZlbnQuanMiLCJzcmMvanMvcG9seWZpbGxzL2VsZW1lbnQtaGlkZGVuLmpzIiwic3JjL2pzL3BvbHlmaWxscy9pbmRleC5qcyIsInNyYy9qcy9wb2x5ZmlsbHMvbnVtYmVyLWlzLW5hbi5qcyIsInNyYy9qcy9wb2x5ZmlsbHMvc3ZnNGV2ZXJ5Ym9keS5qcyIsInNyYy9qcy9zdGFydC5qcyIsInNyYy9qcy91dGlscy9hY3RpdmUtZWxlbWVudC5qcyIsInNyYy9qcy91dGlscy9iZWhhdmlvci5qcyIsInNyYy9qcy91dGlscy9mb2N1cy10cmFwLmpzIiwic3JjL2pzL3V0aWxzL2lzLWluLXZpZXdwb3J0LmpzIiwic3JjL2pzL3V0aWxzL2lzLWlvcy1kZXZpY2UuanMiLCJzcmMvanMvdXRpbHMvc2Nyb2xsYmFyLXdpZHRoLmpzIiwic3JjL2pzL3V0aWxzL3NlbGVjdC5qcyIsInNyYy9qcy91dGlscy90b2dnbGUtZmllbGQtbWFzay5qcyIsInNyYy9qcy91dGlscy90b2dnbGUtZm9ybS1pbnB1dC5qcyIsInNyYy9qcy91dGlscy90b2dnbGUuanMiLCJzcmMvanMvdXRpbHMvdmFsaWRhdGUtaW5wdXQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFFQSxJQUFJLGNBQWMsTUFBTSxDQUFDLElBQXpCLEVBQStCO0FBRS9CO0FBQ0E7QUFDQSxNQUFJLEVBQUUsZUFBZSxRQUFRLENBQUMsYUFBVCxDQUF1QixHQUF2QixDQUFqQixLQUNBLFFBQVEsQ0FBQyxlQUFULElBQTRCLEVBQUUsZUFBZSxRQUFRLENBQUMsZUFBVCxDQUF5Qiw0QkFBekIsRUFBc0QsR0FBdEQsQ0FBakIsQ0FEaEMsRUFDOEc7QUFFN0csZUFBVSxJQUFWLEVBQWdCO0FBRWpCOztBQUVBLFVBQUksRUFBRSxhQUFhLElBQWYsQ0FBSixFQUEwQjs7QUFFMUIsVUFDRyxhQUFhLEdBQUcsV0FEbkI7QUFBQSxVQUVHLFNBQVMsR0FBRyxXQUZmO0FBQUEsVUFHRyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQUwsQ0FBYSxTQUFiLENBSGxCO0FBQUEsVUFJRyxNQUFNLEdBQUcsTUFKWjtBQUFBLFVBS0csT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFELENBQU4sQ0FBa0IsSUFBbEIsSUFBMEIsWUFBWTtBQUNqRCxlQUFPLEtBQUssT0FBTCxDQUFhLFlBQWIsRUFBMkIsRUFBM0IsQ0FBUDtBQUNBLE9BUEY7QUFBQSxVQVFHLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBRCxDQUFMLENBQWlCLE9BQWpCLElBQTRCLFVBQVUsSUFBVixFQUFnQjtBQUMxRCxZQUNHLENBQUMsR0FBRyxDQURQO0FBQUEsWUFFRyxHQUFHLEdBQUcsS0FBSyxNQUZkOztBQUlBLGVBQU8sQ0FBQyxHQUFHLEdBQVgsRUFBZ0IsQ0FBQyxFQUFqQixFQUFxQjtBQUNwQixjQUFJLENBQUMsSUFBSSxJQUFMLElBQWEsS0FBSyxDQUFM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QU8sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFqQixDQUFzQixFQUFFLENBQUMsS0FBekIsQ0FBaEI7QUFDQSxNQUFBLGlCQUFpQixDQUFDLFNBQWxCLENBQTRCLE1BQTVCLENBQW1DLGFBQW5DLEVBQWtELE9BQWxEO0FBQ0EsTUFBQSxpQkFBaUIsQ0FBQyxZQUFsQixDQUErQixPQUEvQixFQUF3QyxPQUF4QztBQUNEO0FBQ0YsR0FmRDtBQWdCRCxDQTVCRCIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qXG4gKiBjbGFzc0xpc3QuanM6IENyb3NzLWJyb3dzZXIgZnVsbCBlbGVtZW50LmNsYXNzTGlzdCBpbXBsZW1lbnRhdGlvbi5cbiAqIDEuMS4yMDE3MDQyN1xuICpcbiAqIEJ5IEVsaSBHcmV5LCBodHRwOi8vZWxpZ3JleS5jb21cbiAqIExpY2Vuc2U6IERlZGljYXRlZCB0byB0aGUgcHVibGljIGRvbWFpbi5cbiAqICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbGlncmV5L2NsYXNzTGlzdC5qcy9ibG9iL21hc3Rlci9MSUNFTlNFLm1kXG4gKi9cblxuLypnbG9iYWwgc2VsZiwgZG9jdW1lbnQsIERPTUV4Y2VwdGlvbiAqL1xuXG4vKiEgQHNvdXJjZSBodHRwOi8vcHVybC5lbGlncmV5LmNvbS9naXRodWIvY2xhc3NMaXN0LmpzL2Jsb2IvbWFzdGVyL2NsYXNzTGlzdC5qcyAqL1xuXG5pZiAoXCJkb2N1bWVudFwiIGluIHdpbmRvdy5zZWxmKSB7XG5cbi8vIEZ1bGwgcG9seWZpbGwgZm9yIGJyb3dzZXJzIHdpdGggbm8gY2xhc3NMaXN0IHN1cHBvcnRcbi8vIEluY2x1ZGluZyBJRSA8IEVkZ2UgbWlzc2luZyBTVkdFbGVtZW50LmNsYXNzTGlzdFxuaWYgKCEoXCJjbGFzc0xpc3RcIiBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiX1wiKSkgXG5cdHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyAmJiAhKFwiY2xhc3NMaXN0XCIgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcImdcIikpKSB7XG5cbihmdW5jdGlvbiAodmlldykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuaWYgKCEoJ0VsZW1lbnQnIGluIHZpZXcpKSByZXR1cm47XG5cbnZhclxuXHQgIGNsYXNzTGlzdFByb3AgPSBcImNsYXNzTGlzdFwiXG5cdCwgcHJvdG9Qcm9wID0gXCJwcm90b3R5cGVcIlxuXHQsIGVsZW1DdHJQcm90byA9IHZpZXcuRWxlbWVudFtwcm90b1Byb3BdXG5cdCwgb2JqQ3RyID0gT2JqZWN0XG5cdCwgc3RyVHJpbSA9IFN0cmluZ1twcm90b1Byb3BdLnRyaW0gfHwgZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnJlcGxhY2UoL15cXHMrfFxccyskL2csIFwiXCIpO1xuXHR9XG5cdCwgYXJySW5kZXhPZiA9IEFycmF5W3Byb3RvUHJvcF0uaW5kZXhPZiB8fCBmdW5jdGlvbiAoaXRlbSkge1xuXHRcdHZhclxuXHRcdFx0ICBpID0gMFxuXHRcdFx0LCBsZW4gPSB0aGlzLmxlbmd0aFxuXHRcdDtcblx0XHRmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoaSBpbiB0aGlzICYmIHRoaXNbaV0gPT09IGl0ZW0pIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fVxuXHQvLyBWZW5kb3JzOiBwbGVhc2UgYWxsb3cgY29udGVudCBjb2RlIHRvIGluc3RhbnRpYXRlIERPTUV4Y2VwdGlvbnNcblx0LCBET01FeCA9IGZ1bmN0aW9uICh0eXBlLCBtZXNzYWdlKSB7XG5cdFx0dGhpcy5uYW1lID0gdHlwZTtcblx0XHR0aGlzLmNvZGUgPSBET01FeGNlcHRpb25bdHlwZV07XG5cdFx0dGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblx0fVxuXHQsIGNoZWNrVG9rZW5BbmRHZXRJbmRleCA9IGZ1bmN0aW9uIChjbGFzc0xpc3QsIHRva2VuKSB7XG5cdFx0aWYgKHRva2VuID09PSBcIlwiKSB7XG5cdFx0XHR0aHJvdyBuZXcgRE9NRXgoXG5cdFx0XHRcdCAgXCJTWU5UQVhfRVJSXCJcblx0XHRcdFx0LCBcIkFuIGludmFsaWQgb3IgaWxsZWdhbCBzdHJpbmcgd2FzIHNwZWNpZmllZFwiXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRpZiAoL1xccy8udGVzdCh0b2tlbikpIHtcblx0XHRcdHRocm93IG5ldyBET01FeChcblx0XHRcdFx0ICBcIklOVkFMSURfQ0hBUkFDVEVSX0VSUlwiXG5cdFx0XHRcdCwgXCJTdHJpbmcgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXJcIlxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFyckluZGV4T2YuY2FsbChjbGFzc0xpc3QsIHRva2VuKTtcblx0fVxuXHQsIENsYXNzTGlzdCA9IGZ1bmN0aW9uIChlbGVtKSB7XG5cdFx0dmFyXG5cdFx0XHQgIHRyaW1tZWRDbGFzc2VzID0gc3RyVHJpbS5jYWxsKGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIilcblx0XHRcdCwgY2xhc3NlcyA9IHRyaW1tZWRDbGFzc2VzID8gdHJpbW1lZENsYXNzZXMuc3BsaXQoL1xccysvKSA6IFtdXG5cdFx0XHQsIGkgPSAwXG5cdFx0XHQsIGxlbiA9IGNsYXNzZXMubGVuZ3RoXG5cdFx0O1xuXHRcdGZvciAoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdHRoaXMucHVzaChjbGFzc2VzW2ldKTtcblx0XHR9XG5cdFx0dGhpcy5fdXBkYXRlQ2xhc3NOYW1lID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLnRvU3RyaW5nKCkpO1xuXHRcdH07XG5cdH1cblx0LCBjbGFzc0xpc3RQcm90byA9IENsYXNzTGlzdFtwcm90b1Byb3BdID0gW11cblx0LCBjbGFzc0xpc3RHZXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIG5ldyBDbGFzc0xpc3QodGhpcyk7XG5cdH1cbjtcbi8vIE1vc3QgRE9NRXhjZXB0aW9uIGltcGxlbWVudGF0aW9ucyBkb24ndCBhbGxvdyBjYWxsaW5nIERPTUV4Y2VwdGlvbidzIHRvU3RyaW5nKClcbi8vIG9uIG5vbi1ET01FeGNlcHRpb25zLiBFcnJvcidzIHRvU3RyaW5nKCkgaXMgc3VmZmljaWVudCBoZXJlLlxuRE9NRXhbcHJvdG9Qcm9wXSA9IEVycm9yW3Byb3RvUHJvcF07XG5jbGFzc0xpc3RQcm90by5pdGVtID0gZnVuY3Rpb24gKGkpIHtcblx0cmV0dXJuIHRoaXNbaV0gfHwgbnVsbDtcbn07XG5jbGFzc0xpc3RQcm90by5jb250YWlucyA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHR0b2tlbiArPSBcIlwiO1xuXHRyZXR1cm4gY2hlY2tUb2tlbkFuZEdldEluZGV4KHRoaXMsIHRva2VuKSAhPT0gLTE7XG59O1xuY2xhc3NMaXN0UHJvdG8uYWRkID0gZnVuY3Rpb24gKCkge1xuXHR2YXJcblx0XHQgIHRva2VucyA9IGFyZ3VtZW50c1xuXHRcdCwgaSA9IDBcblx0XHQsIGwgPSB0b2tlbnMubGVuZ3RoXG5cdFx0LCB0b2tlblxuXHRcdCwgdXBkYXRlZCA9IGZhbHNlXG5cdDtcblx0ZG8ge1xuXHRcdHRva2VuID0gdG9rZW5zW2ldICsgXCJcIjtcblx0XHRpZiAoY2hlY2tUb2tlbkFuZEdldEluZGV4KHRoaXMsIHRva2VuKSA9PT0gLTEpIHtcblx0XHRcdHRoaXMucHVzaCh0b2tlbik7XG5cdFx0XHR1cGRhdGVkID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0d2hpbGUgKCsraSA8IGwpO1xuXG5cdGlmICh1cGRhdGVkKSB7XG5cdFx0dGhpcy5fdXBkYXRlQ2xhc3NOYW1lKCk7XG5cdH1cbn07XG5jbGFzc0xpc3RQcm90by5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG5cdHZhclxuXHRcdCAgdG9rZW5zID0gYXJndW1lbnRzXG5cdFx0LCBpID0gMFxuXHRcdCwgbCA9IHRva2Vucy5sZW5ndGhcblx0XHQsIHRva2VuXG5cdFx0LCB1cGRhdGVkID0gZmFsc2Vcblx0XHQsIGluZGV4XG5cdDtcblx0ZG8ge1xuXHRcdHRva2VuID0gdG9rZW5zW2ldICsgXCJcIjtcblx0XHRpbmRleCA9IGNoZWNrVG9rZW5BbmRHZXRJbmRleCh0aGlzLCB0b2tlbik7XG5cdFx0d2hpbGUgKGluZGV4ICE9PSAtMSkge1xuXHRcdFx0dGhpcy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0dXBkYXRlZCA9IHRydWU7XG5cdFx0XHRpbmRleCA9IGNoZWNrVG9rZW5BbmRHZXRJbmRleCh0aGlzLCB0b2tlbik7XG5cdFx0fVxuXHR9XG5cdHdoaWxlICgrK2kgPCBsKTtcblxuXHRpZiAodXBkYXRlZCkge1xuXHRcdHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSgpO1xuXHR9XG59O1xuY2xhc3NMaXN0UHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gKHRva2VuLCBmb3JjZSkge1xuXHR0b2tlbiArPSBcIlwiO1xuXG5cdHZhclxuXHRcdCAgcmVzdWx0ID0gdGhpcy5jb250YWlucyh0b2tlbilcblx0XHQsIG1ldGhvZCA9IHJlc3VsdCA/XG5cdFx0XHRmb3JjZSAhPT0gdHJ1ZSAmJiBcInJlbW92ZVwiXG5cdFx0OlxuXHRcdFx0Zm9yY2UgIT09IGZhbHNlICYmIFwiYWRkXCJcblx0O1xuXG5cdGlmIChtZXRob2QpIHtcblx0XHR0aGlzW21ldGhvZF0odG9rZW4pO1xuXHR9XG5cblx0aWYgKGZvcmNlID09PSB0cnVlIHx8IGZvcmNlID09PSBmYWxzZSkge1xuXHRcdHJldHVybiBmb3JjZTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gIXJlc3VsdDtcblx0fVxufTtcbmNsYXNzTGlzdFByb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdGhpcy5qb2luKFwiIFwiKTtcbn07XG5cbmlmIChvYmpDdHIuZGVmaW5lUHJvcGVydHkpIHtcblx0dmFyIGNsYXNzTGlzdFByb3BEZXNjID0ge1xuXHRcdCAgZ2V0OiBjbGFzc0xpc3RHZXR0ZXJcblx0XHQsIGVudW1lcmFibGU6IHRydWVcblx0XHQsIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHR9O1xuXHR0cnkge1xuXHRcdG9iakN0ci5kZWZpbmVQcm9wZXJ0eShlbGVtQ3RyUHJvdG8sIGNsYXNzTGlzdFByb3AsIGNsYXNzTGlzdFByb3BEZXNjKTtcblx0fSBjYXRjaCAoZXgpIHsgLy8gSUUgOCBkb2Vzbid0IHN1cHBvcnQgZW51bWVyYWJsZTp0cnVlXG5cdFx0Ly8gYWRkaW5nIHVuZGVmaW5lZCB0byBmaWdodCB0aGlzIGlzc3VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbGlncmV5L2NsYXNzTGlzdC5qcy9pc3N1ZXMvMzZcblx0XHQvLyBtb2Rlcm5pZSBJRTgtTVNXNyBtYWNoaW5lIGhhcyBJRTggOC4wLjYwMDEuMTg3MDIgYW5kIGlzIGFmZmVjdGVkXG5cdFx0aWYgKGV4Lm51bWJlciA9PT0gdW5kZWZpbmVkIHx8IGV4Lm51bWJlciA9PT0gLTB4N0ZGNUVDNTQpIHtcblx0XHRcdGNsYXNzTGlzdFByb3BEZXNjLmVudW1lcmFibGUgPSBmYWxzZTtcblx0XHRcdG9iakN0ci5kZWZpbmVQcm9wZXJ0eShlbGVtQ3RyUHJvdG8sIGNsYXNzTGlzdFByb3AsIGNsYXNzTGlzdFByb3BEZXNjKTtcblx0XHR9XG5cdH1cbn0gZWxzZSBpZiAob2JqQ3RyW3Byb3RvUHJvcF0uX19kZWZpbmVHZXR0ZXJfXykge1xuXHRlbGVtQ3RyUHJvdG8uX19kZWZpbmVHZXR0ZXJfXyhjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RHZXR0ZXIpO1xufVxuXG59KHdpbmRvdy5zZWxmKSk7XG5cbn1cblxuLy8gVGhlcmUgaXMgZnVsbCBvciBwYXJ0aWFsIG5hdGl2ZSBjbGFzc0xpc3Qgc3VwcG9ydCwgc28ganVzdCBjaGVjayBpZiB3ZSBuZWVkXG4vLyB0byBub3JtYWxpemUgdGhlIGFkZC9yZW1vdmUgYW5kIHRvZ2dsZSBBUElzLlxuXG4oZnVuY3Rpb24gKCkge1xuXHRcInVzZSBzdHJpY3RcIjtcblxuXHR2YXIgdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiX1wiKTtcblxuXHR0ZXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYzFcIiwgXCJjMlwiKTtcblxuXHQvLyBQb2x5ZmlsbCBmb3IgSUUgMTAvMTEgYW5kIEZpcmVmb3ggPDI2LCB3aGVyZSBjbGFzc0xpc3QuYWRkIGFuZFxuXHQvLyBjbGFzc0xpc3QucmVtb3ZlIGV4aXN0IGJ1dCBzdXBwb3J0IG9ubHkgb25lIGFyZ3VtZW50IGF0IGEgdGltZS5cblx0aWYgKCF0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjMlwiKSkge1xuXHRcdHZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbihtZXRob2QpIHtcblx0XHRcdHZhciBvcmlnaW5hbCA9IERPTVRva2VuTGlzdC5wcm90b3R5cGVbbWV0aG9kXTtcblxuXHRcdFx0RE9NVG9rZW5MaXN0LnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odG9rZW4pIHtcblx0XHRcdFx0dmFyIGksIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdFx0dG9rZW4gPSBhcmd1bWVudHNbaV07XG5cdFx0XHRcdFx0b3JpZ2luYWwuY2FsbCh0aGlzLCB0b2tlbik7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fTtcblx0XHRjcmVhdGVNZXRob2QoJ2FkZCcpO1xuXHRcdGNyZWF0ZU1ldGhvZCgncmVtb3ZlJyk7XG5cdH1cblxuXHR0ZXN0RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKFwiYzNcIiwgZmFsc2UpO1xuXG5cdC8vIFBvbHlmaWxsIGZvciBJRSAxMCBhbmQgRmlyZWZveCA8MjQsIHdoZXJlIGNsYXNzTGlzdC50b2dnbGUgZG9lcyBub3Rcblx0Ly8gc3VwcG9ydCB0aGUgc2Vjb25kIGFyZ3VtZW50LlxuXHRpZiAodGVzdEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYzNcIikpIHtcblx0XHR2YXIgX3RvZ2dsZSA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlO1xuXG5cdFx0RE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbih0b2tlbiwgZm9yY2UpIHtcblx0XHRcdGlmICgxIGluIGFyZ3VtZW50cyAmJiAhdGhpcy5jb250YWlucyh0b2tlbikgPT09ICFmb3JjZSkge1xuXHRcdFx0XHRyZXR1cm4gZm9yY2U7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gX3RvZ2dsZS5jYWxsKHRoaXMsIHRva2VuKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdH1cblxuXHR0ZXN0RWxlbWVudCA9IG51bGw7XG59KCkpO1xuXG59XG4iLCIvKiFcbiAgKiBkb21yZWFkeSAoYykgRHVzdGluIERpYXogMjAxNCAtIExpY2Vuc2UgTUlUXG4gICovXG4hZnVuY3Rpb24gKG5hbWUsIGRlZmluaXRpb24pIHtcblxuICBpZiAodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJykgbW9kdWxlLmV4cG9ydHMgPSBkZWZpbml0aW9uKClcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnKSBkZWZpbmUoZGVmaW5pdGlvbilcbiAgZWxzZSB0aGlzW25hbWVdID0gZGVmaW5pdGlvbigpXG5cbn0oJ2RvbXJlYWR5JywgZnVuY3Rpb24gKCkge1xuXG4gIHZhciBmbnMgPSBbXSwgbGlzdGVuZXJcbiAgICAsIGRvYyA9IGRvY3VtZW50XG4gICAgLCBoYWNrID0gZG9jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbFxuICAgICwgZG9tQ29udGVudExvYWRlZCA9ICdET01Db250ZW50TG9hZGVkJ1xuICAgICwgbG9hZGVkID0gKGhhY2sgPyAvXmxvYWRlZHxeYy8gOiAvXmxvYWRlZHxeaXxeYy8pLnRlc3QoZG9jLnJlYWR5U3RhdGUpXG5cblxuICBpZiAoIWxvYWRlZClcbiAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoZG9tQ29udGVudExvYWRlZCwgbGlzdGVuZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9tQ29udGVudExvYWRlZCwgbGlzdGVuZXIpXG4gICAgbG9hZGVkID0gMVxuICAgIHdoaWxlIChsaXN0ZW5lciA9IGZucy5zaGlmdCgpKSBsaXN0ZW5lcigpXG4gIH0pXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgIGxvYWRlZCA/IHNldFRpbWVvdXQoZm4sIDApIDogZm5zLnB1c2goZm4pXG4gIH1cblxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIHVzZU5hdGl2ZSgpIHtcbiAgdmFyIGVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZWxlbS5zZXRBdHRyaWJ1dGUoJ2RhdGEtYS1iJywgJ2MnKTtcbiAgcmV0dXJuIEJvb2xlYW4oZWxlbS5kYXRhc2V0ICYmIGVsZW0uZGF0YXNldC5hQiA9PT0gJ2MnKTtcbn1cblxuZnVuY3Rpb24gbmF0aXZlRGF0YXNldChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50LmRhdGFzZXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdXNlTmF0aXZlKCkgPyBuYXRpdmVEYXRhc2V0IDogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgdmFyIG1hcCA9IHt9O1xuICB2YXIgYXR0cmlidXRlcyA9IGVsZW1lbnQuYXR0cmlidXRlcztcblxuICBmdW5jdGlvbiBnZXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBzZXR0ZXIobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMCwgaiA9IGF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaV07XG5cbiAgICBpZiAoYXR0cmlidXRlKSB7XG4gICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZS5uYW1lO1xuXG4gICAgICBpZiAobmFtZS5pbmRleE9mKCdkYXRhLScpID09PSAwKSB7XG4gICAgICAgIHZhciBwcm9wID0gbmFtZS5zbGljZSg1KS5yZXBsYWNlKC8tLi9nLCBmdW5jdGlvbiAodSkge1xuICAgICAgICAgIHJldHVybiB1LmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHZhbHVlID0gYXR0cmlidXRlLnZhbHVlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobWFwLCBwcm9wLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6IGdldHRlci5iaW5kKHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSB8fCAnJ1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHNldDogc2V0dGVyLmJpbmQoZWxlbWVudCwgbmFtZSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hcDtcbn07XG5cbiIsIi8vIGVsZW1lbnQtY2xvc2VzdCB8IENDMC0xLjAgfCBnaXRodWIuY29tL2pvbmF0aGFudG5lYWwvY2xvc2VzdFxuXG4oZnVuY3Rpb24gKEVsZW1lbnRQcm90bykge1xuXHRpZiAodHlwZW9mIEVsZW1lbnRQcm90by5tYXRjaGVzICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0RWxlbWVudFByb3RvLm1hdGNoZXMgPSBFbGVtZW50UHJvdG8ubXNNYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudFByb3RvLm1vek1hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50UHJvdG8ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGZ1bmN0aW9uIG1hdGNoZXMoc2VsZWN0b3IpIHtcblx0XHRcdHZhciBlbGVtZW50ID0gdGhpcztcblx0XHRcdHZhciBlbGVtZW50cyA9IChlbGVtZW50LmRvY3VtZW50IHx8IGVsZW1lbnQub3duZXJEb2N1bWVudCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG5cdFx0XHR2YXIgaW5kZXggPSAwO1xuXG5cdFx0XHR3aGlsZSAoZWxlbWVudHNbaW5kZXhdICYmIGVsZW1lbnRzW2luZGV4XSAhPT0gZWxlbWVudCkge1xuXHRcdFx0XHQrK2luZGV4O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gQm9vbGVhbihlbGVtZW50c1tpbmRleF0pO1xuXHRcdH07XG5cdH1cblxuXHRpZiAodHlwZW9mIEVsZW1lbnRQcm90by5jbG9zZXN0ICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0RWxlbWVudFByb3RvLmNsb3Nlc3QgPSBmdW5jdGlvbiBjbG9zZXN0KHNlbGVjdG9yKSB7XG5cdFx0XHR2YXIgZWxlbWVudCA9IHRoaXM7XG5cblx0XHRcdHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcblx0XHRcdFx0aWYgKGVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbWVudDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH07XG5cdH1cbn0pKHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZSk7XG4iLCIvKiBnbG9iYWwgZGVmaW5lLCBLZXlib2FyZEV2ZW50LCBtb2R1bGUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblxuICB2YXIga2V5Ym9hcmRldmVudEtleVBvbHlmaWxsID0ge1xuICAgIHBvbHlmaWxsOiBwb2x5ZmlsbCxcbiAgICBrZXlzOiB7XG4gICAgICAzOiAnQ2FuY2VsJyxcbiAgICAgIDY6ICdIZWxwJyxcbiAgICAgIDg6ICdCYWNrc3BhY2UnLFxuICAgICAgOTogJ1RhYicsXG4gICAgICAxMjogJ0NsZWFyJyxcbiAgICAgIDEzOiAnRW50ZXInLFxuICAgICAgMTY6ICdTaGlmdCcsXG4gICAgICAxNzogJ0NvbnRyb2wnLFxuICAgICAgMTg6ICdBbHQnLFxuICAgICAgMTk6ICdQYXVzZScsXG4gICAgICAyMDogJ0NhcHNMb2NrJyxcbiAgICAgIDI3OiAnRXNjYXBlJyxcbiAgICAgIDI4OiAnQ29udmVydCcsXG4gICAgICAyOTogJ05vbkNvbnZlcnQnLFxuICAgICAgMzA6ICdBY2NlcHQnLFxuICAgICAgMzE6ICdNb2RlQ2hhbmdlJyxcbiAgICAgIDMyOiAnICcsXG4gICAgICAzMzogJ1BhZ2VVcCcsXG4gICAgICAzNDogJ1BhZ2VEb3duJyxcbiAgICAgIDM1OiAnRW5kJyxcbiAgICAgIDM2OiAnSG9tZScsXG4gICAgICAzNzogJ0Fycm93TGVmdCcsXG4gICAgICAzODogJ0Fycm93VXAnLFxuICAgICAgMzk6ICdBcnJvd1JpZ2h0JyxcbiAgICAgIDQwOiAnQXJyb3dEb3duJyxcbiAgICAgIDQxOiAnU2VsZWN0JyxcbiAgICAgIDQyOiAnUHJpbnQnLFxuICAgICAgNDM6ICdFeGVjdXRlJyxcbiAgICAgIDQ0OiAnUHJpbnRTY3JlZW4nLFxuICAgICAgNDU6ICdJbnNlcnQnLFxuICAgICAgNDY6ICdEZWxldGUnLFxuICAgICAgNDg6IFsnMCcsICcpJ10sXG4gICAgICA0OTogWycxJywgJyEnXSxcbiAgICAgIDUwOiBbJzInLCAnQCddLFxuICAgICAgNTE6IFsnMycsICcjJ10sXG4gICAgICA1MjogWyc0JywgJyQnXSxcbiAgICAgIDUzOiBbJzUnLCAnJSddLFxuICAgICAgNTQ6IFsnNicsICdeJ10sXG4gICAgICA1NTogWyc3JywgJyYnXSxcbiAgICAgIDU2OiBbJzgnLCAnKiddLFxuICAgICAgNTc6IFsnOScsICcoJ10sXG4gICAgICA5MTogJ09TJyxcbiAgICAgIDkzOiAnQ29udGV4dE1lbnUnLFxuICAgICAgMTQ0OiAnTnVtTG9jaycsXG4gICAgICAxNDU6ICdTY3JvbGxMb2NrJyxcbiAgICAgIDE4MTogJ1ZvbHVtZU11dGUnLFxuICAgICAgMTgyOiAnVm9sdW1lRG93bicsXG4gICAgICAxODM6ICdWb2x1bWVVcCcsXG4gICAgICAxODY6IFsnOycsICc6J10sXG4gICAgICAxODc6IFsnPScsICcrJ10sXG4gICAgICAxODg6IFsnLCcsICc8J10sXG4gICAgICAxODk6IFsnLScsICdfJ10sXG4gICAgICAxOTA6IFsnLicsICc+J10sXG4gICAgICAxOTE6IFsnLycsICc/J10sXG4gICAgICAxOTI6IFsnYCcsICd+J10sXG4gICAgICAyMTk6IFsnWycsICd7J10sXG4gICAgICAyMjA6IFsnXFxcXCcsICd8J10sXG4gICAgICAyMjE6IFsnXScsICd9J10sXG4gICAgICAyMjI6IFtcIidcIiwgJ1wiJ10sXG4gICAgICAyMjQ6ICdNZXRhJyxcbiAgICAgIDIyNTogJ0FsdEdyYXBoJyxcbiAgICAgIDI0NjogJ0F0dG4nLFxuICAgICAgMjQ3OiAnQ3JTZWwnLFxuICAgICAgMjQ4OiAnRXhTZWwnLFxuICAgICAgMjQ5OiAnRXJhc2VFb2YnLFxuICAgICAgMjUwOiAnUGxheScsXG4gICAgICAyNTE6ICdab29tT3V0J1xuICAgIH1cbiAgfTtcblxuICAvLyBGdW5jdGlvbiBrZXlzIChGMS0yNCkuXG4gIHZhciBpO1xuICBmb3IgKGkgPSAxOyBpIDwgMjU7IGkrKykge1xuICAgIGtleWJvYXJkZXZlbnRLZXlQb2x5ZmlsbC5rZXlzWzExMSArIGldID0gJ0YnICsgaTtcbiAgfVxuXG4gIC8vIFByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzLlxuICB2YXIgbGV0dGVyID0gJyc7XG4gIGZvciAoaSA9IDY1OyBpIDwgOTE7IGkrKykge1xuICAgIGxldHRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSk7XG4gICAga2V5Ym9hcmRldmVudEtleVBvbHlmaWxsLmtleXNbaV0gPSBbbGV0dGVyLnRvTG93ZXJDYXNlKCksIGxldHRlci50b1VwcGVyQ2FzZSgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvbHlmaWxsICgpIHtcbiAgICBpZiAoISgnS2V5Ym9hcmRFdmVudCcgaW4gd2luZG93KSB8fFxuICAgICAgICAna2V5JyBpbiBLZXlib2FyZEV2ZW50LnByb3RvdHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFBvbHlmaWxsIGBrZXlgIG9uIGBLZXlib2FyZEV2ZW50YC5cbiAgICB2YXIgcHJvdG8gPSB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlib2FyZGV2ZW50S2V5UG9seWZpbGwua2V5c1t0aGlzLndoaWNoIHx8IHRoaXMua2V5Q29kZV07XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgICAgIGtleSA9IGtleVsrdGhpcy5zaGlmdEtleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfVxuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEtleWJvYXJkRXZlbnQucHJvdG90eXBlLCAna2V5JywgcHJvdG8pO1xuICAgIHJldHVybiBwcm90bztcbiAgfVxuXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoJ2tleWJvYXJkZXZlbnQta2V5LXBvbHlmaWxsJywga2V5Ym9hcmRldmVudEtleVBvbHlmaWxsKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGtleWJvYXJkZXZlbnRLZXlQb2x5ZmlsbDtcbiAgfSBlbHNlIGlmICh3aW5kb3cpIHtcbiAgICB3aW5kb3cua2V5Ym9hcmRldmVudEtleVBvbHlmaWxsID0ga2V5Ym9hcmRldmVudEtleVBvbHlmaWxsO1xuICB9XG5cbn0pKCk7XG4iLCIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwiY29uc3QgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuY29uc3QgZGVsZWdhdGUgPSByZXF1aXJlKCcuLi9kZWxlZ2F0ZScpO1xuY29uc3QgZGVsZWdhdGVBbGwgPSByZXF1aXJlKCcuLi9kZWxlZ2F0ZUFsbCcpO1xuXG5jb25zdCBERUxFR0FURV9QQVRURVJOID0gL14oLispOmRlbGVnYXRlXFwoKC4rKVxcKSQvO1xuY29uc3QgU1BBQ0UgPSAnICc7XG5cbmNvbnN0IGdldExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUsIGhhbmRsZXIpIHtcbiAgdmFyIG1hdGNoID0gdHlwZS5tYXRjaChERUxFR0FURV9QQVRURVJOKTtcbiAgdmFyIHNlbGVjdG9yO1xuICBpZiAobWF0Y2gpIHtcbiAgICB0eXBlID0gbWF0Y2hbMV07XG4gICAgc2VsZWN0b3IgPSBtYXRjaFsyXTtcbiAgfVxuXG4gIHZhciBvcHRpb25zO1xuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIGNhcHR1cmU6IHBvcEtleShoYW5kbGVyLCAnY2FwdHVyZScpLFxuICAgICAgcGFzc2l2ZTogcG9wS2V5KGhhbmRsZXIsICdwYXNzaXZlJylcbiAgICB9O1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0ge1xuICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICBkZWxlZ2F0ZTogKHR5cGVvZiBoYW5kbGVyID09PSAnb2JqZWN0JylcbiAgICAgID8gZGVsZWdhdGVBbGwoaGFuZGxlcilcbiAgICAgIDogc2VsZWN0b3JcbiAgICAgICAgPyBkZWxlZ2F0ZShzZWxlY3RvciwgaGFuZGxlcilcbiAgICAgICAgOiBoYW5kbGVyLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgfTtcblxuICBpZiAodHlwZS5pbmRleE9mKFNQQUNFKSA+IC0xKSB7XG4gICAgcmV0dXJuIHR5cGUuc3BsaXQoU1BBQ0UpLm1hcChmdW5jdGlvbihfdHlwZSkge1xuICAgICAgcmV0dXJuIGFzc2lnbih7dHlwZTogX3R5cGV9LCBsaXN0ZW5lcik7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbGlzdGVuZXIudHlwZSA9IHR5cGU7XG4gICAgcmV0dXJuIFtsaXN0ZW5lcl07XG4gIH1cbn07XG5cbnZhciBwb3BLZXkgPSBmdW5jdGlvbihvYmosIGtleSkge1xuICB2YXIgdmFsdWUgPSBvYmpba2V5XTtcbiAgZGVsZXRlIG9ialtrZXldO1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJlaGF2aW9yKGV2ZW50cywgcHJvcHMpIHtcbiAgY29uc3QgbGlzdGVuZXJzID0gT2JqZWN0LmtleXMoZXZlbnRzKVxuICAgIC5yZWR1Y2UoZnVuY3Rpb24obWVtbywgdHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0eXBlLCBldmVudHNbdHlwZV0pO1xuICAgICAgcmV0dXJuIG1lbW8uY29uY2F0KGxpc3RlbmVycyk7XG4gICAgfSwgW10pO1xuXG4gIHJldHVybiBhc3NpZ24oe1xuICAgIGFkZDogZnVuY3Rpb24gYWRkQmVoYXZpb3IoZWxlbWVudCkge1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24obGlzdGVuZXIpIHtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIGxpc3RlbmVyLnR5cGUsXG4gICAgICAgICAgbGlzdGVuZXIuZGVsZWdhdGUsXG4gICAgICAgICAgbGlzdGVuZXIub3B0aW9uc1xuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZUJlaGF2aW9yKGVsZW1lbnQpIHtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uKGxpc3RlbmVyKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBsaXN0ZW5lci50eXBlLFxuICAgICAgICAgIGxpc3RlbmVyLmRlbGVnYXRlLFxuICAgICAgICAgIGxpc3RlbmVyLm9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgcHJvcHMpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tcG9zZShmdW5jdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25zLnNvbWUoZnVuY3Rpb24oZm4pIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGUpID09PSBmYWxzZTtcbiAgICB9LCB0aGlzKTtcbiAgfTtcbn07XG4iLCIvLyBwb2x5ZmlsbCBFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0XG5yZXF1aXJlKCdlbGVtZW50LWNsb3Nlc3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWxlZ2F0ZShzZWxlY3RvciwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGRlbGVnYXRpb24oZXZlbnQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3Qoc2VsZWN0b3IpO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRhcmdldCwgZXZlbnQpO1xuICAgIH1cbiAgfVxufTtcbiIsImNvbnN0IGRlbGVnYXRlID0gcmVxdWlyZSgnLi4vZGVsZWdhdGUnKTtcbmNvbnN0IGNvbXBvc2UgPSByZXF1aXJlKCcuLi9jb21wb3NlJyk7XG5cbmNvbnN0IFNQTEFUID0gJyonO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlbGVnYXRlQWxsKHNlbGVjdG9ycykge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2VsZWN0b3JzKVxuXG4gIC8vIFhYWCBvcHRpbWl6YXRpb246IGlmIHRoZXJlIGlzIG9ubHkgb25lIGhhbmRsZXIgYW5kIGl0IGFwcGxpZXMgdG9cbiAgLy8gYWxsIGVsZW1lbnRzICh0aGUgXCIqXCIgQ1NTIHNlbGVjdG9yKSwgdGhlbiBqdXN0IHJldHVybiB0aGF0XG4gIC8vIGhhbmRsZXJcbiAgaWYgKGtleXMubGVuZ3RoID09PSAxICYmIGtleXNbMF0gPT09IFNQTEFUKSB7XG4gICAgcmV0dXJuIHNlbGVjdG9yc1tTUExBVF07XG4gIH1cblxuICBjb25zdCBkZWxlZ2F0ZXMgPSBrZXlzLnJlZHVjZShmdW5jdGlvbihtZW1vLCBzZWxlY3Rvcikge1xuICAgIG1lbW8ucHVzaChkZWxlZ2F0ZShzZWxlY3Rvciwgc2VsZWN0b3JzW3NlbGVjdG9yXSkpO1xuICAgIHJldHVybiBtZW1vO1xuICB9LCBbXSk7XG4gIHJldHVybiBjb21wb3NlKGRlbGVnYXRlcyk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpZ25vcmUoZWxlbWVudCwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlnbm9yYW5jZShlKSB7XG4gICAgaWYgKGVsZW1lbnQgIT09IGUudGFyZ2V0ICYmICFlbGVtZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZSk7XG4gICAgfVxuICB9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBiZWhhdmlvcjogICAgIHJlcXVpcmUoJy4vYmVoYXZpb3InKSxcbiAgZGVsZWdhdGU6ICAgICByZXF1aXJlKCcuL2RlbGVnYXRlJyksXG4gIGRlbGVnYXRlQWxsOiAgcmVxdWlyZSgnLi9kZWxlZ2F0ZUFsbCcpLFxuICBpZ25vcmU6ICAgICAgIHJlcXVpcmUoJy4vaWdub3JlJyksXG4gIGtleW1hcDogICAgICAgcmVxdWlyZSgnLi9rZXltYXAnKSxcbn07XG4iLCJyZXF1aXJlKCdrZXlib2FyZGV2ZW50LWtleS1wb2x5ZmlsbCcpO1xuXG4vLyB0aGVzZSBhcmUgdGhlIG9ubHkgcmVsZXZhbnQgbW9kaWZpZXJzIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLFxuLy8gYWNjb3JkaW5nIHRvIE1ETjpcbi8vIDxodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9nZXRNb2RpZmllclN0YXRlPlxuY29uc3QgTU9ESUZJRVJTID0ge1xuICAnQWx0JzogICAgICAnYWx0S2V5JyxcbiAgJ0NvbnRyb2wnOiAgJ2N0cmxLZXknLFxuICAnQ3RybCc6ICAgICAnY3RybEtleScsXG4gICdTaGlmdCc6ICAgICdzaGlmdEtleSdcbn07XG5cbmNvbnN0IE1PRElGSUVSX1NFUEFSQVRPUiA9ICcrJztcblxuY29uc3QgZ2V0RXZlbnRLZXkgPSBmdW5jdGlvbihldmVudCwgaGFzTW9kaWZpZXJzKSB7XG4gIHZhciBrZXkgPSBldmVudC5rZXk7XG4gIGlmIChoYXNNb2RpZmllcnMpIHtcbiAgICBmb3IgKHZhciBtb2RpZmllciBpbiBNT0RJRklFUlMpIHtcbiAgICAgIGlmIChldmVudFtNT0RJRklFUlNbbW9kaWZpZXJdXSA9PT0gdHJ1ZSkge1xuICAgICAgICBrZXkgPSBbbW9kaWZpZXIsIGtleV0uam9pbihNT0RJRklFUl9TRVBBUkFUT1IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4ga2V5O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBrZXltYXAoa2V5cykge1xuICBjb25zdCBoYXNNb2RpZmllcnMgPSBPYmplY3Qua2V5cyhrZXlzKS5zb21lKGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBrZXkuaW5kZXhPZihNT0RJRklFUl9TRVBBUkFUT1IpID4gLTE7XG4gIH0pO1xuICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIga2V5ID0gZ2V0RXZlbnRLZXkoZXZlbnQsIGhhc01vZGlmaWVycyk7XG4gICAgcmV0dXJuIFtrZXksIGtleS50b0xvd2VyQ2FzZSgpXVxuICAgICAgLnJlZHVjZShmdW5jdGlvbihyZXN1bHQsIF9rZXkpIHtcbiAgICAgICAgaWYgKF9rZXkgaW4ga2V5cykge1xuICAgICAgICAgIHJlc3VsdCA9IGtleXNba2V5XS5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSwgdW5kZWZpbmVkKTtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLk1PRElGSUVSUyA9IE1PRElGSUVSUztcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb25jZShsaXN0ZW5lciwgb3B0aW9ucykge1xuICB2YXIgd3JhcHBlZCA9IGZ1bmN0aW9uIHdyYXBwZWRPbmNlKGUpIHtcbiAgICBlLmN1cnJlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsIHdyYXBwZWQsIG9wdGlvbnMpO1xuICAgIHJldHVybiBsaXN0ZW5lci5jYWxsKHRoaXMsIGUpO1xuICB9O1xuICByZXR1cm4gd3JhcHBlZDtcbn07XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFJFX1RSSU0gPSAvKF5cXHMrKXwoXFxzKyQpL2c7XG52YXIgUkVfU1BMSVQgPSAvXFxzKy87XG5cbnZhciB0cmltID0gU3RyaW5nLnByb3RvdHlwZS50cmltXG4gID8gZnVuY3Rpb24oc3RyKSB7IHJldHVybiBzdHIudHJpbSgpOyB9XG4gIDogZnVuY3Rpb24oc3RyKSB7IHJldHVybiBzdHIucmVwbGFjZShSRV9UUklNLCAnJyk7IH07XG5cbnZhciBxdWVyeUJ5SWQgPSBmdW5jdGlvbihpZCkge1xuICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdbaWQ9XCInICsgaWQucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpICsgJ1wiXScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXNvbHZlSWRzKGlkcywgZG9jKSB7XG4gIGlmICh0eXBlb2YgaWRzICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcgYnV0IGdvdCAnICsgKHR5cGVvZiBpZHMpKTtcbiAgfVxuXG4gIGlmICghZG9jKSB7XG4gICAgZG9jID0gd2luZG93LmRvY3VtZW50O1xuICB9XG5cbiAgdmFyIGdldEVsZW1lbnRCeUlkID0gZG9jLmdldEVsZW1lbnRCeUlkXG4gICAgPyBkb2MuZ2V0RWxlbWVudEJ5SWQuYmluZChkb2MpXG4gICAgOiBxdWVyeUJ5SWQuYmluZChkb2MpO1xuXG4gIGlkcyA9IHRyaW0oaWRzKS5zcGxpdChSRV9TUExJVCk7XG5cbiAgLy8gWFhYIHdlIGNhbiBzaG9ydC1jaXJjdWl0IGhlcmUgYmVjYXVzZSB0cmltbWluZyBhbmQgc3BsaXR0aW5nIGFcbiAgLy8gc3RyaW5nIG9mIGp1c3Qgd2hpdGVzcGFjZSBwcm9kdWNlcyBhbiBhcnJheSBjb250YWluaW5nIGEgc2luZ2xlLFxuICAvLyBlbXB0eSBzdHJpbmdcbiAgaWYgKGlkcy5sZW5ndGggPT09IDEgJiYgaWRzWzBdID09PSAnJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBpZHNcbiAgICAubWFwKGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgZWwgPSBnZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZWxlbWVudCB3aXRoIGlkOiBcIicgKyBpZCArICdcIicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsO1xuICAgIH0pO1xufTtcbiIsImNvbnN0IHNlbGVjdCA9IHJlcXVpcmUoXCIuLi91dGlscy9zZWxlY3RcIik7XG5jb25zdCBiZWhhdmlvciA9IHJlcXVpcmUoXCIuLi91dGlscy9iZWhhdmlvclwiKTtcbmNvbnN0IHRvZ2dsZSA9IHJlcXVpcmUoXCIuLi91dGlscy90b2dnbGVcIik7XG5jb25zdCBpc0VsZW1lbnRJblZpZXdwb3J0ID0gcmVxdWlyZShcIi4uL3V0aWxzL2lzLWluLXZpZXdwb3J0XCIpO1xuY29uc3QgeyBDTElDSyB9ID0gcmVxdWlyZShcIi4uL2V2ZW50c1wiKTtcbmNvbnN0IHsgcHJlZml4OiBQUkVGSVggfSA9IHJlcXVpcmUoXCIuLi9jb25maWdcIik7XG5cbmNvbnN0IEFDQ09SRElPTiA9IGAuJHtQUkVGSVh9LWFjY29yZGlvbiwgLiR7UFJFRklYfS1hY2NvcmRpb24tLWJvcmRlcmVkYDtcbmNvbnN0IEJVVFRPTiA9IGAuJHtQUkVGSVh9LWFjY29yZGlvbl9fYnV0dG9uW2FyaWEtY29udHJvbHNdYDtcbmNvbnN0IEVYUEFOREVEID0gXCJhcmlhLWV4cGFuZGVkXCI7XG5jb25zdCBNVUxUSVNFTEVDVEFCTEUgPSBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCI7XG5cbi8qKlxuICogR2V0IGFuIEFycmF5IG9mIGJ1dHRvbiBlbGVtZW50cyBiZWxvbmdpbmcgZGlyZWN0bHkgdG8gdGhlIGdpdmVuXG4gKiBhY2NvcmRpb24gZWxlbWVudC5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGFjY29yZGlvblxuICogQHJldHVybiB7YXJyYXk8SFRNTEJ1dHRvbkVsZW1lbnQ+fVxuICovXG5jb25zdCBnZXRBY2NvcmRpb25CdXR0b25zID0gKGFjY29yZGlvbikgPT4ge1xuICBjb25zdCBidXR0b25zID0gc2VsZWN0KEJVVFRPTiwgYWNjb3JkaW9uKTtcblxuICByZXR1cm4gYnV0dG9ucy5maWx0ZXIoKGJ1dHRvbikgPT4gYnV0dG9uLmNsb3Nlc3QoQUNDT1JESU9OKSA9PT0gYWNjb3JkaW9uKTtcbn07XG5cbi8qKlxuICogVG9nZ2xlIGEgYnV0dG9uJ3MgXCJwcmVzc2VkXCIgc3RhdGUsIG9wdGlvbmFsbHkgcHJvdmlkaW5nIGEgdGFyZ2V0XG4gKiBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge0hUTUxCdXR0b25FbGVtZW50fSBidXR0b25cbiAqIEBwYXJhbSB7Ym9vbGVhbj99IGV4cGFuZGVkIElmIG5vIHN0YXRlIGlzIHByb3ZpZGVkLCB0aGUgY3VycmVudFxuICogc3RhdGUgd2lsbCBiZSB0b2dnbGVkIChmcm9tIGZhbHNlIHRvIHRydWUsIGFuZCB2aWNlLXZlcnNhKS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRoZSByZXN1bHRpbmcgc3RhdGVcbiAqL1xuY29uc3QgdG9nZ2xlQnV0dG9uID0gKGJ1dHRvbiwgZXhwYW5kZWQpID0+IHtcbiAgY29uc3QgYWNjb3JkaW9uID0gYnV0dG9uLmNsb3Nlc3QoQUNDT1JESU9OKTtcbiAgbGV0IHNhZmVFeHBhbmRlZCA9IGV4cGFuZGVkO1xuXG4gIGlmICghYWNjb3JkaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke0JVVFRPTn0gaXMgbWlzc2luZyBvdXRlciAke0FDQ09SRElPTn1gKTtcbiAgfVxuXG4gIHNhZmVFeHBhbmRlZCA9IHRvZ2dsZShidXR0b24sIGV4cGFuZGVkKTtcblxuICAvLyBYWFggbXVsdGlzZWxlY3RhYmxlIGlzIG9wdC1pbiwgdG8gcHJlc2VydmUgbGVnYWN5IGJlaGF2aW9yXG4gIGNvbnN0IG11bHRpc2VsZWN0YWJsZSA9IGFjY29yZGlvbi5nZXRBdHRyaWJ1dGUoTVVMVElTRUxFQ1RBQkxFKSA9PT0gXCJ0cnVlXCI7XG5cbiAgaWYgKHNhZmVFeHBhbmRlZCAmJiAhbXVsdGlzZWxlY3RhYmxlKSB7XG4gICAgZ2V0QWNjb3JkaW9uQnV0dG9ucyhhY2NvcmRpb24pLmZvckVhY2goKG90aGVyKSA9PiB7XG4gICAgICBpZiAob3RoZXIgIT09IGJ1dHRvbikge1xuICAgICAgICB0b2dnbGUob3RoZXIsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxCdXR0b25FbGVtZW50fSBidXR0b25cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWVcbiAqL1xuY29uc3Qgc2hvd0J1dHRvbiA9IChidXR0b24pID0+IHRvZ2dsZUJ1dHRvbihidXR0b24sIHRydWUpO1xuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEJ1dHRvbkVsZW1lbnR9IGJ1dHRvblxuICogQHJldHVybiB7Ym9vbGVhbn0gZmFsc2VcbiAqL1xuY29uc3QgaGlkZUJ1dHRvbiA9IChidXR0b24pID0+IHRvZ2dsZUJ1dHRvbihidXR0b24sIGZhbHNlKTtcblxuY29uc3QgYWNjb3JkaW9uID0gYmVoYXZpb3IoXG4gIHtcbiAgICBbQ0xJQ0tdOiB7XG4gICAgICBbQlVUVE9OXShldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRvZ2dsZUJ1dHRvbih0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGUoRVhQQU5ERUQpID09PSBcInRydWVcIikge1xuICAgICAgICAgIC8vIFdlIHdlcmUganVzdCBleHBhbmRlZCwgYnV0IGlmIGFub3RoZXIgYWNjb3JkaW9uIHdhcyBhbHNvIGp1c3RcbiAgICAgICAgICAvLyBjb2xsYXBzZWQsIHdlIG1heSBubyBsb25nZXIgYmUgaW4gdGhlIHZpZXdwb3J0LiBUaGlzIGVuc3VyZXNcbiAgICAgICAgICAvLyB0aGF0IHdlIGFyZSBzdGlsbCB2aXNpYmxlLCBzbyB0aGUgdXNlciBpc24ndCBjb25mdXNlZC5cbiAgICAgICAgICBpZiAoIWlzRWxlbWVudEluVmlld3BvcnQodGhpcykpIHRoaXMuc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgaW5pdChyb290KSB7XG4gICAgICBzZWxlY3QoQlVUVE9OLCByb290KS5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBidXR0b24uZ2V0QXR0cmlidXRlKEVYUEFOREVEKSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgIHRvZ2dsZUJ1dHRvbihidXR0b24sIGV4cGFuZGVkKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgQUNDT1JESU9OLFxuICAgIEJVVFRPTixcbiAgICBzaG93OiBzaG93QnV0dG9uLFxuICAgIGhpZGU6IGhpZGVCdXR0b24sXG4gICAgdG9nZ2xlOiB0b2dnbGVCdXR0b24sXG4gICAgZ2V0QnV0dG9uczogZ2V0QWNjb3JkaW9uQnV0dG9ucyxcbiAgfVxuKTtcblxubW9kdWxlLmV4cG9ydHMgPSBhY2NvcmRpb247XG4iLCJjb25zdCBiZWhhdmlvciA9IHJlcXVpcmUoXCIuLi91dGlscy9iZWhhdmlvclwiKTtcbmNvbnN0IHsgQ0xJQ0sgfSA9IHJlcXVpcmUoXCIuLi9ldmVudHNcIik7XG5jb25zdCB7IHByZWZpeDogUFJFRklYIH0gPSByZXF1aXJlKFwiLi4vY29uZmlnXCIpO1xuXG5jb25zdCBIRUFERVIgPSBgLiR7UFJFRklYfS1iYW5uZXJfX2hlYWRlcmA7XG5jb25zdCBFWFBBTkRFRF9DTEFTUyA9IGAke1BSRUZJWH0tYmFubmVyX19oZWFkZXItLWV4cGFuZGVkYDtcblxuY29uc3QgdG9nZ2xlQmFubmVyID0gZnVuY3Rpb24gdG9nZ2xlRWwoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgdGhpcy5jbG9zZXN0KEhFQURFUikuY2xhc3NMaXN0LnRvZ2dsZShFWFBBTkRFRF9DTEFTUyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJlaGF2aW9yKHtcbiAgW0NMSUNLXToge1xuICAgIFtgJHtIRUFERVJ9IFthcmlhLWNvbnRyb2xzXWBdOiB0b2dnbGVCYW5uZXIsXG4gIH0sXG59KTtcbiIsImNvbnN0IHNlbGVjdCA9IHJlcXVpcmUoXCIuLi91dGlscy9zZWxlY3RcIik7XG5jb25zdCBiZWhhdmlvciA9IHJlcXVpcmUoXCIuLi91dGlscy9iZWhhdmlvclwiKTtcbmNvbnN0IHsgcHJlZml4OiBQUkVGSVggfSA9IHJlcXVpcmUoXCIuLi9jb25maWdcIik7XG5cbmNvbnN0IENIQVJBQ1RFUl9DT1VOVCA9IGAuJHtQUkVGSVh9LWNoYXJhY3Rlci1jb3VudGA7XG5jb25zdCBJTlBVVCA9IGAuJHtQUkVGSVh9LWNoYXJhY3Rlci1jb3VudF9fZmllbGRgO1xuY29uc3QgTUVTU0FHRSA9IGAuJHtQUkVGSVh9LWNoYXJhY3Rlci1jb3VudF9fbWVzc2FnZWA7XG5jb25zdCBWQUxJREFUSU9OX01FU1NBR0UgPSBcIlRoZSBjb250ZW50IGlzIHRvbyBsb25nLlwiO1xuY29uc3QgTUVTU0FHRV9JTlZBTElEX0NMQVNTID0gYCR7UFJFRklYfS1jaGFyYWN0ZXItY291bnRfX21lc3NhZ2UtLWludmFsaWRgO1xuXG4vKipcbiAqIFRoZSBlbGVtZW50cyB3aXRoaW4gdGhlIGNoYXJhY3RlciBjb3VudC5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IENoYXJhY3RlckNvdW50RWxlbWVudHNcbiAqIEBwcm9wZXJ0eSB7SFRNTERpdkVsZW1lbnR9IGNoYXJhY3RlckNvdW50RWxcbiAqIEBwcm9wZXJ0eSB7SFRNTFNwYW5FbGVtZW50fSBtZXNzYWdlRWxcbiAqL1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHJvb3QgYW5kIG1lc3NhZ2UgZWxlbWVudFxuICogZm9yIGFuIGNoYXJhY3RlciBjb3VudCBpbnB1dFxuICpcbiAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudHxIVE1MVGV4dEFyZWFFbGVtZW50fSBpbnB1dEVsIFRoZSBjaGFyYWN0ZXIgY291bnQgaW5wdXQgZWxlbWVudFxuICogQHJldHVybnMge0NoYXJhY3RlckNvdW50RWxlbWVudHN9IGVsZW1lbnRzIFRoZSByb290IGFuZCBtZXNzYWdlIGVsZW1lbnQuXG4gKi9cbmNvbnN0IGdldENoYXJhY3RlckNvdW50RWxlbWVudHMgPSAoaW5wdXRFbCkgPT4ge1xuICBjb25zdCBjaGFyYWN0ZXJDb3VudEVsID0gaW5wdXRFbC5jbG9zZXN0KENIQVJBQ1RFUl9DT1VOVCk7XG5cbiAgaWYgKCFjaGFyYWN0ZXJDb3VudEVsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke0lOUFVUfSBpcyBtaXNzaW5nIG91dGVyICR7Q0hBUkFDVEVSX0NPVU5UfWApO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZUVsID0gY2hhcmFjdGVyQ291bnRFbC5xdWVyeVNlbGVjdG9yKE1FU1NBR0UpO1xuXG4gIGlmICghbWVzc2FnZUVsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke0NIQVJBQ1RFUl9DT1VOVH0gaXMgbWlzc2luZyBpbm5lciAke01FU1NBR0V9YCk7XG4gIH1cblxuICByZXR1cm4geyBjaGFyYWN0ZXJDb3VudEVsLCBtZXNzYWdlRWwgfTtcbn07XG5cbi8qKlxuICogVXBkYXRlIHRoZSBjaGFyYWN0ZXIgY291bnQgY29tcG9uZW50XG4gKlxuICogQHBhcmFtIHtIVE1MSW5wdXRFbGVtZW50fEhUTUxUZXh0QXJlYUVsZW1lbnR9IGlucHV0RWwgVGhlIGNoYXJhY3RlciBjb3VudCBpbnB1dCBlbGVtZW50XG4gKi9cbmNvbnN0IHVwZGF0ZUNvdW50TWVzc2FnZSA9IChpbnB1dEVsKSA9PiB7XG4gIGNvbnN0IHsgY2hhcmFjdGVyQ291bnRFbCwgbWVzc2FnZUVsIH0gPSBnZXRDaGFyYWN0ZXJDb3VudEVsZW1lbnRzKGlucHV0RWwpO1xuXG4gIGNvbnN0IG1heGxlbmd0aCA9IHBhcnNlSW50KFxuICAgIGNoYXJhY3RlckNvdW50RWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1tYXhsZW5ndGhcIiksXG4gICAgMTBcbiAgKTtcblxuICBpZiAoIW1heGxlbmd0aCkgcmV0dXJuO1xuXG4gIGxldCBuZXdNZXNzYWdlID0gXCJcIjtcbiAgY29uc3QgY3VycmVudExlbmd0aCA9IGlucHV0RWwudmFsdWUubGVuZ3RoO1xuICBjb25zdCBpc092ZXJMaW1pdCA9IGN1cnJlbnRMZW5ndGggJiYgY3VycmVudExlbmd0aCA+IG1heGxlbmd0aDtcblxuICBpZiAoY3VycmVudExlbmd0aCA9PT0gMCkge1xuICAgIG5ld01lc3NhZ2UgPSBgJHttYXhsZW5ndGh9IGNoYXJhY3RlcnMgYWxsb3dlZGA7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IE1hdGguYWJzKG1heGxlbmd0aCAtIGN1cnJlbnRMZW5ndGgpO1xuICAgIGNvbnN0IGNoYXJhY3RlcnMgPSBgY2hhcmFjdGVyJHtkaWZmZXJlbmNlID09PSAxID8gXCJcIiA6IFwic1wifWA7XG4gICAgY29uc3QgZ3VpZGFuY2UgPSBpc092ZXJMaW1pdCA/IFwib3ZlciBsaW1pdFwiIDogXCJsZWZ0XCI7XG5cbiAgICBuZXdNZXNzYWdlID0gYCR7ZGlmZmVyZW5jZX0gJHtjaGFyYWN0ZXJzfSAke2d1aWRhbmNlfWA7XG4gIH1cblxuICBtZXNzYWdlRWwuY2xhc3NMaXN0LnRvZ2dsZShNRVNTQUdFX0lOVkFMSURfQ0xBU1MsIGlzT3ZlckxpbWl0KTtcbiAgbWVzc2FnZUVsLmlubmVySFRNTCA9IG5ld01lc3NhZ2U7XG5cbiAgaWYgKGlzT3ZlckxpbWl0ICYmICFpbnB1dEVsLnZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgaW5wdXRFbC5zZXRDdXN0b21WYWxpZGl0eShWQUxJREFUSU9OX01FU1NBR0UpO1xuICB9XG5cbiAgaWYgKCFpc092ZXJMaW1pdCAmJiBpbnB1dEVsLnZhbGlkYXRpb25NZXNzYWdlID09PSBWQUxJREFUSU9OX01FU1NBR0UpIHtcbiAgICBpbnB1dEVsLnNldEN1c3RvbVZhbGlkaXR5KFwiXCIpO1xuICB9XG59O1xuXG4vKipcbiAqIFNldHVwIHRoZSBjaGFyYWN0ZXIgY291bnQgY29tcG9uZW50XG4gKlxuICogQHBhcmFtIHtIVE1MSW5wdXRFbGVtZW50fEhUTUxUZXh0QXJlYUVsZW1lbnR9IGlucHV0RWwgVGhlIGNoYXJhY3RlciBjb3VudCBpbnB1dCBlbGVtZW50XG4gKi9cbmNvbnN0IHNldHVwQXR0cmlidXRlcyA9IChpbnB1dEVsKSA9PiB7XG4gIGNvbnN0IHsgY2hhcmFjdGVyQ291bnRFbCB9ID0gZ2V0Q2hhcmFjdGVyQ291bnRFbGVtZW50cyhpbnB1dEVsKTtcblxuICBjb25zdCBtYXhsZW5ndGggPSBpbnB1dEVsLmdldEF0dHJpYnV0ZShcIm1heGxlbmd0aFwiKTtcblxuICBpZiAoIW1heGxlbmd0aCkgcmV0dXJuO1xuXG4gIGlucHV0RWwucmVtb3ZlQXR0cmlidXRlKFwibWF4bGVuZ3RoXCIpO1xuICBjaGFyYWN0ZXJDb3VudEVsLnNldEF0dHJpYnV0ZShcImRhdGEtbWF4bGVuZ3RoXCIsIG1heGxlbmd0aCk7XG59O1xuXG5jb25zdCBjaGFyYWN0ZXJDb3VudCA9IGJlaGF2aW9yKFxuICB7XG4gICAgaW5wdXQ6IHtcbiAgICAgIFtJTlBVVF0oKSB7XG4gICAgICAgIHVwZGF0ZUNvdW50TWVzc2FnZSh0aGlzKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIGluaXQocm9vdCkge1xuICAgICAgc2VsZWN0KElOUFVULCByb290KS5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgICAgICBzZXR1cEF0dHJpYnV0ZXMoaW5wdXQpO1xuICAgICAgICB1cGRhdGVDb3VudE1lc3NhZ2UoaW5wdXQpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBNRVNTQUdFX0lOVkFMSURfQ0xBU1MsXG4gICAgVkFMSURBVElPTl9NRVNTQUdFLFxuICB9XG4pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNoYXJhY3RlckNvdW50O1xuIiwiY29uc3Qga2V5bWFwID0gcmVxdWlyZShcInJlY2VwdG9yL2tleW1hcFwiKTtcbmNvbnN0IHNlbGVjdCA9IHJlcXVpcmUoXCIuLi91dGlscy9zZWxlY3RcIik7XG5jb25zdCBiZWhhdmlvciA9IHJlcXVpcmUoXCIuLi91dGlscy9iZWhhdmlvclwiKTtcbmNvbnN0IHsgcHJlZml4OiBQUkVGSVggfSA9IHJlcXVpcmUoXCIuLi9jb25maWdcIik7XG5jb25zdCB7IENMSUNLIH0gPSByZXF1aXJlKFwiLi4vZXZlbnRzXCIpO1xuXG5jb25zdCBDT01CT19CT1hfQ0xBU1MgPSBgJHtQUkVGSVh9LWNvbWJvLWJveGA7XG5jb25zdCBDT01CT19CT1hfUFJJU1RJTkVfQ0xBU1MgPSBgJHtDT01CT19CT1hfQ0xBU1N9LS1wcmlzdGluZWA7XG5jb25zdCBTRUxFQ1RfQ0xBU1MgPSBgJHtDT01CT19CT1hfQ0xBU1N9X19zZWxlY3RgO1xuY29uc3QgSU5QVVRfQ0xBU1MgPSBgJHtDT01CT19CT1hfQ0xBU1N9X19pbnB1dGA7XG5jb25zdCBDTEVBUl9JTlBVVF9CVVRUT05fQ0xBU1MgPSBgJHtDT01CT19CT1hfQ0xBU1N9X19jbGVhci1pbnB1dGA7XG5jb25zdCBDTEVBUl9JTlBVVF9CVVRUT05fV1JBUFBFUl9DTEFTUyA9IGAke0NMRUFSX0lOUFVUX0JVVFRPTl9DTEFTU31fX3dyYXBwZXJgO1xuY29uc3QgSU5QVVRfQlVUVE9OX1NFUEFSQVRPUl9DTEFTUyA9IGAke0NPTUJPX0JPWF9DTEFTU31fX2lucHV0LWJ1dHRvbi1zZXBhcmF0b3JgO1xuY29uc3QgVE9HR0xFX0xJU1RfQlVUVE9OX0NMQVNTID0gYCR7Q09NQk9fQk9YX0NMQVNTfV9fdG9nZ2xlLWxpc3RgO1xuY29uc3QgVE9HR0xFX0xJU1RfQlVUVE9OX1dSQVBQRVJfQ0xBU1MgPSBgJHtUT0dHTEVfTElTVF9CVVRUT05fQ0xBU1N9X193cmFwcGVyYDtcbmNvbnN0IExJU1RfQ0xBU1MgPSBgJHtDT01CT19CT1hfQ0xBU1N9X19saXN0YDtcbmNvbnN0IExJU1RfT1BUSU9OX0NMQVNTID0gYCR7Q09NQk9fQk9YX0NMQVNTfV9fbGlzdC1vcHRpb25gO1xuY29uc3QgTElTVF9PUFRJT05fRk9DVVNFRF9DTEFTUyA9IGAke0xJU1RfT1BUSU9OX0NMQVNTfS0tZm9jdXNlZGA7XG5jb25zdCBMSVNUX09QVElPTl9TRUxFQ1RFRF9DTEFTUyA9IGAke0xJU1RfT1BUSU9OX0NMQVNTfS0tc2VsZWN0ZWRgO1xuY29uc3QgU1RBVFVTX0NMQVNTID0gYCR7Q09NQk9fQk9YX0NMQVNTfV9fc3RhdHVzYDtcblxuY29uc3QgQ09NQk9fQk9YID0gYC4ke0NPTUJPX0JPWF9DTEFTU31gO1xuY29uc3QgU0VMRUNUID0gYC4ke1NFTEVDVF9DTEFTU31gO1xuY29uc3QgSU5QVVQgPSBgLiR7SU5QVVRfQ0xBU1N9YDtcbmNvbnN0IENMRUFSX0lOUFVUX0JVVFRPTiA9IGAuJHtDTEVBUl9JTlBVVF9CVVRUT05fQ0xBU1N9YDtcbmNvbnN0IFRPR0dMRV9MSVNUX0JVVFRPTiA9IGAuJHtUT0dHTEVfTElTVF9CVVRUT05fQ0xBU1N9YDtcbmNvbnN0IExJU1QgPSBgLiR7TElTVF9DTEFTU31gO1xuY29uc3QgTElTVF9PUFRJT04gPSBgLiR7TElTVF9PUFRJT05fQ0xBU1N9YDtcbmNvbnN0IExJU1RfT1BUSU9OX0ZPQ1VTRUQgPSBgLiR7TElTVF9PUFRJT05fRk9DVVNFRF9DTEFTU31gO1xuY29uc3QgTElTVF9PUFRJT05fU0VMRUNURUQgPSBgLiR7TElTVF9PUFRJT05fU0VMRUNURURfQ0xBU1N9YDtcbmNvbnN0IFNUQVRVUyA9IGAuJHtTVEFUVVNfQ0xBU1N9YDtcblxuY29uc3QgREVGQVVMVF9GSUxURVIgPSBcIi4qe3txdWVyeX19LipcIjtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG4vKipcbiAqIHNldCB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgYW5kIGRpc3BhdGNoIGEgY2hhbmdlIGV2ZW50XG4gKlxuICogQHBhcmFtIHtIVE1MSW5wdXRFbGVtZW50fEhUTUxTZWxlY3RFbGVtZW50fSBlbCBUaGUgZWxlbWVudCB0byB1cGRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBlbGVtZW50XG4gKi9cbmNvbnN0IGNoYW5nZUVsZW1lbnRWYWx1ZSA9IChlbCwgdmFsdWUgPSBcIlwiKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRUb0NoYW5nZSA9IGVsO1xuICBlbGVtZW50VG9DaGFuZ2UudmFsdWUgPSB2YWx1ZTtcblxuICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudChcImNoYW5nZVwiLCB7XG4gICAgYnViYmxlczogdHJ1ZSxcbiAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgIGRldGFpbDogeyB2YWx1ZSB9LFxuICB9KTtcbiAgZWxlbWVudFRvQ2hhbmdlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xufTtcblxuLyoqXG4gKiBUaGUgZWxlbWVudHMgd2l0aGluIHRoZSBjb21ibyBib3guXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb21ib0JveENvbnRleHRcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IGNvbWJvQm94RWxcbiAqIEBwcm9wZXJ0eSB7SFRNTFNlbGVjdEVsZW1lbnR9IHNlbGVjdEVsXG4gKiBAcHJvcGVydHkge0hUTUxJbnB1dEVsZW1lbnR9IGlucHV0RWxcbiAqIEBwcm9wZXJ0eSB7SFRNTFVMaXN0RWxlbWVudH0gbGlzdEVsXG4gKiBAcHJvcGVydHkge0hUTUxEaXZFbGVtZW50fSBzdGF0dXNFbFxuICogQHByb3BlcnR5IHtIVE1MTElFbGVtZW50fSBmb2N1c2VkT3B0aW9uRWxcbiAqIEBwcm9wZXJ0eSB7SFRNTExJRWxlbWVudH0gc2VsZWN0ZWRPcHRpb25FbFxuICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudH0gdG9nZ2xlTGlzdEJ0bkVsXG4gKiBAcHJvcGVydHkge0hUTUxCdXR0b25FbGVtZW50fSBjbGVhcklucHV0QnRuRWxcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNQcmlzdGluZVxuICogQHByb3BlcnR5IHtib29sZWFufSBkaXNhYmxlRmlsdGVyaW5nXG4gKi9cblxuLyoqXG4gKiBHZXQgYW4gb2JqZWN0IG9mIGVsZW1lbnRzIGJlbG9uZ2luZyBkaXJlY3RseSB0byB0aGUgZ2l2ZW5cbiAqIGNvbWJvIGJveCBjb21wb25lbnQuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgdGhlIGVsZW1lbnQgd2l0aGluIHRoZSBjb21ibyBib3hcbiAqIEByZXR1cm5zIHtDb21ib0JveENvbnRleHR9IGVsZW1lbnRzXG4gKi9cbmNvbnN0IGdldENvbWJvQm94Q29udGV4dCA9IChlbCkgPT4ge1xuICBjb25zdCBjb21ib0JveEVsID0gZWwuY2xvc2VzdChDT01CT19CT1gpO1xuXG4gIGlmICghY29tYm9Cb3hFbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBpcyBtaXNzaW5nIG91dGVyICR7Q09NQk9fQk9YfWApO1xuICB9XG5cbiAgY29uc3Qgc2VsZWN0RWwgPSBjb21ib0JveEVsLnF1ZXJ5U2VsZWN0b3IoU0VMRUNUKTtcbiAgY29uc3QgaW5wdXRFbCA9IGNvbWJvQm94RWwucXVlcnlTZWxlY3RvcihJTlBVVCk7XG4gIGNvbnN0IGxpc3RFbCA9IGNvbWJvQm94RWwucXVlcnlTZWxlY3RvcihMSVNUKTtcbiAgY29uc3Qgc3RhdHVzRWwgPSBjb21ib0JveEVsLnF1ZXJ5U2VsZWN0b3IoU1RBVFVTKTtcbiAgY29uc3QgZm9jdXNlZE9wdGlvbkVsID0gY29tYm9Cb3hFbC5xdWVyeVNlbGVjdG9yKExJU1RfT1BUSU9OX0ZPQ1VTRUQpO1xuICBjb25zdCBzZWxlY3RlZE9wdGlvbkVsID0gY29tYm9Cb3hFbC5xdWVyeVNlbGVjdG9yKExJU1RfT1BUSU9OX1NFTEVDVEVEKTtcbiAgY29uc3QgdG9nZ2xlTGlzdEJ0bkVsID0gY29tYm9Cb3hFbC5xdWVyeVNlbGVjdG9yKFRPR0dMRV9MSVNUX0JVVFRPTik7XG4gIGNvbnN0IGNsZWFySW5wdXRCdG5FbCA9IGNvbWJvQm94RWwucXVlcnlTZWxlY3RvcihDTEVBUl9JTlBVVF9CVVRUT04pO1xuXG4gIGNvbnN0IGlzUHJpc3RpbmUgPSBjb21ib0JveEVsLmNsYXNzTGlzdC5jb250YWlucyhDT01CT19CT1hfUFJJU1RJTkVfQ0xBU1MpO1xuICBjb25zdCBkaXNhYmxlRmlsdGVyaW5nID0gY29tYm9Cb3hFbC5kYXRhc2V0LmRpc2FibGVGaWx0ZXJpbmcgPT09IFwidHJ1ZVwiO1xuXG4gIHJldHVybiB7XG4gICAgY29tYm9Cb3hFbCxcbiAgICBzZWxlY3RFbCxcbiAgICBpbnB1dEVsLFxuICAgIGxpc3RFbCxcbiAgICBzdGF0dXNFbCxcbiAgICBmb2N1c2VkT3B0aW9uRWwsXG4gICAgc2VsZWN0ZWRPcHRpb25FbCxcbiAgICB0b2dnbGVMaXN0QnRuRWwsXG4gICAgY2xlYXJJbnB1dEJ0bkVsLFxuICAgIGlzUHJpc3RpbmUsXG4gICAgZGlzYWJsZUZpbHRlcmluZyxcbiAgfTtcbn07XG5cbi8qKlxuICogRGlzYWJsZSB0aGUgY29tYm8tYm94IGNvbXBvbmVudFxuICpcbiAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudH0gZWwgQW4gZWxlbWVudCB3aXRoaW4gdGhlIGNvbWJvIGJveCBjb21wb25lbnRcbiAqL1xuY29uc3QgZGlzYWJsZSA9IChlbCkgPT4ge1xuICBjb25zdCB7IGlucHV0RWwsIHRvZ2dsZUxpc3RCdG5FbCwgY2xlYXJJbnB1dEJ0bkVsIH0gPSBnZXRDb21ib0JveENvbnRleHQoZWwpO1xuXG4gIGNsZWFySW5wdXRCdG5FbC5oaWRkZW4gPSB0cnVlO1xuICBjbGVhcklucHV0QnRuRWwuZGlzYWJsZWQgPSB0cnVlO1xuICB0b2dnbGVMaXN0QnRuRWwuZGlzYWJsZWQgPSB0cnVlO1xuICBpbnB1dEVsLmRpc2FibGVkID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogRW5hYmxlIHRoZSBjb21iby1ib3ggY29tcG9uZW50XG4gKlxuICogQHBhcmFtIHtIVE1MSW5wdXRFbGVtZW50fSBlbCBBbiBlbGVtZW50IHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudFxuICovXG5jb25zdCBlbmFibGUgPSAoZWwpID0+IHtcbiAgY29uc3QgeyBpbnB1dEVsLCB0b2dnbGVMaXN0QnRuRWwsIGNsZWFySW5wdXRCdG5FbCB9ID0gZ2V0Q29tYm9Cb3hDb250ZXh0KGVsKTtcblxuICBjbGVhcklucHV0QnRuRWwuaGlkZGVuID0gZmFsc2U7XG4gIGNsZWFySW5wdXRCdG5FbC5kaXNhYmxlZCA9IGZhbHNlO1xuICB0b2dnbGVMaXN0QnRuRWwuZGlzYWJsZWQgPSBmYWxzZTtcbiAgaW5wdXRFbC5kaXNhYmxlZCA9IGZhbHNlO1xufTtcblxuLyoqXG4gKiBFbmhhbmNlIGEgc2VsZWN0IGVsZW1lbnQgaW50byBhIGNvbWJvIGJveCBjb21wb25lbnQuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gX2NvbWJvQm94RWwgVGhlIGluaXRpYWwgZWxlbWVudCBvZiB0aGUgY29tYm8gYm94IGNvbXBvbmVudFxuICovXG5jb25zdCBlbmhhbmNlQ29tYm9Cb3ggPSAoX2NvbWJvQm94RWwpID0+IHtcbiAgY29uc3QgY29tYm9Cb3hFbCA9IF9jb21ib0JveEVsLmNsb3Nlc3QoQ09NQk9fQk9YKTtcblxuICBpZiAoY29tYm9Cb3hFbC5kYXRhc2V0LmVuaGFuY2VkKSByZXR1cm47XG5cbiAgY29uc3Qgc2VsZWN0RWwgPSBjb21ib0JveEVsLnF1ZXJ5U2VsZWN0b3IoXCJzZWxlY3RcIik7XG5cbiAgaWYgKCFzZWxlY3RFbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtDT01CT19CT1h9IGlzIG1pc3NpbmcgaW5uZXIgc2VsZWN0YCk7XG4gIH1cblxuICBjb25zdCBzZWxlY3RJZCA9IHNlbGVjdEVsLmlkO1xuICBjb25zdCBzZWxlY3RMYWJlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGxhYmVsW2Zvcj1cIiR7c2VsZWN0SWR9XCJdYCk7XG4gIGNvbnN0IGxpc3RJZCA9IGAke3NlbGVjdElkfS0tbGlzdGA7XG4gIGNvbnN0IGxpc3RJZExhYmVsID0gYCR7c2VsZWN0SWR9LWxhYmVsYDtcbiAgY29uc3QgYXNzaXN0aXZlSGludElEID0gYCR7c2VsZWN0SWR9LS1hc3Npc3RpdmVIaW50YDtcbiAgY29uc3QgYWRkaXRpb25hbEF0dHJpYnV0ZXMgPSBbXTtcbiAgY29uc3QgZGVmYXVsdFZhbHVlID0gY29tYm9Cb3hFbC5kYXRhc2V0LmRlZmF1bHRWYWx1ZTtcbiAgY29uc3QgcGxhY2Vob2xkZXIgPSBjb21ib0JveEVsLmRhdGFzZXQucGxhY2Vob2xkZXI7XG4gIGxldCBzZWxlY3RlZE9wdGlvbjtcblxuICBpZiAocGxhY2Vob2xkZXIpIHtcbiAgICBhZGRpdGlvbmFsQXR0cmlidXRlcy5wdXNoKGBwbGFjZWhvbGRlcj1cIiR7cGxhY2Vob2xkZXJ9XCJgKTtcbiAgfVxuXG4gIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc2VsZWN0RWwub3B0aW9ucy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgY29uc3Qgb3B0aW9uRWwgPSBzZWxlY3RFbC5vcHRpb25zW2ldO1xuXG4gICAgICBpZiAob3B0aW9uRWwudmFsdWUgPT09IGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBzZWxlY3RlZE9wdGlvbiA9IG9wdGlvbkVsO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3cgZXJyb3IgaWYgY29tYm9ib3ggaXMgbWlzc2luZyBhIGxhYmVsIG9yIGxhYmVsIGlzIG1pc3NpbmdcbiAgICogYGZvcmAgYXR0cmlidXRlLiBPdGhlcndpc2UsIHNldCB0aGUgSUQgdG8gbWF0Y2ggdGhlIDx1bD4gYXJpYS1sYWJlbGxlZGJ5XG4gICAqL1xuICBpZiAoIXNlbGVjdExhYmVsIHx8ICFzZWxlY3RMYWJlbC5tYXRjaGVzKGBsYWJlbFtmb3I9XCIke3NlbGVjdElkfVwiXWApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7Q09NQk9fQk9YfSBmb3IgJHtzZWxlY3RJZH0gaXMgZWl0aGVyIG1pc3NpbmcgYSBsYWJlbCBvciBhIFwiZm9yXCIgYXR0cmlidXRlYFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgc2VsZWN0TGFiZWwuc2V0QXR0cmlidXRlKFwiaWRcIiwgbGlzdElkTGFiZWwpO1xuICB9XG5cbiAgc2VsZWN0TGFiZWwuc2V0QXR0cmlidXRlKFwiaWRcIiwgbGlzdElkTGFiZWwpO1xuICBzZWxlY3RFbC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gIHNlbGVjdEVsLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIik7XG4gIHNlbGVjdEVsLmNsYXNzTGlzdC5hZGQoXCJ1c2Etc3Itb25seVwiLCBTRUxFQ1RfQ0xBU1MpO1xuICBzZWxlY3RFbC5pZCA9IFwiXCI7XG4gIHNlbGVjdEVsLnZhbHVlID0gXCJcIjtcblxuICBbXCJyZXF1aXJlZFwiLCBcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0uZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgIGlmIChzZWxlY3RFbC5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gc2VsZWN0RWwuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgICAgYWRkaXRpb25hbEF0dHJpYnV0ZXMucHVzaChgJHtuYW1lfT1cIiR7dmFsdWV9XCJgKTtcbiAgICAgIHNlbGVjdEVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbWJvQm94RWwuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgW1xuICAgICAgYDxpbnB1dFxuICAgICAgICBhcmlhLW93bnM9XCIke2xpc3RJZH1cIlxuICAgICAgICBhcmlhLWF1dG9jb21wbGV0ZT1cImxpc3RcIlxuICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiJHthc3Npc3RpdmVIaW50SUR9XCJcbiAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcbiAgICAgICAgYXV0b2NhcGl0YWxpemU9XCJvZmZcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBpZD1cIiR7c2VsZWN0SWR9XCJcbiAgICAgICAgY2xhc3M9XCIke0lOUFVUX0NMQVNTfVwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgJHthZGRpdGlvbmFsQXR0cmlidXRlcy5qb2luKFwiIFwiKX1cbiAgICAgID5gLFxuICAgICAgYDxzcGFuIGNsYXNzPVwiJHtDTEVBUl9JTlBVVF9CVVRUT05fV1JBUFBFUl9DTEFTU31cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiJHtDTEVBUl9JTlBVVF9CVVRUT05fQ0xBU1N9XCIgYXJpYS1sYWJlbD1cIkNsZWFyIHRoZSBzZWxlY3QgY29udGVudHNcIj4mbmJzcDs8L2J1dHRvbj5cbiAgICAgIDwvc3Bhbj5gLFxuICAgICAgYDxzcGFuIGNsYXNzPVwiJHtJTlBVVF9CVVRUT05fU0VQQVJBVE9SX0NMQVNTfVwiPiZuYnNwOzwvc3Bhbj5gLFxuICAgICAgYDxzcGFuIGNsYXNzPVwiJHtUT0dHTEVfTElTVF9CVVRUT05fV1JBUFBFUl9DTEFTU31cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cIiR7VE9HR0xFX0xJU1RfQlVUVE9OX0NMQVNTfVwiIGFyaWEtbGFiZWw9XCJUb2dnbGUgdGhlIGRyb3Bkb3duIGxpc3RcIj4mbmJzcDs8L2J1dHRvbj5cbiAgICAgIDwvc3Bhbj5gLFxuICAgICAgYDx1bFxuICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgaWQ9XCIke2xpc3RJZH1cIlxuICAgICAgICBjbGFzcz1cIiR7TElTVF9DTEFTU31cIlxuICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT1cIiR7bGlzdElkTGFiZWx9XCJcbiAgICAgICAgaGlkZGVuPlxuICAgICAgPC91bD5gLFxuICAgICAgYDxkaXYgY2xhc3M9XCIke1NUQVRVU19DTEFTU30gdXNhLXNyLW9ubHlcIiByb2xlPVwic3RhdHVzXCI+PC9kaXY+YCxcbiAgICAgIGA8c3BhbiBpZD1cIiR7YXNzaXN0aXZlSGludElEfVwiIGNsYXNzPVwidXNhLXNyLW9ubHlcIj5cbiAgICAgICAgV2hlbiBhdXRvY29tcGxldGUgcmVzdWx0cyBhcmUgYXZhaWxhYmxlIHVzZSB1cCBhbmQgZG93biBhcnJvd3MgdG8gcmV2aWV3IGFuZCBlbnRlciB0byBzZWxlY3QuXG4gICAgICAgIFRvdWNoIGRldmljZSB1c2VycywgZXhwbG9yZSBieSB0b3VjaCBvciB3aXRoIHN3aXBlIGdlc3R1cmVzLlxuICAgICAgPC9zcGFuPmAsXG4gICAgXS5qb2luKFwiXCIpXG4gICk7XG5cbiAgaWYgKHNlbGVjdGVkT3B0aW9uKSB7XG4gICAgY29uc3QgeyBpbnB1dEVsIH0gPSBnZXRDb21ib0JveENvbnRleHQoY29tYm9Cb3hFbCk7XG4gICAgY2hhbmdlRWxlbWVudFZhbHVlKHNlbGVjdEVsLCBzZWxlY3RlZE9wdGlvbi52YWx1ZSk7XG4gICAgY2hhbmdlRWxlbWVudFZhbHVlKGlucHV0RWwsIHNlbGVjdGVkT3B0aW9uLnRleHQpO1xuICAgIGNvbWJvQm94RWwuY2xhc3NMaXN0LmFkZChDT01CT19CT1hfUFJJU1RJTkVfQ0xBU1MpO1xuICB9XG5cbiAgaWYgKHNlbGVjdEVsLmRpc2FibGVkKSB7XG4gICAgZGlzYWJsZShjb21ib0JveEVsKTtcbiAgICBzZWxlY3RFbC5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgY29tYm9Cb3hFbC5kYXRhc2V0LmVuaGFuY2VkID0gXCJ0cnVlXCI7XG59O1xuXG4vKipcbiAqIE1hbmFnZSB0aGUgZm9jdXNlZCBlbGVtZW50IHdpdGhpbiB0aGUgbGlzdCBvcHRpb25zIHdoZW5cbiAqIG5hdmlnYXRpbmcgdmlhIGtleWJvYXJkLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEFuIGFuY2hvciBlbGVtZW50IHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbmV4dEVsIEFuIGVsZW1lbnQgd2l0aGluIHRoZSBjb21ibyBib3ggY29tcG9uZW50XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBvcHRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuc2tpcEZvY3VzIHNraXAgZm9jdXMgb2YgaGlnaGxpZ2h0ZWQgaXRlbVxuICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnByZXZlbnRTY3JvbGwgc2hvdWxkIHNraXAgcHJvY2VkdXJlIHRvIHNjcm9sbCB0byBlbGVtZW50XG4gKi9cbmNvbnN0IGhpZ2hsaWdodE9wdGlvbiA9IChlbCwgbmV4dEVsLCB7IHNraXBGb2N1cywgcHJldmVudFNjcm9sbCB9ID0ge30pID0+IHtcbiAgY29uc3QgeyBpbnB1dEVsLCBsaXN0RWwsIGZvY3VzZWRPcHRpb25FbCB9ID0gZ2V0Q29tYm9Cb3hDb250ZXh0KGVsKTtcblxuICBpZiAoZm9jdXNlZE9wdGlvbkVsKSB7XG4gICAgZm9jdXNlZE9wdGlvbkVsLmNsYXNzTGlzdC5yZW1vdmUoTElTVF9PUFRJT05fRk9DVVNFRF9DTEFTUyk7XG4gICAgZm9jdXNlZE9wdGlvbkVsLnNldEF0dHJpYnV0ZShcInRhYkluZGV4XCIsIFwiLTFcIik7XG4gIH1cblxuICBpZiAobmV4dEVsKSB7XG4gICAgaW5wdXRFbC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgbmV4dEVsLmlkKTtcbiAgICBuZXh0RWwuc2V0QXR0cmlidXRlKFwidGFiSW5kZXhcIiwgXCIwXCIpO1xuICAgIG5leHRFbC5jbGFzc0xpc3QuYWRkKExJU1RfT1BUSU9OX0ZPQ1VTRURfQ0xBU1MpO1xuXG4gICAgaWYgKCFwcmV2ZW50U2Nyb2xsKSB7XG4gICAgICBjb25zdCBvcHRpb25Cb3R0b20gPSBuZXh0RWwub2Zmc2V0VG9wICsgbmV4dEVsLm9mZnNldEhlaWdodDtcbiAgICAgIGNvbnN0IGN1cnJlbnRCb3R0b20gPSBsaXN0RWwuc2Nyb2xsVG9wICsgbGlzdEVsLm9mZnNldEhlaWdodDtcblxuICAgICAgaWYgKG9wdGlvbkJvdHRvbSA+IGN1cnJlbnRCb3R0b20pIHtcbiAgICAgICAgbGlzdEVsLnNjcm9sbFRvcCA9IG9wdGlvbkJvdHRvbSAtIGxpc3RFbC5vZmZzZXRIZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0RWwub2Zmc2V0VG9wIDwgbGlzdEVsLnNjcm9sbFRvcCkge1xuICAgICAgICBsaXN0RWwuc2Nyb2xsVG9wID0gbmV4dEVsLm9mZnNldFRvcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXNraXBGb2N1cykge1xuICAgICAgbmV4dEVsLmZvY3VzKHsgcHJldmVudFNjcm9sbCB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaW5wdXRFbC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJcIik7XG4gICAgaW5wdXRFbC5mb2N1cygpO1xuICB9XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgZHluYW1pYyByZWd1bGFyIGV4cHJlc3Npb24gYmFzZWQgb2ZmIG9mIGEgcmVwbGFjZWFibGUgYW5kIHBvc3NpYmx5IGZpbHRlcmVkIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbCBBbiBlbGVtZW50IHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudFxuICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSB2YWx1ZSB0byB1c2UgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvblxuICogQHBhcmFtIHtvYmplY3R9IGV4dHJhcyBBbiBvYmplY3Qgb2YgcmVndWxhciBleHByZXNzaW9ucyB0byByZXBsYWNlIGFuZCBmaWx0ZXIgdGhlIHF1ZXJ5XG4gKi9cbmNvbnN0IGdlbmVyYXRlRHluYW1pY1JlZ0V4cCA9IChmaWx0ZXIsIHF1ZXJ5ID0gXCJcIiwgZXh0cmFzID0ge30pID0+IHtcbiAgY29uc3QgZXNjYXBlUmVnRXhwID0gKHRleHQpID0+IHtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZywgXCJcXFxcJCZcIik7XG4gIH07XG5cbiAgbGV0IGZpbmQgPSBmaWx0ZXIucmVwbGFjZSgve3soLio/KX19L2csIChtLCAkMSkgPT4ge1xuICAgIGNvbnN0IGtleSA9ICQxLnRyaW0oKTtcbiAgICBjb25zdCBxdWVyeUZpbHRlciA9IGV4dHJhc1trZXldO1xuICAgIGlmIChrZXkgIT09IFwicXVlcnlcIiAmJiBxdWVyeUZpbHRlcikge1xuICAgICAgY29uc3QgbWF0Y2hlciA9IG5ldyBSZWdFeHAocXVlcnlGaWx0ZXIsIFwiaVwiKTtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBxdWVyeS5tYXRjaChtYXRjaGVyKTtcblxuICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgcmV0dXJuIGVzY2FwZVJlZ0V4cChtYXRjaGVzWzFdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHJldHVybiBlc2NhcGVSZWdFeHAocXVlcnkpO1xuICB9KTtcblxuICBmaW5kID0gXCJeKD86XCIgKyBmaW5kICsgXCIpJFwiO1xuXG4gIHJldHVybiBuZXcgUmVnRXhwKGZpbmQsIFwiaVwiKTtcbn07XG5cbi8qKlxuICogRGlzcGxheSB0aGUgb3B0aW9uIGxpc3Qgb2YgYSBjb21ibyBib3ggY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEFuIGVsZW1lbnQgd2l0aGluIHRoZSBjb21ibyBib3ggY29tcG9uZW50XG4gKi9cbmNvbnN0IGRpc3BsYXlMaXN0ID0gKGVsKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21ib0JveEVsLFxuICAgIHNlbGVjdEVsLFxuICAgIGlucHV0RWwsXG4gICAgbGlzdEVsLFxuICAgIHN0YXR1c0VsLFxuICAgIGlzUHJpc3RpbmUsXG4gICAgZGlzYWJsZUZpbHRlcmluZyxcbiAgfSA9IGdldENvbWJvQm94Q29udGV4dChlbCk7XG4gIGxldCBzZWxlY3RlZEl0ZW1JZDtcbiAgbGV0IGZpcnN0Rm91bmRJZDtcblxuICBjb25zdCBsaXN0T3B0aW9uQmFzZUlkID0gYCR7bGlzdEVsLmlkfS0tb3B0aW9uLWA7XG5cbiAgY29uc3QgaW5wdXRWYWx1ZSA9IChpbnB1dEVsLnZhbHVlIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGZpbHRlciA9IGNvbWJvQm94RWwuZGF0YXNldC5maWx0ZXIgfHwgREVGQVVMVF9GSUxURVI7XG4gIGNvbnN0IHJlZ2V4ID0gZ2VuZXJhdGVEeW5hbWljUmVnRXhwKGZpbHRlciwgaW5wdXRWYWx1ZSwgY29tYm9Cb3hFbC5kYXRhc2V0KTtcblxuICBjb25zdCBvcHRpb25zID0gW107XG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzZWxlY3RFbC5vcHRpb25zLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgY29uc3Qgb3B0aW9uRWwgPSBzZWxlY3RFbC5vcHRpb25zW2ldO1xuICAgIGNvbnN0IG9wdGlvbklkID0gYCR7bGlzdE9wdGlvbkJhc2VJZH0ke29wdGlvbnMubGVuZ3RofWA7XG5cbiAgICBpZiAoXG4gICAgICBvcHRpb25FbC52YWx1ZSAmJlxuICAgICAgKGRpc2FibGVGaWx0ZXJpbmcgfHxcbiAgICAgICAgaXNQcmlzdGluZSB8fFxuICAgICAgICAhaW5wdXRWYWx1ZSB8fFxuICAgICAgICByZWdleC50ZXN0KG9wdGlvbkVsLnRleHQpKVxuICAgICkge1xuICAgICAgaWYgKHNlbGVjdEVsLnZhbHVlICYmIG9wdGlvbkVsLnZhbHVlID09PSBzZWxlY3RFbC52YWx1ZSkge1xuICAgICAgICBzZWxlY3RlZEl0ZW1JZCA9IG9wdGlvbklkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlzYWJsZUZpbHRlcmluZyAmJiAhZmlyc3RGb3VuZElkICYmIHJlZ2V4LnRlc3Qob3B0aW9uRWwudGV4dCkpIHtcbiAgICAgICAgZmlyc3RGb3VuZElkID0gb3B0aW9uSWQ7XG4gICAgICB9XG5cbiAgICAgIG9wdGlvbnMucHVzaChvcHRpb25FbCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbnVtT3B0aW9ucyA9IG9wdGlvbnMubGVuZ3RoO1xuICBjb25zdCBvcHRpb25IdG1sID0gb3B0aW9uc1xuICAgIC5tYXAoKG9wdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbklkID0gYCR7bGlzdE9wdGlvbkJhc2VJZH0ke2luZGV4fWA7XG4gICAgICBjb25zdCBjbGFzc2VzID0gW0xJU1RfT1BUSU9OX0NMQVNTXTtcbiAgICAgIGxldCB0YWJpbmRleCA9IFwiLTFcIjtcbiAgICAgIGxldCBhcmlhU2VsZWN0ZWQgPSBcImZhbHNlXCI7XG5cbiAgICAgIGlmIChvcHRpb25JZCA9PT0gc2VsZWN0ZWRJdGVtSWQpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKExJU1RfT1BUSU9OX1NFTEVDVEVEX0NMQVNTLCBMSVNUX09QVElPTl9GT0NVU0VEX0NMQVNTKTtcbiAgICAgICAgdGFiaW5kZXggPSBcIjBcIjtcbiAgICAgICAgYXJpYVNlbGVjdGVkID0gXCJ0cnVlXCI7XG4gICAgICB9XG5cbiAgICAgIGlmICghc2VsZWN0ZWRJdGVtSWQgJiYgaW5kZXggPT09IDApIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKExJU1RfT1BUSU9OX0ZPQ1VTRURfQ0xBU1MpO1xuICAgICAgICB0YWJpbmRleCA9IFwiMFwiO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYDxsaVxuICAgICAgICAgIGFyaWEtc2VsZWN0ZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgYXJpYS1zZXRzaXplPVwiJHtvcHRpb25zLmxlbmd0aH1cIlxuICAgICAgICAgIGFyaWEtcG9zaW5zZXQ9XCIke2luZGV4ICsgMX1cIlxuICAgICAgICAgIGFyaWEtc2VsZWN0ZWQ9XCIke2FyaWFTZWxlY3RlZH1cIlxuICAgICAgICAgIGlkPVwiJHtvcHRpb25JZH1cIlxuICAgICAgICAgIGNsYXNzPVwiJHtjbGFzc2VzLmpvaW4oXCIgXCIpfVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCIke3RhYmluZGV4fVwiXG4gICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgZGF0YS12YWx1ZT1cIiR7b3B0aW9uLnZhbHVlfVwiXG4gICAgICAgID4ke29wdGlvbi50ZXh0fTwvbGk+YDtcbiAgICB9KVxuICAgIC5qb2luKFwiXCIpO1xuXG4gIGNvbnN0IG5vUmVzdWx0cyA9IGA8bGkgY2xhc3M9XCIke0xJU1RfT1BUSU9OX0NMQVNTfS0tbm8tcmVzdWx0c1wiPk5vIHJlc3VsdHMgZm91bmQ8L2xpPmA7XG5cbiAgbGlzdEVsLmhpZGRlbiA9IGZhbHNlO1xuICBsaXN0RWwuaW5uZXJIVE1MID0gbnVtT3B0aW9ucyA/IG9wdGlvbkh0bWwgOiBub1Jlc3VsdHM7XG5cbiAgaW5wdXRFbC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIsIFwidHJ1ZVwiKTtcblxuICBzdGF0dXNFbC5pbm5lckhUTUwgPSBudW1PcHRpb25zXG4gICAgPyBgJHtudW1PcHRpb25zfSByZXN1bHQke251bU9wdGlvbnMgPiAxID8gXCJzXCIgOiBcIlwifSBhdmFpbGFibGUuYFxuICAgIDogXCJObyByZXN1bHRzLlwiO1xuXG4gIGxldCBpdGVtVG9Gb2N1cztcblxuICBpZiAoaXNQcmlzdGluZSAmJiBzZWxlY3RlZEl0ZW1JZCkge1xuICAgIGl0ZW1Ub0ZvY3VzID0gbGlzdEVsLnF1ZXJ5U2VsZWN0b3IoXCIjXCIgKyBzZWxlY3RlZEl0ZW1JZCk7XG4gIH0gZWxzZSBpZiAoZGlzYWJsZUZpbHRlcmluZyAmJiBmaXJzdEZvdW5kSWQpIHtcbiAgICBpdGVtVG9Gb2N1cyA9IGxpc3RFbC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgZmlyc3RGb3VuZElkKTtcbiAgfVxuXG4gIGlmIChpdGVtVG9Gb2N1cykge1xuICAgIGhpZ2hsaWdodE9wdGlvbihsaXN0RWwsIGl0ZW1Ub0ZvY3VzLCB7XG4gICAgICBza2lwRm9jdXM6IHRydWUsXG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogSGlkZSB0aGUgb3B0aW9uIGxpc3Qgb2YgYSBjb21ibyBib3ggY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEFuIGVsZW1lbnQgd2l0aGluIHRoZSBjb21ibyBib3ggY29tcG9uZW50XG4gKi9cbmNvbnN0IGhpZGVMaXN0ID0gKGVsKSA9PiB7XG4gIGNvbnN0IHsgaW5wdXRFbCwgbGlzdEVsLCBzdGF0dXNFbCwgZm9jdXNlZE9wdGlvbkVsIH0gPSBnZXRDb21ib0JveENvbnRleHQoZWwpO1xuXG4gIHN0YXR1c0VsLmlubmVySFRNTCA9IFwiXCI7XG5cbiAgaW5wdXRFbC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIsIFwiZmFsc2VcIik7XG4gIGlucHV0RWwuc2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiXCIpO1xuXG4gIGlmIChmb2N1c2VkT3B0aW9uRWwpIHtcbiAgICBmb2N1c2VkT3B0aW9uRWwuY2xhc3NMaXN0LnJlbW92ZShMSVNUX09QVElPTl9GT0NVU0VEX0NMQVNTKTtcbiAgfVxuXG4gIGxpc3RFbC5zY3JvbGxUb3AgPSAwO1xuICBsaXN0RWwuaGlkZGVuID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogU2VsZWN0IGFuIG9wdGlvbiBsaXN0IG9mIHRoZSBjb21ibyBib3ggY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGxpc3RPcHRpb25FbCBUaGUgbGlzdCBvcHRpb24gYmVpbmcgc2VsZWN0ZWRcbiAqL1xuY29uc3Qgc2VsZWN0SXRlbSA9IChsaXN0T3B0aW9uRWwpID0+IHtcbiAgY29uc3QgeyBjb21ib0JveEVsLCBzZWxlY3RFbCwgaW5wdXRFbCB9ID0gZ2V0Q29tYm9Cb3hDb250ZXh0KGxpc3RPcHRpb25FbCk7XG5cbiAgY2hhbmdlRWxlbWVudFZhbHVlKHNlbGVjdEVsLCBsaXN0T3B0aW9uRWwuZGF0YXNldC52YWx1ZSk7XG4gIGNoYW5nZUVsZW1lbnRWYWx1ZShpbnB1dEVsLCBsaXN0T3B0aW9uRWwudGV4dENvbnRlbnQpO1xuICBjb21ib0JveEVsLmNsYXNzTGlzdC5hZGQoQ09NQk9fQk9YX1BSSVNUSU5FX0NMQVNTKTtcbiAgaGlkZUxpc3QoY29tYm9Cb3hFbCk7XG4gIGlucHV0RWwuZm9jdXMoKTtcbn07XG5cbi8qKlxuICogQ2xlYXIgdGhlIGlucHV0IG9mIHRoZSBjb21ibyBib3hcbiAqXG4gKiBAcGFyYW0ge0hUTUxCdXR0b25FbGVtZW50fSBjbGVhckJ1dHRvbkVsIFRoZSBjbGVhciBpbnB1dCBidXR0b25cbiAqL1xuY29uc3QgY2xlYXJJbnB1dCA9IChjbGVhckJ1dHRvbkVsKSA9PiB7XG4gIGNvbnN0IHsgY29tYm9Cb3hFbCwgbGlzdEVsLCBzZWxlY3RFbCwgaW5wdXRFbCB9ID0gZ2V0Q29tYm9Cb3hDb250ZXh0KFxuICAgIGNsZWFyQnV0dG9uRWxcbiAgKTtcbiAgY29uc3QgbGlzdFNob3duID0gIWxpc3RFbC5oaWRkZW47XG5cbiAgaWYgKHNlbGVjdEVsLnZhbHVlKSBjaGFuZ2VFbGVtZW50VmFsdWUoc2VsZWN0RWwpO1xuICBpZiAoaW5wdXRFbC52YWx1ZSkgY2hhbmdlRWxlbWVudFZhbHVlKGlucHV0RWwpO1xuICBjb21ib0JveEVsLmNsYXNzTGlzdC5yZW1vdmUoQ09NQk9fQk9YX1BSSVNUSU5FX0NMQVNTKTtcblxuICBpZiAobGlzdFNob3duKSBkaXNwbGF5TGlzdChjb21ib0JveEVsKTtcbiAgaW5wdXRFbC5mb2N1cygpO1xufTtcblxuLyoqXG4gKiBSZXNldCB0aGUgc2VsZWN0IGJhc2VkIG9mZiBvZiBjdXJyZW50bHkgc2V0IHNlbGVjdCB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEFuIGVsZW1lbnQgd2l0aGluIHRoZSBjb21ibyBib3ggY29tcG9uZW50XG4gKi9cbmNvbnN0IHJlc2V0U2VsZWN0aW9uID0gKGVsKSA9PiB7XG4gIGNvbnN0IHsgY29tYm9Cb3hFbCwgc2VsZWN0RWwsIGlucHV0RWwgfSA9IGdldENvbWJvQm94Q29udGV4dChlbCk7XG5cbiAgY29uc3Qgc2VsZWN0VmFsdWUgPSBzZWxlY3RFbC52YWx1ZTtcbiAgY29uc3QgaW5wdXRWYWx1ZSA9IChpbnB1dEVsLnZhbHVlIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKHNlbGVjdFZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHNlbGVjdEVsLm9wdGlvbnMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IG9wdGlvbkVsID0gc2VsZWN0RWwub3B0aW9uc1tpXTtcbiAgICAgIGlmIChvcHRpb25FbC52YWx1ZSA9PT0gc2VsZWN0VmFsdWUpIHtcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgIT09IG9wdGlvbkVsLnRleHQpIHtcbiAgICAgICAgICBjaGFuZ2VFbGVtZW50VmFsdWUoaW5wdXRFbCwgb3B0aW9uRWwudGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgY29tYm9Cb3hFbC5jbGFzc0xpc3QuYWRkKENPTUJPX0JPWF9QUklTVElORV9DTEFTUyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaW5wdXRWYWx1ZSkge1xuICAgIGNoYW5nZUVsZW1lbnRWYWx1ZShpbnB1dEVsKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZWxlY3QgYW4gb3B0aW9uIGxpc3Qgb2YgdGhlIGNvbWJvIGJveCBjb21wb25lbnQgYmFzZWQgb2ZmIG9mXG4gKiBoYXZpbmcgYSBjdXJyZW50IGZvY3VzZWQgbGlzdCBvcHRpb24gb3JcbiAqIGhhdmluZyB0ZXN0IHRoYXQgY29tcGxldGVseSBtYXRjaGVzIGEgbGlzdCBvcHRpb24uXG4gKiBPdGhlcndpc2UgaXQgY2xlYXJzIHRoZSBpbnB1dCBhbmQgc2VsZWN0LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEFuIGVsZW1lbnQgd2l0aGluIHRoZSBjb21ibyBib3ggY29tcG9uZW50XG4gKi9cbmNvbnN0IGNvbXBsZXRlU2VsZWN0aW9uID0gKGVsKSA9PiB7XG4gIGNvbnN0IHsgY29tYm9Cb3hFbCwgc2VsZWN0RWwsIGlucHV0RWwsIHN0YXR1c0VsIH0gPSBnZXRDb21ib0JveENvbnRleHQoZWwpO1xuXG4gIHN0YXR1c0VsLnRleHRDb250ZW50ID0gXCJcIjtcblxuICBjb25zdCBpbnB1dFZhbHVlID0gKGlucHV0RWwudmFsdWUgfHwgXCJcIikudG9Mb3dlckNhc2UoKTtcblxuICBpZiAoaW5wdXRWYWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzZWxlY3RFbC5vcHRpb25zLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICBjb25zdCBvcHRpb25FbCA9IHNlbGVjdEVsLm9wdGlvbnNbaV07XG4gICAgICBpZiAob3B0aW9uRWwudGV4dC50b0xvd2VyQ2FzZSgpID09PSBpbnB1dFZhbHVlKSB7XG4gICAgICAgIGNoYW5nZUVsZW1lbnRWYWx1ZShzZWxlY3RFbCwgb3B0aW9uRWwudmFsdWUpO1xuICAgICAgICBjaGFuZ2VFbGVtZW50VmFsdWUoaW5wdXRFbCwgb3B0aW9uRWwudGV4dCk7XG4gICAgICAgIGNvbWJvQm94RWwuY2xhc3NMaXN0LmFkZChDT01CT19CT1hfUFJJU1RJTkVfQ0xBU1MpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVzZXRTZWxlY3Rpb24oY29tYm9Cb3hFbCk7XG59O1xuXG4vKipcbiAqIEhhbmRsZSB0aGUgZXNjYXBlIGV2ZW50IHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IEFuIGV2ZW50IHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudFxuICovXG5jb25zdCBoYW5kbGVFc2NhcGUgPSAoZXZlbnQpID0+IHtcbiAgY29uc3QgeyBjb21ib0JveEVsLCBpbnB1dEVsIH0gPSBnZXRDb21ib0JveENvbnRleHQoZXZlbnQudGFyZ2V0KTtcblxuICBoaWRlTGlzdChjb21ib0JveEVsKTtcbiAgcmVzZXRTZWxlY3Rpb24oY29tYm9Cb3hFbCk7XG4gIGlucHV0RWwuZm9jdXMoKTtcbn07XG5cbi8qKlxuICogSGFuZGxlIHRoZSBkb3duIGV2ZW50IHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IEFuIGV2ZW50IHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudFxuICovXG5jb25zdCBoYW5kbGVEb3duRnJvbUlucHV0ID0gKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHsgY29tYm9Cb3hFbCwgbGlzdEVsIH0gPSBnZXRDb21ib0JveENvbnRleHQoZXZlbnQudGFyZ2V0KTtcblxuICBpZiAobGlzdEVsLmhpZGRlbikge1xuICAgIGRpc3BsYXlMaXN0KGNvbWJvQm94RWwpO1xuICB9XG5cbiAgbGV0IG5leHRPcHRpb25FbCA9XG4gICAgbGlzdEVsLnF1ZXJ5U2VsZWN0b3IoTElTVF9PUFRJT05fRk9DVVNFRCkgfHxcbiAgICBsaXN0RWwucXVlcnlTZWxlY3RvcihMSVNUX09QVElPTik7XG5cbiAgaWYgKG5leHRPcHRpb25FbCkge1xuICAgIGhpZ2hsaWdodE9wdGlvbihjb21ib0JveEVsLCBuZXh0T3B0aW9uRWwpO1xuICB9XG5cbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbn07XG5cbi8qKlxuICogSGFuZGxlIHRoZSBlbnRlciBldmVudCBmcm9tIGFuIGlucHV0IGVsZW1lbnQgd2l0aGluIHRoZSBjb21ibyBib3ggY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgQW4gZXZlbnQgd2l0aGluIHRoZSBjb21ibyBib3ggY29tcG9uZW50XG4gKi9cbmNvbnN0IGhhbmRsZUVudGVyRnJvbUlucHV0ID0gKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHsgY29tYm9Cb3hFbCwgbGlzdEVsIH0gPSBnZXRDb21ib0JveENvbnRleHQoZXZlbnQudGFyZ2V0KTtcbiAgY29uc3QgbGlzdFNob3duID0gIWxpc3RFbC5oaWRkZW47XG5cbiAgY29tcGxldGVTZWxlY3Rpb24oY29tYm9Cb3hFbCk7XG5cbiAgaWYgKGxpc3RTaG93bikge1xuICAgIGhpZGVMaXN0KGNvbWJvQm94RWwpO1xuICB9XG5cbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbn07XG5cbi8qKlxuICogSGFuZGxlIHRoZSBkb3duIGV2ZW50IHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IEFuIGV2ZW50IHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudFxuICovXG5jb25zdCBoYW5kbGVEb3duRnJvbUxpc3RPcHRpb24gPSAoZXZlbnQpID0+IHtcbiAgY29uc3QgZm9jdXNlZE9wdGlvbkVsID0gZXZlbnQudGFyZ2V0O1xuICBjb25zdCBuZXh0T3B0aW9uRWwgPSBmb2N1c2VkT3B0aW9uRWwubmV4dFNpYmxpbmc7XG5cbiAgaWYgKG5leHRPcHRpb25FbCkge1xuICAgIGhpZ2hsaWdodE9wdGlvbihmb2N1c2VkT3B0aW9uRWwsIG5leHRPcHRpb25FbCk7XG4gIH1cblxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xufTtcblxuLyoqXG4gKiBIYW5kbGUgdGhlIHRhYiBldmVudCBmcm9tIGFuIGxpc3Qgb3B0aW9uIGVsZW1lbnQgd2l0aGluIHRoZSBjb21ibyBib3ggY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgQW4gZXZlbnQgd2l0aGluIHRoZSBjb21ibyBib3ggY29tcG9uZW50XG4gKi9cbmNvbnN0IGhhbmRsZVRhYkZyb21MaXN0T3B0aW9uID0gKGV2ZW50KSA9PiB7XG4gIHNlbGVjdEl0ZW0oZXZlbnQudGFyZ2V0KTtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbn07XG5cbi8qKlxuICogSGFuZGxlIHRoZSBlbnRlciBldmVudCBmcm9tIGxpc3Qgb3B0aW9uIHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IEFuIGV2ZW50IHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudFxuICovXG5jb25zdCBoYW5kbGVFbnRlckZyb21MaXN0T3B0aW9uID0gKGV2ZW50KSA9PiB7XG4gIHNlbGVjdEl0ZW0oZXZlbnQudGFyZ2V0KTtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbn07XG5cbi8qKlxuICogSGFuZGxlIHRoZSB1cCBldmVudCBmcm9tIGxpc3Qgb3B0aW9uIHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IEFuIGV2ZW50IHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudFxuICovXG5jb25zdCBoYW5kbGVVcEZyb21MaXN0T3B0aW9uID0gKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHsgY29tYm9Cb3hFbCwgbGlzdEVsLCBmb2N1c2VkT3B0aW9uRWwgfSA9IGdldENvbWJvQm94Q29udGV4dChcbiAgICBldmVudC50YXJnZXRcbiAgKTtcbiAgY29uc3QgbmV4dE9wdGlvbkVsID0gZm9jdXNlZE9wdGlvbkVsICYmIGZvY3VzZWRPcHRpb25FbC5wcmV2aW91c1NpYmxpbmc7XG4gIGNvbnN0IGxpc3RTaG93biA9ICFsaXN0RWwuaGlkZGVuO1xuXG4gIGhpZ2hsaWdodE9wdGlvbihjb21ib0JveEVsLCBuZXh0T3B0aW9uRWwpO1xuXG4gIGlmIChsaXN0U2hvd24pIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgaWYgKCFuZXh0T3B0aW9uRWwpIHtcbiAgICBoaWRlTGlzdChjb21ib0JveEVsKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZWxlY3QgbGlzdCBvcHRpb24gb24gdGhlIG1vdXNlbW92ZSBldmVudC5cbiAqXG4gKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50IFRoZSBtb3VzZW1vdmUgZXZlbnRcbiAqIEBwYXJhbSB7SFRNTExJRWxlbWVudH0gbGlzdE9wdGlvbkVsIEFuIGVsZW1lbnQgd2l0aGluIHRoZSBjb21ibyBib3ggY29tcG9uZW50XG4gKi9cbmNvbnN0IGhhbmRsZU1vdXNlbW92ZSA9IChsaXN0T3B0aW9uRWwpID0+IHtcbiAgY29uc3QgaXNDdXJyZW50bHlGb2N1c2VkID0gbGlzdE9wdGlvbkVsLmNsYXNzTGlzdC5jb250YWlucyhcbiAgICBMSVNUX09QVElPTl9GT0NVU0VEX0NMQVNTXG4gICk7XG5cbiAgaWYgKGlzQ3VycmVudGx5Rm9jdXNlZCkgcmV0dXJuO1xuXG4gIGhpZ2hsaWdodE9wdGlvbihsaXN0T3B0aW9uRWwsIGxpc3RPcHRpb25FbCwge1xuICAgIHByZXZlbnRTY3JvbGw6IHRydWUsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBUb2dnbGUgdGhlIGxpc3Qgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWRcbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBBbiBlbGVtZW50IHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudFxuICovXG5jb25zdCB0b2dnbGVMaXN0ID0gKGVsKSA9PiB7XG4gIGNvbnN0IHsgY29tYm9Cb3hFbCwgbGlzdEVsLCBpbnB1dEVsIH0gPSBnZXRDb21ib0JveENvbnRleHQoZWwpO1xuXG4gIGlmIChsaXN0RWwuaGlkZGVuKSB7XG4gICAgZGlzcGxheUxpc3QoY29tYm9Cb3hFbCk7XG4gIH0gZWxzZSB7XG4gICAgaGlkZUxpc3QoY29tYm9Cb3hFbCk7XG4gIH1cblxuICBpbnB1dEVsLmZvY3VzKCk7XG59O1xuXG4vKipcbiAqIEhhbmRsZSBjbGljayBmcm9tIGlucHV0XG4gKlxuICogQHBhcmFtIHtIVE1MSW5wdXRFbGVtZW50fSBlbCBBbiBlbGVtZW50IHdpdGhpbiB0aGUgY29tYm8gYm94IGNvbXBvbmVudFxuICovXG5jb25zdCBoYW5kbGVDbGlja0Zyb21JbnB1dCA9IChlbCkgPT4ge1xuICBjb25zdCB7IGNvbWJvQm94RWwsIGxpc3RFbCB9ID0gZ2V0Q29tYm9Cb3hDb250ZXh0KGVsKTtcblxuICBpZiAobGlzdEVsLmhpZGRlbikge1xuICAgIGRpc3BsYXlMaXN0KGNvbWJvQm94RWwpO1xuICB9XG59O1xuXG5jb25zdCBjb21ib0JveCA9IGJlaGF2aW9yKFxuICB7XG4gICAgW0NMSUNLXToge1xuICAgICAgW0lOUFVUXSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICAgICAgaGFuZGxlQ2xpY2tGcm9tSW5wdXQodGhpcyk7XG4gICAgICB9LFxuICAgICAgW1RPR0dMRV9MSVNUX0JVVFRPTl0oKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgICAgIHRvZ2dsZUxpc3QodGhpcyk7XG4gICAgICB9LFxuICAgICAgW0xJU1RfT1BUSU9OXSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICAgICAgc2VsZWN0SXRlbSh0aGlzKTtcbiAgICAgIH0sXG4gICAgICBbQ0xFQVJfSU5QVVRfQlVUVE9OXSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICAgICAgY2xlYXJJbnB1dCh0aGlzKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBmb2N1c291dDoge1xuICAgICAgW0NPTUJPX0JPWF0oZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgcmVzZXRTZWxlY3Rpb24odGhpcyk7XG4gICAgICAgICAgaGlkZUxpc3QodGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBrZXlkb3duOiB7XG4gICAgICBbQ09NQk9fQk9YXToga2V5bWFwKHtcbiAgICAgICAgRXNjYXBlOiBoYW5kbGVFc2NhcGUsXG4gICAgICB9KSxcbiAgICAgIFtJTlBVVF06IGtleW1hcCh7XG4gICAgICAgIEVudGVyOiBoYW5kbGVFbnRlckZyb21JbnB1dCxcbiAgICAgICAgQXJyb3dEb3duOiBoYW5kbGVEb3duRnJvbUlucHV0LFxuICAgICAgICBEb3duOiBoYW5kbGVEb3duRnJvbUlucHV0LFxuICAgICAgfSksXG4gICAgICBbTElTVF9PUFRJT05dOiBrZXltYXAoe1xuICAgICAgICBBcnJvd1VwOiBoYW5kbGVVcEZyb21MaXN0T3B0aW9uLFxuICAgICAgICBVcDogaGFuZGxlVXBGcm9tTGlzdE9wdGlvbixcbiAgICAgICAgQXJyb3dEb3duOiBoYW5kbGVEb3duRnJvbUxpc3RPcHRpb24sXG4gICAgICAgIERvd246IGhhbmRsZURvd25Gcm9tTGlzdE9wdGlvbixcbiAgICAgICAgRW50ZXI6IGhhbmRsZUVudGVyRnJvbUxpc3RPcHRpb24sXG4gICAgICAgIFRhYjogaGFuZGxlVGFiRnJvbUxpc3RPcHRpb24sXG4gICAgICAgIFwiU2hpZnQrVGFiXCI6IG5vb3AsXG4gICAgICB9KSxcbiAgICB9LFxuICAgIGlucHV0OiB7XG4gICAgICBbSU5QVVRdKCkge1xuICAgICAgICBjb25zdCBjb21ib0JveEVsID0gdGhpcy5jbG9zZXN0KENPTUJPX0JPWCk7XG4gICAgICAgIGNvbWJvQm94RWwuY2xhc3NMaXN0LnJlbW92ZShDT01CT19CT1hfUFJJU1RJTkVfQ0xBU1MpO1xuICAgICAgICBkaXNwbGF5TGlzdCh0aGlzKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBtb3VzZW1vdmU6IHtcbiAgICAgIFtMSVNUX09QVElPTl0oKSB7XG4gICAgICAgIGhhbmRsZU1vdXNlbW92ZSh0aGlzKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIGluaXQocm9vdCkge1xuICAgICAgc2VsZWN0KENPTUJPX0JPWCwgcm9vdCkuZm9yRWFjaCgoY29tYm9Cb3hFbCkgPT4ge1xuICAgICAgICBlbmhhbmNlQ29tYm9Cb3goY29tYm9Cb3hFbCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldENvbWJvQm94Q29udGV4dCxcbiAgICBlbmhhbmNlQ29tYm9Cb3gsXG4gICAgZ2VuZXJhdGVEeW5hbWljUmVnRXhwLFxuICAgIGRpc2FibGUsXG4gICAgZW5hYmxlLFxuICAgIGRpc3BsYXlMaXN0LFxuICAgIGhpZGVMaXN0LFxuICAgIENPTUJPX0JPWF9DTEFTUyxcbiAgfVxuKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb21ib0JveDtcbiIsImNvbnN0IGtleW1hcCA9IHJlcXVpcmUoXCJyZWNlcHRvci9rZXltYXBcIik7XG5jb25zdCBiZWhhdmlvciA9IHJlcXVpcmUoXCIuLi91dGlscy9iZWhhdmlvclwiKTtcbmNvbnN0IHNlbGVjdCA9IHJlcXVpcmUoXCIuLi91dGlscy9zZWxlY3RcIik7XG5jb25zdCB7IHByZWZpeDogUFJFRklYIH0gPSByZXF1aXJlKFwiLi4vY29uZmlnXCIpO1xuY29uc3QgeyBDTElDSyB9ID0gcmVxdWlyZShcIi4uL2V2ZW50c1wiKTtcbmNvbnN0IGFjdGl2ZUVsZW1lbnQgPSByZXF1aXJlKFwiLi4vdXRpbHMvYWN0aXZlLWVsZW1lbnRcIik7XG5jb25zdCBpc0lvc0RldmljZSA9IHJlcXVpcmUoXCIuLi91dGlscy9pcy1pb3MtZGV2aWNlXCIpO1xuXG5jb25zdCBEQVRFX1BJQ0tFUl9DTEFTUyA9IGAke1BSRUZJWH0tZGF0ZS1waWNrZXJgO1xuY29uc3QgREFURV9QSUNLRVJfV1JBUFBFUl9DTEFTUyA9IGAke0RBVEVfUElDS0VSX0NMQVNTfV9fd3JhcHBlcmA7XG5jb25zdCBEQVRFX1BJQ0tFUl9JTklUSUFMSVpFRF9DTEFTUyA9IGAke0RBVEVfUElDS0VSX0NMQVNTfS0taW5pdGlhbGl6ZWRgO1xuY29uc3QgREFURV9QSUNLRVJfQUNUSVZFX0NMQVNTID0gYCR7REFURV9QSUNLRVJfQ0xBU1N9LS1hY3RpdmVgO1xuY29uc3QgREFURV9QSUNLRVJfSU5URVJOQUxfSU5QVVRfQ0xBU1MgPSBgJHtEQVRFX1BJQ0tFUl9DTEFTU31fX2ludGVybmFsLWlucHV0YDtcbmNvbnN0IERBVEVfUElDS0VSX0VYVEVSTkFMX0lOUFVUX0NMQVNTID0gYCR7REFURV9QSUNLRVJfQ0xBU1N9X19leHRlcm5hbC1pbnB1dGA7XG5jb25zdCBEQVRFX1BJQ0tFUl9CVVRUT05fQ0xBU1MgPSBgJHtEQVRFX1BJQ0tFUl9DTEFTU31fX2J1dHRvbmA7XG5jb25zdCBEQVRFX1BJQ0tFUl9DQUxFTkRBUl9DTEFTUyA9IGAke0RBVEVfUElDS0VSX0NMQVNTfV9fY2FsZW5kYXJgO1xuY29uc3QgREFURV9QSUNLRVJfU1RBVFVTX0NMQVNTID0gYCR7REFURV9QSUNLRVJfQ0xBU1N9X19zdGF0dXNgO1xuY29uc3QgQ0FMRU5EQVJfREFURV9DTEFTUyA9IGAke0RBVEVfUElDS0VSX0NBTEVOREFSX0NMQVNTfV9fZGF0ZWA7XG5cbmNvbnN0IENBTEVOREFSX0RBVEVfRk9DVVNFRF9DTEFTUyA9IGAke0NBTEVOREFSX0RBVEVfQ0xBU1N9LS1mb2N1c2VkYDtcbmNvbnN0IENBTEVOREFSX0RBVEVfU0VMRUNURURfQ0xBU1MgPSBgJHtDQUxFTkRBUl9EQVRFX0NMQVNTfS0tc2VsZWN0ZWRgO1xuY29uc3QgQ0FMRU5EQVJfREFURV9QUkVWSU9VU19NT05USF9DTEFTUyA9IGAke0NBTEVOREFSX0RBVEVfQ0xBU1N9LS1wcmV2aW91cy1tb250aGA7XG5jb25zdCBDQUxFTkRBUl9EQVRFX0NVUlJFTlRfTU9OVEhfQ0xBU1MgPSBgJHtDQUxFTkRBUl9EQVRFX0NMQVNTfS0tY3VycmVudC1tb250aGA7XG5jb25zdCBDQUxFTkRBUl9EQVRFX05FWFRfTU9OVEhfQ0xBU1MgPSBgJHtDQUxFTkRBUl9EQVRFX0NMQVNTfS0tbmV4dC1tb250aGA7XG5jb25zdCBDQUxFTkRBUl9EQVRFX1JBTkdFX0RBVEVfQ0xBU1MgPSBgJHtDQUxFTkRBUl9EQVRFX0NMQVNTfS0tcmFuZ2UtZGF0ZWA7XG5jb25zdCBDQUxFTkRBUl9EQVRFX1RPREFZX0NMQVNTID0gYCR7Q0FMRU5EQVJfREFURV9DTEFTU30tLXRvZGF5YDtcbmNvbnN0IENBTEVOREFSX0RBVEVfUkFOR0VfREFURV9TVEFSVF9DTEFTUyA9IGAke0NBTEVOREFSX0RBVEVfQ0xBU1N9LS1yYW5nZS1kYXRlLXN0YXJ0YDtcbmNvbnN0IENBTEVOREFSX0RBVEVfUkFOR0VfREFURV9FTkRfQ0xBU1MgPSBgJHtDQUxFTkRBUl9EQVRFX0NMQVNTfS0tcmFuZ2UtZGF0ZS1lbmRgO1xuY29uc3QgQ0FMRU5EQVJfREFURV9XSVRISU5fUkFOR0VfQ0xBU1MgPSBgJHtDQUxFTkRBUl9EQVRFX0NMQVNTfS0td2l0aGluLXJhbmdlYDtcbmNvbnN0IENBTEVOREFSX1BSRVZJT1VTX1lFQVJfQ0xBU1MgPSBgJHtEQVRFX1BJQ0tFUl9DQUxFTkRBUl9DTEFTU31fX3ByZXZpb3VzLXllYXJgO1xuY29uc3QgQ0FMRU5EQVJfUFJFVklPVVNfTU9OVEhfQ0xBU1MgPSBgJHtEQVRFX1BJQ0tFUl9DQUxFTkRBUl9DTEFTU31fX3ByZXZpb3VzLW1vbnRoYDtcbmNvbnN0IENBTEVOREFSX05FWFRfWUVBUl9DTEFTUyA9IGAke0RBVEVfUElDS0VSX0NBTEVOREFSX0NMQVNTfV9fbmV4dC15ZWFyYDtcbmNvbnN0IENBTEVOREFSX05FWFRfTU9OVEhfQ0xBU1MgPSBgJHtEQVRFX1BJQ0tFUl9DQUxFTkRBUl9DTEFTU31fX25leHQtbW9udGhgO1xuY29uc3QgQ0FMRU5EQVJfTU9OVEhfU0VMRUNUSU9OX0NMQVNTID0gYCR7REFURV9QSUNLRVJfQ0FMRU5EQVJfQ0xBU1N9X19tb250aC1zZWxlY3Rpb25gO1xuY29uc3QgQ0FMRU5EQVJfWUVBUl9TRUxFQ1RJT05fQ0xBU1MgPSBgJHtEQVRFX1BJQ0tFUl9DQUxFTkRBUl9DTEFTU31fX3llYXItc2VsZWN0aW9uYDtcbmNvbnN0IENBTEVOREFSX01PTlRIX0NMQVNTID0gYCR7REFURV9QSUNLRVJfQ0FMRU5EQVJfQ0xBU1N9X19tb250aGA7XG5jb25zdCBDQUxFTkRBUl9NT05USF9GT0NVU0VEX0NMQVNTID0gYCR7Q0FMRU5EQVJfTU9OVEhfQ0xBU1N9LS1mb2N1c2VkYDtcbmNvbnN0IENBTEVOREFSX01PTlRIX1NFTEVDVEVEX0NMQVNTID0gYCR7Q0FMRU5EQVJfTU9OVEhfQ0xBU1N9LS1zZWxlY3RlZGA7XG5jb25zdCBDQUxFTkRBUl9ZRUFSX0NMQVNTID0gYCR7REFURV9QSUNLRVJfQ0FMRU5EQVJfQ0xBU1N9X195ZWFyYDtcbmNvbnN0IENBTEVOREFSX1lFQVJfRk9DVVNFRF9DTEFTUyA9IGAke0NBTEVOREFSX1lFQVJfQ0xBU1N9LS1mb2N1c2VkYDtcbmNvbnN0IENBTEVOREFSX1lFQVJfU0VMRUNURURfQ0xBU1MgPSBgJHtDQUxFTkRBUl9ZRUFSX0NMQVNTfS0tc2VsZWN0ZWRgO1xuY29uc3QgQ0FMRU5EQVJfUFJFVklPVVNfWUVBUl9DSFVOS19DTEFTUyA9IGAke0RBVEVfUElDS0VSX0NBTEVOREFSX0NMQVNTfV9fcHJldmlvdXMteWVhci1jaHVua2A7XG5jb25zdCBDQUxFTkRBUl9ORVhUX1lFQVJfQ0hVTktfQ0xBU1MgPSBgJHtEQVRFX1BJQ0tFUl9DQUxFTkRBUl9DTEFTU31fX25leHQteWVhci1jaHVua2A7XG5jb25zdCBDQUxFTkRBUl9EQVRFX1BJQ0tFUl9DTEFTUyA9IGAke0RBVEVfUElDS0VSX0NBTEVOREFSX0NMQVNTfV9fZGF0ZS1waWNrZXJgO1xuY29uc3QgQ0FMRU5EQVJfTU9OVEhfUElDS0VSX0NMQVNTID0gYCR7REFURV9QSUNLRVJfQ0FMRU5EQVJfQ0xBU1N9X19tb250aC1waWNrZXJgO1xuY29uc3QgQ0FMRU5EQVJfWUVBUl9QSUNLRVJfQ0xBU1MgPSBgJHtEQVRFX1BJQ0tFUl9DQUxFTkRBUl9DTEFTU31fX3llYXItcGlja2VyYDtcbmNvbnN0IENBTEVOREFSX1RBQkxFX0NMQVNTID0gYCR7REFURV9QSUNLRVJfQ0FMRU5EQVJfQ0xBU1N9X190YWJsZWA7XG5jb25zdCBDQUxFTkRBUl9ST1dfQ0xBU1MgPSBgJHtEQVRFX1BJQ0tFUl9DQUxFTkRBUl9DTEFTU31fX3Jvd2A7XG5jb25zdCBDQUxFTkRBUl9DRUxMX0NMQVNTID0gYCR7REFURV9QSUNLRVJfQ0FMRU5EQVJfQ0xBU1N9X19jZWxsYDtcbmNvbnN0IENBTEVOREFSX0NFTExfQ0VOVEVSX0lURU1TX0NMQVNTID0gYCR7Q0FMRU5EQVJfQ0VMTF9DTEFTU30tLWNlbnRlci1pdGVtc2A7XG5jb25zdCBDQUxFTkRBUl9NT05USF9MQUJFTF9DTEFTUyA9IGAke0RBVEVfUElDS0VSX0NBTEVOREFSX0NMQVNTfV9fbW9udGgtbGFiZWxgO1xuY29uc3QgQ0FMRU5EQVJfREFZX09GX1dFRUtfQ0xBU1MgPSBgJHtEQVRFX1BJQ0tFUl9DQUxFTkRBUl9DTEFTU31fX2RheS1vZi13ZWVrYDtcblxuY29uc3QgREFURV9QSUNLRVIgPSBgLiR7REFURV9QSUNLRVJfQ0xBU1N9YDtcbmNvbnN0IERBVEVfUElDS0VSX0JVVFRPTiA9IGAuJHtEQVRFX1BJQ0tFUl9CVVRUT05fQ0xBU1N9YDtcbmNvbnN0IERBVEVfUElDS0VSX0lOVEVSTkFMX0lOUFVUID0gYC4ke0RBVEVfUElDS0VSX0lOVEVSTkFMX0lOUFVUX0NMQVNTfWA7XG5jb25zdCBEQVRFX1BJQ0tFUl9FWFRFUk5BTF9JTlBVVCA9IGAuJHtEQVRFX1BJQ0tFUl9FWFRFUk5BTF9JTlBVVF9DTEFTU31gO1xuY29uc3QgREFURV9QSUNLRVJfQ0FMRU5EQVIgPSBgLiR7REFURV9QSUNLRVJfQ0FMRU5EQVJfQ0xBU1N9YDtcbmNvbnN0IERBVEVfUElDS0VSX1NUQVRVUyA9IGAuJHtEQVRFX1BJQ0tFUl9TVEFUVVNfQ0xBU1N9YDtcbmNvbnN0IENBTEVOREFSX0RBVEUgPSBgLiR7Q0FMRU5EQVJfREFURV9DTEFTU31gO1xuY29uc3QgQ0FMRU5EQVJfREFURV9GT0NVU0VEID0gYC4ke0NBTEVOREFSX0RBVEVfRk9DVVNFRF9DTEFTU31gO1xuY29uc3QgQ0FMRU5EQVJfREFURV9DVVJSRU5UX01PTlRIID0gYC4ke0NBTEVOREFSX0RBVEVfQ1VSUkVOVF9NT05USF9DTEFTU31gO1xuY29uc3QgQ0FMRU5EQVJfUFJFVklPVVNfWUVBUiA9IGAuJHtDQUxFTkRBUl9QUkVWSU9VU19ZRUFSX0NMQVNTfWA7XG5jb25zdCBDQUxFTkRBUl9QUkVWSU9VU19NT05USCA9IGAuJHtDQUxFTkRBUl9QUkVWSU9VU19NT05USF9DTEFTU31gO1xuY29uc3QgQ0FMRU5EQVJfTkVYVF9ZRUFSID0gYC4ke0NBTEVOREFSX05FWFRfWUVBUl9DTEFTU31gO1xuY29uc3QgQ0FMRU5EQVJfTkVYVF9NT05USCA9IGAuJHtDQUxFTkRBUl9ORVhUX01PTlRIX0NMQVNTfWA7XG5jb25zdCBDQUxFTkRBUl9ZRUFSX1NFTEVDVElPTiA9IGAuJHtDQUxFTkRBUl9ZRUFSX1NFTEVDVElPTl9DTEFTU31gO1xuY29uc3QgQ0FMRU5EQVJfTU9OVEhfU0VMRUNUSU9OID0gYC4ke0NBTEVOREFSX01PTlRIX1NFTEVDVElPTl9DTEFTU31gO1xuY29uc3QgQ0FMRU5EQVJfTU9OVEggPSBgLiR7Q0FMRU5EQVJfTU9OVEhfQ0xBU1N9YDtcbmNvbnN0IENBTEVOREFSX1lFQVIgPSBgLiR7Q0FMRU5EQVJfWUVBUl9DTEFTU31gO1xuY29uc3QgQ0FMRU5EQVJfUFJFVklPVVNfWUVBUl9DSFVOSyA9IGAuJHtDQUxFTkRBUl9QUkVWSU9VU19ZRUFSX0NIVU5LX0NMQVNTfWA7XG5jb25zdCBDQUxFTkRBUl9ORVhUX1lFQVJfQ0hVTksgPSBgLiR7Q0FMRU5EQVJfTkVYVF9ZRUFSX0NIVU5LX0NMQVNTfWA7XG5jb25zdCBDQUxFTkRBUl9EQVRFX1BJQ0tFUiA9IGAuJHtDQUxFTkRBUl9EQVRFX1BJQ0tFUl9DTEFTU31gO1xuY29uc3QgQ0FMRU5EQVJfTU9OVEhfUElDS0VSID0gYC4ke0NBTEVOREFSX01PTlRIX1BJQ0tFUl9DTEFTU31gO1xuY29uc3QgQ0FMRU5EQVJfWUVBUl9QSUNLRVIgPSBgLiR7Q0FMRU5EQVJfWUVBUl9QSUNLRVJfQ0xBU1N9YDtcbmNvbnN0IENBTEVOREFSX01PTlRIX0ZPQ1VTRUQgPSBgLiR7Q0FMRU5EQVJfTU9OVEhfRk9DVVNFRF9DTEFTU31gO1xuY29uc3QgQ0FMRU5EQVJfWUVBUl9GT0NVU0VEID0gYC4ke0NBTEVOREFSX1lFQVJfRk9DVVNFRF9DTEFTU31gO1xuXG5jb25zdCBWQUxJREFUSU9OX01FU1NBR0UgPSBcIlBsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGVcIjtcblxuY29uc3QgTU9OVEhfTEFCRUxTID0gW1xuICBcIkphbnVhcnlcIixcbiAgXCJGZWJydWFyeVwiLFxuICBcIk1hcmNoXCIsXG4gIFwiQXByaWxcIixcbiAgXCJNYXlcIixcbiAgXCJKdW5lXCIsXG4gIFwiSnVseVwiLFxuICBcIkF1Z3VzdFwiLFxuICBcIlNlcHRlbWJlclwiLFxuICBcIk9jdG9iZXJcIixcbiAgXCJOb3ZlbWJlclwiLFxuICBcIkRlY2VtYmVyXCIsXG5dO1xuXG5jb25zdCBEQVlfT0ZfV0VFS19MQUJFTFMgPSBbXG4gIFwiU3VuZGF5XCIsXG4gIFwiTW9uZGF5XCIsXG4gIFwiVHVlc2RheVwiLFxuICBcIldlZG5lc2RheVwiLFxuICBcIlRodXJzZGF5XCIsXG4gIFwiRnJpZGF5XCIsXG4gIFwiU2F0dXJkYXlcIixcbl07XG5cbmNvbnN0IEVOVEVSX0tFWUNPREUgPSAxMztcblxuY29uc3QgWUVBUl9DSFVOSyA9IDEyO1xuXG5jb25zdCBERUZBVUxUX01JTl9EQVRFID0gXCIwMDAwLTAxLTAxXCI7XG5jb25zdCBERUZBVUxUX0VYVEVSTkFMX0RBVEVfRk9STUFUID0gXCJNTS9ERC9ZWVlZXCI7XG5jb25zdCBJTlRFUk5BTF9EQVRFX0ZPUk1BVCA9IFwiWVlZWS1NTS1ERFwiO1xuXG5jb25zdCBOT1RfRElTQUJMRURfU0VMRUNUT1IgPSBcIjpub3QoW2Rpc2FibGVkXSlcIjtcblxuY29uc3QgcHJvY2Vzc0ZvY3VzYWJsZVNlbGVjdG9ycyA9ICguLi5zZWxlY3RvcnMpID0+XG4gIHNlbGVjdG9ycy5tYXAoKHF1ZXJ5KSA9PiBxdWVyeSArIE5PVF9ESVNBQkxFRF9TRUxFQ1RPUikuam9pbihcIiwgXCIpO1xuXG5jb25zdCBEQVRFX1BJQ0tFUl9GT0NVU0FCTEUgPSBwcm9jZXNzRm9jdXNhYmxlU2VsZWN0b3JzKFxuICBDQUxFTkRBUl9QUkVWSU9VU19ZRUFSLFxuICBDQUxFTkRBUl9QUkVWSU9VU19NT05USCxcbiAgQ0FMRU5EQVJfWUVBUl9TRUxFQ1RJT04sXG4gIENBTEVOREFSX01PTlRIX1NFTEVDVElPTixcbiAgQ0FMRU5EQVJfTkVYVF9ZRUFSLFxuICBDQUxFTkRBUl9ORVhUX01PTlRILFxuICBDQUxFTkRBUl9EQVRFX0ZPQ1VTRURcbik7XG5cbmNvbnN0IE1PTlRIX1BJQ0tFUl9GT0NVU0FCTEUgPSBwcm9jZXNzRm9jdXNhYmxlU2VsZWN0b3JzKFxuICBDQUxFTkRBUl9NT05USF9GT0NVU0VEXG4pO1xuXG5jb25zdCBZRUFSX1BJQ0tFUl9GT0NVU0FCTEUgPSBwcm9jZXNzRm9jdXNhYmxlU2VsZWN0b3JzKFxuICBDQUxFTkRBUl9QUkVWSU9VU19ZRUFSX0NIVU5LLFxuICBDQUxFTkRBUl9ORVhUX1lFQVJfQ0hVTkssXG4gIENBTEVOREFSX1lFQVJfRk9DVVNFRFxuKTtcblxuLy8gI3JlZ2lvbiBEYXRlIE1hbmlwdWxhdGlvbiBGdW5jdGlvbnNcblxuLyoqXG4gKiBLZWVwIGRhdGUgd2l0aGluIG1vbnRoLiBNb250aCB3b3VsZCBvbmx5IGJlIG92ZXIgYnkgMSB0byAzIGRheXNcbiAqXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGVUb0NoZWNrIHRoZSBkYXRlIG9iamVjdCB0byBjaGVja1xuICogQHBhcmFtIHtudW1iZXJ9IG1vbnRoIHRoZSBjb3JyZWN0IG1vbnRoXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIGRhdGUsIGNvcnJlY3RlZCBpZiBuZWVkZWRcbiAqL1xuY29uc3Qga2VlcERhdGVXaXRoaW5Nb250aCA9IChkYXRlVG9DaGVjaywgbW9udGgpID0+IHtcbiAgaWYgKG1vbnRoICE9PSBkYXRlVG9DaGVjay5nZXRNb250aCgpKSB7XG4gICAgZGF0ZVRvQ2hlY2suc2V0RGF0ZSgwKTtcbiAgfVxuXG4gIHJldHVybiBkYXRlVG9DaGVjaztcbn07XG5cbi8qKlxuICogU2V0IGRhdGUgZnJvbSBtb250aCBkYXkgeWVhclxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB5ZWFyIHRoZSB5ZWFyIHRvIHNldFxuICogQHBhcmFtIHtudW1iZXJ9IG1vbnRoIHRoZSBtb250aCB0byBzZXQgKHplcm8taW5kZXhlZClcbiAqIEBwYXJhbSB7bnVtYmVyfSBkYXRlIHRoZSBkYXRlIHRvIHNldFxuICogQHJldHVybnMge0RhdGV9IHRoZSBzZXQgZGF0ZVxuICovXG5jb25zdCBzZXREYXRlID0gKHllYXIsIG1vbnRoLCBkYXRlKSA9PiB7XG4gIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSgwKTtcbiAgbmV3RGF0ZS5zZXRGdWxsWWVhcih5ZWFyLCBtb250aCwgZGF0ZSk7XG4gIHJldHVybiBuZXdEYXRlO1xufTtcblxuLyoqXG4gKiB0b2RheXMgZGF0ZVxuICpcbiAqIEByZXR1cm5zIHtEYXRlfSB0b2RheXMgZGF0ZVxuICovXG5jb25zdCB0b2RheSA9ICgpID0+IHtcbiAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGRheSA9IG5ld0RhdGUuZ2V0RGF0ZSgpO1xuICBjb25zdCBtb250aCA9IG5ld0RhdGUuZ2V0TW9udGgoKTtcbiAgY29uc3QgeWVhciA9IG5ld0RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgcmV0dXJuIHNldERhdGUoeWVhciwgbW9udGgsIGRheSk7XG59O1xuXG4vKipcbiAqIFNldCBkYXRlIHRvIGZpcnN0IGRheSBvZiB0aGUgbW9udGhcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGF0ZSB0aGUgZGF0ZSB0byBhZGp1c3RcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgYWRqdXN0ZWQgZGF0ZVxuICovXG5jb25zdCBzdGFydE9mTW9udGggPSAoZGF0ZSkgPT4ge1xuICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoMCk7XG4gIG5ld0RhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIDEpO1xuICByZXR1cm4gbmV3RGF0ZTtcbn07XG5cbi8qKlxuICogU2V0IGRhdGUgdG8gbGFzdCBkYXkgb2YgdGhlIG1vbnRoXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGRhdGUgdGhlIGRhdGUgdG8gYWRqdXN0XG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIGFkanVzdGVkIGRhdGVcbiAqL1xuY29uc3QgbGFzdERheU9mTW9udGggPSAoZGF0ZSkgPT4ge1xuICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoMCk7XG4gIG5ld0RhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCAwKTtcbiAgcmV0dXJuIG5ld0RhdGU7XG59O1xuXG4vKipcbiAqIEFkZCBkYXlzIHRvIGRhdGVcbiAqXG4gKiBAcGFyYW0ge0RhdGV9IF9kYXRlIHRoZSBkYXRlIHRvIGFkanVzdFxuICogQHBhcmFtIHtudW1iZXJ9IG51bURheXMgdGhlIGRpZmZlcmVuY2UgaW4gZGF5c1xuICogQHJldHVybnMge0RhdGV9IHRoZSBhZGp1c3RlZCBkYXRlXG4gKi9cbmNvbnN0IGFkZERheXMgPSAoX2RhdGUsIG51bURheXMpID0+IHtcbiAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKF9kYXRlLmdldFRpbWUoKSk7XG4gIG5ld0RhdGUuc2V0RGF0ZShuZXdEYXRlLmdldERhdGUoKSArIG51bURheXMpO1xuICByZXR1cm4gbmV3RGF0ZTtcbn07XG5cbi8qKlxuICogU3VidHJhY3QgZGF5cyBmcm9tIGRhdGVcbiAqXG4gKiBAcGFyYW0ge0RhdGV9IF9kYXRlIHRoZSBkYXRlIHRvIGFkanVzdFxuICogQHBhcmFtIHtudW1iZXJ9IG51bURheXMgdGhlIGRpZmZlcmVuY2UgaW4gZGF5c1xuICogQHJldHVybnMge0RhdGV9IHRoZSBhZGp1c3RlZCBkYXRlXG4gKi9cbmNvbnN0IHN1YkRheXMgPSAoX2RhdGUsIG51bURheXMpID0+IGFkZERheXMoX2RhdGUsIC1udW1EYXlzKTtcblxuLyoqXG4gKiBBZGQgd2Vla3MgdG8gZGF0ZVxuICpcbiAqIEBwYXJhbSB7RGF0ZX0gX2RhdGUgdGhlIGRhdGUgdG8gYWRqdXN0XG4gKiBAcGFyYW0ge251bWJlcn0gbnVtV2Vla3MgdGhlIGRpZmZlcmVuY2UgaW4gd2Vla3NcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgYWRqdXN0ZWQgZGF0ZVxuICovXG5jb25zdCBhZGRXZWVrcyA9IChfZGF0ZSwgbnVtV2Vla3MpID0+IGFkZERheXMoX2RhdGUsIG51bVdlZWtzICogNyk7XG5cbi8qKlxuICogU3VidHJhY3Qgd2Vla3MgZnJvbSBkYXRlXG4gKlxuICogQHBhcmFtIHtEYXRlfSBfZGF0ZSB0aGUgZGF0ZSB0byBhZGp1c3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1XZWVrcyB0aGUgZGlmZmVyZW5jZSBpbiB3ZWVrc1xuICogQHJldHVybnMge0RhdGV9IHRoZSBhZGp1c3RlZCBkYXRlXG4gKi9cbmNvbnN0IHN1YldlZWtzID0gKF9kYXRlLCBudW1XZWVrcykgPT4gYWRkV2Vla3MoX2RhdGUsIC1udW1XZWVrcyk7XG5cbi8qKlxuICogU2V0IGRhdGUgdG8gdGhlIHN0YXJ0IG9mIHRoZSB3ZWVrIChTdW5kYXkpXG4gKlxuICogQHBhcmFtIHtEYXRlfSBfZGF0ZSB0aGUgZGF0ZSB0byBhZGp1c3RcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgYWRqdXN0ZWQgZGF0ZVxuICovXG5jb25zdCBzdGFydE9mV2VlayA9IChfZGF0ZSkgPT4ge1xuICBjb25zdCBkYXlPZldlZWsgPSBfZGF0ZS5nZXREYXkoKTtcbiAgcmV0dXJuIHN1YkRheXMoX2RhdGUsIGRheU9mV2Vlayk7XG59O1xuXG4vKipcbiAqIFNldCBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIHdlZWsgKFNhdHVyZGF5KVxuICpcbiAqIEBwYXJhbSB7RGF0ZX0gX2RhdGUgdGhlIGRhdGUgdG8gYWRqdXN0XG4gKiBAcGFyYW0ge251bWJlcn0gbnVtV2Vla3MgdGhlIGRpZmZlcmVuY2UgaW4gd2Vla3NcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgYWRqdXN0ZWQgZGF0ZVxuICovXG5jb25zdCBlbmRPZldlZWsgPSAoX2RhdGUpID0+IHtcbiAgY29uc3QgZGF5T2ZXZWVrID0gX2RhdGUuZ2V0RGF5KCk7XG4gIHJldHVybiBhZGREYXlzKF9kYXRlLCA2IC0gZGF5T2ZXZWVrKTtcbn07XG5cbi8qKlxuICogQWRkIG1vbnRocyB0byBkYXRlIGFuZCBrZWVwIGRhdGUgd2l0aGluIG1vbnRoXG4gKlxuICogQHBhcmFtIHtEYXRlfSBfZGF0ZSB0aGUgZGF0ZSB0byBhZGp1c3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1Nb250aHMgdGhlIGRpZmZlcmVuY2UgaW4gbW9udGhzXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIGFkanVzdGVkIGRhdGVcbiAqL1xuY29uc3QgYWRkTW9udGhzID0gKF9kYXRlLCBudW1Nb250aHMpID0+IHtcbiAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKF9kYXRlLmdldFRpbWUoKSk7XG5cbiAgY29uc3QgZGF0ZU1vbnRoID0gKG5ld0RhdGUuZ2V0TW9udGgoKSArIDEyICsgbnVtTW9udGhzKSAlIDEyO1xuICBuZXdEYXRlLnNldE1vbnRoKG5ld0RhdGUuZ2V0TW9udGgoKSArIG51bU1vbnRocyk7XG4gIGtlZXBEYXRlV2l0aGluTW9udGgobmV3RGF0ZSwgZGF0ZU1vbnRoKTtcblxuICByZXR1cm4gbmV3RGF0ZTtcbn07XG5cbi8qKlxuICogU3VidHJhY3QgbW9udGhzIGZyb20gZGF0ZVxuICpcbiAqIEBwYXJhbSB7RGF0ZX0gX2RhdGUgdGhlIGRhdGUgdG8gYWRqdXN0XG4gKiBAcGFyYW0ge251bWJlcn0gbnVtTW9udGhzIHRoZSBkaWZmZXJlbmNlIGluIG1vbnRoc1xuICogQHJldHVybnMge0RhdGV9IHRoZSBhZGp1c3RlZCBkYXRlXG4gKi9cbmNvbnN0IHN1Yk1vbnRocyA9IChfZGF0ZSwgbnVtTW9udGhzKSA9PiBhZGRNb250aHMoX2RhdGUsIC1udW1Nb250aHMpO1xuXG4vKipcbiAqIEFkZCB5ZWFycyB0byBkYXRlIGFuZCBrZWVwIGRhdGUgd2l0aGluIG1vbnRoXG4gKlxuICogQHBhcmFtIHtEYXRlfSBfZGF0ZSB0aGUgZGF0ZSB0byBhZGp1c3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1ZZWFycyB0aGUgZGlmZmVyZW5jZSBpbiB5ZWFyc1xuICogQHJldHVybnMge0RhdGV9IHRoZSBhZGp1c3RlZCBkYXRlXG4gKi9cbmNvbnN0IGFkZFllYXJzID0gKF9kYXRlLCBudW1ZZWFycykgPT4gYWRkTW9udGhzKF9kYXRlLCBudW1ZZWFycyAqIDEyKTtcblxuLyoqXG4gKiBTdWJ0cmFjdCB5ZWFycyBmcm9tIGRhdGVcbiAqXG4gKiBAcGFyYW0ge0RhdGV9IF9kYXRlIHRoZSBkYXRlIHRvIGFkanVzdFxuICogQHBhcmFtIHtudW1iZXJ9IG51bVllYXJzIHRoZSBkaWZmZXJlbmNlIGluIHllYXJzXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIGFkanVzdGVkIGRhdGVcbiAqL1xuY29uc3Qgc3ViWWVhcnMgPSAoX2RhdGUsIG51bVllYXJzKSA9PiBhZGRZZWFycyhfZGF0ZSwgLW51bVllYXJzKTtcblxuLyoqXG4gKiBTZXQgbW9udGhzIG9mIGRhdGVcbiAqXG4gKiBAcGFyYW0ge0RhdGV9IF9kYXRlIHRoZSBkYXRlIHRvIGFkanVzdFxuICogQHBhcmFtIHtudW1iZXJ9IG1vbnRoIHplcm8taW5kZXhlZCBtb250aCB0byBzZXRcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgYWRqdXN0ZWQgZGF0ZVxuICovXG5jb25zdCBzZXRNb250aCA9IChfZGF0ZSwgbW9udGgpID0+IHtcbiAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKF9kYXRlLmdldFRpbWUoKSk7XG5cbiAgbmV3RGF0ZS5zZXRNb250aChtb250aCk7XG4gIGtlZXBEYXRlV2l0aGluTW9udGgobmV3RGF0ZSwgbW9udGgpO1xuXG4gIHJldHVybiBuZXdEYXRlO1xufTtcblxuLyoqXG4gKiBTZXQgeWVhciBvZiBkYXRlXG4gKlxuICogQHBhcmFtIHtEYXRlfSBfZGF0ZSB0aGUgZGF0ZSB0byBhZGp1c3RcbiAqIEBwYXJhbSB7bnVtYmVyfSB5ZWFyIHRoZSB5ZWFyIHRvIHNldFxuICogQHJldHVybnMge0RhdGV9IHRoZSBhZGp1c3RlZCBkYXRlXG4gKi9cbmNvbnN0IHNldFllYXIgPSAoX2RhdGUsIHllYXIpID0+IHtcbiAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKF9kYXRlLmdldFRpbWUoKSk7XG5cbiAgY29uc3QgbW9udGggPSBuZXdEYXRlLmdldE1vbnRoKCk7XG4gIG5ld0RhdGUuc2V0RnVsbFllYXIoeWVhcik7XG4gIGtlZXBEYXRlV2l0aGluTW9udGgobmV3RGF0ZSwgbW9udGgpO1xuXG4gIHJldHVybiBuZXdEYXRlO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGVhcmxpZXN0IGRhdGVcbiAqXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGVBIGRhdGUgdG8gY29tcGFyZVxuICogQHBhcmFtIHtEYXRlfSBkYXRlQiBkYXRlIHRvIGNvbXBhcmVcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgZWFybGllc3QgZGF0ZVxuICovXG5jb25zdCBtaW4gPSAoZGF0ZUEsIGRhdGVCKSA9PiB7XG4gIGxldCBuZXdEYXRlID0gZGF0ZUE7XG5cbiAgaWYgKGRhdGVCIDwgZGF0ZUEpIHtcbiAgICBuZXdEYXRlID0gZGF0ZUI7XG4gIH1cblxuICByZXR1cm4gbmV3IERhdGUobmV3RGF0ZS5nZXRUaW1lKCkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxhdGVzdCBkYXRlXG4gKlxuICogQHBhcmFtIHtEYXRlfSBkYXRlQSBkYXRlIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSB7RGF0ZX0gZGF0ZUIgZGF0ZSB0byBjb21wYXJlXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIGxhdGVzdCBkYXRlXG4gKi9cbmNvbnN0IG1heCA9IChkYXRlQSwgZGF0ZUIpID0+IHtcbiAgbGV0IG5ld0RhdGUgPSBkYXRlQTtcblxuICBpZiAoZGF0ZUIgPiBkYXRlQSkge1xuICAgIG5ld0RhdGUgPSBkYXRlQjtcbiAgfVxuXG4gIHJldHVybiBuZXcgRGF0ZShuZXdEYXRlLmdldFRpbWUoKSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGRhdGVzIGFyZSB0aGUgaW4gdGhlIHNhbWUgeWVhclxuICpcbiAqIEBwYXJhbSB7RGF0ZX0gZGF0ZUEgZGF0ZSB0byBjb21wYXJlXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGVCIGRhdGUgdG8gY29tcGFyZVxuICogQHJldHVybnMge2Jvb2xlYW59IGFyZSBkYXRlcyBpbiB0aGUgc2FtZSB5ZWFyXG4gKi9cbmNvbnN0IGlzU2FtZVllYXIgPSAoZGF0ZUEsIGRhdGVCKSA9PiB7XG4gIHJldHVybiBkYXRlQSAmJiBkYXRlQiAmJiBkYXRlQS5nZXRGdWxsWWVhcigpID09PSBkYXRlQi5nZXRGdWxsWWVhcigpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBkYXRlcyBhcmUgdGhlIGluIHRoZSBzYW1lIG1vbnRoXG4gKlxuICogQHBhcmFtIHtEYXRlfSBkYXRlQSBkYXRlIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSB7RGF0ZX0gZGF0ZUIgZGF0ZSB0byBjb21wYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYXJlIGRhdGVzIGluIHRoZSBzYW1lIG1vbnRoXG4gKi9cbmNvbnN0IGlzU2FtZU1vbnRoID0gKGRhdGVBLCBkYXRlQikgPT4ge1xuICByZXR1cm4gaXNTYW1lWWVhcihkYXRlQSwgZGF0ZUIpICYmIGRhdGVBLmdldE1vbnRoKCkgPT09IGRhdGVCLmdldE1vbnRoKCk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGRhdGVzIGFyZSB0aGUgc2FtZSBkYXRlXG4gKlxuICogQHBhcmFtIHtEYXRlfSBkYXRlQSB0aGUgZGF0ZSB0byBjb21wYXJlXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGVBIHRoZSBkYXRlIHRvIGNvbXBhcmVcbiAqIEByZXR1cm5zIHtib29sZWFufSBhcmUgZGF0ZXMgdGhlIHNhbWUgZGF0ZVxuICovXG5jb25zdCBpc1NhbWVEYXkgPSAoZGF0ZUEsIGRhdGVCKSA9PiB7XG4gIHJldHVybiBpc1NhbWVNb250aChkYXRlQSwgZGF0ZUIpICYmIGRhdGVBLmdldERhdGUoKSA9PT0gZGF0ZUIuZ2V0RGF0ZSgpO1xufTtcblxuLyoqXG4gKiByZXR1cm4gYSBuZXcgZGF0ZSB3aXRoaW4gbWluaW11bSBhbmQgbWF4aW11bSBkYXRlXG4gKlxuICogQHBhcmFtIHtEYXRlfSBkYXRlIGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSB7RGF0ZX0gbWluRGF0ZSBtaW5pbXVtIGRhdGUgdG8gYWxsb3dcbiAqIEBwYXJhbSB7RGF0ZX0gbWF4RGF0ZSBtYXhpbXVtIGRhdGUgdG8gYWxsb3dcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgZGF0ZSBiZXR3ZWVuIG1pbiBhbmQgbWF4XG4gKi9cbmNvbnN0IGtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCA9IChkYXRlLCBtaW5EYXRlLCBtYXhEYXRlKSA9PiB7XG4gIGxldCBuZXdEYXRlID0gZGF0ZTtcblxuICBpZiAoZGF0ZSA8IG1pbkRhdGUpIHtcbiAgICBuZXdEYXRlID0gbWluRGF0ZTtcbiAgfSBlbHNlIGlmIChtYXhEYXRlICYmIGRhdGUgPiBtYXhEYXRlKSB7XG4gICAgbmV3RGF0ZSA9IG1heERhdGU7XG4gIH1cblxuICByZXR1cm4gbmV3IERhdGUobmV3RGF0ZS5nZXRUaW1lKCkpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBkYXRlcyBpcyB2YWxpZC5cbiAqXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGUgZGF0ZSB0byBjaGVja1xuICogQHBhcmFtIHtEYXRlfSBtaW5EYXRlIG1pbmltdW0gZGF0ZSB0byBhbGxvd1xuICogQHBhcmFtIHtEYXRlfSBtYXhEYXRlIG1heGltdW0gZGF0ZSB0byBhbGxvd1xuICogQHJldHVybiB7Ym9vbGVhbn0gaXMgdGhlcmUgYSBkYXkgd2l0aGluIHRoZSBtb250aCB3aXRoaW4gbWluIGFuZCBtYXggZGF0ZXNcbiAqL1xuY29uc3QgaXNEYXRlV2l0aGluTWluQW5kTWF4ID0gKGRhdGUsIG1pbkRhdGUsIG1heERhdGUpID0+XG4gIGRhdGUgPj0gbWluRGF0ZSAmJiAoIW1heERhdGUgfHwgZGF0ZSA8PSBtYXhEYXRlKTtcblxuLyoqXG4gKiBDaGVjayBpZiBkYXRlcyBtb250aCBpcyBpbnZhbGlkLlxuICpcbiAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0ge0RhdGV9IG1pbkRhdGUgbWluaW11bSBkYXRlIHRvIGFsbG93XG4gKiBAcGFyYW0ge0RhdGV9IG1heERhdGUgbWF4aW11bSBkYXRlIHRvIGFsbG93XG4gKiBAcmV0dXJuIHtib29sZWFufSBpcyB0aGUgbW9udGggb3V0c2lkZSBtaW4gb3IgbWF4IGRhdGVzXG4gKi9cbmNvbnN0IGlzRGF0ZXNNb250aE91dHNpZGVNaW5Pck1heCA9IChkYXRlLCBtaW5EYXRlLCBtYXhEYXRlKSA9PiB7XG4gIHJldHVybiAoXG4gICAgbGFzdERheU9mTW9udGgoZGF0ZSkgPCBtaW5EYXRlIHx8IChtYXhEYXRlICYmIHN0YXJ0T2ZNb250aChkYXRlKSA+IG1heERhdGUpXG4gICk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGRhdGVzIHllYXIgaXMgaW52YWxpZC5cbiAqXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGUgZGF0ZSB0byBjaGVja1xuICogQHBhcmFtIHtEYXRlfSBtaW5EYXRlIG1pbmltdW0gZGF0ZSB0byBhbGxvd1xuICogQHBhcmFtIHtEYXRlfSBtYXhEYXRlIG1heGltdW0gZGF0ZSB0byBhbGxvd1xuICogQHJldHVybiB7Ym9vbGVhbn0gaXMgdGhlIG1vbnRoIG91dHNpZGUgbWluIG9yIG1heCBkYXRlc1xuICovXG5jb25zdCBpc0RhdGVzWWVhck91dHNpZGVNaW5Pck1heCA9IChkYXRlLCBtaW5EYXRlLCBtYXhEYXRlKSA9PiB7XG4gIHJldHVybiAoXG4gICAgbGFzdERheU9mTW9udGgoc2V0TW9udGgoZGF0ZSwgMTEpKSA8IG1pbkRhdGUgfHxcbiAgICAobWF4RGF0ZSAmJiBzdGFydE9mTW9udGgoc2V0TW9udGgoZGF0ZSwgMCkpID4gbWF4RGF0ZSlcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgYSBkYXRlIHdpdGggZm9ybWF0IE0tRC1ZWVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlU3RyaW5nIHRoZSBkYXRlIHN0cmluZyB0byBwYXJzZVxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGVGb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgZGF0ZSBzdHJpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWRqdXN0RGF0ZSBzaG91bGQgdGhlIGRhdGUgYmUgYWRqdXN0ZWRcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgcGFyc2VkIGRhdGVcbiAqL1xuY29uc3QgcGFyc2VEYXRlU3RyaW5nID0gKFxuICBkYXRlU3RyaW5nLFxuICBkYXRlRm9ybWF0ID0gSU5URVJOQUxfREFURV9GT1JNQVQsXG4gIGFkanVzdERhdGUgPSBmYWxzZVxuKSA9PiB7XG4gIGxldCBkYXRlO1xuICBsZXQgbW9udGg7XG4gIGxldCBkYXk7XG4gIGxldCB5ZWFyO1xuICBsZXQgcGFyc2VkO1xuXG4gIGlmIChkYXRlU3RyaW5nKSB7XG4gICAgbGV0IG1vbnRoU3RyLCBkYXlTdHIsIHllYXJTdHI7XG5cbiAgICBpZiAoZGF0ZUZvcm1hdCA9PT0gREVGQVVMVF9FWFRFUk5BTF9EQVRFX0ZPUk1BVCkge1xuICAgICAgW21vbnRoU3RyLCBkYXlTdHIsIHllYXJTdHJdID0gZGF0ZVN0cmluZy5zcGxpdChcIi9cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIFt5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyXSA9IGRhdGVTdHJpbmcuc3BsaXQoXCItXCIpO1xuICAgIH1cblxuICAgIGlmICh5ZWFyU3RyKSB7XG4gICAgICBwYXJzZWQgPSBwYXJzZUludCh5ZWFyU3RyLCAxMCk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQpKSB7XG4gICAgICAgIHllYXIgPSBwYXJzZWQ7XG4gICAgICAgIGlmIChhZGp1c3REYXRlKSB7XG4gICAgICAgICAgeWVhciA9IE1hdGgubWF4KDAsIHllYXIpO1xuICAgICAgICAgIGlmICh5ZWFyU3RyLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gdG9kYXkoKS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFllYXJTdHViID1cbiAgICAgICAgICAgICAgY3VycmVudFllYXIgLSAoY3VycmVudFllYXIgJSAxMCAqKiB5ZWFyU3RyLmxlbmd0aCk7XG4gICAgICAgICAgICB5ZWFyID0gY3VycmVudFllYXJTdHViICsgcGFyc2VkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb250aFN0cikge1xuICAgICAgcGFyc2VkID0gcGFyc2VJbnQobW9udGhTdHIsIDEwKTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgbW9udGggPSBwYXJzZWQ7XG4gICAgICAgIGlmIChhZGp1c3REYXRlKSB7XG4gICAgICAgICAgbW9udGggPSBNYXRoLm1heCgxLCBtb250aCk7XG4gICAgICAgICAgbW9udGggPSBNYXRoLm1pbigxMiwgbW9udGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vbnRoICYmIGRheVN0ciAmJiB5ZWFyICE9IG51bGwpIHtcbiAgICAgIHBhcnNlZCA9IHBhcnNlSW50KGRheVN0ciwgMTApO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICBkYXkgPSBwYXJzZWQ7XG4gICAgICAgIGlmIChhZGp1c3REYXRlKSB7XG4gICAgICAgICAgY29uc3QgbGFzdERheU9mVGhlTW9udGggPSBzZXREYXRlKHllYXIsIG1vbnRoLCAwKS5nZXREYXRlKCk7XG4gICAgICAgICAgZGF5ID0gTWF0aC5tYXgoMSwgZGF5KTtcbiAgICAgICAgICBkYXkgPSBNYXRoLm1pbihsYXN0RGF5T2ZUaGVNb250aCwgZGF5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb250aCAmJiBkYXkgJiYgeWVhciAhPSBudWxsKSB7XG4gICAgICBkYXRlID0gc2V0RGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRhdGU7XG59O1xuXG4vKipcbiAqIEZvcm1hdCBhIGRhdGUgdG8gZm9ybWF0IE1NLURELVlZWVlcbiAqXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGUgdGhlIGRhdGUgdG8gZm9ybWF0XG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0ZUZvcm1hdCB0aGUgZm9ybWF0IG9mIHRoZSBkYXRlIHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gdGhlIGZvcm1hdHRlZCBkYXRlIHN0cmluZ1xuICovXG5jb25zdCBmb3JtYXREYXRlID0gKGRhdGUsIGRhdGVGb3JtYXQgPSBJTlRFUk5BTF9EQVRFX0ZPUk1BVCkgPT4ge1xuICBjb25zdCBwYWRaZXJvcyA9ICh2YWx1ZSwgbGVuZ3RoKSA9PiB7XG4gICAgcmV0dXJuIGAwMDAwJHt2YWx1ZX1gLnNsaWNlKC1sZW5ndGgpO1xuICB9O1xuXG4gIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTtcbiAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCk7XG4gIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgaWYgKGRhdGVGb3JtYXQgPT09IERFRkFVTFRfRVhURVJOQUxfREFURV9GT1JNQVQpIHtcbiAgICByZXR1cm4gW3BhZFplcm9zKG1vbnRoLCAyKSwgcGFkWmVyb3MoZGF5LCAyKSwgcGFkWmVyb3MoeWVhciwgNCldLmpvaW4oXCIvXCIpO1xuICB9XG5cbiAgcmV0dXJuIFtwYWRaZXJvcyh5ZWFyLCA0KSwgcGFkWmVyb3MobW9udGgsIDIpLCBwYWRaZXJvcyhkYXksIDIpXS5qb2luKFwiLVwiKTtcbn07XG5cbi8vICNlbmRyZWdpb24gRGF0ZSBNYW5pcHVsYXRpb24gRnVuY3Rpb25zXG5cbi8qKlxuICogQ3JlYXRlIGEgZ3JpZCBzdHJpbmcgZnJvbSBhbiBhcnJheSBvZiBodG1sIHN0cmluZ3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBodG1sQXJyYXkgdGhlIGFycmF5IG9mIGh0bWwgaXRlbXNcbiAqIEBwYXJhbSB7bnVtYmVyfSByb3dTaXplIHRoZSBsZW5ndGggb2YgYSByb3dcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBncmlkIHN0cmluZ1xuICovXG5jb25zdCBsaXN0VG9HcmlkSHRtbCA9IChodG1sQXJyYXksIHJvd1NpemUpID0+IHtcbiAgY29uc3QgZ3JpZCA9IFtdO1xuICBsZXQgcm93ID0gW107XG5cbiAgbGV0IGkgPSAwO1xuICB3aGlsZSAoaSA8IGh0bWxBcnJheS5sZW5ndGgpIHtcbiAgICByb3cgPSBbXTtcbiAgICB3aGlsZSAoaSA8IGh0bWxBcnJheS5sZW5ndGggJiYgcm93Lmxlbmd0aCA8IHJvd1NpemUpIHtcbiAgICAgIHJvdy5wdXNoKGA8dGQ+JHtodG1sQXJyYXlbaV19PC90ZD5gKTtcbiAgICAgIGkgKz0gMTtcbiAgICB9XG4gICAgZ3JpZC5wdXNoKGA8dHI+JHtyb3cuam9pbihcIlwiKX08L3RyPmApO1xuICB9XG5cbiAgcmV0dXJuIGdyaWQuam9pbihcIlwiKTtcbn07XG5cbi8qKlxuICogc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhbmQgZGlzcGF0Y2ggYSBjaGFuZ2UgZXZlbnRcbiAqXG4gKiBAcGFyYW0ge0hUTUxJbnB1dEVsZW1lbnR9IGVsIFRoZSBlbGVtZW50IHRvIHVwZGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIGVsZW1lbnRcbiAqL1xuY29uc3QgY2hhbmdlRWxlbWVudFZhbHVlID0gKGVsLCB2YWx1ZSA9IFwiXCIpID0+IHtcbiAgY29uc3QgZWxlbWVudFRvQ2hhbmdlID0gZWw7XG4gIGVsZW1lbnRUb0NoYW5nZS52YWx1ZSA9IHZhbHVlO1xuXG4gIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KFwiY2hhbmdlXCIsIHtcbiAgICBidWJibGVzOiB0cnVlLFxuICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgZGV0YWlsOiB7IHZhbHVlIH0sXG4gIH0pO1xuICBlbGVtZW50VG9DaGFuZ2UuZGlzcGF0Y2hFdmVudChldmVudCk7XG59O1xuXG4vKipcbiAqIFRoZSBwcm9wZXJ0aWVzIGFuZCBlbGVtZW50cyB3aXRoaW4gdGhlIGRhdGUgcGlja2VyLlxuICogQHR5cGVkZWYge09iamVjdH0gRGF0ZVBpY2tlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7SFRNTERpdkVsZW1lbnR9IGNhbGVuZGFyRWxcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IGRhdGVQaWNrZXJFbFxuICogQHByb3BlcnR5IHtIVE1MSW5wdXRFbGVtZW50fSBpbnRlcm5hbElucHV0RWxcbiAqIEBwcm9wZXJ0eSB7SFRNTElucHV0RWxlbWVudH0gZXh0ZXJuYWxJbnB1dEVsXG4gKiBAcHJvcGVydHkge0hUTUxEaXZFbGVtZW50fSBzdGF0dXNFbFxuICogQHByb3BlcnR5IHtIVE1MRGl2RWxlbWVudH0gZmlyc3RZZWFyQ2h1bmtFbFxuICogQHByb3BlcnR5IHtEYXRlfSBjYWxlbmRhckRhdGVcbiAqIEBwcm9wZXJ0eSB7RGF0ZX0gbWluRGF0ZVxuICogQHByb3BlcnR5IHtEYXRlfSBtYXhEYXRlXG4gKiBAcHJvcGVydHkge0RhdGV9IHNlbGVjdGVkRGF0ZVxuICogQHByb3BlcnR5IHtEYXRlfSByYW5nZURhdGVcbiAqIEBwcm9wZXJ0eSB7RGF0ZX0gZGVmYXVsdERhdGVcbiAqL1xuXG4vKipcbiAqIEdldCBhbiBvYmplY3Qgb2YgdGhlIHByb3BlcnRpZXMgYW5kIGVsZW1lbnRzIGJlbG9uZ2luZyBkaXJlY3RseSB0byB0aGUgZ2l2ZW5cbiAqIGRhdGUgcGlja2VyIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCB0aGUgZWxlbWVudCB3aXRoaW4gdGhlIGRhdGUgcGlja2VyXG4gKiBAcmV0dXJucyB7RGF0ZVBpY2tlckNvbnRleHR9IGVsZW1lbnRzXG4gKi9cbmNvbnN0IGdldERhdGVQaWNrZXJDb250ZXh0ID0gKGVsKSA9PiB7XG4gIGNvbnN0IGRhdGVQaWNrZXJFbCA9IGVsLmNsb3Nlc3QoREFURV9QSUNLRVIpO1xuXG4gIGlmICghZGF0ZVBpY2tlckVsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGlzIG1pc3Npbmcgb3V0ZXIgJHtEQVRFX1BJQ0tFUn1gKTtcbiAgfVxuXG4gIGNvbnN0IGludGVybmFsSW5wdXRFbCA9IGRhdGVQaWNrZXJFbC5xdWVyeVNlbGVjdG9yKFxuICAgIERBVEVfUElDS0VSX0lOVEVSTkFMX0lOUFVUXG4gICk7XG4gIGNvbnN0IGV4dGVybmFsSW5wdXRFbCA9IGRhdGVQaWNrZXJFbC5xdWVyeVNlbGVjdG9yKFxuICAgIERBVEVfUElDS0VSX0VYVEVSTkFMX0lOUFVUXG4gICk7XG4gIGNvbnN0IGNhbGVuZGFyRWwgPSBkYXRlUGlja2VyRWwucXVlcnlTZWxlY3RvcihEQVRFX1BJQ0tFUl9DQUxFTkRBUik7XG4gIGNvbnN0IHRvZ2dsZUJ0bkVsID0gZGF0ZVBpY2tlckVsLnF1ZXJ5U2VsZWN0b3IoREFURV9QSUNLRVJfQlVUVE9OKTtcbiAgY29uc3Qgc3RhdHVzRWwgPSBkYXRlUGlja2VyRWwucXVlcnlTZWxlY3RvcihEQVRFX1BJQ0tFUl9TVEFUVVMpO1xuICBjb25zdCBmaXJzdFllYXJDaHVua0VsID0gZGF0ZVBpY2tlckVsLnF1ZXJ5U2VsZWN0b3IoQ0FMRU5EQVJfWUVBUik7XG5cbiAgY29uc3QgaW5wdXREYXRlID0gcGFyc2VEYXRlU3RyaW5nKFxuICAgIGV4dGVybmFsSW5wdXRFbC52YWx1ZSxcbiAgICBERUZBVUxUX0VYVEVSTkFMX0RBVEVfRk9STUFULFxuICAgIHRydWVcbiAgKTtcbiAgY29uc3Qgc2VsZWN0ZWREYXRlID0gcGFyc2VEYXRlU3RyaW5nKGludGVybmFsSW5wdXRFbC52YWx1ZSk7XG5cbiAgY29uc3QgY2FsZW5kYXJEYXRlID0gcGFyc2VEYXRlU3RyaW5nKGNhbGVuZGFyRWwuZGF0YXNldC52YWx1ZSk7XG4gIGNvbnN0IG1pbkRhdGUgPSBwYXJzZURhdGVTdHJpbmcoZGF0ZVBpY2tlckVsLmRhdGFzZXQubWluRGF0ZSk7XG4gIGNvbnN0IG1heERhdGUgPSBwYXJzZURhdGVTdHJpbmcoZGF0ZVBpY2tlckVsLmRhdGFzZXQubWF4RGF0ZSk7XG4gIGNvbnN0IHJhbmdlRGF0ZSA9IHBhcnNlRGF0ZVN0cmluZyhkYXRlUGlja2VyRWwuZGF0YXNldC5yYW5nZURhdGUpO1xuICBjb25zdCBkZWZhdWx0RGF0ZSA9IHBhcnNlRGF0ZVN0cmluZyhkYXRlUGlja2VyRWwuZGF0YXNldC5kZWZhdWx0RGF0ZSk7XG5cbiAgaWYgKG1pbkRhdGUgJiYgbWF4RGF0ZSAmJiBtaW5EYXRlID4gbWF4RGF0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk1pbmltdW0gZGF0ZSBjYW5ub3QgYmUgYWZ0ZXIgbWF4aW11bSBkYXRlXCIpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjYWxlbmRhckRhdGUsXG4gICAgbWluRGF0ZSxcbiAgICB0b2dnbGVCdG5FbCxcbiAgICBzZWxlY3RlZERhdGUsXG4gICAgbWF4RGF0ZSxcbiAgICBmaXJzdFllYXJDaHVua0VsLFxuICAgIGRhdGVQaWNrZXJFbCxcbiAgICBpbnB1dERhdGUsXG4gICAgaW50ZXJuYWxJbnB1dEVsLFxuICAgIGV4dGVybmFsSW5wdXRFbCxcbiAgICBjYWxlbmRhckVsLFxuICAgIHJhbmdlRGF0ZSxcbiAgICBkZWZhdWx0RGF0ZSxcbiAgICBzdGF0dXNFbCxcbiAgfTtcbn07XG5cbi8qKlxuICogRGlzYWJsZSB0aGUgZGF0ZSBwaWNrZXIgY29tcG9uZW50XG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgQW4gZWxlbWVudCB3aXRoaW4gdGhlIGRhdGUgcGlja2VyIGNvbXBvbmVudFxuICovXG5jb25zdCBkaXNhYmxlID0gKGVsKSA9PiB7XG4gIGNvbnN0IHsgZXh0ZXJuYWxJbnB1dEVsLCB0b2dnbGVCdG5FbCB9ID0gZ2V0RGF0ZVBpY2tlckNvbnRleHQoZWwpO1xuXG4gIHRvZ2dsZUJ0bkVsLmRpc2FibGVkID0gdHJ1ZTtcbiAgZXh0ZXJuYWxJbnB1dEVsLmRpc2FibGVkID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogRW5hYmxlIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnRcbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBBbiBlbGVtZW50IHdpdGhpbiB0aGUgZGF0ZSBwaWNrZXIgY29tcG9uZW50XG4gKi9cbmNvbnN0IGVuYWJsZSA9IChlbCkgPT4ge1xuICBjb25zdCB7IGV4dGVybmFsSW5wdXRFbCwgdG9nZ2xlQnRuRWwgfSA9IGdldERhdGVQaWNrZXJDb250ZXh0KGVsKTtcblxuICB0b2dnbGVCdG5FbC5kaXNhYmxlZCA9IGZhbHNlO1xuICBleHRlcm5hbElucHV0RWwuZGlzYWJsZWQgPSBmYWxzZTtcbn07XG5cbi8vICNyZWdpb24gVmFsaWRhdGlvblxuXG4vKipcbiAqIFZhbGlkYXRlIHRoZSB2YWx1ZSBpbiB0aGUgaW5wdXQgYXMgYSB2YWxpZCBkYXRlIG9mIGZvcm1hdCBNL0QvWVlZWVxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEFuIGVsZW1lbnQgd2l0aGluIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnRcbiAqL1xuY29uc3QgaXNEYXRlSW5wdXRJbnZhbGlkID0gKGVsKSA9PiB7XG4gIGNvbnN0IHsgZXh0ZXJuYWxJbnB1dEVsLCBtaW5EYXRlLCBtYXhEYXRlIH0gPSBnZXREYXRlUGlja2VyQ29udGV4dChlbCk7XG5cbiAgY29uc3QgZGF0ZVN0cmluZyA9IGV4dGVybmFsSW5wdXRFbC52YWx1ZTtcbiAgbGV0IGlzSW52YWxpZCA9IGZhbHNlO1xuXG4gIGlmIChkYXRlU3RyaW5nKSB7XG4gICAgaXNJbnZhbGlkID0gdHJ1ZTtcblxuICAgIGNvbnN0IGRhdGVTdHJpbmdQYXJ0cyA9IGRhdGVTdHJpbmcuc3BsaXQoXCIvXCIpO1xuICAgIGNvbnN0IFttb250aCwgZGF5LCB5ZWFyXSA9IGRhdGVTdHJpbmdQYXJ0cy5tYXAoKHN0cikgPT4ge1xuICAgICAgbGV0IHZhbHVlO1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQoc3RyLCAxMCk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQpKSB2YWx1ZSA9IHBhcnNlZDtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcblxuICAgIGlmIChtb250aCAmJiBkYXkgJiYgeWVhciAhPSBudWxsKSB7XG4gICAgICBjb25zdCBjaGVja0RhdGUgPSBzZXREYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcblxuICAgICAgaWYgKFxuICAgICAgICBjaGVja0RhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGggLSAxICYmXG4gICAgICAgIGNoZWNrRGF0ZS5nZXREYXRlKCkgPT09IGRheSAmJlxuICAgICAgICBjaGVja0RhdGUuZ2V0RnVsbFllYXIoKSA9PT0geWVhciAmJlxuICAgICAgICBkYXRlU3RyaW5nUGFydHNbMl0ubGVuZ3RoID09PSA0ICYmXG4gICAgICAgIGlzRGF0ZVdpdGhpbk1pbkFuZE1heChjaGVja0RhdGUsIG1pbkRhdGUsIG1heERhdGUpXG4gICAgICApIHtcbiAgICAgICAgaXNJbnZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzSW52YWxpZDtcbn07XG5cbi8qKlxuICogVmFsaWRhdGUgdGhlIHZhbHVlIGluIHRoZSBpbnB1dCBhcyBhIHZhbGlkIGRhdGUgb2YgZm9ybWF0IE0vRC9ZWVlZXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgQW4gZWxlbWVudCB3aXRoaW4gdGhlIGRhdGUgcGlja2VyIGNvbXBvbmVudFxuICovXG5jb25zdCB2YWxpZGF0ZURhdGVJbnB1dCA9IChlbCkgPT4ge1xuICBjb25zdCB7IGV4dGVybmFsSW5wdXRFbCB9ID0gZ2V0RGF0ZVBpY2tlckNvbnRleHQoZWwpO1xuICBjb25zdCBpc0ludmFsaWQgPSBpc0RhdGVJbnB1dEludmFsaWQoZXh0ZXJuYWxJbnB1dEVsKTtcblxuICBpZiAoaXNJbnZhbGlkICYmICFleHRlcm5hbElucHV0RWwudmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICBleHRlcm5hbElucHV0RWwuc2V0Q3VzdG9tVmFsaWRpdHkoVkFMSURBVElPTl9NRVNTQUdFKTtcbiAgfVxuXG4gIGlmICghaXNJbnZhbGlkICYmIGV4dGVybmFsSW5wdXRFbC52YWxpZGF0aW9uTWVzc2FnZSA9PT0gVkFMSURBVElPTl9NRVNTQUdFKSB7XG4gICAgZXh0ZXJuYWxJbnB1dEVsLnNldEN1c3RvbVZhbGlkaXR5KFwiXCIpO1xuICB9XG59O1xuXG4vLyAjZW5kcmVnaW9uIFZhbGlkYXRpb25cblxuLyoqXG4gKiBFbmFibGUgdGhlIGRhdGUgcGlja2VyIGNvbXBvbmVudFxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEFuIGVsZW1lbnQgd2l0aGluIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnRcbiAqL1xuY29uc3QgcmVjb25jaWxlSW5wdXRWYWx1ZXMgPSAoZWwpID0+IHtcbiAgY29uc3QgeyBpbnRlcm5hbElucHV0RWwsIGlucHV0RGF0ZSB9ID0gZ2V0RGF0ZVBpY2tlckNvbnRleHQoZWwpO1xuICBsZXQgbmV3VmFsdWUgPSBcIlwiO1xuXG4gIGlmIChpbnB1dERhdGUgJiYgIWlzRGF0ZUlucHV0SW52YWxpZChlbCkpIHtcbiAgICBuZXdWYWx1ZSA9IGZvcm1hdERhdGUoaW5wdXREYXRlKTtcbiAgfVxuXG4gIGlmIChpbnRlcm5hbElucHV0RWwudmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgY2hhbmdlRWxlbWVudFZhbHVlKGludGVybmFsSW5wdXRFbCwgbmV3VmFsdWUpO1xuICB9XG59O1xuXG4vKipcbiAqIFNlbGVjdCB0aGUgdmFsdWUgb2YgdGhlIGRhdGUgcGlja2VyIGlucHV0cy5cbiAqXG4gKiBAcGFyYW0ge0hUTUxCdXR0b25FbGVtZW50fSBlbCBBbiBlbGVtZW50IHdpdGhpbiB0aGUgZGF0ZSBwaWNrZXIgY29tcG9uZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0ZVN0cmluZyBUaGUgZGF0ZSBzdHJpbmcgdG8gdXBkYXRlIGluIFlZWVktTU0tREQgZm9ybWF0XG4gKi9cbmNvbnN0IHNldENhbGVuZGFyVmFsdWUgPSAoZWwsIGRhdGVTdHJpbmcpID0+IHtcbiAgY29uc3QgcGFyc2VkRGF0ZSA9IHBhcnNlRGF0ZVN0cmluZyhkYXRlU3RyaW5nKTtcblxuICBpZiAocGFyc2VkRGF0ZSkge1xuICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSBmb3JtYXREYXRlKHBhcnNlZERhdGUsIERFRkFVTFRfRVhURVJOQUxfREFURV9GT1JNQVQpO1xuXG4gICAgY29uc3Qge1xuICAgICAgZGF0ZVBpY2tlckVsLFxuICAgICAgaW50ZXJuYWxJbnB1dEVsLFxuICAgICAgZXh0ZXJuYWxJbnB1dEVsLFxuICAgIH0gPSBnZXREYXRlUGlja2VyQ29udGV4dChlbCk7XG5cbiAgICBjaGFuZ2VFbGVtZW50VmFsdWUoaW50ZXJuYWxJbnB1dEVsLCBkYXRlU3RyaW5nKTtcbiAgICBjaGFuZ2VFbGVtZW50VmFsdWUoZXh0ZXJuYWxJbnB1dEVsLCBmb3JtYXR0ZWREYXRlKTtcblxuICAgIHZhbGlkYXRlRGF0ZUlucHV0KGRhdGVQaWNrZXJFbCk7XG4gIH1cbn07XG5cbi8qKlxuICogRW5oYW5jZSBhbiBpbnB1dCB3aXRoIHRoZSBkYXRlIHBpY2tlciBlbGVtZW50c1xuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIFRoZSBpbml0aWFsIHdyYXBwaW5nIGVsZW1lbnQgb2YgdGhlIGRhdGUgcGlja2VyIGNvbXBvbmVudFxuICovXG5jb25zdCBlbmhhbmNlRGF0ZVBpY2tlciA9IChlbCkgPT4ge1xuICBjb25zdCBkYXRlUGlja2VyRWwgPSBlbC5jbG9zZXN0KERBVEVfUElDS0VSKTtcbiAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGF0ZVBpY2tlckVsLmRhdGFzZXQuZGVmYXVsdFZhbHVlO1xuXG4gIGNvbnN0IGludGVybmFsSW5wdXRFbCA9IGRhdGVQaWNrZXJFbC5xdWVyeVNlbGVjdG9yKGBpbnB1dGApO1xuXG4gIGlmICghaW50ZXJuYWxJbnB1dEVsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke0RBVEVfUElDS0VSfSBpcyBtaXNzaW5nIGlubmVyIGlucHV0YCk7XG4gIH1cblxuICBpZiAoaW50ZXJuYWxJbnB1dEVsLnZhbHVlKSB7XG4gICAgaW50ZXJuYWxJbnB1dEVsLnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIGNvbnN0IG1pbkRhdGUgPSBwYXJzZURhdGVTdHJpbmcoXG4gICAgZGF0ZVBpY2tlckVsLmRhdGFzZXQubWluRGF0ZSB8fCBpbnRlcm5hbElucHV0RWwuZ2V0QXR0cmlidXRlKFwibWluXCIpXG4gICk7XG4gIGRhdGVQaWNrZXJFbC5kYXRhc2V0Lm1pbkRhdGUgPSBtaW5EYXRlXG4gICAgPyBmb3JtYXREYXRlKG1pbkRhdGUpXG4gICAgOiBERUZBVUxUX01JTl9EQVRFO1xuXG4gIGNvbnN0IG1heERhdGUgPSBwYXJzZURhdGVTdHJpbmcoXG4gICAgZGF0ZVBpY2tlckVsLmRhdGFzZXQubWF4RGF0ZSB8fCBpbnRlcm5hbElucHV0RWwuZ2V0QXR0cmlidXRlKFwibWF4XCIpXG4gICk7XG4gIGlmIChtYXhEYXRlKSB7XG4gICAgZGF0ZVBpY2tlckVsLmRhdGFzZXQubWF4RGF0ZSA9IGZvcm1hdERhdGUobWF4RGF0ZSk7XG4gIH1cblxuICBjb25zdCBjYWxlbmRhcldyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjYWxlbmRhcldyYXBwZXIuY2xhc3NMaXN0LmFkZChEQVRFX1BJQ0tFUl9XUkFQUEVSX0NMQVNTKTtcbiAgY2FsZW5kYXJXcmFwcGVyLnRhYkluZGV4ID0gXCItMVwiO1xuXG4gIGNvbnN0IGV4dGVybmFsSW5wdXRFbCA9IGludGVybmFsSW5wdXRFbC5jbG9uZU5vZGUoKTtcbiAgZXh0ZXJuYWxJbnB1dEVsLmNsYXNzTGlzdC5hZGQoREFURV9QSUNLRVJfRVhURVJOQUxfSU5QVVRfQ0xBU1MpO1xuICBleHRlcm5hbElucHV0RWwudHlwZSA9IFwidGV4dFwiO1xuICBleHRlcm5hbElucHV0RWwubmFtZSA9IFwiXCI7XG5cbiAgY2FsZW5kYXJXcmFwcGVyLmFwcGVuZENoaWxkKGV4dGVybmFsSW5wdXRFbCk7XG4gIGNhbGVuZGFyV3JhcHBlci5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgXCJiZWZvcmVlbmRcIixcbiAgICBbXG4gICAgICBgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCIke0RBVEVfUElDS0VSX0JVVFRPTl9DTEFTU31cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtbGFiZWw9XCJUb2dnbGUgY2FsZW5kYXJcIj4mbmJzcDs8L2J1dHRvbj5gLFxuICAgICAgYDxkaXYgY2xhc3M9XCIke0RBVEVfUElDS0VSX0NBTEVOREFSX0NMQVNTfVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiIGhpZGRlbj48L2Rpdj5gLFxuICAgICAgYDxkaXYgY2xhc3M9XCJ1c2Etc3Itb25seSAke0RBVEVfUElDS0VSX1NUQVRVU19DTEFTU31cIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCI+PC9kaXY+YCxcbiAgICBdLmpvaW4oXCJcIilcbiAgKTtcblxuICBpbnRlcm5hbElucHV0RWwuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICBpbnRlcm5hbElucHV0RWwuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCItMVwiKTtcbiAgaW50ZXJuYWxJbnB1dEVsLmNsYXNzTGlzdC5hZGQoXG4gICAgXCJ1c2Etc3Itb25seVwiLFxuICAgIERBVEVfUElDS0VSX0lOVEVSTkFMX0lOUFVUX0NMQVNTXG4gICk7XG4gIGludGVybmFsSW5wdXRFbC5pZCA9IFwiXCI7XG4gIGludGVybmFsSW5wdXRFbC5yZXF1aXJlZCA9IGZhbHNlO1xuXG4gIGRhdGVQaWNrZXJFbC5hcHBlbmRDaGlsZChjYWxlbmRhcldyYXBwZXIpO1xuICBkYXRlUGlja2VyRWwuY2xhc3NMaXN0LmFkZChEQVRFX1BJQ0tFUl9JTklUSUFMSVpFRF9DTEFTUyk7XG5cbiAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgIHNldENhbGVuZGFyVmFsdWUoZGF0ZVBpY2tlckVsLCBkZWZhdWx0VmFsdWUpO1xuICB9XG5cbiAgaWYgKGludGVybmFsSW5wdXRFbC5kaXNhYmxlZCkge1xuICAgIGRpc2FibGUoZGF0ZVBpY2tlckVsKTtcbiAgICBpbnRlcm5hbElucHV0RWwuZGlzYWJsZWQgPSBmYWxzZTtcbiAgfVxufTtcblxuLy8gI3JlZ2lvbiBDYWxlbmRhciAtIERhdGUgU2VsZWN0aW9uIFZpZXdcblxuLyoqXG4gKiByZW5kZXIgdGhlIGNhbGVuZGFyLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEFuIGVsZW1lbnQgd2l0aGluIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnRcbiAqIEBwYXJhbSB7RGF0ZX0gX2RhdGVUb0Rpc3BsYXkgYSBkYXRlIHRvIHJlbmRlciBvbiB0aGUgY2FsZW5kYXJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gYSByZWZlcmVuY2UgdG8gdGhlIG5ldyBjYWxlbmRhciBlbGVtZW50XG4gKi9cbmNvbnN0IHJlbmRlckNhbGVuZGFyID0gKGVsLCBfZGF0ZVRvRGlzcGxheSkgPT4ge1xuICBjb25zdCB7XG4gICAgZGF0ZVBpY2tlckVsLFxuICAgIGNhbGVuZGFyRWwsXG4gICAgc3RhdHVzRWwsXG4gICAgc2VsZWN0ZWREYXRlLFxuICAgIG1heERhdGUsXG4gICAgbWluRGF0ZSxcbiAgICByYW5nZURhdGUsXG4gIH0gPSBnZXREYXRlUGlja2VyQ29udGV4dChlbCk7XG4gIGNvbnN0IHRvZGF5c0RhdGUgPSB0b2RheSgpO1xuICBsZXQgZGF0ZVRvRGlzcGxheSA9IF9kYXRlVG9EaXNwbGF5IHx8IHRvZGF5c0RhdGU7XG5cbiAgY29uc3QgY2FsZW5kYXJXYXNIaWRkZW4gPSBjYWxlbmRhckVsLmhpZGRlbjtcblxuICBjb25zdCBmb2N1c2VkRGF0ZSA9IGFkZERheXMoZGF0ZVRvRGlzcGxheSwgMCk7XG4gIGNvbnN0IGZvY3VzZWRNb250aCA9IGRhdGVUb0Rpc3BsYXkuZ2V0TW9udGgoKTtcbiAgY29uc3QgZm9jdXNlZFllYXIgPSBkYXRlVG9EaXNwbGF5LmdldEZ1bGxZZWFyKCk7XG5cbiAgY29uc3QgcHJldk1vbnRoID0gc3ViTW9udGhzKGRhdGVUb0Rpc3BsYXksIDEpO1xuICBjb25zdCBuZXh0TW9udGggPSBhZGRNb250aHMoZGF0ZVRvRGlzcGxheSwgMSk7XG5cbiAgY29uc3QgY3VycmVudEZvcm1hdHRlZERhdGUgPSBmb3JtYXREYXRlKGRhdGVUb0Rpc3BsYXkpO1xuXG4gIGNvbnN0IGZpcnN0T2ZNb250aCA9IHN0YXJ0T2ZNb250aChkYXRlVG9EaXNwbGF5KTtcbiAgY29uc3QgcHJldkJ1dHRvbnNEaXNhYmxlZCA9IGlzU2FtZU1vbnRoKGRhdGVUb0Rpc3BsYXksIG1pbkRhdGUpO1xuICBjb25zdCBuZXh0QnV0dG9uc0Rpc2FibGVkID0gaXNTYW1lTW9udGgoZGF0ZVRvRGlzcGxheSwgbWF4RGF0ZSk7XG5cbiAgY29uc3QgcmFuZ2VDb25jbHVzaW9uRGF0ZSA9IHNlbGVjdGVkRGF0ZSB8fCBkYXRlVG9EaXNwbGF5O1xuICBjb25zdCByYW5nZVN0YXJ0RGF0ZSA9IHJhbmdlRGF0ZSAmJiBtaW4ocmFuZ2VDb25jbHVzaW9uRGF0ZSwgcmFuZ2VEYXRlKTtcbiAgY29uc3QgcmFuZ2VFbmREYXRlID0gcmFuZ2VEYXRlICYmIG1heChyYW5nZUNvbmNsdXNpb25EYXRlLCByYW5nZURhdGUpO1xuXG4gIGNvbnN0IHdpdGhpblJhbmdlU3RhcnREYXRlID0gcmFuZ2VEYXRlICYmIGFkZERheXMocmFuZ2VTdGFydERhdGUsIDEpO1xuICBjb25zdCB3aXRoaW5SYW5nZUVuZERhdGUgPSByYW5nZURhdGUgJiYgc3ViRGF5cyhyYW5nZUVuZERhdGUsIDEpO1xuXG4gIGNvbnN0IG1vbnRoTGFiZWwgPSBNT05USF9MQUJFTFNbZm9jdXNlZE1vbnRoXTtcblxuICBjb25zdCBnZW5lcmF0ZURhdGVIdG1sID0gKGRhdGVUb1JlbmRlcikgPT4ge1xuICAgIGNvbnN0IGNsYXNzZXMgPSBbQ0FMRU5EQVJfREFURV9DTEFTU107XG4gICAgY29uc3QgZGF5ID0gZGF0ZVRvUmVuZGVyLmdldERhdGUoKTtcbiAgICBjb25zdCBtb250aCA9IGRhdGVUb1JlbmRlci5nZXRNb250aCgpO1xuICAgIGNvbnN0IHllYXIgPSBkYXRlVG9SZW5kZXIuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlVG9SZW5kZXIuZ2V0RGF5KCk7XG5cbiAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gZm9ybWF0RGF0ZShkYXRlVG9SZW5kZXIpO1xuXG4gICAgbGV0IHRhYmluZGV4ID0gXCItMVwiO1xuXG4gICAgY29uc3QgaXNEaXNhYmxlZCA9ICFpc0RhdGVXaXRoaW5NaW5BbmRNYXgoZGF0ZVRvUmVuZGVyLCBtaW5EYXRlLCBtYXhEYXRlKTtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gaXNTYW1lRGF5KGRhdGVUb1JlbmRlciwgc2VsZWN0ZWREYXRlKTtcblxuICAgIGlmIChpc1NhbWVNb250aChkYXRlVG9SZW5kZXIsIHByZXZNb250aCkpIHtcbiAgICAgIGNsYXNzZXMucHVzaChDQUxFTkRBUl9EQVRFX1BSRVZJT1VTX01PTlRIX0NMQVNTKTtcbiAgICB9XG5cbiAgICBpZiAoaXNTYW1lTW9udGgoZGF0ZVRvUmVuZGVyLCBmb2N1c2VkRGF0ZSkpIHtcbiAgICAgIGNsYXNzZXMucHVzaChDQUxFTkRBUl9EQVRFX0NVUlJFTlRfTU9OVEhfQ0xBU1MpO1xuICAgIH1cblxuICAgIGlmIChpc1NhbWVNb250aChkYXRlVG9SZW5kZXIsIG5leHRNb250aCkpIHtcbiAgICAgIGNsYXNzZXMucHVzaChDQUxFTkRBUl9EQVRFX05FWFRfTU9OVEhfQ0xBU1MpO1xuICAgIH1cblxuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICBjbGFzc2VzLnB1c2goQ0FMRU5EQVJfREFURV9TRUxFQ1RFRF9DTEFTUyk7XG4gICAgfVxuXG4gICAgaWYgKGlzU2FtZURheShkYXRlVG9SZW5kZXIsIHRvZGF5c0RhdGUpKSB7XG4gICAgICBjbGFzc2VzLnB1c2goQ0FMRU5EQVJfREFURV9UT0RBWV9DTEFTUyk7XG4gICAgfVxuXG4gICAgaWYgKHJhbmdlRGF0ZSkge1xuICAgICAgaWYgKGlzU2FtZURheShkYXRlVG9SZW5kZXIsIHJhbmdlRGF0ZSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKENBTEVOREFSX0RBVEVfUkFOR0VfREFURV9DTEFTUyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1NhbWVEYXkoZGF0ZVRvUmVuZGVyLCByYW5nZVN0YXJ0RGF0ZSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKENBTEVOREFSX0RBVEVfUkFOR0VfREFURV9TVEFSVF9DTEFTUyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1NhbWVEYXkoZGF0ZVRvUmVuZGVyLCByYW5nZUVuZERhdGUpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChDQUxFTkRBUl9EQVRFX1JBTkdFX0RBVEVfRU5EX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBpc0RhdGVXaXRoaW5NaW5BbmRNYXgoXG4gICAgICAgICAgZGF0ZVRvUmVuZGVyLFxuICAgICAgICAgIHdpdGhpblJhbmdlU3RhcnREYXRlLFxuICAgICAgICAgIHdpdGhpblJhbmdlRW5kRGF0ZVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKENBTEVOREFSX0RBVEVfV0lUSElOX1JBTkdFX0NMQVNTKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNTYW1lRGF5KGRhdGVUb1JlbmRlciwgZm9jdXNlZERhdGUpKSB7XG4gICAgICB0YWJpbmRleCA9IFwiMFwiO1xuICAgICAgY2xhc3Nlcy5wdXNoKENBTEVOREFSX0RBVEVfRk9DVVNFRF9DTEFTUyk7XG4gICAgfVxuXG4gICAgY29uc3QgbW9udGhTdHIgPSBNT05USF9MQUJFTFNbbW9udGhdO1xuICAgIGNvbnN0IGRheVN0ciA9IERBWV9PRl9XRUVLX0xBQkVMU1tkYXlPZldlZWtdO1xuXG4gICAgcmV0dXJuIGA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIHRhYmluZGV4PVwiJHt0YWJpbmRleH1cIlxuICAgICAgY2xhc3M9XCIke2NsYXNzZXMuam9pbihcIiBcIil9XCIgXG4gICAgICBkYXRhLWRheT1cIiR7ZGF5fVwiIFxuICAgICAgZGF0YS1tb250aD1cIiR7bW9udGggKyAxfVwiIFxuICAgICAgZGF0YS15ZWFyPVwiJHt5ZWFyfVwiIFxuICAgICAgZGF0YS12YWx1ZT1cIiR7Zm9ybWF0dGVkRGF0ZX1cIlxuICAgICAgYXJpYS1sYWJlbD1cIiR7ZGF5fSAke21vbnRoU3RyfSAke3llYXJ9ICR7ZGF5U3RyfVwiXG4gICAgICBhcmlhLXNlbGVjdGVkPVwiJHtpc1NlbGVjdGVkID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJ9XCJcbiAgICAgICR7aXNEaXNhYmxlZCA/IGBkaXNhYmxlZD1cImRpc2FibGVkXCJgIDogXCJcIn1cbiAgICA+JHtkYXl9PC9idXR0b24+YDtcbiAgfTtcblxuICAvLyBzZXQgZGF0ZSB0byBmaXJzdCByZW5kZXJlZCBkYXlcbiAgZGF0ZVRvRGlzcGxheSA9IHN0YXJ0T2ZXZWVrKGZpcnN0T2ZNb250aCk7XG5cbiAgY29uc3QgZGF5cyA9IFtdO1xuXG4gIHdoaWxlIChcbiAgICBkYXlzLmxlbmd0aCA8IDI4IHx8XG4gICAgZGF0ZVRvRGlzcGxheS5nZXRNb250aCgpID09PSBmb2N1c2VkTW9udGggfHxcbiAgICBkYXlzLmxlbmd0aCAlIDcgIT09IDBcbiAgKSB7XG4gICAgZGF5cy5wdXNoKGdlbmVyYXRlRGF0ZUh0bWwoZGF0ZVRvRGlzcGxheSkpO1xuICAgIGRhdGVUb0Rpc3BsYXkgPSBhZGREYXlzKGRhdGVUb0Rpc3BsYXksIDEpO1xuICB9XG5cbiAgY29uc3QgZGF0ZXNIdG1sID0gbGlzdFRvR3JpZEh0bWwoZGF5cywgNyk7XG5cbiAgY29uc3QgbmV3Q2FsZW5kYXIgPSBjYWxlbmRhckVsLmNsb25lTm9kZSgpO1xuICBuZXdDYWxlbmRhci5kYXRhc2V0LnZhbHVlID0gY3VycmVudEZvcm1hdHRlZERhdGU7XG4gIG5ld0NhbGVuZGFyLnN0eWxlLnRvcCA9IGAke2RhdGVQaWNrZXJFbC5vZmZzZXRIZWlnaHR9cHhgO1xuICBuZXdDYWxlbmRhci5oaWRkZW4gPSBmYWxzZTtcbiAgbmV3Q2FsZW5kYXIuaW5uZXJIVE1MID0gYDxkaXYgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwiJHtDQUxFTkRBUl9EQVRFX1BJQ0tFUl9DTEFTU31cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCIke0NBTEVOREFSX1JPV19DTEFTU31cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIiR7Q0FMRU5EQVJfQ0VMTF9DTEFTU30gJHtDQUxFTkRBUl9DRUxMX0NFTlRFUl9JVEVNU19DTEFTU31cIj5cbiAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIiR7Q0FMRU5EQVJfUFJFVklPVVNfWUVBUl9DTEFTU31cIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk5hdmlnYXRlIGJhY2sgb25lIHllYXJcIlxuICAgICAgICAgICAgJHtwcmV2QnV0dG9uc0Rpc2FibGVkID8gYGRpc2FibGVkPVwiZGlzYWJsZWRcImAgOiBcIlwifVxuICAgICAgICAgID4mbmJzcDs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCIke0NBTEVOREFSX0NFTExfQ0xBU1N9ICR7Q0FMRU5EQVJfQ0VMTF9DRU5URVJfSVRFTVNfQ0xBU1N9XCI+XG4gICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCIke0NBTEVOREFSX1BSRVZJT1VTX01PTlRIX0NMQVNTfVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiTmF2aWdhdGUgYmFjayBvbmUgbW9udGhcIlxuICAgICAgICAgICAgJHtwcmV2QnV0dG9uc0Rpc2FibGVkID8gYGRpc2FibGVkPVwiZGlzYWJsZWRcImAgOiBcIlwifVxuICAgICAgICAgID4mbmJzcDs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCIke0NBTEVOREFSX0NFTExfQ0xBU1N9ICR7Q0FMRU5EQVJfTU9OVEhfTEFCRUxfQ0xBU1N9XCI+XG4gICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCIke0NBTEVOREFSX01PTlRIX1NFTEVDVElPTl9DTEFTU31cIiBhcmlhLWxhYmVsPVwiJHttb250aExhYmVsfS4gQ2xpY2sgdG8gc2VsZWN0IG1vbnRoXCJcbiAgICAgICAgICA+JHttb250aExhYmVsfTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiJHtDQUxFTkRBUl9ZRUFSX1NFTEVDVElPTl9DTEFTU31cIiBhcmlhLWxhYmVsPVwiJHtmb2N1c2VkWWVhcn0uIENsaWNrIHRvIHNlbGVjdCB5ZWFyXCJcbiAgICAgICAgICA+JHtmb2N1c2VkWWVhcn08L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCIke0NBTEVOREFSX0NFTExfQ0xBU1N9ICR7Q0FMRU5EQVJfQ0VMTF9DRU5URVJfSVRFTVNfQ0xBU1N9XCI+XG4gICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCIke0NBTEVOREFSX05FWFRfTU9OVEhfQ0xBU1N9XCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJOYXZpZ2F0ZSBmb3J3YXJkIG9uZSBtb250aFwiXG4gICAgICAgICAgICAke25leHRCdXR0b25zRGlzYWJsZWQgPyBgZGlzYWJsZWQ9XCJkaXNhYmxlZFwiYCA6IFwiXCJ9XG4gICAgICAgICAgPiZuYnNwOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIiR7Q0FMRU5EQVJfQ0VMTF9DTEFTU30gJHtDQUxFTkRBUl9DRUxMX0NFTlRFUl9JVEVNU19DTEFTU31cIj5cbiAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIiR7Q0FMRU5EQVJfTkVYVF9ZRUFSX0NMQVNTfVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiTmF2aWdhdGUgZm9yd2FyZCBvbmUgeWVhclwiXG4gICAgICAgICAgICAke25leHRCdXR0b25zRGlzYWJsZWQgPyBgZGlzYWJsZWQ9XCJkaXNhYmxlZFwiYCA6IFwiXCJ9XG4gICAgICAgICAgPiZuYnNwOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHRhYmxlIGNsYXNzPVwiJHtDQUxFTkRBUl9UQUJMRV9DTEFTU31cIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCIke0NBTEVOREFSX0RBWV9PRl9XRUVLX0NMQVNTfVwiIHNjb3BlPVwiY29sXCIgYXJpYS1sYWJlbD1cIlN1bmRheVwiPlM8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiJHtDQUxFTkRBUl9EQVlfT0ZfV0VFS19DTEFTU31cIiBzY29wZT1cImNvbFwiIGFyaWEtbGFiZWw9XCJNb25kYXlcIj5NPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cIiR7Q0FMRU5EQVJfREFZX09GX1dFRUtfQ0xBU1N9XCIgc2NvcGU9XCJjb2xcIiBhcmlhLWxhYmVsPVwiVHVlc2RheVwiPlQ8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiJHtDQUxFTkRBUl9EQVlfT0ZfV0VFS19DTEFTU31cIiBzY29wZT1cImNvbFwiIGFyaWEtbGFiZWw9XCJXZWRuZXNkYXlcIj5XPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cIiR7Q0FMRU5EQVJfREFZX09GX1dFRUtfQ0xBU1N9XCIgc2NvcGU9XCJjb2xcIiBhcmlhLWxhYmVsPVwiVGh1cnNkYXlcIj5UaDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCIke0NBTEVOREFSX0RBWV9PRl9XRUVLX0NMQVNTfVwiIHNjb3BlPVwiY29sXCIgYXJpYS1sYWJlbD1cIkZyaWRheVwiPkY8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiJHtDQUxFTkRBUl9EQVlfT0ZfV0VFS19DTEFTU31cIiBzY29wZT1cImNvbFwiIGFyaWEtbGFiZWw9XCJTYXR1cmRheVwiPlM8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAke2RhdGVzSHRtbH1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+YDtcblxuICBjYWxlbmRhckVsLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld0NhbGVuZGFyLCBjYWxlbmRhckVsKTtcblxuICBkYXRlUGlja2VyRWwuY2xhc3NMaXN0LmFkZChEQVRFX1BJQ0tFUl9BQ1RJVkVfQ0xBU1MpO1xuXG4gIGNvbnN0IHN0YXR1c2VzID0gW107XG5cbiAgaWYgKGlzU2FtZURheShzZWxlY3RlZERhdGUsIGZvY3VzZWREYXRlKSkge1xuICAgIHN0YXR1c2VzLnB1c2goXCJTZWxlY3RlZCBkYXRlXCIpO1xuICB9XG5cbiAgaWYgKGNhbGVuZGFyV2FzSGlkZGVuKSB7XG4gICAgc3RhdHVzZXMucHVzaChcbiAgICAgIFwiWW91IGNhbiBuYXZpZ2F0ZSBieSBkYXkgdXNpbmcgbGVmdCBhbmQgcmlnaHQgYXJyb3dzXCIsXG4gICAgICBcIldlZWtzIGJ5IHVzaW5nIHVwIGFuZCBkb3duIGFycm93c1wiLFxuICAgICAgXCJNb250aHMgYnkgdXNpbmcgcGFnZSB1cCBhbmQgcGFnZSBkb3duIGtleXNcIixcbiAgICAgIFwiWWVhcnMgYnkgdXNpbmcgc2hpZnQgcGx1cyBwYWdlIHVwIGFuZCBzaGlmdCBwbHVzIHBhZ2UgZG93blwiLFxuICAgICAgXCJIb21lIGFuZCBlbmQga2V5cyBuYXZpZ2F0ZSB0byB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSB3ZWVrXCJcbiAgICApO1xuICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gXCJcIjtcbiAgfSBlbHNlIHtcbiAgICBzdGF0dXNlcy5wdXNoKGAke21vbnRoTGFiZWx9ICR7Zm9jdXNlZFllYXJ9YCk7XG4gIH1cbiAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBzdGF0dXNlcy5qb2luKFwiLiBcIik7XG5cbiAgcmV0dXJuIG5ld0NhbGVuZGFyO1xufTtcblxuLyoqXG4gKiBOYXZpZ2F0ZSBiYWNrIG9uZSB5ZWFyIGFuZCBkaXNwbGF5IHRoZSBjYWxlbmRhci5cbiAqXG4gKiBAcGFyYW0ge0hUTUxCdXR0b25FbGVtZW50fSBfYnV0dG9uRWwgQW4gZWxlbWVudCB3aXRoaW4gdGhlIGRhdGUgcGlja2VyIGNvbXBvbmVudFxuICovXG5jb25zdCBkaXNwbGF5UHJldmlvdXNZZWFyID0gKF9idXR0b25FbCkgPT4ge1xuICBpZiAoX2J1dHRvbkVsLmRpc2FibGVkKSByZXR1cm47XG4gIGNvbnN0IHsgY2FsZW5kYXJFbCwgY2FsZW5kYXJEYXRlLCBtaW5EYXRlLCBtYXhEYXRlIH0gPSBnZXREYXRlUGlja2VyQ29udGV4dChcbiAgICBfYnV0dG9uRWxcbiAgKTtcbiAgbGV0IGRhdGUgPSBzdWJZZWFycyhjYWxlbmRhckRhdGUsIDEpO1xuICBkYXRlID0ga2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KGRhdGUsIG1pbkRhdGUsIG1heERhdGUpO1xuICBjb25zdCBuZXdDYWxlbmRhciA9IHJlbmRlckNhbGVuZGFyKGNhbGVuZGFyRWwsIGRhdGUpO1xuXG4gIGxldCBuZXh0VG9Gb2N1cyA9IG5ld0NhbGVuZGFyLnF1ZXJ5U2VsZWN0b3IoQ0FMRU5EQVJfUFJFVklPVVNfWUVBUik7XG4gIGlmIChuZXh0VG9Gb2N1cy5kaXNhYmxlZCkge1xuICAgIG5leHRUb0ZvY3VzID0gbmV3Q2FsZW5kYXIucXVlcnlTZWxlY3RvcihDQUxFTkRBUl9EQVRFX1BJQ0tFUik7XG4gIH1cbiAgbmV4dFRvRm9jdXMuZm9jdXMoKTtcbn07XG5cbi8qKlxuICogTmF2aWdhdGUgYmFjayBvbmUgbW9udGggYW5kIGRpc3BsYXkgdGhlIGNhbGVuZGFyLlxuICpcbiAqIEBwYXJhbSB7SFRNTEJ1dHRvbkVsZW1lbnR9IF9idXR0b25FbCBBbiBlbGVtZW50IHdpdGhpbiB0aGUgZGF0ZSBwaWNrZXIgY29tcG9uZW50XG4gKi9cbmNvbnN0IGRpc3BsYXlQcmV2aW91c01vbnRoID0gKF9idXR0b25FbCkgPT4ge1xuICBpZiAoX2J1dHRvbkVsLmRpc2FibGVkKSByZXR1cm47XG4gIGNvbnN0IHsgY2FsZW5kYXJFbCwgY2FsZW5kYXJEYXRlLCBtaW5EYXRlLCBtYXhEYXRlIH0gPSBnZXREYXRlUGlja2VyQ29udGV4dChcbiAgICBfYnV0dG9uRWxcbiAgKTtcbiAgbGV0IGRhdGUgPSBzdWJNb250aHMoY2FsZW5kYXJEYXRlLCAxKTtcbiAgZGF0ZSA9IGtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heChkYXRlLCBtaW5EYXRlLCBtYXhEYXRlKTtcbiAgY29uc3QgbmV3Q2FsZW5kYXIgPSByZW5kZXJDYWxlbmRhcihjYWxlbmRhckVsLCBkYXRlKTtcblxuICBsZXQgbmV4dFRvRm9jdXMgPSBuZXdDYWxlbmRhci5xdWVyeVNlbGVjdG9yKENBTEVOREFSX1BSRVZJT1VTX01PTlRIKTtcbiAgaWYgKG5leHRUb0ZvY3VzLmRpc2FibGVkKSB7XG4gICAgbmV4dFRvRm9jdXMgPSBuZXdDYWxlbmRhci5xdWVyeVNlbGVjdG9yKENBTEVOREFSX0RBVEVfUElDS0VSKTtcbiAgfVxuICBuZXh0VG9Gb2N1cy5mb2N1cygpO1xufTtcblxuLyoqXG4gKiBOYXZpZ2F0ZSBmb3J3YXJkIG9uZSBtb250aCBhbmQgZGlzcGxheSB0aGUgY2FsZW5kYXIuXG4gKlxuICogQHBhcmFtIHtIVE1MQnV0dG9uRWxlbWVudH0gX2J1dHRvbkVsIEFuIGVsZW1lbnQgd2l0aGluIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnRcbiAqL1xuY29uc3QgZGlzcGxheU5leHRNb250aCA9IChfYnV0dG9uRWwpID0+IHtcbiAgaWYgKF9idXR0b25FbC5kaXNhYmxlZCkgcmV0dXJuO1xuICBjb25zdCB7IGNhbGVuZGFyRWwsIGNhbGVuZGFyRGF0ZSwgbWluRGF0ZSwgbWF4RGF0ZSB9ID0gZ2V0RGF0ZVBpY2tlckNvbnRleHQoXG4gICAgX2J1dHRvbkVsXG4gICk7XG4gIGxldCBkYXRlID0gYWRkTW9udGhzKGNhbGVuZGFyRGF0ZSwgMSk7XG4gIGRhdGUgPSBrZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgoZGF0ZSwgbWluRGF0ZSwgbWF4RGF0ZSk7XG4gIGNvbnN0IG5ld0NhbGVuZGFyID0gcmVuZGVyQ2FsZW5kYXIoY2FsZW5kYXJFbCwgZGF0ZSk7XG5cbiAgbGV0IG5leHRUb0ZvY3VzID0gbmV3Q2FsZW5kYXIucXVlcnlTZWxlY3RvcihDQUxFTkRBUl9ORVhUX01PTlRIKTtcbiAgaWYgKG5leHRUb0ZvY3VzLmRpc2FibGVkKSB7XG4gICAgbmV4dFRvRm9jdXMgPSBuZXdDYWxlbmRhci5xdWVyeVNlbGVjdG9yKENBTEVOREFSX0RBVEVfUElDS0VSKTtcbiAgfVxuICBuZXh0VG9Gb2N1cy5mb2N1cygpO1xufTtcblxuLyoqXG4gKiBOYXZpZ2F0ZSBmb3J3YXJkIG9uZSB5ZWFyIGFuZCBkaXNwbGF5IHRoZSBjYWxlbmRhci5cbiAqXG4gKiBAcGFyYW0ge0hUTUxCdXR0b25FbGVtZW50fSBfYnV0dG9uRWwgQW4gZWxlbWVudCB3aXRoaW4gdGhlIGRhdGUgcGlja2VyIGNvbXBvbmVudFxuICovXG5jb25zdCBkaXNwbGF5TmV4dFllYXIgPSAoX2J1dHRvbkVsKSA9PiB7XG4gIGlmIChfYnV0dG9uRWwuZGlzYWJsZWQpIHJldHVybjtcbiAgY29uc3QgeyBjYWxlbmRhckVsLCBjYWxlbmRhckRhdGUsIG1pbkRhdGUsIG1heERhdGUgfSA9IGdldERhdGVQaWNrZXJDb250ZXh0KFxuICAgIF9idXR0b25FbFxuICApO1xuICBsZXQgZGF0ZSA9IGFkZFllYXJzKGNhbGVuZGFyRGF0ZSwgMSk7XG4gIGRhdGUgPSBrZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgoZGF0ZSwgbWluRGF0ZSwgbWF4RGF0ZSk7XG4gIGNvbnN0IG5ld0NhbGVuZGFyID0gcmVuZGVyQ2FsZW5kYXIoY2FsZW5kYXJFbCwgZGF0ZSk7XG5cbiAgbGV0IG5leHRUb0ZvY3VzID0gbmV3Q2FsZW5kYXIucXVlcnlTZWxlY3RvcihDQUxFTkRBUl9ORVhUX1lFQVIpO1xuICBpZiAobmV4dFRvRm9jdXMuZGlzYWJsZWQpIHtcbiAgICBuZXh0VG9Gb2N1cyA9IG5ld0NhbGVuZGFyLnF1ZXJ5U2VsZWN0b3IoQ0FMRU5EQVJfREFURV9QSUNLRVIpO1xuICB9XG4gIG5leHRUb0ZvY3VzLmZvY3VzKCk7XG59O1xuXG4vKipcbiAqIEhpZGUgdGhlIGNhbGVuZGFyIG9mIGEgZGF0ZSBwaWNrZXIgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEFuIGVsZW1lbnQgd2l0aGluIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnRcbiAqL1xuY29uc3QgaGlkZUNhbGVuZGFyID0gKGVsKSA9PiB7XG4gIGNvbnN0IHsgZGF0ZVBpY2tlckVsLCBjYWxlbmRhckVsLCBzdGF0dXNFbCB9ID0gZ2V0RGF0ZVBpY2tlckNvbnRleHQoZWwpO1xuXG4gIGRhdGVQaWNrZXJFbC5jbGFzc0xpc3QucmVtb3ZlKERBVEVfUElDS0VSX0FDVElWRV9DTEFTUyk7XG4gIGNhbGVuZGFyRWwuaGlkZGVuID0gdHJ1ZTtcbiAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBcIlwiO1xufTtcblxuLyoqXG4gKiBTZWxlY3QgYSBkYXRlIHdpdGhpbiB0aGUgZGF0ZSBwaWNrZXIgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7SFRNTEJ1dHRvbkVsZW1lbnR9IGNhbGVuZGFyRGF0ZUVsIEEgZGF0ZSBlbGVtZW50IHdpdGhpbiB0aGUgZGF0ZSBwaWNrZXIgY29tcG9uZW50XG4gKi9cbmNvbnN0IHNlbGVjdERhdGUgPSAoY2FsZW5kYXJEYXRlRWwpID0+IHtcbiAgaWYgKGNhbGVuZGFyRGF0ZUVsLmRpc2FibGVkKSByZXR1cm47XG5cbiAgY29uc3QgeyBkYXRlUGlja2VyRWwsIGV4dGVybmFsSW5wdXRFbCB9ID0gZ2V0RGF0ZVBpY2tlckNvbnRleHQoXG4gICAgY2FsZW5kYXJEYXRlRWxcbiAgKTtcblxuICBzZXRDYWxlbmRhclZhbHVlKGNhbGVuZGFyRGF0ZUVsLCBjYWxlbmRhckRhdGVFbC5kYXRhc2V0LnZhbHVlKTtcbiAgaGlkZUNhbGVuZGFyKGRhdGVQaWNrZXJFbCk7XG5cbiAgZXh0ZXJuYWxJbnB1dEVsLmZvY3VzKCk7XG59O1xuXG4vKipcbiAqIFRvZ2dsZSB0aGUgY2FsZW5kYXIuXG4gKlxuICogQHBhcmFtIHtIVE1MQnV0dG9uRWxlbWVudH0gZWwgQW4gZWxlbWVudCB3aXRoaW4gdGhlIGRhdGUgcGlja2VyIGNvbXBvbmVudFxuICovXG5jb25zdCB0b2dnbGVDYWxlbmRhciA9IChlbCkgPT4ge1xuICBpZiAoZWwuZGlzYWJsZWQpIHJldHVybjtcbiAgY29uc3Qge1xuICAgIGNhbGVuZGFyRWwsXG4gICAgaW5wdXREYXRlLFxuICAgIG1pbkRhdGUsXG4gICAgbWF4RGF0ZSxcbiAgICBkZWZhdWx0RGF0ZSxcbiAgfSA9IGdldERhdGVQaWNrZXJDb250ZXh0KGVsKTtcblxuICBpZiAoY2FsZW5kYXJFbC5oaWRkZW4pIHtcbiAgICBjb25zdCBkYXRlVG9EaXNwbGF5ID0ga2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KFxuICAgICAgaW5wdXREYXRlIHx8IGRlZmF1bHREYXRlIHx8IHRvZGF5KCksXG4gICAgICBtaW5EYXRlLFxuICAgICAgbWF4RGF0ZVxuICAgICk7XG4gICAgY29uc3QgbmV3Q2FsZW5kYXIgPSByZW5kZXJDYWxlbmRhcihjYWxlbmRhckVsLCBkYXRlVG9EaXNwbGF5KTtcbiAgICBuZXdDYWxlbmRhci5xdWVyeVNlbGVjdG9yKENBTEVOREFSX0RBVEVfRk9DVVNFRCkuZm9jdXMoKTtcbiAgfSBlbHNlIHtcbiAgICBoaWRlQ2FsZW5kYXIoZWwpO1xuICB9XG59O1xuXG4vKipcbiAqIFVwZGF0ZSB0aGUgY2FsZW5kYXIgd2hlbiB2aXNpYmxlLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBkYXRlIHBpY2tlclxuICovXG5jb25zdCB1cGRhdGVDYWxlbmRhcklmVmlzaWJsZSA9IChlbCkgPT4ge1xuICBjb25zdCB7IGNhbGVuZGFyRWwsIGlucHV0RGF0ZSwgbWluRGF0ZSwgbWF4RGF0ZSB9ID0gZ2V0RGF0ZVBpY2tlckNvbnRleHQoZWwpO1xuICBjb25zdCBjYWxlbmRhclNob3duID0gIWNhbGVuZGFyRWwuaGlkZGVuO1xuXG4gIGlmIChjYWxlbmRhclNob3duICYmIGlucHV0RGF0ZSkge1xuICAgIGNvbnN0IGRhdGVUb0Rpc3BsYXkgPSBrZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgoaW5wdXREYXRlLCBtaW5EYXRlLCBtYXhEYXRlKTtcbiAgICByZW5kZXJDYWxlbmRhcihjYWxlbmRhckVsLCBkYXRlVG9EaXNwbGF5KTtcbiAgfVxufTtcblxuLy8gI2VuZHJlZ2lvbiBDYWxlbmRhciAtIERhdGUgU2VsZWN0aW9uIFZpZXdcblxuLy8gI3JlZ2lvbiBDYWxlbmRhciAtIE1vbnRoIFNlbGVjdGlvbiBWaWV3XG4vKipcbiAqIERpc3BsYXkgdGhlIG1vbnRoIHNlbGVjdGlvbiBzY3JlZW4gaW4gdGhlIGRhdGUgcGlja2VyLlxuICpcbiAqIEBwYXJhbSB7SFRNTEJ1dHRvbkVsZW1lbnR9IGVsIEFuIGVsZW1lbnQgd2l0aGluIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnRcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gYSByZWZlcmVuY2UgdG8gdGhlIG5ldyBjYWxlbmRhciBlbGVtZW50XG4gKi9cbmNvbnN0IGRpc3BsYXlNb250aFNlbGVjdGlvbiA9IChlbCwgbW9udGhUb0Rpc3BsYXkpID0+IHtcbiAgY29uc3Qge1xuICAgIGNhbGVuZGFyRWwsXG4gICAgc3RhdHVzRWwsXG4gICAgY2FsZW5kYXJEYXRlLFxuICAgIG1pbkRhdGUsXG4gICAgbWF4RGF0ZSxcbiAgfSA9IGdldERhdGVQaWNrZXJDb250ZXh0KGVsKTtcblxuICBjb25zdCBzZWxlY3RlZE1vbnRoID0gY2FsZW5kYXJEYXRlLmdldE1vbnRoKCk7XG4gIGNvbnN0IGZvY3VzZWRNb250aCA9IG1vbnRoVG9EaXNwbGF5ID09IG51bGwgPyBzZWxlY3RlZE1vbnRoIDogbW9udGhUb0Rpc3BsYXk7XG5cbiAgY29uc3QgbW9udGhzID0gTU9OVEhfTEFCRUxTLm1hcCgobW9udGgsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgbW9udGhUb0NoZWNrID0gc2V0TW9udGgoY2FsZW5kYXJEYXRlLCBpbmRleCk7XG5cbiAgICBjb25zdCBpc0Rpc2FibGVkID0gaXNEYXRlc01vbnRoT3V0c2lkZU1pbk9yTWF4KFxuICAgICAgbW9udGhUb0NoZWNrLFxuICAgICAgbWluRGF0ZSxcbiAgICAgIG1heERhdGVcbiAgICApO1xuXG4gICAgbGV0IHRhYmluZGV4ID0gXCItMVwiO1xuXG4gICAgY29uc3QgY2xhc3NlcyA9IFtDQUxFTkRBUl9NT05USF9DTEFTU107XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IGluZGV4ID09PSBzZWxlY3RlZE1vbnRoO1xuXG4gICAgaWYgKGluZGV4ID09PSBmb2N1c2VkTW9udGgpIHtcbiAgICAgIHRhYmluZGV4ID0gXCIwXCI7XG4gICAgICBjbGFzc2VzLnB1c2goQ0FMRU5EQVJfTU9OVEhfRk9DVVNFRF9DTEFTUyk7XG4gICAgfVxuXG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIGNsYXNzZXMucHVzaChDQUxFTkRBUl9NT05USF9TRUxFQ1RFRF9DTEFTUyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGA8YnV0dG9uIFxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCIke3RhYmluZGV4fVwiXG4gICAgICAgIGNsYXNzPVwiJHtjbGFzc2VzLmpvaW4oXCIgXCIpfVwiIFxuICAgICAgICBkYXRhLXZhbHVlPVwiJHtpbmRleH1cIlxuICAgICAgICBkYXRhLWxhYmVsPVwiJHttb250aH1cIlxuICAgICAgICBhcmlhLXNlbGVjdGVkPVwiJHtpc1NlbGVjdGVkID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJ9XCJcbiAgICAgICAgJHtpc0Rpc2FibGVkID8gYGRpc2FibGVkPVwiZGlzYWJsZWRcImAgOiBcIlwifVxuICAgICAgPiR7bW9udGh9PC9idXR0b24+YDtcbiAgfSk7XG5cbiAgY29uc3QgbW9udGhzSHRtbCA9IGA8ZGl2IHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cIiR7Q0FMRU5EQVJfTU9OVEhfUElDS0VSX0NMQVNTfVwiPlxuICAgIDx0YWJsZSBjbGFzcz1cIiR7Q0FMRU5EQVJfVEFCTEVfQ0xBU1N9XCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxuICAgICAgPHRib2R5PlxuICAgICAgICAke2xpc3RUb0dyaWRIdG1sKG1vbnRocywgMyl9XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gIDwvZGl2PmA7XG5cbiAgY29uc3QgbmV3Q2FsZW5kYXIgPSBjYWxlbmRhckVsLmNsb25lTm9kZSgpO1xuICBuZXdDYWxlbmRhci5pbm5lckhUTUwgPSBtb250aHNIdG1sO1xuICBjYWxlbmRhckVsLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld0NhbGVuZGFyLCBjYWxlbmRhckVsKTtcblxuICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IFwiU2VsZWN0IGEgbW9udGguXCI7XG5cbiAgcmV0dXJuIG5ld0NhbGVuZGFyO1xufTtcblxuLyoqXG4gKiBTZWxlY3QgYSBtb250aCBpbiB0aGUgZGF0ZSBwaWNrZXIgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7SFRNTEJ1dHRvbkVsZW1lbnR9IG1vbnRoRWwgQW4gbW9udGggZWxlbWVudCB3aXRoaW4gdGhlIGRhdGUgcGlja2VyIGNvbXBvbmVudFxuICovXG5jb25zdCBzZWxlY3RNb250aCA9IChtb250aEVsKSA9PiB7XG4gIGlmIChtb250aEVsLmRpc2FibGVkKSByZXR1cm47XG4gIGNvbnN0IHsgY2FsZW5kYXJFbCwgY2FsZW5kYXJEYXRlLCBtaW5EYXRlLCBtYXhEYXRlIH0gPSBnZXREYXRlUGlja2VyQ29udGV4dChcbiAgICBtb250aEVsXG4gICk7XG4gIGNvbnN0IHNlbGVjdGVkTW9udGggPSBwYXJzZUludChtb250aEVsLmRhdGFzZXQudmFsdWUsIDEwKTtcbiAgbGV0IGRhdGUgPSBzZXRNb250aChjYWxlbmRhckRhdGUsIHNlbGVjdGVkTW9udGgpO1xuICBkYXRlID0ga2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KGRhdGUsIG1pbkRhdGUsIG1heERhdGUpO1xuICBjb25zdCBuZXdDYWxlbmRhciA9IHJlbmRlckNhbGVuZGFyKGNhbGVuZGFyRWwsIGRhdGUpO1xuICBuZXdDYWxlbmRhci5xdWVyeVNlbGVjdG9yKENBTEVOREFSX0RBVEVfRk9DVVNFRCkuZm9jdXMoKTtcbn07XG5cbi8vICNlbmRyZWdpb24gQ2FsZW5kYXIgLSBNb250aCBTZWxlY3Rpb24gVmlld1xuXG4vLyAjcmVnaW9uIENhbGVuZGFyIC0gWWVhciBTZWxlY3Rpb24gVmlld1xuXG4vKipcbiAqIERpc3BsYXkgdGhlIHllYXIgc2VsZWN0aW9uIHNjcmVlbiBpbiB0aGUgZGF0ZSBwaWNrZXIuXG4gKlxuICogQHBhcmFtIHtIVE1MQnV0dG9uRWxlbWVudH0gZWwgQW4gZWxlbWVudCB3aXRoaW4gdGhlIGRhdGUgcGlja2VyIGNvbXBvbmVudFxuICogQHBhcmFtIHtudW1iZXJ9IHllYXJUb0Rpc3BsYXkgeWVhciB0byBkaXNwbGF5IGluIHllYXIgc2VsZWN0aW9uXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IGEgcmVmZXJlbmNlIHRvIHRoZSBuZXcgY2FsZW5kYXIgZWxlbWVudFxuICovXG5jb25zdCBkaXNwbGF5WWVhclNlbGVjdGlvbiA9IChlbCwgeWVhclRvRGlzcGxheSkgPT4ge1xuICBjb25zdCB7XG4gICAgY2FsZW5kYXJFbCxcbiAgICBzdGF0dXNFbCxcbiAgICBjYWxlbmRhckRhdGUsXG4gICAgbWluRGF0ZSxcbiAgICBtYXhEYXRlLFxuICB9ID0gZ2V0RGF0ZVBpY2tlckNvbnRleHQoZWwpO1xuXG4gIGNvbnN0IHNlbGVjdGVkWWVhciA9IGNhbGVuZGFyRGF0ZS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBmb2N1c2VkWWVhciA9IHllYXJUb0Rpc3BsYXkgPT0gbnVsbCA/IHNlbGVjdGVkWWVhciA6IHllYXJUb0Rpc3BsYXk7XG5cbiAgbGV0IHllYXJUb0NodW5rID0gZm9jdXNlZFllYXI7XG4gIHllYXJUb0NodW5rIC09IHllYXJUb0NodW5rICUgWUVBUl9DSFVOSztcbiAgeWVhclRvQ2h1bmsgPSBNYXRoLm1heCgwLCB5ZWFyVG9DaHVuayk7XG5cbiAgY29uc3QgcHJldlllYXJDaHVua0Rpc2FibGVkID0gaXNEYXRlc1llYXJPdXRzaWRlTWluT3JNYXgoXG4gICAgc2V0WWVhcihjYWxlbmRhckRhdGUsIHllYXJUb0NodW5rIC0gMSksXG4gICAgbWluRGF0ZSxcbiAgICBtYXhEYXRlXG4gICk7XG5cbiAgY29uc3QgbmV4dFllYXJDaHVua0Rpc2FibGVkID0gaXNEYXRlc1llYXJPdXRzaWRlTWluT3JNYXgoXG4gICAgc2V0WWVhcihjYWxlbmRhckRhdGUsIHllYXJUb0NodW5rICsgWUVBUl9DSFVOSyksXG4gICAgbWluRGF0ZSxcbiAgICBtYXhEYXRlXG4gICk7XG5cbiAgY29uc3QgeWVhcnMgPSBbXTtcbiAgbGV0IHllYXJJbmRleCA9IHllYXJUb0NodW5rO1xuICB3aGlsZSAoeWVhcnMubGVuZ3RoIDwgWUVBUl9DSFVOSykge1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSBpc0RhdGVzWWVhck91dHNpZGVNaW5Pck1heChcbiAgICAgIHNldFllYXIoY2FsZW5kYXJEYXRlLCB5ZWFySW5kZXgpLFxuICAgICAgbWluRGF0ZSxcbiAgICAgIG1heERhdGVcbiAgICApO1xuXG4gICAgbGV0IHRhYmluZGV4ID0gXCItMVwiO1xuXG4gICAgY29uc3QgY2xhc3NlcyA9IFtDQUxFTkRBUl9ZRUFSX0NMQVNTXTtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0geWVhckluZGV4ID09PSBzZWxlY3RlZFllYXI7XG5cbiAgICBpZiAoeWVhckluZGV4ID09PSBmb2N1c2VkWWVhcikge1xuICAgICAgdGFiaW5kZXggPSBcIjBcIjtcbiAgICAgIGNsYXNzZXMucHVzaChDQUxFTkRBUl9ZRUFSX0ZPQ1VTRURfQ0xBU1MpO1xuICAgIH1cblxuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICBjbGFzc2VzLnB1c2goQ0FMRU5EQVJfWUVBUl9TRUxFQ1RFRF9DTEFTUyk7XG4gICAgfVxuXG4gICAgeWVhcnMucHVzaChcbiAgICAgIGA8YnV0dG9uIFxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCIke3RhYmluZGV4fVwiXG4gICAgICAgIGNsYXNzPVwiJHtjbGFzc2VzLmpvaW4oXCIgXCIpfVwiIFxuICAgICAgICBkYXRhLXZhbHVlPVwiJHt5ZWFySW5kZXh9XCJcbiAgICAgICAgYXJpYS1zZWxlY3RlZD1cIiR7aXNTZWxlY3RlZCA/IFwidHJ1ZVwiIDogXCJmYWxzZVwifVwiXG4gICAgICAgICR7aXNEaXNhYmxlZCA/IGBkaXNhYmxlZD1cImRpc2FibGVkXCJgIDogXCJcIn1cbiAgICAgID4ke3llYXJJbmRleH08L2J1dHRvbj5gXG4gICAgKTtcbiAgICB5ZWFySW5kZXggKz0gMTtcbiAgfVxuXG4gIGNvbnN0IHllYXJzSHRtbCA9IGxpc3RUb0dyaWRIdG1sKHllYXJzLCAzKTtcblxuICBjb25zdCBuZXdDYWxlbmRhciA9IGNhbGVuZGFyRWwuY2xvbmVOb2RlKCk7XG4gIG5ld0NhbGVuZGFyLmlubmVySFRNTCA9IGA8ZGl2IHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cIiR7Q0FMRU5EQVJfWUVBUl9QSUNLRVJfQ0xBU1N9XCI+XG4gICAgPHRhYmxlIGNsYXNzPVwiJHtDQUxFTkRBUl9UQUJMRV9DTEFTU31cIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIiR7Q0FMRU5EQVJfUFJFVklPVVNfWUVBUl9DSFVOS19DTEFTU31cIiBcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTmF2aWdhdGUgYmFjayAke1lFQVJfQ0hVTkt9IHllYXJzXCJcbiAgICAgICAgICAgICAgICAke3ByZXZZZWFyQ2h1bmtEaXNhYmxlZCA/IGBkaXNhYmxlZD1cImRpc2FibGVkXCJgIDogXCJcIn1cbiAgICAgICAgICAgICAgPiZuYnNwOzwvYnV0dG9uPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiM1wiPlxuICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCIke0NBTEVOREFSX1RBQkxFX0NMQVNTfVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAke3llYXJzSHRtbH1cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiJHtDQUxFTkRBUl9ORVhUX1lFQVJfQ0hVTktfQ0xBU1N9XCIgXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk5hdmlnYXRlIGZvcndhcmQgJHtZRUFSX0NIVU5LfSB5ZWFyc1wiXG4gICAgICAgICAgICAgICAgJHtuZXh0WWVhckNodW5rRGlzYWJsZWQgPyBgZGlzYWJsZWQ9XCJkaXNhYmxlZFwiYCA6IFwiXCJ9XG4gICAgICAgICAgICAgID4mbmJzcDs8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+YDtcbiAgY2FsZW5kYXJFbC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdDYWxlbmRhciwgY2FsZW5kYXJFbCk7XG5cbiAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgU2hvd2luZyB5ZWFycyAke3llYXJUb0NodW5rfSB0byAke1xuICAgIHllYXJUb0NodW5rICsgWUVBUl9DSFVOSyAtIDFcbiAgfS4gU2VsZWN0IGEgeWVhci5gO1xuXG4gIHJldHVybiBuZXdDYWxlbmRhcjtcbn07XG5cbi8qKlxuICogTmF2aWdhdGUgYmFjayBieSB5ZWFycyBhbmQgZGlzcGxheSB0aGUgeWVhciBzZWxlY3Rpb24gc2NyZWVuLlxuICpcbiAqIEBwYXJhbSB7SFRNTEJ1dHRvbkVsZW1lbnR9IGVsIEFuIGVsZW1lbnQgd2l0aGluIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnRcbiAqL1xuY29uc3QgZGlzcGxheVByZXZpb3VzWWVhckNodW5rID0gKGVsKSA9PiB7XG4gIGlmIChlbC5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IHsgY2FsZW5kYXJFbCwgY2FsZW5kYXJEYXRlLCBtaW5EYXRlLCBtYXhEYXRlIH0gPSBnZXREYXRlUGlja2VyQ29udGV4dChcbiAgICBlbFxuICApO1xuICBjb25zdCB5ZWFyRWwgPSBjYWxlbmRhckVsLnF1ZXJ5U2VsZWN0b3IoQ0FMRU5EQVJfWUVBUl9GT0NVU0VEKTtcbiAgY29uc3Qgc2VsZWN0ZWRZZWFyID0gcGFyc2VJbnQoeWVhckVsLnRleHRDb250ZW50LCAxMCk7XG5cbiAgbGV0IGFkanVzdGVkWWVhciA9IHNlbGVjdGVkWWVhciAtIFlFQVJfQ0hVTks7XG4gIGFkanVzdGVkWWVhciA9IE1hdGgubWF4KDAsIGFkanVzdGVkWWVhcik7XG5cbiAgY29uc3QgZGF0ZSA9IHNldFllYXIoY2FsZW5kYXJEYXRlLCBhZGp1c3RlZFllYXIpO1xuICBjb25zdCBjYXBwZWREYXRlID0ga2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KGRhdGUsIG1pbkRhdGUsIG1heERhdGUpO1xuICBjb25zdCBuZXdDYWxlbmRhciA9IGRpc3BsYXlZZWFyU2VsZWN0aW9uKFxuICAgIGNhbGVuZGFyRWwsXG4gICAgY2FwcGVkRGF0ZS5nZXRGdWxsWWVhcigpXG4gICk7XG5cbiAgbGV0IG5leHRUb0ZvY3VzID0gbmV3Q2FsZW5kYXIucXVlcnlTZWxlY3RvcihDQUxFTkRBUl9QUkVWSU9VU19ZRUFSX0NIVU5LKTtcbiAgaWYgKG5leHRUb0ZvY3VzLmRpc2FibGVkKSB7XG4gICAgbmV4dFRvRm9jdXMgPSBuZXdDYWxlbmRhci5xdWVyeVNlbGVjdG9yKENBTEVOREFSX1lFQVJfUElDS0VSKTtcbiAgfVxuICBuZXh0VG9Gb2N1cy5mb2N1cygpO1xufTtcblxuLyoqXG4gKiBOYXZpZ2F0ZSBmb3J3YXJkIGJ5IHllYXJzIGFuZCBkaXNwbGF5IHRoZSB5ZWFyIHNlbGVjdGlvbiBzY3JlZW4uXG4gKlxuICogQHBhcmFtIHtIVE1MQnV0dG9uRWxlbWVudH0gZWwgQW4gZWxlbWVudCB3aXRoaW4gdGhlIGRhdGUgcGlja2VyIGNvbXBvbmVudFxuICovXG5jb25zdCBkaXNwbGF5TmV4dFllYXJDaHVuayA9IChlbCkgPT4ge1xuICBpZiAoZWwuZGlzYWJsZWQpIHJldHVybjtcblxuICBjb25zdCB7IGNhbGVuZGFyRWwsIGNhbGVuZGFyRGF0ZSwgbWluRGF0ZSwgbWF4RGF0ZSB9ID0gZ2V0RGF0ZVBpY2tlckNvbnRleHQoXG4gICAgZWxcbiAgKTtcbiAgY29uc3QgeWVhckVsID0gY2FsZW5kYXJFbC5xdWVyeVNlbGVjdG9yKENBTEVOREFSX1lFQVJfRk9DVVNFRCk7XG4gIGNvbnN0IHNlbGVjdGVkWWVhciA9IHBhcnNlSW50KHllYXJFbC50ZXh0Q29udGVudCwgMTApO1xuXG4gIGxldCBhZGp1c3RlZFllYXIgPSBzZWxlY3RlZFllYXIgKyBZRUFSX0NIVU5LO1xuICBhZGp1c3RlZFllYXIgPSBNYXRoLm1heCgwLCBhZGp1c3RlZFllYXIpO1xuXG4gIGNvbnN0IGRhdGUgPSBzZXRZZWFyKGNhbGVuZGFyRGF0ZSwgYWRqdXN0ZWRZZWFyKTtcbiAgY29uc3QgY2FwcGVkRGF0ZSA9IGtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heChkYXRlLCBtaW5EYXRlLCBtYXhEYXRlKTtcbiAgY29uc3QgbmV3Q2FsZW5kYXIgPSBkaXNwbGF5WWVhclNlbGVjdGlvbihcbiAgICBjYWxlbmRhckVsLFxuICAgIGNhcHBlZERhdGUuZ2V0RnVsbFllYXIoKVxuICApO1xuXG4gIGxldCBuZXh0VG9Gb2N1cyA9IG5ld0NhbGVuZGFyLnF1ZXJ5U2VsZWN0b3IoQ0FMRU5EQVJfTkVYVF9ZRUFSX0NIVU5LKTtcbiAgaWYgKG5leHRUb0ZvY3VzLmRpc2FibGVkKSB7XG4gICAgbmV4dFRvRm9jdXMgPSBuZXdDYWxlbmRhci5xdWVyeVNlbGVjdG9yKENBTEVOREFSX1lFQVJfUElDS0VSKTtcbiAgfVxuICBuZXh0VG9Gb2N1cy5mb2N1cygpO1xufTtcblxuLyoqXG4gKiBTZWxlY3QgYSB5ZWFyIGluIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnQuXG4gKlxuICogQHBhcmFtIHtIVE1MQnV0dG9uRWxlbWVudH0geWVhckVsIEEgeWVhciBlbGVtZW50IHdpdGhpbiB0aGUgZGF0ZSBwaWNrZXIgY29tcG9uZW50XG4gKi9cbmNvbnN0IHNlbGVjdFllYXIgPSAoeWVhckVsKSA9PiB7XG4gIGlmICh5ZWFyRWwuZGlzYWJsZWQpIHJldHVybjtcbiAgY29uc3QgeyBjYWxlbmRhckVsLCBjYWxlbmRhckRhdGUsIG1pbkRhdGUsIG1heERhdGUgfSA9IGdldERhdGVQaWNrZXJDb250ZXh0KFxuICAgIHllYXJFbFxuICApO1xuICBjb25zdCBzZWxlY3RlZFllYXIgPSBwYXJzZUludCh5ZWFyRWwuaW5uZXJIVE1MLCAxMCk7XG4gIGxldCBkYXRlID0gc2V0WWVhcihjYWxlbmRhckRhdGUsIHNlbGVjdGVkWWVhcik7XG4gIGRhdGUgPSBrZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgoZGF0ZSwgbWluRGF0ZSwgbWF4RGF0ZSk7XG4gIGNvbnN0IG5ld0NhbGVuZGFyID0gcmVuZGVyQ2FsZW5kYXIoY2FsZW5kYXJFbCwgZGF0ZSk7XG4gIG5ld0NhbGVuZGFyLnF1ZXJ5U2VsZWN0b3IoQ0FMRU5EQVJfREFURV9GT0NVU0VEKS5mb2N1cygpO1xufTtcblxuLy8gI2VuZHJlZ2lvbiBDYWxlbmRhciAtIFllYXIgU2VsZWN0aW9uIFZpZXdcblxuLy8gI3JlZ2lvbiBDYWxlbmRhciBFdmVudCBIYW5kbGluZ1xuXG4vKipcbiAqIEhpZGUgdGhlIGNhbGVuZGFyLlxuICpcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgdGhlIGtleWRvd24gZXZlbnRcbiAqL1xuY29uc3QgaGFuZGxlRXNjYXBlRnJvbUNhbGVuZGFyID0gKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHsgZGF0ZVBpY2tlckVsLCBleHRlcm5hbElucHV0RWwgfSA9IGdldERhdGVQaWNrZXJDb250ZXh0KGV2ZW50LnRhcmdldCk7XG5cbiAgaGlkZUNhbGVuZGFyKGRhdGVQaWNrZXJFbCk7XG4gIGV4dGVybmFsSW5wdXRFbC5mb2N1cygpO1xuXG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG59O1xuXG4vLyAjZW5kcmVnaW9uIENhbGVuZGFyIEV2ZW50IEhhbmRsaW5nXG5cbi8vICNyZWdpb24gQ2FsZW5kYXIgRGF0ZSBFdmVudCBIYW5kbGluZ1xuXG4vKipcbiAqIEFkanVzdCB0aGUgZGF0ZSBhbmQgZGlzcGxheSB0aGUgY2FsZW5kYXIgaWYgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGFkanVzdERhdGVGbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGFkanVzdGVkIGRhdGVcbiAqL1xuY29uc3QgYWRqdXN0Q2FsZW5kYXIgPSAoYWRqdXN0RGF0ZUZuKSA9PiB7XG4gIHJldHVybiAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB7IGNhbGVuZGFyRWwsIGNhbGVuZGFyRGF0ZSwgbWluRGF0ZSwgbWF4RGF0ZSB9ID0gZ2V0RGF0ZVBpY2tlckNvbnRleHQoXG4gICAgICBldmVudC50YXJnZXRcbiAgICApO1xuXG4gICAgY29uc3QgZGF0ZSA9IGFkanVzdERhdGVGbihjYWxlbmRhckRhdGUpO1xuXG4gICAgY29uc3QgY2FwcGVkRGF0ZSA9IGtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heChkYXRlLCBtaW5EYXRlLCBtYXhEYXRlKTtcbiAgICBpZiAoIWlzU2FtZURheShjYWxlbmRhckRhdGUsIGNhcHBlZERhdGUpKSB7XG4gICAgICBjb25zdCBuZXdDYWxlbmRhciA9IHJlbmRlckNhbGVuZGFyKGNhbGVuZGFyRWwsIGNhcHBlZERhdGUpO1xuICAgICAgbmV3Q2FsZW5kYXIucXVlcnlTZWxlY3RvcihDQUxFTkRBUl9EQVRFX0ZPQ1VTRUQpLmZvY3VzKCk7XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG59O1xuXG4vKipcbiAqIE5hdmlnYXRlIGJhY2sgb25lIHdlZWsgYW5kIGRpc3BsYXkgdGhlIGNhbGVuZGFyLlxuICpcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgdGhlIGtleWRvd24gZXZlbnRcbiAqL1xuY29uc3QgaGFuZGxlVXBGcm9tRGF0ZSA9IGFkanVzdENhbGVuZGFyKChkYXRlKSA9PiBzdWJXZWVrcyhkYXRlLCAxKSk7XG5cbi8qKlxuICogTmF2aWdhdGUgZm9yd2FyZCBvbmUgd2VlayBhbmQgZGlzcGxheSB0aGUgY2FsZW5kYXIuXG4gKlxuICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudCB0aGUga2V5ZG93biBldmVudFxuICovXG5jb25zdCBoYW5kbGVEb3duRnJvbURhdGUgPSBhZGp1c3RDYWxlbmRhcigoZGF0ZSkgPT4gYWRkV2Vla3MoZGF0ZSwgMSkpO1xuXG4vKipcbiAqIE5hdmlnYXRlIGJhY2sgb25lIGRheSBhbmQgZGlzcGxheSB0aGUgY2FsZW5kYXIuXG4gKlxuICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudCB0aGUga2V5ZG93biBldmVudFxuICovXG5jb25zdCBoYW5kbGVMZWZ0RnJvbURhdGUgPSBhZGp1c3RDYWxlbmRhcigoZGF0ZSkgPT4gc3ViRGF5cyhkYXRlLCAxKSk7XG5cbi8qKlxuICogTmF2aWdhdGUgZm9yd2FyZCBvbmUgZGF5IGFuZCBkaXNwbGF5IHRoZSBjYWxlbmRhci5cbiAqXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IHRoZSBrZXlkb3duIGV2ZW50XG4gKi9cbmNvbnN0IGhhbmRsZVJpZ2h0RnJvbURhdGUgPSBhZGp1c3RDYWxlbmRhcigoZGF0ZSkgPT4gYWRkRGF5cyhkYXRlLCAxKSk7XG5cbi8qKlxuICogTmF2aWdhdGUgdG8gdGhlIHN0YXJ0IG9mIHRoZSB3ZWVrIGFuZCBkaXNwbGF5IHRoZSBjYWxlbmRhci5cbiAqXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IHRoZSBrZXlkb3duIGV2ZW50XG4gKi9cbmNvbnN0IGhhbmRsZUhvbWVGcm9tRGF0ZSA9IGFkanVzdENhbGVuZGFyKChkYXRlKSA9PiBzdGFydE9mV2VlayhkYXRlKSk7XG5cbi8qKlxuICogTmF2aWdhdGUgdG8gdGhlIGVuZCBvZiB0aGUgd2VlayBhbmQgZGlzcGxheSB0aGUgY2FsZW5kYXIuXG4gKlxuICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudCB0aGUga2V5ZG93biBldmVudFxuICovXG5jb25zdCBoYW5kbGVFbmRGcm9tRGF0ZSA9IGFkanVzdENhbGVuZGFyKChkYXRlKSA9PiBlbmRPZldlZWsoZGF0ZSkpO1xuXG4vKipcbiAqIE5hdmlnYXRlIGZvcndhcmQgb25lIG1vbnRoIGFuZCBkaXNwbGF5IHRoZSBjYWxlbmRhci5cbiAqXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IHRoZSBrZXlkb3duIGV2ZW50XG4gKi9cbmNvbnN0IGhhbmRsZVBhZ2VEb3duRnJvbURhdGUgPSBhZGp1c3RDYWxlbmRhcigoZGF0ZSkgPT4gYWRkTW9udGhzKGRhdGUsIDEpKTtcblxuLyoqXG4gKiBOYXZpZ2F0ZSBiYWNrIG9uZSBtb250aCBhbmQgZGlzcGxheSB0aGUgY2FsZW5kYXIuXG4gKlxuICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudCB0aGUga2V5ZG93biBldmVudFxuICovXG5jb25zdCBoYW5kbGVQYWdlVXBGcm9tRGF0ZSA9IGFkanVzdENhbGVuZGFyKChkYXRlKSA9PiBzdWJNb250aHMoZGF0ZSwgMSkpO1xuXG4vKipcbiAqIE5hdmlnYXRlIGZvcndhcmQgb25lIHllYXIgYW5kIGRpc3BsYXkgdGhlIGNhbGVuZGFyLlxuICpcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgdGhlIGtleWRvd24gZXZlbnRcbiAqL1xuY29uc3QgaGFuZGxlU2hpZnRQYWdlRG93bkZyb21EYXRlID0gYWRqdXN0Q2FsZW5kYXIoKGRhdGUpID0+IGFkZFllYXJzKGRhdGUsIDEpKTtcblxuLyoqXG4gKiBOYXZpZ2F0ZSBiYWNrIG9uZSB5ZWFyIGFuZCBkaXNwbGF5IHRoZSBjYWxlbmRhci5cbiAqXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IHRoZSBrZXlkb3duIGV2ZW50XG4gKi9cbmNvbnN0IGhhbmRsZVNoaWZ0UGFnZVVwRnJvbURhdGUgPSBhZGp1c3RDYWxlbmRhcigoZGF0ZSkgPT4gc3ViWWVhcnMoZGF0ZSwgMSkpO1xuXG4vKipcbiAqIGRpc3BsYXkgdGhlIGNhbGVuZGFyIGZvciB0aGUgbW91c2Vtb3ZlIGRhdGUuXG4gKlxuICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudCBUaGUgbW91c2Vtb3ZlIGV2ZW50XG4gKiBAcGFyYW0ge0hUTUxCdXR0b25FbGVtZW50fSBkYXRlRWwgQSBkYXRlIGVsZW1lbnQgd2l0aGluIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnRcbiAqL1xuY29uc3QgaGFuZGxlTW91c2Vtb3ZlRnJvbURhdGUgPSAoZGF0ZUVsKSA9PiB7XG4gIGlmIChkYXRlRWwuZGlzYWJsZWQpIHJldHVybjtcblxuICBjb25zdCBjYWxlbmRhckVsID0gZGF0ZUVsLmNsb3Nlc3QoREFURV9QSUNLRVJfQ0FMRU5EQVIpO1xuXG4gIGNvbnN0IGN1cnJlbnRDYWxlbmRhckRhdGUgPSBjYWxlbmRhckVsLmRhdGFzZXQudmFsdWU7XG4gIGNvbnN0IGhvdmVyRGF0ZSA9IGRhdGVFbC5kYXRhc2V0LnZhbHVlO1xuXG4gIGlmIChob3ZlckRhdGUgPT09IGN1cnJlbnRDYWxlbmRhckRhdGUpIHJldHVybjtcblxuICBjb25zdCBkYXRlVG9EaXNwbGF5ID0gcGFyc2VEYXRlU3RyaW5nKGhvdmVyRGF0ZSk7XG4gIGNvbnN0IG5ld0NhbGVuZGFyID0gcmVuZGVyQ2FsZW5kYXIoY2FsZW5kYXJFbCwgZGF0ZVRvRGlzcGxheSk7XG4gIG5ld0NhbGVuZGFyLnF1ZXJ5U2VsZWN0b3IoQ0FMRU5EQVJfREFURV9GT0NVU0VEKS5mb2N1cygpO1xufTtcblxuLy8gI2VuZHJlZ2lvbiBDYWxlbmRhciBEYXRlIEV2ZW50IEhhbmRsaW5nXG5cbi8vICNyZWdpb24gQ2FsZW5kYXIgTW9udGggRXZlbnQgSGFuZGxpbmdcblxuLyoqXG4gKiBBZGp1c3QgdGhlIG1vbnRoIGFuZCBkaXNwbGF5IHRoZSBtb250aCBzZWxlY3Rpb24gc2NyZWVuIGlmIG5lZWRlZC5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBhZGp1c3RNb250aEZuIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgYWRqdXN0ZWQgbW9udGhcbiAqL1xuY29uc3QgYWRqdXN0TW9udGhTZWxlY3Rpb25TY3JlZW4gPSAoYWRqdXN0TW9udGhGbikgPT4ge1xuICByZXR1cm4gKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgbW9udGhFbCA9IGV2ZW50LnRhcmdldDtcbiAgICBjb25zdCBzZWxlY3RlZE1vbnRoID0gcGFyc2VJbnQobW9udGhFbC5kYXRhc2V0LnZhbHVlLCAxMCk7XG4gICAgY29uc3QgeyBjYWxlbmRhckVsLCBjYWxlbmRhckRhdGUsIG1pbkRhdGUsIG1heERhdGUgfSA9IGdldERhdGVQaWNrZXJDb250ZXh0KFxuICAgICAgbW9udGhFbFxuICAgICk7XG4gICAgY29uc3QgY3VycmVudERhdGUgPSBzZXRNb250aChjYWxlbmRhckRhdGUsIHNlbGVjdGVkTW9udGgpO1xuXG4gICAgbGV0IGFkanVzdGVkTW9udGggPSBhZGp1c3RNb250aEZuKHNlbGVjdGVkTW9udGgpO1xuICAgIGFkanVzdGVkTW9udGggPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMSwgYWRqdXN0ZWRNb250aCkpO1xuXG4gICAgY29uc3QgZGF0ZSA9IHNldE1vbnRoKGNhbGVuZGFyRGF0ZSwgYWRqdXN0ZWRNb250aCk7XG4gICAgY29uc3QgY2FwcGVkRGF0ZSA9IGtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heChkYXRlLCBtaW5EYXRlLCBtYXhEYXRlKTtcbiAgICBpZiAoIWlzU2FtZU1vbnRoKGN1cnJlbnREYXRlLCBjYXBwZWREYXRlKSkge1xuICAgICAgY29uc3QgbmV3Q2FsZW5kYXIgPSBkaXNwbGF5TW9udGhTZWxlY3Rpb24oXG4gICAgICAgIGNhbGVuZGFyRWwsXG4gICAgICAgIGNhcHBlZERhdGUuZ2V0TW9udGgoKVxuICAgICAgKTtcbiAgICAgIG5ld0NhbGVuZGFyLnF1ZXJ5U2VsZWN0b3IoQ0FMRU5EQVJfTU9OVEhfRk9DVVNFRCkuZm9jdXMoKTtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfTtcbn07XG5cbi8qKlxuICogTmF2aWdhdGUgYmFjayB0aHJlZSBtb250aHMgYW5kIGRpc3BsYXkgdGhlIG1vbnRoIHNlbGVjdGlvbiBzY3JlZW4uXG4gKlxuICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudCB0aGUga2V5ZG93biBldmVudFxuICovXG5jb25zdCBoYW5kbGVVcEZyb21Nb250aCA9IGFkanVzdE1vbnRoU2VsZWN0aW9uU2NyZWVuKChtb250aCkgPT4gbW9udGggLSAzKTtcblxuLyoqXG4gKiBOYXZpZ2F0ZSBmb3J3YXJkIHRocmVlIG1vbnRocyBhbmQgZGlzcGxheSB0aGUgbW9udGggc2VsZWN0aW9uIHNjcmVlbi5cbiAqXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IHRoZSBrZXlkb3duIGV2ZW50XG4gKi9cbmNvbnN0IGhhbmRsZURvd25Gcm9tTW9udGggPSBhZGp1c3RNb250aFNlbGVjdGlvblNjcmVlbigobW9udGgpID0+IG1vbnRoICsgMyk7XG5cbi8qKlxuICogTmF2aWdhdGUgYmFjayBvbmUgbW9udGggYW5kIGRpc3BsYXkgdGhlIG1vbnRoIHNlbGVjdGlvbiBzY3JlZW4uXG4gKlxuICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudCB0aGUga2V5ZG93biBldmVudFxuICovXG5jb25zdCBoYW5kbGVMZWZ0RnJvbU1vbnRoID0gYWRqdXN0TW9udGhTZWxlY3Rpb25TY3JlZW4oKG1vbnRoKSA9PiBtb250aCAtIDEpO1xuXG4vKipcbiAqIE5hdmlnYXRlIGZvcndhcmQgb25lIG1vbnRoIGFuZCBkaXNwbGF5IHRoZSBtb250aCBzZWxlY3Rpb24gc2NyZWVuLlxuICpcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgdGhlIGtleWRvd24gZXZlbnRcbiAqL1xuY29uc3QgaGFuZGxlUmlnaHRGcm9tTW9udGggPSBhZGp1c3RNb250aFNlbGVjdGlvblNjcmVlbigobW9udGgpID0+IG1vbnRoICsgMSk7XG5cbi8qKlxuICogTmF2aWdhdGUgdG8gdGhlIHN0YXJ0IG9mIHRoZSByb3cgb2YgbW9udGhzIGFuZCBkaXNwbGF5IHRoZSBtb250aCBzZWxlY3Rpb24gc2NyZWVuLlxuICpcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgdGhlIGtleWRvd24gZXZlbnRcbiAqL1xuY29uc3QgaGFuZGxlSG9tZUZyb21Nb250aCA9IGFkanVzdE1vbnRoU2VsZWN0aW9uU2NyZWVuKFxuICAobW9udGgpID0+IG1vbnRoIC0gKG1vbnRoICUgMylcbik7XG5cbi8qKlxuICogTmF2aWdhdGUgdG8gdGhlIGVuZCBvZiB0aGUgcm93IG9mIG1vbnRocyBhbmQgZGlzcGxheSB0aGUgbW9udGggc2VsZWN0aW9uIHNjcmVlbi5cbiAqXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IHRoZSBrZXlkb3duIGV2ZW50XG4gKi9cbmNvbnN0IGhhbmRsZUVuZEZyb21Nb250aCA9IGFkanVzdE1vbnRoU2VsZWN0aW9uU2NyZWVuKFxuICAobW9udGgpID0+IG1vbnRoICsgMiAtIChtb250aCAlIDMpXG4pO1xuXG4vKipcbiAqIE5hdmlnYXRlIHRvIHRoZSBsYXN0IG1vbnRoIChEZWNlbWJlcikgYW5kIGRpc3BsYXkgdGhlIG1vbnRoIHNlbGVjdGlvbiBzY3JlZW4uXG4gKlxuICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudCB0aGUga2V5ZG93biBldmVudFxuICovXG5jb25zdCBoYW5kbGVQYWdlRG93bkZyb21Nb250aCA9IGFkanVzdE1vbnRoU2VsZWN0aW9uU2NyZWVuKCgpID0+IDExKTtcblxuLyoqXG4gKiBOYXZpZ2F0ZSB0byB0aGUgZmlyc3QgbW9udGggKEphbnVhcnkpIGFuZCBkaXNwbGF5IHRoZSBtb250aCBzZWxlY3Rpb24gc2NyZWVuLlxuICpcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgdGhlIGtleWRvd24gZXZlbnRcbiAqL1xuY29uc3QgaGFuZGxlUGFnZVVwRnJvbU1vbnRoID0gYWRqdXN0TW9udGhTZWxlY3Rpb25TY3JlZW4oKCkgPT4gMCk7XG5cbi8qKlxuICogdXBkYXRlIHRoZSBmb2N1cyBvbiBhIG1vbnRoIHdoZW4gdGhlIG1vdXNlIG1vdmVzLlxuICpcbiAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQgVGhlIG1vdXNlbW92ZSBldmVudFxuICogQHBhcmFtIHtIVE1MQnV0dG9uRWxlbWVudH0gbW9udGhFbCBBIG1vbnRoIGVsZW1lbnQgd2l0aGluIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnRcbiAqL1xuY29uc3QgaGFuZGxlTW91c2Vtb3ZlRnJvbU1vbnRoID0gKG1vbnRoRWwpID0+IHtcbiAgaWYgKG1vbnRoRWwuZGlzYWJsZWQpIHJldHVybjtcbiAgaWYgKG1vbnRoRWwuY2xhc3NMaXN0LmNvbnRhaW5zKENBTEVOREFSX01PTlRIX0ZPQ1VTRURfQ0xBU1MpKSByZXR1cm47XG5cbiAgY29uc3QgZm9jdXNNb250aCA9IHBhcnNlSW50KG1vbnRoRWwuZGF0YXNldC52YWx1ZSwgMTApO1xuXG4gIGNvbnN0IG5ld0NhbGVuZGFyID0gZGlzcGxheU1vbnRoU2VsZWN0aW9uKG1vbnRoRWwsIGZvY3VzTW9udGgpO1xuICBuZXdDYWxlbmRhci5xdWVyeVNlbGVjdG9yKENBTEVOREFSX01PTlRIX0ZPQ1VTRUQpLmZvY3VzKCk7XG59O1xuXG4vLyAjZW5kcmVnaW9uIENhbGVuZGFyIE1vbnRoIEV2ZW50IEhhbmRsaW5nXG5cbi8vICNyZWdpb24gQ2FsZW5kYXIgWWVhciBFdmVudCBIYW5kbGluZ1xuXG4vKipcbiAqIEFkanVzdCB0aGUgeWVhciBhbmQgZGlzcGxheSB0aGUgeWVhciBzZWxlY3Rpb24gc2NyZWVuIGlmIG5lZWRlZC5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBhZGp1c3RZZWFyRm4gZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBhZGp1c3RlZCB5ZWFyXG4gKi9cbmNvbnN0IGFkanVzdFllYXJTZWxlY3Rpb25TY3JlZW4gPSAoYWRqdXN0WWVhckZuKSA9PiB7XG4gIHJldHVybiAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB5ZWFyRWwgPSBldmVudC50YXJnZXQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRZZWFyID0gcGFyc2VJbnQoeWVhckVsLmRhdGFzZXQudmFsdWUsIDEwKTtcbiAgICBjb25zdCB7IGNhbGVuZGFyRWwsIGNhbGVuZGFyRGF0ZSwgbWluRGF0ZSwgbWF4RGF0ZSB9ID0gZ2V0RGF0ZVBpY2tlckNvbnRleHQoXG4gICAgICB5ZWFyRWxcbiAgICApO1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gc2V0WWVhcihjYWxlbmRhckRhdGUsIHNlbGVjdGVkWWVhcik7XG5cbiAgICBsZXQgYWRqdXN0ZWRZZWFyID0gYWRqdXN0WWVhckZuKHNlbGVjdGVkWWVhcik7XG4gICAgYWRqdXN0ZWRZZWFyID0gTWF0aC5tYXgoMCwgYWRqdXN0ZWRZZWFyKTtcblxuICAgIGNvbnN0IGRhdGUgPSBzZXRZZWFyKGNhbGVuZGFyRGF0ZSwgYWRqdXN0ZWRZZWFyKTtcbiAgICBjb25zdCBjYXBwZWREYXRlID0ga2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KGRhdGUsIG1pbkRhdGUsIG1heERhdGUpO1xuICAgIGlmICghaXNTYW1lWWVhcihjdXJyZW50RGF0ZSwgY2FwcGVkRGF0ZSkpIHtcbiAgICAgIGNvbnN0IG5ld0NhbGVuZGFyID0gZGlzcGxheVllYXJTZWxlY3Rpb24oXG4gICAgICAgIGNhbGVuZGFyRWwsXG4gICAgICAgIGNhcHBlZERhdGUuZ2V0RnVsbFllYXIoKVxuICAgICAgKTtcbiAgICAgIG5ld0NhbGVuZGFyLnF1ZXJ5U2VsZWN0b3IoQ0FMRU5EQVJfWUVBUl9GT0NVU0VEKS5mb2N1cygpO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9O1xufTtcblxuLyoqXG4gKiBOYXZpZ2F0ZSBiYWNrIHRocmVlIHllYXJzIGFuZCBkaXNwbGF5IHRoZSB5ZWFyIHNlbGVjdGlvbiBzY3JlZW4uXG4gKlxuICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudCB0aGUga2V5ZG93biBldmVudFxuICovXG5jb25zdCBoYW5kbGVVcEZyb21ZZWFyID0gYWRqdXN0WWVhclNlbGVjdGlvblNjcmVlbigoeWVhcikgPT4geWVhciAtIDMpO1xuXG4vKipcbiAqIE5hdmlnYXRlIGZvcndhcmQgdGhyZWUgeWVhcnMgYW5kIGRpc3BsYXkgdGhlIHllYXIgc2VsZWN0aW9uIHNjcmVlbi5cbiAqXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IHRoZSBrZXlkb3duIGV2ZW50XG4gKi9cbmNvbnN0IGhhbmRsZURvd25Gcm9tWWVhciA9IGFkanVzdFllYXJTZWxlY3Rpb25TY3JlZW4oKHllYXIpID0+IHllYXIgKyAzKTtcblxuLyoqXG4gKiBOYXZpZ2F0ZSBiYWNrIG9uZSB5ZWFyIGFuZCBkaXNwbGF5IHRoZSB5ZWFyIHNlbGVjdGlvbiBzY3JlZW4uXG4gKlxuICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudCB0aGUga2V5ZG93biBldmVudFxuICovXG5jb25zdCBoYW5kbGVMZWZ0RnJvbVllYXIgPSBhZGp1c3RZZWFyU2VsZWN0aW9uU2NyZWVuKCh5ZWFyKSA9PiB5ZWFyIC0gMSk7XG5cbi8qKlxuICogTmF2aWdhdGUgZm9yd2FyZCBvbmUgeWVhciBhbmQgZGlzcGxheSB0aGUgeWVhciBzZWxlY3Rpb24gc2NyZWVuLlxuICpcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgdGhlIGtleWRvd24gZXZlbnRcbiAqL1xuY29uc3QgaGFuZGxlUmlnaHRGcm9tWWVhciA9IGFkanVzdFllYXJTZWxlY3Rpb25TY3JlZW4oKHllYXIpID0+IHllYXIgKyAxKTtcblxuLyoqXG4gKiBOYXZpZ2F0ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHJvdyBvZiB5ZWFycyBhbmQgZGlzcGxheSB0aGUgeWVhciBzZWxlY3Rpb24gc2NyZWVuLlxuICpcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgdGhlIGtleWRvd24gZXZlbnRcbiAqL1xuY29uc3QgaGFuZGxlSG9tZUZyb21ZZWFyID0gYWRqdXN0WWVhclNlbGVjdGlvblNjcmVlbihcbiAgKHllYXIpID0+IHllYXIgLSAoeWVhciAlIDMpXG4pO1xuXG4vKipcbiAqIE5hdmlnYXRlIHRvIHRoZSBlbmQgb2YgdGhlIHJvdyBvZiB5ZWFycyBhbmQgZGlzcGxheSB0aGUgeWVhciBzZWxlY3Rpb24gc2NyZWVuLlxuICpcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgdGhlIGtleWRvd24gZXZlbnRcbiAqL1xuY29uc3QgaGFuZGxlRW5kRnJvbVllYXIgPSBhZGp1c3RZZWFyU2VsZWN0aW9uU2NyZWVuKFxuICAoeWVhcikgPT4geWVhciArIDIgLSAoeWVhciAlIDMpXG4pO1xuXG4vKipcbiAqIE5hdmlnYXRlIHRvIGJhY2sgMTIgeWVhcnMgYW5kIGRpc3BsYXkgdGhlIHllYXIgc2VsZWN0aW9uIHNjcmVlbi5cbiAqXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IHRoZSBrZXlkb3duIGV2ZW50XG4gKi9cbmNvbnN0IGhhbmRsZVBhZ2VVcEZyb21ZZWFyID0gYWRqdXN0WWVhclNlbGVjdGlvblNjcmVlbihcbiAgKHllYXIpID0+IHllYXIgLSBZRUFSX0NIVU5LXG4pO1xuXG4vKipcbiAqIE5hdmlnYXRlIGZvcndhcmQgMTIgeWVhcnMgYW5kIGRpc3BsYXkgdGhlIHllYXIgc2VsZWN0aW9uIHNjcmVlbi5cbiAqXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IHRoZSBrZXlkb3duIGV2ZW50XG4gKi9cbmNvbnN0IGhhbmRsZVBhZ2VEb3duRnJvbVllYXIgPSBhZGp1c3RZZWFyU2VsZWN0aW9uU2NyZWVuKFxuICAoeWVhcikgPT4geWVhciArIFlFQVJfQ0hVTktcbik7XG5cbi8qKlxuICogdXBkYXRlIHRoZSBmb2N1cyBvbiBhIHllYXIgd2hlbiB0aGUgbW91c2UgbW92ZXMuXG4gKlxuICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudCBUaGUgbW91c2Vtb3ZlIGV2ZW50XG4gKiBAcGFyYW0ge0hUTUxCdXR0b25FbGVtZW50fSBkYXRlRWwgQSB5ZWFyIGVsZW1lbnQgd2l0aGluIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnRcbiAqL1xuY29uc3QgaGFuZGxlTW91c2Vtb3ZlRnJvbVllYXIgPSAoeWVhckVsKSA9PiB7XG4gIGlmICh5ZWFyRWwuZGlzYWJsZWQpIHJldHVybjtcbiAgaWYgKHllYXJFbC5jbGFzc0xpc3QuY29udGFpbnMoQ0FMRU5EQVJfWUVBUl9GT0NVU0VEX0NMQVNTKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGZvY3VzWWVhciA9IHBhcnNlSW50KHllYXJFbC5kYXRhc2V0LnZhbHVlLCAxMCk7XG5cbiAgY29uc3QgbmV3Q2FsZW5kYXIgPSBkaXNwbGF5WWVhclNlbGVjdGlvbih5ZWFyRWwsIGZvY3VzWWVhcik7XG4gIG5ld0NhbGVuZGFyLnF1ZXJ5U2VsZWN0b3IoQ0FMRU5EQVJfWUVBUl9GT0NVU0VEKS5mb2N1cygpO1xufTtcblxuLy8gI2VuZHJlZ2lvbiBDYWxlbmRhciBZZWFyIEV2ZW50IEhhbmRsaW5nXG5cbi8vICNyZWdpb24gRm9jdXMgSGFuZGxpbmcgRXZlbnQgSGFuZGxpbmdcblxuY29uc3QgdGFiSGFuZGxlciA9IChmb2N1c2FibGUpID0+IHtcbiAgY29uc3QgZ2V0Rm9jdXNhYmxlQ29udGV4dCA9IChlbCkgPT4ge1xuICAgIGNvbnN0IHsgY2FsZW5kYXJFbCB9ID0gZ2V0RGF0ZVBpY2tlckNvbnRleHQoZWwpO1xuICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gc2VsZWN0KGZvY3VzYWJsZSwgY2FsZW5kYXJFbCk7XG5cbiAgICBjb25zdCBmaXJzdFRhYkluZGV4ID0gMDtcbiAgICBjb25zdCBsYXN0VGFiSW5kZXggPSBmb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IGZpcnN0VGFiU3RvcCA9IGZvY3VzYWJsZUVsZW1lbnRzW2ZpcnN0VGFiSW5kZXhdO1xuICAgIGNvbnN0IGxhc3RUYWJTdG9wID0gZm9jdXNhYmxlRWxlbWVudHNbbGFzdFRhYkluZGV4XTtcbiAgICBjb25zdCBmb2N1c0luZGV4ID0gZm9jdXNhYmxlRWxlbWVudHMuaW5kZXhPZihhY3RpdmVFbGVtZW50KCkpO1xuXG4gICAgY29uc3QgaXNMYXN0VGFiID0gZm9jdXNJbmRleCA9PT0gbGFzdFRhYkluZGV4O1xuICAgIGNvbnN0IGlzRmlyc3RUYWIgPSBmb2N1c0luZGV4ID09PSBmaXJzdFRhYkluZGV4O1xuICAgIGNvbnN0IGlzTm90Rm91bmQgPSBmb2N1c0luZGV4ID09PSAtMTtcblxuICAgIHJldHVybiB7XG4gICAgICBmb2N1c2FibGVFbGVtZW50cyxcbiAgICAgIGlzTm90Rm91bmQsXG4gICAgICBmaXJzdFRhYlN0b3AsXG4gICAgICBpc0ZpcnN0VGFiLFxuICAgICAgbGFzdFRhYlN0b3AsXG4gICAgICBpc0xhc3RUYWIsXG4gICAgfTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHRhYkFoZWFkKGV2ZW50KSB7XG4gICAgICBjb25zdCB7IGZpcnN0VGFiU3RvcCwgaXNMYXN0VGFiLCBpc05vdEZvdW5kIH0gPSBnZXRGb2N1c2FibGVDb250ZXh0KFxuICAgICAgICBldmVudC50YXJnZXRcbiAgICAgICk7XG5cbiAgICAgIGlmIChpc0xhc3RUYWIgfHwgaXNOb3RGb3VuZCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBmaXJzdFRhYlN0b3AuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHRhYkJhY2soZXZlbnQpIHtcbiAgICAgIGNvbnN0IHsgbGFzdFRhYlN0b3AsIGlzRmlyc3RUYWIsIGlzTm90Rm91bmQgfSA9IGdldEZvY3VzYWJsZUNvbnRleHQoXG4gICAgICAgIGV2ZW50LnRhcmdldFxuICAgICAgKTtcblxuICAgICAgaWYgKGlzRmlyc3RUYWIgfHwgaXNOb3RGb3VuZCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBsYXN0VGFiU3RvcC5mb2N1cygpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59O1xuXG5jb25zdCBkYXRlUGlja2VyVGFiRXZlbnRIYW5kbGVyID0gdGFiSGFuZGxlcihEQVRFX1BJQ0tFUl9GT0NVU0FCTEUpO1xuY29uc3QgbW9udGhQaWNrZXJUYWJFdmVudEhhbmRsZXIgPSB0YWJIYW5kbGVyKE1PTlRIX1BJQ0tFUl9GT0NVU0FCTEUpO1xuY29uc3QgeWVhclBpY2tlclRhYkV2ZW50SGFuZGxlciA9IHRhYkhhbmRsZXIoWUVBUl9QSUNLRVJfRk9DVVNBQkxFKTtcblxuLy8gI2VuZHJlZ2lvbiBGb2N1cyBIYW5kbGluZyBFdmVudCBIYW5kbGluZ1xuXG4vLyAjcmVnaW9uIERhdGUgUGlja2VyIEV2ZW50IERlbGVnYXRpb24gUmVnaXN0cmF0aW9uIC8gQ29tcG9uZW50XG5cbmNvbnN0IGRhdGVQaWNrZXJFdmVudHMgPSB7XG4gIFtDTElDS106IHtcbiAgICBbREFURV9QSUNLRVJfQlVUVE9OXSgpIHtcbiAgICAgIHRvZ2dsZUNhbGVuZGFyKHRoaXMpO1xuICAgIH0sXG4gICAgW0NBTEVOREFSX0RBVEVdKCkge1xuICAgICAgc2VsZWN0RGF0ZSh0aGlzKTtcbiAgICB9LFxuICAgIFtDQUxFTkRBUl9NT05USF0oKSB7XG4gICAgICBzZWxlY3RNb250aCh0aGlzKTtcbiAgICB9LFxuICAgIFtDQUxFTkRBUl9ZRUFSXSgpIHtcbiAgICAgIHNlbGVjdFllYXIodGhpcyk7XG4gICAgfSxcbiAgICBbQ0FMRU5EQVJfUFJFVklPVVNfTU9OVEhdKCkge1xuICAgICAgZGlzcGxheVByZXZpb3VzTW9udGgodGhpcyk7XG4gICAgfSxcbiAgICBbQ0FMRU5EQVJfTkVYVF9NT05USF0oKSB7XG4gICAgICBkaXNwbGF5TmV4dE1vbnRoKHRoaXMpO1xuICAgIH0sXG4gICAgW0NBTEVOREFSX1BSRVZJT1VTX1lFQVJdKCkge1xuICAgICAgZGlzcGxheVByZXZpb3VzWWVhcih0aGlzKTtcbiAgICB9LFxuICAgIFtDQUxFTkRBUl9ORVhUX1lFQVJdKCkge1xuICAgICAgZGlzcGxheU5leHRZZWFyKHRoaXMpO1xuICAgIH0sXG4gICAgW0NBTEVOREFSX1BSRVZJT1VTX1lFQVJfQ0hVTktdKCkge1xuICAgICAgZGlzcGxheVByZXZpb3VzWWVhckNodW5rKHRoaXMpO1xuICAgIH0sXG4gICAgW0NBTEVOREFSX05FWFRfWUVBUl9DSFVOS10oKSB7XG4gICAgICBkaXNwbGF5TmV4dFllYXJDaHVuayh0aGlzKTtcbiAgICB9LFxuICAgIFtDQUxFTkRBUl9NT05USF9TRUxFQ1RJT05dKCkge1xuICAgICAgY29uc3QgbmV3Q2FsZW5kYXIgPSBkaXNwbGF5TW9udGhTZWxlY3Rpb24odGhpcyk7XG4gICAgICBuZXdDYWxlbmRhci5xdWVyeVNlbGVjdG9yKENBTEVOREFSX01PTlRIX0ZPQ1VTRUQpLmZvY3VzKCk7XG4gICAgfSxcbiAgICBbQ0FMRU5EQVJfWUVBUl9TRUxFQ1RJT05dKCkge1xuICAgICAgY29uc3QgbmV3Q2FsZW5kYXIgPSBkaXNwbGF5WWVhclNlbGVjdGlvbih0aGlzKTtcbiAgICAgIG5ld0NhbGVuZGFyLnF1ZXJ5U2VsZWN0b3IoQ0FMRU5EQVJfWUVBUl9GT0NVU0VEKS5mb2N1cygpO1xuICAgIH0sXG4gIH0sXG4gIGtleXVwOiB7XG4gICAgW0RBVEVfUElDS0VSX0NBTEVOREFSXShldmVudCkge1xuICAgICAgY29uc3Qga2V5ZG93biA9IHRoaXMuZGF0YXNldC5rZXlkb3duS2V5Q29kZTtcbiAgICAgIGlmIChgJHtldmVudC5rZXlDb2RlfWAgIT09IGtleWRvd24pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBrZXlkb3duOiB7XG4gICAgW0RBVEVfUElDS0VSX0VYVEVSTkFMX0lOUFVUXShldmVudCkge1xuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEVOVEVSX0tFWUNPREUpIHtcbiAgICAgICAgdmFsaWRhdGVEYXRlSW5wdXQodGhpcyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbQ0FMRU5EQVJfREFURV06IGtleW1hcCh7XG4gICAgICBVcDogaGFuZGxlVXBGcm9tRGF0ZSxcbiAgICAgIEFycm93VXA6IGhhbmRsZVVwRnJvbURhdGUsXG4gICAgICBEb3duOiBoYW5kbGVEb3duRnJvbURhdGUsXG4gICAgICBBcnJvd0Rvd246IGhhbmRsZURvd25Gcm9tRGF0ZSxcbiAgICAgIExlZnQ6IGhhbmRsZUxlZnRGcm9tRGF0ZSxcbiAgICAgIEFycm93TGVmdDogaGFuZGxlTGVmdEZyb21EYXRlLFxuICAgICAgUmlnaHQ6IGhhbmRsZVJpZ2h0RnJvbURhdGUsXG4gICAgICBBcnJvd1JpZ2h0OiBoYW5kbGVSaWdodEZyb21EYXRlLFxuICAgICAgSG9tZTogaGFuZGxlSG9tZUZyb21EYXRlLFxuICAgICAgRW5kOiBoYW5kbGVFbmRGcm9tRGF0ZSxcbiAgICAgIFBhZ2VEb3duOiBoYW5kbGVQYWdlRG93bkZyb21EYXRlLFxuICAgICAgUGFnZVVwOiBoYW5kbGVQYWdlVXBGcm9tRGF0ZSxcbiAgICAgIFwiU2hpZnQrUGFnZURvd25cIjogaGFuZGxlU2hpZnRQYWdlRG93bkZyb21EYXRlLFxuICAgICAgXCJTaGlmdCtQYWdlVXBcIjogaGFuZGxlU2hpZnRQYWdlVXBGcm9tRGF0ZSxcbiAgICB9KSxcbiAgICBbQ0FMRU5EQVJfREFURV9QSUNLRVJdOiBrZXltYXAoe1xuICAgICAgVGFiOiBkYXRlUGlja2VyVGFiRXZlbnRIYW5kbGVyLnRhYkFoZWFkLFxuICAgICAgXCJTaGlmdCtUYWJcIjogZGF0ZVBpY2tlclRhYkV2ZW50SGFuZGxlci50YWJCYWNrLFxuICAgIH0pLFxuICAgIFtDQUxFTkRBUl9NT05USF06IGtleW1hcCh7XG4gICAgICBVcDogaGFuZGxlVXBGcm9tTW9udGgsXG4gICAgICBBcnJvd1VwOiBoYW5kbGVVcEZyb21Nb250aCxcbiAgICAgIERvd246IGhhbmRsZURvd25Gcm9tTW9udGgsXG4gICAgICBBcnJvd0Rvd246IGhhbmRsZURvd25Gcm9tTW9udGgsXG4gICAgICBMZWZ0OiBoYW5kbGVMZWZ0RnJvbU1vbnRoLFxuICAgICAgQXJyb3dMZWZ0OiBoYW5kbGVMZWZ0RnJvbU1vbnRoLFxuICAgICAgUmlnaHQ6IGhhbmRsZVJpZ2h0RnJvbU1vbnRoLFxuICAgICAgQXJyb3dSaWdodDogaGFuZGxlUmlnaHRGcm9tTW9udGgsXG4gICAgICBIb21lOiBoYW5kbGVIb21lRnJvbU1vbnRoLFxuICAgICAgRW5kOiBoYW5kbGVFbmRGcm9tTW9udGgsXG4gICAgICBQYWdlRG93bjogaGFuZGxlUGFnZURvd25Gcm9tTW9udGgsXG4gICAgICBQYWdlVXA6IGhhbmRsZVBhZ2VVcEZyb21Nb250aCxcbiAgICB9KSxcbiAgICBbQ0FMRU5EQVJfTU9OVEhfUElDS0VSXToga2V5bWFwKHtcbiAgICAgIFRhYjogbW9udGhQaWNrZXJUYWJFdmVudEhhbmRsZXIudGFiQWhlYWQsXG4gICAgICBcIlNoaWZ0K1RhYlwiOiBtb250aFBpY2tlclRhYkV2ZW50SGFuZGxlci50YWJCYWNrLFxuICAgIH0pLFxuICAgIFtDQUxFTkRBUl9ZRUFSXToga2V5bWFwKHtcbiAgICAgIFVwOiBoYW5kbGVVcEZyb21ZZWFyLFxuICAgICAgQXJyb3dVcDogaGFuZGxlVXBGcm9tWWVhcixcbiAgICAgIERvd246IGhhbmRsZURvd25Gcm9tWWVhcixcbiAgICAgIEFycm93RG93bjogaGFuZGxlRG93bkZyb21ZZWFyLFxuICAgICAgTGVmdDogaGFuZGxlTGVmdEZyb21ZZWFyLFxuICAgICAgQXJyb3dMZWZ0OiBoYW5kbGVMZWZ0RnJvbVllYXIsXG4gICAgICBSaWdodDogaGFuZGxlUmlnaHRGcm9tWWVhcixcbiAgICAgIEFycm93UmlnaHQ6IGhhbmRsZVJpZ2h0RnJvbVllYXIsXG4gICAgICBIb21lOiBoYW5kbGVIb21lRnJvbVllYXIsXG4gICAgICBFbmQ6IGhhbmRsZUVuZEZyb21ZZWFyLFxuICAgICAgUGFnZURvd246IGhhbmRsZVBhZ2VEb3duRnJvbVllYXIsXG4gICAgICBQYWdlVXA6IGhhbmRsZVBhZ2VVcEZyb21ZZWFyLFxuICAgIH0pLFxuICAgIFtDQUxFTkRBUl9ZRUFSX1BJQ0tFUl06IGtleW1hcCh7XG4gICAgICBUYWI6IHllYXJQaWNrZXJUYWJFdmVudEhhbmRsZXIudGFiQWhlYWQsXG4gICAgICBcIlNoaWZ0K1RhYlwiOiB5ZWFyUGlja2VyVGFiRXZlbnRIYW5kbGVyLnRhYkJhY2ssXG4gICAgfSksXG4gICAgW0RBVEVfUElDS0VSX0NBTEVOREFSXShldmVudCkge1xuICAgICAgdGhpcy5kYXRhc2V0LmtleWRvd25LZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcbiAgICB9LFxuICAgIFtEQVRFX1BJQ0tFUl0oZXZlbnQpIHtcbiAgICAgIGNvbnN0IGtleU1hcCA9IGtleW1hcCh7XG4gICAgICAgIEVzY2FwZTogaGFuZGxlRXNjYXBlRnJvbUNhbGVuZGFyLFxuICAgICAgfSk7XG5cbiAgICAgIGtleU1hcChldmVudCk7XG4gICAgfSxcbiAgfSxcbiAgZm9jdXNvdXQ6IHtcbiAgICBbREFURV9QSUNLRVJfRVhURVJOQUxfSU5QVVRdKCkge1xuICAgICAgdmFsaWRhdGVEYXRlSW5wdXQodGhpcyk7XG4gICAgfSxcbiAgICBbREFURV9QSUNLRVJdKGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgaGlkZUNhbGVuZGFyKHRoaXMpO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIGlucHV0OiB7XG4gICAgW0RBVEVfUElDS0VSX0VYVEVSTkFMX0lOUFVUXSgpIHtcbiAgICAgIHJlY29uY2lsZUlucHV0VmFsdWVzKHRoaXMpO1xuICAgICAgdXBkYXRlQ2FsZW5kYXJJZlZpc2libGUodGhpcyk7XG4gICAgfSxcbiAgfSxcbn07XG5cbmlmICghaXNJb3NEZXZpY2UoKSkge1xuICBkYXRlUGlja2VyRXZlbnRzLm1vdXNlbW92ZSA9IHtcbiAgICBbQ0FMRU5EQVJfREFURV9DVVJSRU5UX01PTlRIXSgpIHtcbiAgICAgIGhhbmRsZU1vdXNlbW92ZUZyb21EYXRlKHRoaXMpO1xuICAgIH0sXG4gICAgW0NBTEVOREFSX01PTlRIXSgpIHtcbiAgICAgIGhhbmRsZU1vdXNlbW92ZUZyb21Nb250aCh0aGlzKTtcbiAgICB9LFxuICAgIFtDQUxFTkRBUl9ZRUFSXSgpIHtcbiAgICAgIGhhbmRsZU1vdXNlbW92ZUZyb21ZZWFyKHRoaXMpO1xuICAgIH0sXG4gIH07XG59XG5cbmNvbnN0IGRhdGVQaWNrZXIgPSBiZWhhdmlvcihkYXRlUGlja2VyRXZlbnRzLCB7XG4gIGluaXQocm9vdCkge1xuICAgIHNlbGVjdChEQVRFX1BJQ0tFUiwgcm9vdCkuZm9yRWFjaCgoZGF0ZVBpY2tlckVsKSA9PiB7XG4gICAgICBlbmhhbmNlRGF0ZVBpY2tlcihkYXRlUGlja2VyRWwpO1xuICAgIH0pO1xuICB9LFxuICBnZXREYXRlUGlja2VyQ29udGV4dCxcbiAgZGlzYWJsZSxcbiAgZW5hYmxlLFxuICBpc0RhdGVJbnB1dEludmFsaWQsXG4gIHNldENhbGVuZGFyVmFsdWUsXG4gIHZhbGlkYXRlRGF0ZUlucHV0LFxuICByZW5kZXJDYWxlbmRhcixcbiAgdXBkYXRlQ2FsZW5kYXJJZlZpc2libGUsXG59KTtcblxuLy8gI2VuZHJlZ2lvbiBEYXRlIFBpY2tlciBFdmVudCBEZWxlZ2F0aW9uIFJlZ2lzdHJhdGlvbiAvIENvbXBvbmVudFxuXG5tb2R1bGUuZXhwb3J0cyA9IGRhdGVQaWNrZXI7XG4iLCJjb25zdCBiZWhhdmlvciA9IHJlcXVpcmUoXCIuLi91dGlscy9iZWhhdmlvclwiKTtcbmNvbnN0IHNlbGVjdCA9IHJlcXVpcmUoXCIuLi91dGlscy9zZWxlY3RcIik7XG5jb25zdCB7IHByZWZpeDogUFJFRklYIH0gPSByZXF1aXJlKFwiLi4vY29uZmlnXCIpO1xuY29uc3Qge1xuICBnZXREYXRlUGlja2VyQ29udGV4dCxcbiAgaXNEYXRlSW5wdXRJbnZhbGlkLFxuICB1cGRhdGVDYWxlbmRhcklmVmlzaWJsZSxcbn0gPSByZXF1aXJlKFwiLi9kYXRlLXBpY2tlclwiKTtcblxuY29uc3QgREFURV9QSUNLRVJfQ0xBU1MgPSBgJHtQUkVGSVh9LWRhdGUtcGlja2VyYDtcbmNvbnN0IERBVEVfUkFOR0VfUElDS0VSX0NMQVNTID0gYCR7UFJFRklYfS1kYXRlLXJhbmdlLXBpY2tlcmA7XG5jb25zdCBEQVRFX1JBTkdFX1BJQ0tFUl9SQU5HRV9TVEFSVF9DTEFTUyA9IGAke0RBVEVfUkFOR0VfUElDS0VSX0NMQVNTfV9fcmFuZ2Utc3RhcnRgO1xuY29uc3QgREFURV9SQU5HRV9QSUNLRVJfUkFOR0VfRU5EX0NMQVNTID0gYCR7REFURV9SQU5HRV9QSUNLRVJfQ0xBU1N9X19yYW5nZS1lbmRgO1xuXG5jb25zdCBEQVRFX1BJQ0tFUiA9IGAuJHtEQVRFX1BJQ0tFUl9DTEFTU31gO1xuY29uc3QgREFURV9SQU5HRV9QSUNLRVIgPSBgLiR7REFURV9SQU5HRV9QSUNLRVJfQ0xBU1N9YDtcbmNvbnN0IERBVEVfUkFOR0VfUElDS0VSX1JBTkdFX1NUQVJUID0gYC4ke0RBVEVfUkFOR0VfUElDS0VSX1JBTkdFX1NUQVJUX0NMQVNTfWA7XG5jb25zdCBEQVRFX1JBTkdFX1BJQ0tFUl9SQU5HRV9FTkQgPSBgLiR7REFURV9SQU5HRV9QSUNLRVJfUkFOR0VfRU5EX0NMQVNTfWA7XG5cbmNvbnN0IERFRkFVTFRfTUlOX0RBVEUgPSBcIjAwMDAtMDEtMDFcIjtcblxuLyoqXG4gKiBUaGUgcHJvcGVydGllcyBhbmQgZWxlbWVudHMgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHBpY2tlci5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IERhdGVSYW5nZVBpY2tlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IGRhdGVSYW5nZVBpY2tlckVsXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSByYW5nZVN0YXJ0RWxcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IHJhbmdlRW5kRWxcbiAqL1xuXG4vKipcbiAqIEdldCBhbiBvYmplY3Qgb2YgdGhlIHByb3BlcnRpZXMgYW5kIGVsZW1lbnRzIGJlbG9uZ2luZyBkaXJlY3RseSB0byB0aGUgZ2l2ZW5cbiAqIGRhdGUgcGlja2VyIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCB0aGUgZWxlbWVudCB3aXRoaW4gdGhlIGRhdGUgcGlja2VyXG4gKiBAcmV0dXJucyB7RGF0ZVJhbmdlUGlja2VyQ29udGV4dH0gZWxlbWVudHNcbiAqL1xuY29uc3QgZ2V0RGF0ZVJhbmdlUGlja2VyQ29udGV4dCA9IChlbCkgPT4ge1xuICBjb25zdCBkYXRlUmFuZ2VQaWNrZXJFbCA9IGVsLmNsb3Nlc3QoREFURV9SQU5HRV9QSUNLRVIpO1xuXG4gIGlmICghZGF0ZVJhbmdlUGlja2VyRWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgaXMgbWlzc2luZyBvdXRlciAke0RBVEVfUkFOR0VfUElDS0VSfWApO1xuICB9XG5cbiAgY29uc3QgcmFuZ2VTdGFydEVsID0gZGF0ZVJhbmdlUGlja2VyRWwucXVlcnlTZWxlY3RvcihcbiAgICBEQVRFX1JBTkdFX1BJQ0tFUl9SQU5HRV9TVEFSVFxuICApO1xuICBjb25zdCByYW5nZUVuZEVsID0gZGF0ZVJhbmdlUGlja2VyRWwucXVlcnlTZWxlY3RvcihcbiAgICBEQVRFX1JBTkdFX1BJQ0tFUl9SQU5HRV9FTkRcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIGRhdGVSYW5nZVBpY2tlckVsLFxuICAgIHJhbmdlU3RhcnRFbCxcbiAgICByYW5nZUVuZEVsLFxuICB9O1xufTtcblxuLyoqXG4gKiBoYW5kbGUgdXBkYXRlIGZyb20gcmFuZ2Ugc3RhcnQgZGF0ZSBwaWNrZXJcbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBhbiBlbGVtZW50IHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBwaWNrZXJcbiAqL1xuY29uc3QgaGFuZGxlUmFuZ2VTdGFydFVwZGF0ZSA9IChlbCkgPT4ge1xuICBjb25zdCB7XG4gICAgZGF0ZVJhbmdlUGlja2VyRWwsXG4gICAgcmFuZ2VTdGFydEVsLFxuICAgIHJhbmdlRW5kRWwsXG4gIH0gPSBnZXREYXRlUmFuZ2VQaWNrZXJDb250ZXh0KGVsKTtcbiAgY29uc3QgeyBpbnRlcm5hbElucHV0RWwgfSA9IGdldERhdGVQaWNrZXJDb250ZXh0KHJhbmdlU3RhcnRFbCk7XG4gIGNvbnN0IHVwZGF0ZWREYXRlID0gaW50ZXJuYWxJbnB1dEVsLnZhbHVlO1xuXG4gIGlmICh1cGRhdGVkRGF0ZSAmJiAhaXNEYXRlSW5wdXRJbnZhbGlkKGludGVybmFsSW5wdXRFbCkpIHtcbiAgICByYW5nZUVuZEVsLmRhdGFzZXQubWluRGF0ZSA9IHVwZGF0ZWREYXRlO1xuICAgIHJhbmdlRW5kRWwuZGF0YXNldC5yYW5nZURhdGUgPSB1cGRhdGVkRGF0ZTtcbiAgICByYW5nZUVuZEVsLmRhdGFzZXQuZGVmYXVsdERhdGUgPSB1cGRhdGVkRGF0ZTtcbiAgfSBlbHNlIHtcbiAgICByYW5nZUVuZEVsLmRhdGFzZXQubWluRGF0ZSA9IGRhdGVSYW5nZVBpY2tlckVsLmRhdGFzZXQubWluRGF0ZSB8fCBcIlwiO1xuICAgIHJhbmdlRW5kRWwuZGF0YXNldC5yYW5nZURhdGUgPSBcIlwiO1xuICAgIHJhbmdlRW5kRWwuZGF0YXNldC5kZWZhdWx0RGF0ZSA9IFwiXCI7XG4gIH1cblxuICB1cGRhdGVDYWxlbmRhcklmVmlzaWJsZShyYW5nZUVuZEVsKTtcbn07XG5cbi8qKlxuICogaGFuZGxlIHVwZGF0ZSBmcm9tIHJhbmdlIHN0YXJ0IGRhdGUgcGlja2VyXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgYW4gZWxlbWVudCB3aXRoaW4gdGhlIGRhdGUgcmFuZ2UgcGlja2VyXG4gKi9cbmNvbnN0IGhhbmRsZVJhbmdlRW5kVXBkYXRlID0gKGVsKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkYXRlUmFuZ2VQaWNrZXJFbCxcbiAgICByYW5nZVN0YXJ0RWwsXG4gICAgcmFuZ2VFbmRFbCxcbiAgfSA9IGdldERhdGVSYW5nZVBpY2tlckNvbnRleHQoZWwpO1xuICBjb25zdCB7IGludGVybmFsSW5wdXRFbCB9ID0gZ2V0RGF0ZVBpY2tlckNvbnRleHQocmFuZ2VFbmRFbCk7XG4gIGNvbnN0IHVwZGF0ZWREYXRlID0gaW50ZXJuYWxJbnB1dEVsLnZhbHVlO1xuXG4gIGlmICh1cGRhdGVkRGF0ZSAmJiAhaXNEYXRlSW5wdXRJbnZhbGlkKGludGVybmFsSW5wdXRFbCkpIHtcbiAgICByYW5nZVN0YXJ0RWwuZGF0YXNldC5tYXhEYXRlID0gdXBkYXRlZERhdGU7XG4gICAgcmFuZ2VTdGFydEVsLmRhdGFzZXQucmFuZ2VEYXRlID0gdXBkYXRlZERhdGU7XG4gICAgcmFuZ2VTdGFydEVsLmRhdGFzZXQuZGVmYXVsdERhdGUgPSB1cGRhdGVkRGF0ZTtcbiAgfSBlbHNlIHtcbiAgICByYW5nZVN0YXJ0RWwuZGF0YXNldC5tYXhEYXRlID0gZGF0ZVJhbmdlUGlja2VyRWwuZGF0YXNldC5tYXhEYXRlIHx8IFwiXCI7XG4gICAgcmFuZ2VTdGFydEVsLmRhdGFzZXQucmFuZ2VEYXRlID0gXCJcIjtcbiAgICByYW5nZVN0YXJ0RWwuZGF0YXNldC5kZWZhdWx0RGF0ZSA9IFwiXCI7XG4gIH1cblxuICB1cGRhdGVDYWxlbmRhcklmVmlzaWJsZShyYW5nZVN0YXJ0RWwpO1xufTtcblxuLyoqXG4gKiBFbmhhbmNlIGFuIGlucHV0IHdpdGggdGhlIGRhdGUgcGlja2VyIGVsZW1lbnRzXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgVGhlIGluaXRpYWwgd3JhcHBpbmcgZWxlbWVudCBvZiB0aGUgZGF0ZSByYW5nZSBwaWNrZXIgY29tcG9uZW50XG4gKi9cbmNvbnN0IGVuaGFuY2VEYXRlUmFuZ2VQaWNrZXIgPSAoZWwpID0+IHtcbiAgY29uc3QgZGF0ZVJhbmdlUGlja2VyRWwgPSBlbC5jbG9zZXN0KERBVEVfUkFOR0VfUElDS0VSKTtcblxuICBjb25zdCBbcmFuZ2VTdGFydCwgcmFuZ2VFbmRdID0gc2VsZWN0KERBVEVfUElDS0VSLCBkYXRlUmFuZ2VQaWNrZXJFbCk7XG5cbiAgaWYgKCFyYW5nZVN0YXJ0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7REFURV9SQU5HRV9QSUNLRVJ9IGlzIG1pc3NpbmcgaW5uZXIgdHdvICcke0RBVEVfUElDS0VSfScgZWxlbWVudHNgXG4gICAgKTtcbiAgfVxuXG4gIGlmICghcmFuZ2VFbmQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtEQVRFX1JBTkdFX1BJQ0tFUn0gaXMgbWlzc2luZyBzZWNvbmQgJyR7REFURV9QSUNLRVJ9JyBlbGVtZW50YFxuICAgICk7XG4gIH1cblxuICByYW5nZVN0YXJ0LmNsYXNzTGlzdC5hZGQoREFURV9SQU5HRV9QSUNLRVJfUkFOR0VfU1RBUlRfQ0xBU1MpO1xuICByYW5nZUVuZC5jbGFzc0xpc3QuYWRkKERBVEVfUkFOR0VfUElDS0VSX1JBTkdFX0VORF9DTEFTUyk7XG5cbiAgaWYgKCFkYXRlUmFuZ2VQaWNrZXJFbC5kYXRhc2V0Lm1pbkRhdGUpIHtcbiAgICBkYXRlUmFuZ2VQaWNrZXJFbC5kYXRhc2V0Lm1pbkRhdGUgPSBERUZBVUxUX01JTl9EQVRFO1xuICB9XG5cbiAgY29uc3QgbWluRGF0ZSA9IGRhdGVSYW5nZVBpY2tlckVsLmRhdGFzZXQubWluRGF0ZTtcbiAgcmFuZ2VTdGFydC5kYXRhc2V0Lm1pbkRhdGUgPSBtaW5EYXRlO1xuICByYW5nZUVuZC5kYXRhc2V0Lm1pbkRhdGUgPSBtaW5EYXRlO1xuXG4gIGNvbnN0IG1heERhdGUgPSBkYXRlUmFuZ2VQaWNrZXJFbC5kYXRhc2V0Lm1heERhdGU7XG4gIGlmIChtYXhEYXRlKSB7XG4gICAgcmFuZ2VTdGFydC5kYXRhc2V0Lm1heERhdGUgPSBtYXhEYXRlO1xuICAgIHJhbmdlRW5kLmRhdGFzZXQubWF4RGF0ZSA9IG1heERhdGU7XG4gIH1cblxuICBoYW5kbGVSYW5nZVN0YXJ0VXBkYXRlKGRhdGVSYW5nZVBpY2tlckVsKTtcbiAgaGFuZGxlUmFuZ2VFbmRVcGRhdGUoZGF0ZVJhbmdlUGlja2VyRWwpO1xufTtcblxuY29uc3QgZGF0ZVJhbmdlUGlja2VyID0gYmVoYXZpb3IoXG4gIHtcbiAgICBcImlucHV0IGNoYW5nZVwiOiB7XG4gICAgICBbREFURV9SQU5HRV9QSUNLRVJfUkFOR0VfU1RBUlRdKCkge1xuICAgICAgICBoYW5kbGVSYW5nZVN0YXJ0VXBkYXRlKHRoaXMpO1xuICAgICAgfSxcbiAgICAgIFtEQVRFX1JBTkdFX1BJQ0tFUl9SQU5HRV9FTkRdKCkge1xuICAgICAgICBoYW5kbGVSYW5nZUVuZFVwZGF0ZSh0aGlzKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIGluaXQocm9vdCkge1xuICAgICAgc2VsZWN0KERBVEVfUkFOR0VfUElDS0VSLCByb290KS5mb3JFYWNoKChkYXRlUmFuZ2VQaWNrZXJFbCkgPT4ge1xuICAgICAgICBlbmhhbmNlRGF0ZVJhbmdlUGlja2VyKGRhdGVSYW5nZVBpY2tlckVsKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH1cbik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGF0ZVJhbmdlUGlja2VyO1xuIiwiY29uc3Qgc2VsZWN0ID0gcmVxdWlyZShcIi4uL3V0aWxzL3NlbGVjdFwiKTtcbmNvbnN0IGJlaGF2aW9yID0gcmVxdWlyZShcIi4uL3V0aWxzL2JlaGF2aW9yXCIpO1xuY29uc3QgeyBwcmVmaXg6IFBSRUZJWCB9ID0gcmVxdWlyZShcIi4uL2NvbmZpZ1wiKTtcblxuY29uc3QgRFJPUFpPTkVfQ0xBU1MgPSBgJHtQUkVGSVh9LWZpbGUtaW5wdXRgO1xuY29uc3QgRFJPUFpPTkUgPSBgLiR7RFJPUFpPTkVfQ0xBU1N9YDtcbmNvbnN0IElOUFVUX0NMQVNTID0gYCR7UFJFRklYfS1maWxlLWlucHV0X19pbnB1dGA7XG5jb25zdCBUQVJHRVRfQ0xBU1MgPSBgJHtQUkVGSVh9LWZpbGUtaW5wdXRfX3RhcmdldGA7XG5jb25zdCBJTlBVVCA9IGAuJHtJTlBVVF9DTEFTU31gO1xuY29uc3QgQk9YX0NMQVNTID0gYCR7UFJFRklYfS1maWxlLWlucHV0X19ib3hgO1xuY29uc3QgSU5TVFJVQ1RJT05TX0NMQVNTID0gYCR7UFJFRklYfS1maWxlLWlucHV0X19pbnN0cnVjdGlvbnNgO1xuY29uc3QgUFJFVklFV19DTEFTUyA9IGAke1BSRUZJWH0tZmlsZS1pbnB1dF9fcHJldmlld2A7XG5jb25zdCBQUkVWSUVXX0hFQURJTkdfQ0xBU1MgPSBgJHtQUkVGSVh9LWZpbGUtaW5wdXRfX3ByZXZpZXctaGVhZGluZ2A7XG5jb25zdCBESVNBQkxFRF9DTEFTUyA9IGAke1BSRUZJWH0tZmlsZS1pbnB1dC0tZGlzYWJsZWRgO1xuY29uc3QgQ0hPT1NFX0NMQVNTID0gYCR7UFJFRklYfS1maWxlLWlucHV0X19jaG9vc2VgO1xuY29uc3QgQUNDRVBURURfRklMRV9NRVNTQUdFX0NMQVNTID0gYCR7UFJFRklYfS1maWxlLWlucHV0X19hY2NlcHRlZC1maWxlcy1tZXNzYWdlYDtcbmNvbnN0IERSQUdfVEVYVF9DTEFTUyA9IGAke1BSRUZJWH0tZmlsZS1pbnB1dF9fZHJhZy10ZXh0YDtcbmNvbnN0IERSQUdfQ0xBU1MgPSBgJHtQUkVGSVh9LWZpbGUtaW5wdXQtLWRyYWdgO1xuY29uc3QgTE9BRElOR19DTEFTUyA9IFwiaXMtbG9hZGluZ1wiO1xuY29uc3QgSElEREVOX0NMQVNTID0gXCJkaXNwbGF5LW5vbmVcIjtcbmNvbnN0IElOVkFMSURfRklMRV9DTEFTUyA9IFwiaGFzLWludmFsaWQtZmlsZVwiO1xuY29uc3QgR0VORVJJQ19QUkVWSUVXX0NMQVNTX05BTUUgPSBgJHtQUkVGSVh9LWZpbGUtaW5wdXRfX3ByZXZpZXctaW1hZ2VgO1xuY29uc3QgR0VORVJJQ19QUkVWSUVXX0NMQVNTID0gYCR7R0VORVJJQ19QUkVWSUVXX0NMQVNTX05BTUV9LS1nZW5lcmljYDtcbmNvbnN0IFBERl9QUkVWSUVXX0NMQVNTID0gYCR7R0VORVJJQ19QUkVWSUVXX0NMQVNTX05BTUV9LS1wZGZgO1xuY29uc3QgV09SRF9QUkVWSUVXX0NMQVNTID0gYCR7R0VORVJJQ19QUkVWSUVXX0NMQVNTX05BTUV9LS13b3JkYDtcbmNvbnN0IFZJREVPX1BSRVZJRVdfQ0xBU1MgPSBgJHtHRU5FUklDX1BSRVZJRVdfQ0xBU1NfTkFNRX0tLXZpZGVvYDtcbmNvbnN0IEVYQ0VMX1BSRVZJRVdfQ0xBU1MgPSBgJHtHRU5FUklDX1BSRVZJRVdfQ0xBU1NfTkFNRX0tLWV4Y2VsYDtcbmNvbnN0IFNQQUNFUl9HSUYgPVxuICBcImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBSUFBQUFBQUFQLy8veUg1QkFFQUFBQUFMQUFBQUFBQkFBRUFBQUlCUkFBN1wiO1xuXG4vKipcbiAqIFRoZSBwcm9wZXJ0aWVzIGFuZCBlbGVtZW50cyB3aXRoaW4gdGhlIGZpbGUgaW5wdXQuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBGaWxlSW5wdXRDb250ZXh0XG4gKiBAcHJvcGVydHkge0hUTUxEaXZFbGVtZW50fSBkcm9wWm9uZUVsXG4gKiBAcHJvcGVydHkge0hUTUxJbnB1dEVsZW1lbnR9IGlucHV0RWxcbiAqL1xuXG4vKipcbiAqIEdldCBhbiBvYmplY3Qgb2YgdGhlIHByb3BlcnRpZXMgYW5kIGVsZW1lbnRzIGJlbG9uZ2luZyBkaXJlY3RseSB0byB0aGUgZ2l2ZW5cbiAqIGZpbGUgaW5wdXQgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIHRoZSBlbGVtZW50IHdpdGhpbiB0aGUgZmlsZSBpbnB1dFxuICogQHJldHVybnMge0ZpbGVJbnB1dENvbnRleHR9IGVsZW1lbnRzXG4gKi9cbmNvbnN0IGdldEZpbGVJbnB1dENvbnRleHQgPSAoZWwpID0+IHtcbiAgY29uc3QgZHJvcFpvbmVFbCA9IGVsLmNsb3Nlc3QoRFJPUFpPTkUpO1xuXG4gIGlmICghZHJvcFpvbmVFbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBpcyBtaXNzaW5nIG91dGVyICR7RFJPUFpPTkV9YCk7XG4gIH1cblxuICBjb25zdCBpbnB1dEVsID0gZHJvcFpvbmVFbC5xdWVyeVNlbGVjdG9yKElOUFVUKTtcblxuICByZXR1cm4ge1xuICAgIGRyb3Bab25lRWwsXG4gICAgaW5wdXRFbCxcbiAgfTtcbn07XG5cbi8qKlxuICogRGlzYWJsZSB0aGUgZmlsZSBpbnB1dCBjb21wb25lbnRcbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBBbiBlbGVtZW50IHdpdGhpbiB0aGUgZmlsZSBpbnB1dCBjb21wb25lbnRcbiAqL1xuY29uc3QgZGlzYWJsZSA9IChlbCkgPT4ge1xuICBjb25zdCB7IGRyb3Bab25lRWwsIGlucHV0RWwgfSA9IGdldEZpbGVJbnB1dENvbnRleHQoZWwpO1xuXG4gIGlucHV0RWwuZGlzYWJsZWQgPSB0cnVlO1xuICBkcm9wWm9uZUVsLmNsYXNzTGlzdC5hZGQoRElTQUJMRURfQ0xBU1MpO1xuICBkcm9wWm9uZUVsLnNldEF0dHJpYnV0ZShcImFyaWEtZGlzYWJsZWRcIiwgXCJ0cnVlXCIpO1xufTtcblxuLyoqXG4gKiBFbmFibGUgdGhlIGZpbGUgaW5wdXQgY29tcG9uZW50XG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgQW4gZWxlbWVudCB3aXRoaW4gdGhlIGZpbGUgaW5wdXQgY29tcG9uZW50XG4gKi9cbmNvbnN0IGVuYWJsZSA9IChlbCkgPT4ge1xuICBjb25zdCB7IGRyb3Bab25lRWwsIGlucHV0RWwgfSA9IGdldEZpbGVJbnB1dENvbnRleHQoZWwpO1xuXG4gIGlucHV0RWwuZGlzYWJsZWQgPSBmYWxzZTtcbiAgZHJvcFpvbmVFbC5jbGFzc0xpc3QucmVtb3ZlKERJU0FCTEVEX0NMQVNTKTtcbiAgZHJvcFpvbmVFbC5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIElEIG5hbWUgZm9yIGVhY2ggZmlsZSB0aGF0IHN0cmlwcyBhbGwgaW52YWxpZCBjaGFyYWN0ZXJzLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBuYW1lIG9mIHRoZSBmaWxlIGFkZGVkIHRvIGZpbGUgaW5wdXRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHNhbWUgY2hhcmFjdGVycyBhcyB0aGUgbmFtZSB3aXRoIGludmFsaWQgY2hhcnMgcmVtb3ZlZFxuICovXG5jb25zdCBtYWtlU2FmZUZvcklEID0gKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5hbWUucmVwbGFjZSgvW15hLXowLTldL2csIGZ1bmN0aW9uIHJlcGxhY2VOYW1lKHMpIHtcbiAgICBjb25zdCBjID0gcy5jaGFyQ29kZUF0KDApO1xuICAgIGlmIChjID09PSAzMikgcmV0dXJuIFwiLVwiO1xuICAgIGlmIChjID49IDY1ICYmIGMgPD0gOTApIHJldHVybiBgaW1nXyR7cy50b0xvd2VyQ2FzZSgpfWA7XG4gICAgcmV0dXJuIGBfXyR7KFwiMDAwXCIsIGMudG9TdHJpbmcoMTYpKS5zbGljZSgtNCl9YDtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEJ1aWxkcyBmdWxsIGZpbGUgaW5wdXQgY29tb25lbnRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGZpbGVJbnB1dEVsIC0gb3JpZ2luYWwgZmlsZSBpbnB1dCBvbiBwYWdlXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8SFRNTEVsZW1lbnR9IC0gSW5zdHJ1Y3Rpb25zLCB0YXJnZXQgYXJlYSBkaXZcbiAqL1xuY29uc3QgYnVpbGRGaWxlSW5wdXQgPSAoZmlsZUlucHV0RWwpID0+IHtcbiAgY29uc3QgYWNjZXB0c011bHRpcGxlID0gZmlsZUlucHV0RWwuaGFzQXR0cmlidXRlKFwibXVsdGlwbGVcIik7XG4gIGNvbnN0IGZpbGVJbnB1dFBhcmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnN0IGRyb3BUYXJnZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjb25zdCBpbnN0cnVjdGlvbnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjb25zdCBkaXNhYmxlZCA9IGZpbGVJbnB1dEVsLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuXG4gIC8vIEFkZHMgY2xhc3MgbmFtZXMgYW5kIG90aGVyIGF0dHJpYnV0ZXNcbiAgZmlsZUlucHV0RWwuY2xhc3NMaXN0LnJlbW92ZShEUk9QWk9ORV9DTEFTUyk7XG4gIGZpbGVJbnB1dEVsLmNsYXNzTGlzdC5hZGQoSU5QVVRfQ0xBU1MpO1xuICBmaWxlSW5wdXRQYXJlbnQuY2xhc3NMaXN0LmFkZChEUk9QWk9ORV9DTEFTUyk7XG4gIGJveC5jbGFzc0xpc3QuYWRkKEJPWF9DTEFTUyk7XG4gIGluc3RydWN0aW9ucy5jbGFzc0xpc3QuYWRkKElOU1RSVUNUSU9OU19DTEFTUyk7XG4gIGluc3RydWN0aW9ucy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gIGRyb3BUYXJnZXQuY2xhc3NMaXN0LmFkZChUQVJHRVRfQ0xBU1MpO1xuXG4gIC8vIEFkZHMgY2hpbGQgZWxlbWVudHMgdG8gdGhlIERPTVxuICBmaWxlSW5wdXRFbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkcm9wVGFyZ2V0LCBmaWxlSW5wdXRFbCk7XG4gIGZpbGVJbnB1dEVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZpbGVJbnB1dFBhcmVudCwgZHJvcFRhcmdldCk7XG4gIGRyb3BUYXJnZXQuYXBwZW5kQ2hpbGQoZmlsZUlucHV0RWwpO1xuICBmaWxlSW5wdXRQYXJlbnQuYXBwZW5kQ2hpbGQoZHJvcFRhcmdldCk7XG4gIGZpbGVJbnB1dEVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGluc3RydWN0aW9ucywgZmlsZUlucHV0RWwpO1xuICBmaWxlSW5wdXRFbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShib3gsIGZpbGVJbnB1dEVsKTtcblxuICAvLyBEaXNhYmxlZCBzdHlsaW5nXG4gIGlmIChkaXNhYmxlZCkge1xuICAgIGRpc2FibGUoZmlsZUlucHV0RWwpO1xuICB9XG5cbiAgLy8gU2V0cyBpbnN0cnVjdGlvbiB0ZXN0IGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IG11bHRpcGxlIGZpbGVzIGFyZSBhY2NlcHRlZFxuICBpZiAoYWNjZXB0c011bHRpcGxlKSB7XG4gICAgaW5zdHJ1Y3Rpb25zLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cIiR7RFJBR19URVhUX0NMQVNTfVwiPkRyYWcgZmlsZXMgaGVyZSBvciA8L3NwYW4+PHNwYW4gY2xhc3M9XCIke0NIT09TRV9DTEFTU31cIj5jaG9vc2UgZnJvbSBmb2xkZXI8L3NwYW4+YDtcbiAgfSBlbHNlIHtcbiAgICBpbnN0cnVjdGlvbnMuaW5uZXJIVE1MID0gYDxzcGFuIGNsYXNzPVwiJHtEUkFHX1RFWFRfQ0xBU1N9XCI+RHJhZyBmaWxlIGhlcmUgb3IgPC9zcGFuPjxzcGFuIGNsYXNzPVwiJHtDSE9PU0VfQ0xBU1N9XCI+Y2hvb3NlIGZyb20gZm9sZGVyPC9zcGFuPmA7XG4gIH1cblxuICAvLyBJRTExIGFuZCBFZGdlIGRvIG5vdCBzdXBwb3J0IGRyb3AgZmlsZXMgb24gZmlsZSBpbnB1dHMsIHNvIHdlJ3ZlIHJlbW92ZWQgdGV4dCB0aGF0IGluZGljYXRlcyB0aGF0XG4gIGlmIChcbiAgICAvcnY6MTEuMC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHxcbiAgICAvRWRnZVxcL1xcZC4vaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG4gICkge1xuICAgIGZpbGVJbnB1dFBhcmVudC5xdWVyeVNlbGVjdG9yKGAuJHtEUkFHX1RFWFRfQ0xBU1N9YCkub3V0ZXJIVE1MID0gXCJcIjtcbiAgfVxuXG4gIHJldHVybiB7IGluc3RydWN0aW9ucywgZHJvcFRhcmdldCB9O1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIGltYWdlIHByZXZpZXdzLCB3ZSB3YW50IHRvIHN0YXJ0IHdpdGggYSBjbGVhbiBsaXN0IGV2ZXJ5IHRpbWUgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxlIGlucHV0XG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBkcm9wVGFyZ2V0IC0gdGFyZ2V0IGFyZWEgZGl2IHRoYXQgZW5jYXNlcyB0aGUgaW5wdXRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGluc3RydWN0aW9ucyAtIHRleHQgdG8gaW5mb3JtIHVzZXJzIHRvIGRyYWcgb3Igc2VsZWN0IGZpbGVzXG4gKi9cbmNvbnN0IHJlbW92ZU9sZFByZXZpZXdzID0gKGRyb3BUYXJnZXQsIGluc3RydWN0aW9ucykgPT4ge1xuICBjb25zdCBmaWxlUHJldmlld3MgPSBkcm9wVGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke1BSRVZJRVdfQ0xBU1N9YCk7XG4gIGNvbnN0IGN1cnJlbnRQcmV2aWV3SGVhZGluZyA9IGRyb3BUYXJnZXQucXVlcnlTZWxlY3RvcihcbiAgICBgLiR7UFJFVklFV19IRUFESU5HX0NMQVNTfWBcbiAgKTtcbiAgY29uc3QgY3VycmVudEVycm9yTWVzc2FnZSA9IGRyb3BUYXJnZXQucXVlcnlTZWxlY3RvcihcbiAgICBgLiR7QUNDRVBURURfRklMRV9NRVNTQUdFX0NMQVNTfWBcbiAgKTtcblxuICAvLyBSZW1vdmUgdGhlIGhlYWRpbmcgYWJvdmUgdGhlIHByZXZpZXdzXG4gIGlmIChjdXJyZW50UHJldmlld0hlYWRpbmcpIHtcbiAgICBjdXJyZW50UHJldmlld0hlYWRpbmcub3V0ZXJIVE1MID0gXCJcIjtcbiAgfVxuXG4gIC8vIFJlbW92ZSBleGlzdGluZyBlcnJvciBtZXNzYWdlc1xuICBpZiAoY3VycmVudEVycm9yTWVzc2FnZSkge1xuICAgIGN1cnJlbnRFcnJvck1lc3NhZ2Uub3V0ZXJIVE1MID0gXCJcIjtcbiAgICBkcm9wVGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoSU5WQUxJRF9GSUxFX0NMQVNTKTtcbiAgfVxuXG4gIC8vIEdldCByaWQgb2YgZXhpc3RpbmcgcHJldmlld3MgaWYgdGhleSBleGlzdCwgc2hvdyBpbnN0cnVjdGlvbnNcbiAgaWYgKGZpbGVQcmV2aWV3cyAhPT0gbnVsbCkge1xuICAgIGlmIChpbnN0cnVjdGlvbnMpIHtcbiAgICAgIGluc3RydWN0aW9ucy5jbGFzc0xpc3QucmVtb3ZlKEhJRERFTl9DTEFTUyk7XG4gICAgfVxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZmlsZVByZXZpZXdzLCBmdW5jdGlvbiByZW1vdmVJbWFnZXMobm9kZSkge1xuICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgIH0pO1xuICB9XG59O1xuXG4vKipcbiAqIFdoZW4gdXNpbmcgYW4gQWNjZXB0IGF0dHJpYnV0ZSwgaW52YWxpZCBmaWxlcyB3aWxsIGJlIGhpZGRlbiBmcm9tXG4gKiBmaWxlIGJyb3dzZXIsIGJ1dCB0aGV5IGNhbiBzdGlsbCBiZSBkcmFnZ2VkIHRvIHRoZSBpbnB1dC4gVGhpc1xuICogZnVuY3Rpb24gcHJldmVudHMgdGhlbSBmcm9tIGJlaW5nIGRyYWdnZWQgYW5kIHJlbW92ZXMgZXJyb3Igc3RhdGVzXG4gKiB3aGVuIGNvcnJlY3QgZmlsZXMgYXJlIGFkZGVkLlxuICogQHBhcmFtIHtldmVudH0gZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZmlsZUlucHV0RWwgLSBmaWxlIGlucHV0IGVsZW1lbnRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGluc3RydWN0aW9ucyAtIHRleHQgdG8gaW5mb3JtIHVzZXJzIHRvIGRyYWcgb3Igc2VsZWN0IGZpbGVzXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBkcm9wVGFyZ2V0IC0gdGFyZ2V0IGFyZWEgZGl2IHRoYXQgZW5jYXNlcyB0aGUgaW5wdXRcbiAqL1xuY29uc3QgcHJldmVudEludmFsaWRGaWxlcyA9IChlLCBmaWxlSW5wdXRFbCwgaW5zdHJ1Y3Rpb25zLCBkcm9wVGFyZ2V0KSA9PiB7XG4gIGNvbnN0IGFjY2VwdGVkRmlsZXNBdHRyID0gZmlsZUlucHV0RWwuZ2V0QXR0cmlidXRlKFwiYWNjZXB0XCIpO1xuICBkcm9wVGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoSU5WQUxJRF9GSUxFX0NMQVNTKTtcblxuICAvLyBSdW5zIGlmIG9ubHkgc3BlY2lmaWMgZmlsZXMgYXJlIGFjY2VwdGVkXG4gIGlmIChhY2NlcHRlZEZpbGVzQXR0cikge1xuICAgIGNvbnN0IGFjY2VwdGVkRmlsZXMgPSBhY2NlcHRlZEZpbGVzQXR0ci5zcGxpdChcIixcIik7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgIC8vIElmIG11bHRpcGxlIGZpbGVzIGFyZSBkcmFnZ2VkLCB0aGlzIGl0ZXJhdGVzIHRocm91Z2ggdGhlbSBhbmQgbG9vayBmb3IgYW55IGZpbGVzIHRoYXQgYXJlIG5vdCBhY2NlcHRlZC5cbiAgICBsZXQgYWxsRmlsZXNBbGxvd2VkID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGUuZGF0YVRyYW5zZmVyLmZpbGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBmaWxlID0gZS5kYXRhVHJhbnNmZXIuZmlsZXNbaV07XG4gICAgICBpZiAoYWxsRmlsZXNBbGxvd2VkKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYWNjZXB0ZWRGaWxlcy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVUeXBlID0gYWNjZXB0ZWRGaWxlc1tqXTtcbiAgICAgICAgICBhbGxGaWxlc0FsbG93ZWQgPVxuICAgICAgICAgICAgZmlsZS5uYW1lLmluZGV4T2YoZmlsZVR5cGUpID4gMCB8fFxuICAgICAgICAgICAgZmlsZS50eXBlLmluY2x1ZGVzKGZpbGVUeXBlLnJlcGxhY2UoL1xcKi9nLCBcIlwiKSk7XG4gICAgICAgICAgaWYgKGFsbEZpbGVzQWxsb3dlZCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBicmVhaztcbiAgICB9XG5cbiAgICAvLyBJZiBkcmFnZ2VkIGZpbGVzIGFyZSBub3QgYWNjZXB0ZWQsIHRoaXMgcmVtb3ZlcyB0aGVtIGZyb20gdGhlIHZhbHVlIG9mIHRoZSBpbnB1dCBhbmQgY3JlYXRlcyBhbmQgZXJyb3Igc3RhdGVcbiAgICBpZiAoIWFsbEZpbGVzQWxsb3dlZCkge1xuICAgICAgcmVtb3ZlT2xkUHJldmlld3MoZHJvcFRhcmdldCwgaW5zdHJ1Y3Rpb25zKTtcbiAgICAgIGZpbGVJbnB1dEVsLnZhbHVlID0gXCJcIjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgZHJvcFRhcmdldC5pbnNlcnRCZWZvcmUoZXJyb3JNZXNzYWdlLCBmaWxlSW5wdXRFbCk7XG4gICAgICBlcnJvck1lc3NhZ2UuaW5uZXJIVE1MID0gYFRoaXMgaXMgbm90IGEgdmFsaWQgZmlsZSB0eXBlLmA7XG4gICAgICBlcnJvck1lc3NhZ2UuY2xhc3NMaXN0LmFkZChBQ0NFUFRFRF9GSUxFX01FU1NBR0VfQ0xBU1MpO1xuICAgICAgZHJvcFRhcmdldC5jbGFzc0xpc3QuYWRkKElOVkFMSURfRklMRV9DTEFTUyk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBXaGVuIG5ldyBmaWxlcyBhcmUgYXBwbGllZCB0byBmaWxlIGlucHV0LCB0aGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBwcmV2aWV3c1xuICogYW5kIHJlbW92ZXMgb2xkIG9uZXMuXG4gKiBAcGFyYW0ge2V2ZW50fSBlXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBmaWxlSW5wdXRFbCAtIGZpbGUgaW5wdXQgZWxlbWVudFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gaW5zdHJ1Y3Rpb25zIC0gdGV4dCB0byBpbmZvcm0gdXNlcnMgdG8gZHJhZyBvciBzZWxlY3QgZmlsZXNcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGRyb3BUYXJnZXQgLSB0YXJnZXQgYXJlYSBkaXYgdGhhdCBlbmNhc2VzIHRoZSBpbnB1dFxuICovXG5jb25zdCBoYW5kbGVDaGFuZ2UgPSAoZSwgZmlsZUlucHV0RWwsIGluc3RydWN0aW9ucywgZHJvcFRhcmdldCkgPT4ge1xuICBjb25zdCBmaWxlTmFtZXMgPSBlLnRhcmdldC5maWxlcztcbiAgY29uc3QgZmlsZVByZXZpZXdzSGVhZGluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgLy8gRmlyc3QsIGdldCByaWQgb2YgZXhpc3RpbmcgcHJldmlld3NcbiAgcmVtb3ZlT2xkUHJldmlld3MoZHJvcFRhcmdldCwgaW5zdHJ1Y3Rpb25zKTtcblxuICAvLyBJdGVyYXRlcyB0aHJvdWdoIGZpbGVzIGxpc3QgYW5kIGNyZWF0ZXMgcHJldmlld3NcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlTmFtZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVzW2ldLm5hbWU7XG5cbiAgICAvLyBTdGFydHMgd2l0aCBhIGxvYWRpbmcgaW1hZ2Ugd2hpbGUgcHJldmlldyBpcyBjcmVhdGVkXG4gICAgcmVhZGVyLm9ubG9hZHN0YXJ0ID0gZnVuY3Rpb24gY3JlYXRlTG9hZGluZ0ltYWdlKCkge1xuICAgICAgY29uc3QgaW1hZ2VJZCA9IG1ha2VTYWZlRm9ySUQoZmlsZU5hbWUpO1xuICAgICAgY29uc3QgcHJldmlld0ltYWdlID0gYDxpbWcgaWQ9XCIke2ltYWdlSWR9XCIgc3JjPVwiJHtTUEFDRVJfR0lGfVwiIGFsdD1cIlwiIGNsYXNzPVwiJHtHRU5FUklDX1BSRVZJRVdfQ0xBU1NfTkFNRX0gJHtMT0FESU5HX0NMQVNTfVwiLz5gO1xuXG4gICAgICBpbnN0cnVjdGlvbnMuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgICAgICBcImFmdGVyZW5kXCIsXG4gICAgICAgIGA8ZGl2IGNsYXNzPVwiJHtQUkVWSUVXX0NMQVNTfVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7cHJldmlld0ltYWdlfSR7ZmlsZU5hbWV9PGRpdj5gXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBOb3QgYWxsIGZpbGVzIHdpbGwgYmUgYWJsZSB0byBnZW5lcmF0ZSBwcmV2aWV3cy4gSW4gY2FzZSB0aGlzIGhhcHBlbnMsIHdlIHByb3ZpZGUgc2V2ZXJhbCB0eXBlcyBcImdlbmVyaWMgcHJldmlld3NcIiBiYXNlZCBvbiB0aGUgZmlsZSBleHRlbnNpb24uXG4gICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uIGNyZWF0ZUZpbGVQcmV2aWV3KCkge1xuICAgICAgY29uc3QgaW1hZ2VJZCA9IG1ha2VTYWZlRm9ySUQoZmlsZU5hbWUpO1xuICAgICAgY29uc3QgcHJldmlld0ltYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW1hZ2VJZCk7XG4gICAgICBpZiAoZmlsZU5hbWUuaW5kZXhPZihcIi5wZGZcIikgPiAwKSB7XG4gICAgICAgIHByZXZpZXdJbWFnZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgXCJvbmVycm9yXCIsXG4gICAgICAgICAgYHRoaXMub25lcnJvcj1udWxsO3RoaXMuc3JjPVwiJHtTUEFDRVJfR0lGfVwiOyB0aGlzLmNsYXNzTGlzdC5hZGQoXCIke1BERl9QUkVWSUVXX0NMQVNTfVwiKWBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGZpbGVOYW1lLmluZGV4T2YoXCIuZG9jXCIpID4gMCB8fFxuICAgICAgICBmaWxlTmFtZS5pbmRleE9mKFwiLnBhZ2VzXCIpID4gMFxuICAgICAgKSB7XG4gICAgICAgIHByZXZpZXdJbWFnZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgXCJvbmVycm9yXCIsXG4gICAgICAgICAgYHRoaXMub25lcnJvcj1udWxsO3RoaXMuc3JjPVwiJHtTUEFDRVJfR0lGfVwiOyB0aGlzLmNsYXNzTGlzdC5hZGQoXCIke1dPUkRfUFJFVklFV19DTEFTU31cIilgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBmaWxlTmFtZS5pbmRleE9mKFwiLnhsc1wiKSA+IDAgfHxcbiAgICAgICAgZmlsZU5hbWUuaW5kZXhPZihcIi5udW1iZXJzXCIpID4gMFxuICAgICAgKSB7XG4gICAgICAgIHByZXZpZXdJbWFnZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgXCJvbmVycm9yXCIsXG4gICAgICAgICAgYHRoaXMub25lcnJvcj1udWxsO3RoaXMuc3JjPVwiJHtTUEFDRVJfR0lGfVwiOyB0aGlzLmNsYXNzTGlzdC5hZGQoXCIke0VYQ0VMX1BSRVZJRVdfQ0xBU1N9XCIpYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChmaWxlTmFtZS5pbmRleE9mKFwiLm1vdlwiKSA+IDAgfHwgZmlsZU5hbWUuaW5kZXhPZihcIi5tcDRcIikgPiAwKSB7XG4gICAgICAgIHByZXZpZXdJbWFnZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgXCJvbmVycm9yXCIsXG4gICAgICAgICAgYHRoaXMub25lcnJvcj1udWxsO3RoaXMuc3JjPVwiJHtTUEFDRVJfR0lGfVwiOyB0aGlzLmNsYXNzTGlzdC5hZGQoXCIke1ZJREVPX1BSRVZJRVdfQ0xBU1N9XCIpYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJldmlld0ltYWdlLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICBcIm9uZXJyb3JcIixcbiAgICAgICAgICBgdGhpcy5vbmVycm9yPW51bGw7dGhpcy5zcmM9XCIke1NQQUNFUl9HSUZ9XCI7IHRoaXMuY2xhc3NMaXN0LmFkZChcIiR7R0VORVJJQ19QUkVWSUVXX0NMQVNTfVwiKWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlcyBsb2FkZXIgYW5kIGRpc3BsYXlzIHByZXZpZXdcbiAgICAgIHByZXZpZXdJbWFnZS5jbGFzc0xpc3QucmVtb3ZlKExPQURJTkdfQ0xBU1MpO1xuICAgICAgcHJldmlld0ltYWdlLnNyYyA9IHJlYWRlci5yZXN1bHQ7XG4gICAgfTtcblxuICAgIGlmIChmaWxlTmFtZXNbaV0pIHtcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGVOYW1lc1tpXSk7XG4gICAgfVxuXG4gICAgLy8gQWRkcyBoZWFkaW5nIGFib3ZlIGZpbGUgcHJldmlld3MsIHBsdXJhbGl6ZXMgaWYgdGhlcmUgYXJlIG11bHRpcGxlXG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGRyb3BUYXJnZXQuaW5zZXJ0QmVmb3JlKGZpbGVQcmV2aWV3c0hlYWRpbmcsIGluc3RydWN0aW9ucyk7XG4gICAgICBmaWxlUHJldmlld3NIZWFkaW5nLmlubmVySFRNTCA9IGBTZWxlY3RlZCBmaWxlIDxzcGFuIGNsYXNzPVwidXNhLWZpbGUtaW5wdXRfX2Nob29zZVwiPkNoYW5nZSBmaWxlPC9zcGFuPmA7XG4gICAgfSBlbHNlIGlmIChpID49IDEpIHtcbiAgICAgIGRyb3BUYXJnZXQuaW5zZXJ0QmVmb3JlKGZpbGVQcmV2aWV3c0hlYWRpbmcsIGluc3RydWN0aW9ucyk7XG4gICAgICBmaWxlUHJldmlld3NIZWFkaW5nLmlubmVySFRNTCA9IGAke1xuICAgICAgICBpICsgMVxuICAgICAgfSBmaWxlcyBzZWxlY3RlZCA8c3BhbiBjbGFzcz1cInVzYS1maWxlLWlucHV0X19jaG9vc2VcIj5DaGFuZ2UgZmlsZXM8L3NwYW4+YDtcbiAgICB9XG5cbiAgICAvLyBIaWRlcyBudWxsIHN0YXRlIGNvbnRlbnQgYW5kIHNldHMgcHJldmlldyBoZWFkaW5nIGNsYXNzXG4gICAgaWYgKGZpbGVQcmV2aWV3c0hlYWRpbmcpIHtcbiAgICAgIGluc3RydWN0aW9ucy5jbGFzc0xpc3QuYWRkKEhJRERFTl9DTEFTUyk7XG4gICAgICBmaWxlUHJldmlld3NIZWFkaW5nLmNsYXNzTGlzdC5hZGQoUFJFVklFV19IRUFESU5HX0NMQVNTKTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IGZpbGVJbnB1dCA9IGJlaGF2aW9yKFxuICB7fSxcbiAge1xuICAgIGluaXQocm9vdCkge1xuICAgICAgc2VsZWN0KERST1BaT05FLCByb290KS5mb3JFYWNoKChmaWxlSW5wdXRFbCkgPT4ge1xuICAgICAgICBjb25zdCB7IGluc3RydWN0aW9ucywgZHJvcFRhcmdldCB9ID0gYnVpbGRGaWxlSW5wdXQoZmlsZUlucHV0RWwpO1xuXG4gICAgICAgIGRyb3BUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBcImRyYWdvdmVyXCIsXG4gICAgICAgICAgZnVuY3Rpb24gaGFuZGxlRHJhZ092ZXIoKSB7XG4gICAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoRFJBR19DTEFTUyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuXG4gICAgICAgIGRyb3BUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBcImRyYWdsZWF2ZVwiLFxuICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZURyYWdMZWF2ZSgpIHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShEUkFHX0NMQVNTKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG5cbiAgICAgICAgZHJvcFRhcmdldC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwiZHJvcFwiLFxuICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZURyb3AoZSkge1xuICAgICAgICAgICAgcHJldmVudEludmFsaWRGaWxlcyhlLCBmaWxlSW5wdXRFbCwgaW5zdHJ1Y3Rpb25zLCBkcm9wVGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShEUkFHX0NMQVNTKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGZpbGVJbnB1dEVsLm9uY2hhbmdlID0gKGUpID0+IHtcbiAgICAgICAgICBoYW5kbGVDaGFuZ2UoZSwgZmlsZUlucHV0RWwsIGluc3RydWN0aW9ucywgZHJvcFRhcmdldCk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldEZpbGVJbnB1dENvbnRleHQsXG4gICAgZGlzYWJsZSxcbiAgICBlbmFibGUsXG4gIH1cbik7XG5cbm1vZHVsZS5leHBvcnRzID0gZmlsZUlucHV0O1xuIiwiY29uc3QgYmVoYXZpb3IgPSByZXF1aXJlKFwiLi4vdXRpbHMvYmVoYXZpb3JcIik7XG5jb25zdCBzZWxlY3QgPSByZXF1aXJlKFwiLi4vdXRpbHMvc2VsZWN0XCIpO1xuY29uc3QgeyBDTElDSyB9ID0gcmVxdWlyZShcIi4uL2V2ZW50c1wiKTtcbmNvbnN0IHsgcHJlZml4OiBQUkVGSVggfSA9IHJlcXVpcmUoXCIuLi9jb25maWdcIik7XG5cbmNvbnN0IEhJRERFTiA9IFwiaGlkZGVuXCI7XG5jb25zdCBTQ09QRSA9IGAuJHtQUkVGSVh9LWZvb3Rlci0tYmlnYDtcbmNvbnN0IE5BViA9IGAke1NDT1BFfSBuYXZgO1xuY29uc3QgQlVUVE9OID0gYCR7TkFWfSAuJHtQUkVGSVh9LWZvb3Rlcl9fcHJpbWFyeS1saW5rYDtcbmNvbnN0IENPTExBUFNJQkxFID0gYC4ke1BSRUZJWH0tZm9vdGVyX19wcmltYXJ5LWNvbnRlbnQtLWNvbGxhcHNpYmxlYDtcblxuY29uc3QgSElERV9NQVhfV0lEVEggPSA0ODA7XG5cbmZ1bmN0aW9uIHNob3dQYW5lbCgpIHtcbiAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgSElERV9NQVhfV0lEVEgpIHtcbiAgICBjb25zdCBjb2xsYXBzZUVsID0gdGhpcy5jbG9zZXN0KENPTExBUFNJQkxFKTtcbiAgICBjb2xsYXBzZUVsLmNsYXNzTGlzdC50b2dnbGUoSElEREVOKTtcblxuICAgIC8vIE5COiB0aGlzICpzaG91bGQqIGFsd2F5cyBzdWNjZWVkIGJlY2F1c2UgdGhlIGJ1dHRvblxuICAgIC8vIHNlbGVjdG9yIGlzIHNjb3BlZCB0byBcIi57cHJlZml4fS1mb290ZXItYmlnIG5hdlwiXG4gICAgY29uc3QgY29sbGFwc2libGVFbHMgPSBzZWxlY3QoQ09MTEFQU0lCTEUsIGNvbGxhcHNlRWwuY2xvc2VzdChOQVYpKTtcblxuICAgIGNvbGxhcHNpYmxlRWxzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBpZiAoZWwgIT09IGNvbGxhcHNlRWwpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZChISURERU4pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IHRvZ2dsZUhpZGRlbiA9IChpc0hpZGRlbikgPT5cbiAgc2VsZWN0KENPTExBUFNJQkxFKS5mb3JFYWNoKChsaXN0KSA9PiBsaXN0LmNsYXNzTGlzdC50b2dnbGUoSElEREVOLCBpc0hpZGRlbikpO1xuXG5jb25zdCByZXNpemUgPSAoZXZlbnQpID0+IHRvZ2dsZUhpZGRlbihldmVudC5tYXRjaGVzKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiZWhhdmlvcihcbiAge1xuICAgIFtDTElDS106IHtcbiAgICAgIFtCVVRUT05dOiBzaG93UGFuZWwsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIC8vIGV4cG9ydCBmb3IgdXNlIGVsc2V3aGVyZVxuICAgIEhJREVfTUFYX1dJRFRILFxuXG4gICAgaW5pdCgpIHtcbiAgICAgIHRvZ2dsZUhpZGRlbih3aW5kb3cuaW5uZXJXaWR0aCA8IEhJREVfTUFYX1dJRFRIKTtcbiAgICAgIHRoaXMubWVkaWFRdWVyeUxpc3QgPSB3aW5kb3cubWF0Y2hNZWRpYShgKG1heC13aWR0aDogJHtISURFX01BWF9XSURUSH1weClgKTtcbiAgICAgIHRoaXMubWVkaWFRdWVyeUxpc3QuYWRkTGlzdGVuZXIocmVzaXplKTtcbiAgICB9LFxuXG4gICAgdGVhcmRvd24oKSB7XG4gICAgICB0aGlzLm1lZGlhUXVlcnlMaXN0LnJlbW92ZUxpc3RlbmVyKHJlc2l6ZSk7XG4gICAgfSxcbiAgfVxuKTtcbiIsImNvbnN0IGFjY29yZGlvbiA9IHJlcXVpcmUoXCIuL2FjY29yZGlvblwiKTtcbmNvbnN0IGJhbm5lciA9IHJlcXVpcmUoXCIuL2Jhbm5lclwiKTtcbmNvbnN0IGNoYXJhY3RlckNvdW50ID0gcmVxdWlyZShcIi4vY2hhcmFjdGVyLWNvdW50XCIpO1xuY29uc3QgY29tYm9Cb3ggPSByZXF1aXJlKFwiLi9jb21iby1ib3hcIik7XG5jb25zdCBmaWxlSW5wdXQgPSByZXF1aXJlKFwiLi9maWxlLWlucHV0XCIpO1xuY29uc3QgZm9vdGVyID0gcmVxdWlyZShcIi4vZm9vdGVyXCIpO1xuY29uc3QgaW5wdXRQcmVmaXhTdWZmaXggPSByZXF1aXJlKFwiLi9pbnB1dC1wcmVmaXgtc3VmZml4XCIpO1xuY29uc3QgbW9kYWwgPSByZXF1aXJlKFwiLi9tb2RhbFwiKTtcbmNvbnN0IG5hdmlnYXRpb24gPSByZXF1aXJlKFwiLi9uYXZpZ2F0aW9uXCIpO1xuY29uc3QgcGFzc3dvcmQgPSByZXF1aXJlKFwiLi9wYXNzd29yZFwiKTtcbmNvbnN0IHNlYXJjaCA9IHJlcXVpcmUoXCIuL3NlYXJjaFwiKTtcbmNvbnN0IHNraXBuYXYgPSByZXF1aXJlKFwiLi9za2lwbmF2XCIpO1xuY29uc3QgdG9vbHRpcCA9IHJlcXVpcmUoXCIuL3Rvb2x0aXBcIik7XG5jb25zdCB2YWxpZGF0b3IgPSByZXF1aXJlKFwiLi92YWxpZGF0b3JcIik7XG5jb25zdCBkYXRlUGlja2VyID0gcmVxdWlyZShcIi4vZGF0ZS1waWNrZXJcIik7XG5jb25zdCBkYXRlUmFuZ2VQaWNrZXIgPSByZXF1aXJlKFwiLi9kYXRlLXJhbmdlLXBpY2tlclwiKTtcbmNvbnN0IHRpbWVQaWNrZXIgPSByZXF1aXJlKFwiLi90aW1lLXBpY2tlclwiKTtcbmNvbnN0IHRhYmxlID0gcmVxdWlyZShcIi4vdGFibGVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhY2NvcmRpb24sXG4gIGJhbm5lcixcbiAgY2hhcmFjdGVyQ291bnQsXG4gIGNvbWJvQm94LFxuICBkYXRlUGlja2VyLFxuICBkYXRlUmFuZ2VQaWNrZXIsXG4gIGZpbGVJbnB1dCxcbiAgZm9vdGVyLFxuICBpbnB1dFByZWZpeFN1ZmZpeCxcbiAgbW9kYWwsXG4gIG5hdmlnYXRpb24sXG4gIHBhc3N3b3JkLFxuICBzZWFyY2gsXG4gIHNraXBuYXYsXG4gIHRhYmxlLFxuICB0aW1lUGlja2VyLFxuICB0b29sdGlwLFxuICB2YWxpZGF0b3IsXG59O1xuIiwiY29uc3QgYmVoYXZpb3IgPSByZXF1aXJlKFwiLi4vdXRpbHMvYmVoYXZpb3JcIik7XG5jb25zdCBzZWxlY3QgPSByZXF1aXJlKFwiLi4vdXRpbHMvc2VsZWN0XCIpO1xuY29uc3QgeyBwcmVmaXg6IFBSRUZJWCB9ID0gcmVxdWlyZShcIi4uL2NvbmZpZ1wiKTtcbmNvbnN0IHsgQ0xJQ0sgfSA9IHJlcXVpcmUoXCIuLi9ldmVudHNcIik7XG5cbmNvbnN0IENPTlRBSU5FUiA9IGAuJHtQUkVGSVh9LWlucHV0LWdyb3VwYDtcbmNvbnN0IElOUFVUID0gYCR7Q09OVEFJTkVSfSAuJHtQUkVGSVh9LWlucHV0YDtcbmNvbnN0IERFQ09SQVRJT04gPSBgJHtDT05UQUlORVJ9IC4ke1BSRUZJWH0taW5wdXQtcHJlZml4LCAke0NPTlRBSU5FUn0gLiR7UFJFRklYfS1pbnB1dC1zdWZmaXhgO1xuY29uc3QgRk9DVVNfQ0xBU1MgPSBcImlzLWZvY3VzZWRcIjtcblxuZnVuY3Rpb24gc2V0Rm9jdXMoZWwpIHtcbiAgZWwuY2xvc2VzdChDT05UQUlORVIpLnF1ZXJ5U2VsZWN0b3IoYC4ke1BSRUZJWH0taW5wdXRgKS5mb2N1cygpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVGb2N1cygpIHtcbiAgdGhpcy5jbG9zZXN0KENPTlRBSU5FUikuY2xhc3NMaXN0LmFkZChGT0NVU19DTEFTUyk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUJsdXIoKSB7XG4gIHRoaXMuY2xvc2VzdChDT05UQUlORVIpLmNsYXNzTGlzdC5yZW1vdmUoRk9DVVNfQ0xBU1MpO1xufVxuXG5jb25zdCBpbnB1dFByZWZpeFN1ZmZpeCA9IGJlaGF2aW9yKFxuICB7XG4gICAgW0NMSUNLXToge1xuICAgICAgW0RFQ09SQVRJT05dKCkge1xuICAgICAgICBzZXRGb2N1cyh0aGlzKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIGluaXQocm9vdCkge1xuICAgICAgc2VsZWN0KElOUFVULCByb290KS5mb3JFYWNoKChpbnB1dEVsKSA9PiB7XG4gICAgICAgIGlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIGhhbmRsZUZvY3VzLCBmYWxzZSk7XG4gICAgICAgIGlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlQmx1ciwgZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgfVxuKTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbnB1dFByZWZpeFN1ZmZpeDtcbiIsImNvbnN0IGJlaGF2aW9yID0gcmVxdWlyZShcIi4uL3V0aWxzL2JlaGF2aW9yXCIpO1xuY29uc3Qgc2VsZWN0ID0gcmVxdWlyZShcIi4uL3V0aWxzL3NlbGVjdFwiKTtcbmNvbnN0IEZvY3VzVHJhcCA9IHJlcXVpcmUoXCIuLi91dGlscy9mb2N1cy10cmFwXCIpO1xuY29uc3QgU2Nyb2xsQmFyV2lkdGggPSByZXF1aXJlKFwiLi4vdXRpbHMvc2Nyb2xsYmFyLXdpZHRoXCIpO1xuXG5jb25zdCB7IENMSUNLIH0gPSByZXF1aXJlKFwiLi4vZXZlbnRzXCIpO1xuY29uc3QgeyBwcmVmaXg6IFBSRUZJWCB9ID0gcmVxdWlyZShcIi4uL2NvbmZpZ1wiKTtcblxuY29uc3QgTU9EQUxfQ0xBU1NOQU1FID0gYCR7UFJFRklYfS1tb2RhbGA7XG5jb25zdCBPVkVSTEFZX0NMQVNTTkFNRSA9IGAke01PREFMX0NMQVNTTkFNRX0tb3ZlcmxheWA7XG5jb25zdCBXUkFQUEVSX0NMQVNTTkFNRSA9IGAke01PREFMX0NMQVNTTkFNRX0td3JhcHBlcmA7XG5jb25zdCBPUEVORVJfQVRUUklCVVRFID0gXCJkYXRhLW9wZW4tbW9kYWxcIjtcbmNvbnN0IENMT1NFUl9BVFRSSUJVVEUgPSBcImRhdGEtY2xvc2UtbW9kYWxcIjtcbmNvbnN0IEZPUkNFX0FDVElPTl9BVFRSSUJVVEUgPSBcImRhdGEtZm9yY2UtYWN0aW9uXCI7XG5jb25zdCBNT0RBTCA9IGAuJHtNT0RBTF9DTEFTU05BTUV9YDtcbmNvbnN0IElOSVRJQUxfRk9DVVMgPSBgLiR7V1JBUFBFUl9DTEFTU05BTUV9ICpbZGF0YS1mb2N1c11gO1xuY29uc3QgQ0xPU0VfQlVUVE9OID0gYCR7V1JBUFBFUl9DTEFTU05BTUV9ICpbJHtDTE9TRVJfQVRUUklCVVRFfV1gO1xuY29uc3QgT1BFTkVSUyA9IGAqWyR7T1BFTkVSX0FUVFJJQlVURX1dW2FyaWEtY29udHJvbHNdYDtcbmNvbnN0IENMT1NFUlMgPSBgJHtDTE9TRV9CVVRUT059LCAuJHtPVkVSTEFZX0NMQVNTTkFNRX06bm90KFske0ZPUkNFX0FDVElPTl9BVFRSSUJVVEV9XSlgO1xuXG5jb25zdCBBQ1RJVkVfQ0xBU1MgPSBcInVzYS1qcy1tb2RhbC0tYWN0aXZlXCI7XG5jb25zdCBQUkVWRU5UX0NMSUNLX0NMQVNTID0gXCJ1c2EtanMtbm8tY2xpY2tcIjtcbmNvbnN0IFZJU0lCTEVfQ0xBU1MgPSBcImlzLXZpc2libGVcIjtcbmNvbnN0IEhJRERFTl9DTEFTUyA9IFwiaXMtaGlkZGVuXCI7XG5cbmNvbnN0IG5vbk1vZGFscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gIGBib2R5ID4gKjpub3QoJHtNT0RBTH0pOm5vdChbYXJpYS1oaWRkZW5dKWBcbik7XG5cbmxldCBtb2RhbDtcblxuY29uc3QgaXNBY3RpdmUgPSAoKSA9PiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucyhBQ1RJVkVfQ0xBU1MpO1xuY29uc3QgU0NST0xMQkFSX1dJRFRIID0gU2Nyb2xsQmFyV2lkdGgoKTtcbmNvbnN0IElOSVRJQUxfUEFERElORyA9IHdpbmRvd1xuICAuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KVxuICAuZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmctcmlnaHRcIik7XG5jb25zdCBURU1QT1JBUllfUEFERElORyA9XG4gIHBhcnNlSW50KElOSVRJQUxfUEFERElORy5yZXBsYWNlKC9weC8sIFwiXCIpLCAxMCkgK1xuICBwYXJzZUludChTQ1JPTExCQVJfV0lEVEgucmVwbGFjZSgvcHgvLCBcIlwiKSwgMTApICtcbiAgXCJweFwiO1xuXG4vKipcbiAqICBJcyBib3VuZCB0byBlc2NhcGUga2V5LCBjbG9zZXMgbW9kYWwgd2hlblxuICovXG5jb25zdCBvbk1lbnVDbG9zZSA9ICgpID0+IHtcbiAgbW9kYWwudG9nZ2xlTW9kYWwuY2FsbChtb2RhbCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiAgVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIGEgbW9kYWwgd2luZG93XG4gKlxuICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudCB0aGUga2V5ZG93biBldmVudFxuICogQHJldHVybnMge2Jvb2xlYW59IHNhZmVBY3RpdmUgaWYgbW9iaWxlIGlzIG9wZW5cbiAqL1xuZnVuY3Rpb24gdG9nZ2xlTW9kYWwoZXZlbnQpIHtcbiAgbGV0IG9yaWdpbmFsT3BlbmVyO1xuICBsZXQgY2xpY2tlZEVsZW1lbnQgPSBldmVudC50YXJnZXQ7XG4gIGNvbnN0IHsgYm9keSB9ID0gZG9jdW1lbnQ7XG4gIGNvbnN0IHNhZmVBY3RpdmUgPSAhaXNBY3RpdmUoKTtcbiAgY29uc3QgbW9kYWxJZCA9IGNsaWNrZWRFbGVtZW50XG4gICAgPyBjbGlja2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpXG4gICAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnVzYS1tb2RhbC13cmFwcGVyLmlzLXZpc2libGVcIik7XG4gIGNvbnN0IHRhcmdldE1vZGFsID0gc2FmZUFjdGl2ZVxuICAgID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kYWxJZClcbiAgICA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIudXNhLW1vZGFsLXdyYXBwZXIuaXMtdmlzaWJsZVwiKTtcbiAgY29uc3Qgb3BlbkZvY3VzRWwgPSB0YXJnZXRNb2RhbC5xdWVyeVNlbGVjdG9yKElOSVRJQUxfRk9DVVMpXG4gICAgPyB0YXJnZXRNb2RhbC5xdWVyeVNlbGVjdG9yKElOSVRJQUxfRk9DVVMpXG4gICAgOiB0YXJnZXRNb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnVzYS1tb2RhbFwiKTtcbiAgY29uc3QgcmV0dXJuRm9jdXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICB0YXJnZXRNb2RhbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW9wZW5lclwiKVxuICApO1xuICBjb25zdCBtZW51QnV0dG9uID0gYm9keS5xdWVyeVNlbGVjdG9yKE9QRU5FUlMpO1xuICBjb25zdCBmb3JjZVVzZXJBY3Rpb24gPSB0YXJnZXRNb2RhbC5nZXRBdHRyaWJ1dGUoRk9SQ0VfQUNUSU9OX0FUVFJJQlVURSk7XG5cbiAgLy8gU2V0cyB0aGUgY2xpY2tlZCBlbGVtZW50IHRvIHRoZSBjbG9zZSBidXR0b25cbiAgLy8gc28gZXNjIGtleSBhbHdheXMgY2xvc2VzIG1vZGFsXG4gIGlmIChldmVudC50eXBlID09PSBcImtleWRvd25cIiAmJiB0YXJnZXRNb2RhbCAhPT0gbnVsbCkge1xuICAgIGNsaWNrZWRFbGVtZW50ID0gdGFyZ2V0TW9kYWwucXVlcnlTZWxlY3RvcihDTE9TRV9CVVRUT04pO1xuICB9XG5cbiAgLy8gV2hlbiB3ZSdyZSBub3QgaGl0dGluZyB0aGUgZXNjYXBlIGtleeKAplxuICBpZiAoY2xpY2tlZEVsZW1lbnQpIHtcbiAgICAvLyBNYWtlIHN1cmUgd2UgY2xpY2sgdGhlIG9wZW5lclxuICAgIC8vIElmIGl0IGRvZXNuJ3QgaGF2ZSBhbiBJRCwgbWFrZSBvbmVcbiAgICAvLyBTdG9yZSBpZCBhcyBkYXRhIGF0dHJpYnV0ZSBvbiBtb2RhbFxuICAgIGlmIChjbGlja2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoT1BFTkVSX0FUVFJJQlVURSkpIHtcbiAgICAgIGlmICh0aGlzLmdldEF0dHJpYnV0ZShcImlkXCIpID09PSBudWxsKSB7XG4gICAgICAgIG9yaWdpbmFsT3BlbmVyID0gYG1vZGFsLSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOTAwMDAwKSArIDEwMDAwMH1gO1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShcImlkXCIsIG9yaWdpbmFsT3BlbmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9yaWdpbmFsT3BlbmVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgIH1cbiAgICAgIHRhcmdldE1vZGFsLnNldEF0dHJpYnV0ZShcImRhdGEtb3BlbmVyXCIsIG9yaWdpbmFsT3BlbmVyKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGJhc2ljYWxseSBzdG9wcyB0aGUgcHJvcGFnYXRpb24gaWYgdGhlIGVsZW1lbnRcbiAgICAvLyBpcyBpbnNpZGUgdGhlIG1vZGFsIGFuZCBub3QgYSBjbG9zZSBidXR0b24gb3JcbiAgICAvLyBlbGVtZW50IGluc2lkZSBhIGNsb3NlIGJ1dHRvblxuICAgIGlmIChjbGlja2VkRWxlbWVudC5jbG9zZXN0KGAuJHtNT0RBTF9DTEFTU05BTUV9YCkpIHtcbiAgICAgIGlmIChjbGlja2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoQ0xPU0VSX0FUVFJJQlVURSkgfHxcbiAgICAgICAgICBjbGlja2VkRWxlbWVudC5jbG9zZXN0KGBbJHtDTE9TRVJfQVRUUklCVVRFfV1gKVxuICAgICAgKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmcuIG1vdmUgb24uXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBY3RpdmUgY2xhc3Mgc2hhcmVzIHNhbWUgYXMgbmF2aWdhdGlvblxuICBib2R5LmNsYXNzTGlzdC50b2dnbGUoQUNUSVZFX0NMQVNTLCBzYWZlQWN0aXZlKTtcbiAgdGFyZ2V0TW9kYWwuY2xhc3NMaXN0LnRvZ2dsZShWSVNJQkxFX0NMQVNTLCBzYWZlQWN0aXZlKTtcbiAgdGFyZ2V0TW9kYWwuY2xhc3NMaXN0LnRvZ2dsZShISURERU5fQ0xBU1MsICFzYWZlQWN0aXZlKTtcblxuICAvLyBJZiB1c2VyIGlzIGZvcmNlZCB0byB0YWtlIGFuIGFjdGlvbiwgYWRkaW5nXG4gIC8vIGEgY2xhc3MgdG8gdGhlIGJvZHkgdGhhdCBwcmV2ZW50cyBjbGlja2luZyB1bmRlcm5lYXRoXG4gIC8vIG92ZXJsYXlcbiAgaWYgKGZvcmNlVXNlckFjdGlvbikge1xuICAgIGJvZHkuY2xhc3NMaXN0LnRvZ2dsZShQUkVWRU5UX0NMSUNLX0NMQVNTLCBzYWZlQWN0aXZlKTtcbiAgfVxuXG4gIC8vIEFjY291bnQgZm9yIGNvbnRlbnQgc2hpZnRpbmcgZnJvbSBib2R5IG92ZXJmbG93OiBoaWRkZW5cbiAgLy8gV2Ugb25seSBjaGVjayBwYWRkaW5nUmlnaHQgaW4gY2FzZSBhcHBzIGFyZSBhZGRpbmcgb3RoZXIgcHJvcGVydGllc1xuICAvLyB0byB0aGUgYm9keSBlbGVtZW50XG4gIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID1cbiAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9PT0gVEVNUE9SQVJZX1BBRERJTkdcbiAgICAgID8gSU5JVElBTF9QQURESU5HXG4gICAgICA6IFRFTVBPUkFSWV9QQURESU5HO1xuXG4gIC8vIEhhbmRsZSB0aGUgZm9jdXMgYWN0aW9uc1xuICBpZiAoc2FmZUFjdGl2ZSAmJiBvcGVuRm9jdXNFbCkge1xuICAgIC8vIFRoZSBtb2RhbCB3aW5kb3cgaXMgb3BlbmVkLiBGb2N1cyBpcyBzZXQgdG8gY2xvc2UgYnV0dG9uLlxuXG4gICAgLy8gQmluZHMgZXNjYXBlIGtleSBpZiB3ZSdyZSBub3QgZm9yY2luZ1xuICAgIC8vIHRoZSB1c2VyIHRvIHRha2UgYW4gYWN0aW9uXG4gICAgaWYgKGZvcmNlVXNlckFjdGlvbikge1xuICAgICAgbW9kYWwuZm9jdXNUcmFwID0gRm9jdXNUcmFwKHRhcmdldE1vZGFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kYWwuZm9jdXNUcmFwID0gRm9jdXNUcmFwKHRhcmdldE1vZGFsLCB7XG4gICAgICAgIEVzY2FwZTogb25NZW51Q2xvc2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGVzIGZvY3VzIHNldHRpbmcgYW5kIGludGVyYWN0aW9uc1xuICAgIG1vZGFsLmZvY3VzVHJhcC51cGRhdGUoc2FmZUFjdGl2ZSk7XG4gICAgb3BlbkZvY3VzRWwuZm9jdXMoKTtcblxuICAgIC8vIEhpZGVzIGV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgdGhlIG1vZGFsIGZyb20gc2NyZWVuIHJlYWRlcnNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vbk1vZGFscy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgbm9uTW9kYWxzW2ldLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIXNhZmVBY3RpdmUgJiYgbWVudUJ1dHRvbiAmJiByZXR1cm5Gb2N1cykge1xuICAgIC8vIFRoZSBtb2RhbCB3aW5kb3cgaXMgY2xvc2VkLlxuICAgIC8vIE5vbi1tb2RhbHMgbm93IGFjY2VzaWJsZSB0byBzY3JlZW4gcmVhZGVyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub25Nb2RhbHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIG5vbk1vZGFsc1tpXS5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKTtcbiAgICB9XG5cbiAgICAvLyBGb2N1cyBpcyByZXR1cm5lZCB0byB0aGUgb3BlbmVyXG4gICAgcmV0dXJuRm9jdXMuZm9jdXMoKTtcbiAgICBtb2RhbC5mb2N1c1RyYXAudXBkYXRlKHNhZmVBY3RpdmUpO1xuICB9XG5cbiAgcmV0dXJuIHNhZmVBY3RpdmU7XG59XG5cbi8qKlxuICogIEJ1aWxkcyBtb2RhbCB3aW5kb3cgZnJvbSBiYXNlIEhUTUxcbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBiYXNlQ29tcG9uZW50IHRoZSBtb2RhbCBodG1sIGluIHRoZSBET01cbiAqL1xuY29uc3Qgc2V0VXBBdHRyaWJ1dGVzID0gKGJhc2VDb21wb25lbnQpID0+IHtcbiAgY29uc3QgbW9kYWxDb250ZW50ID0gYmFzZUNvbXBvbmVudDtcbiAgY29uc3QgbW9kYWxXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgY29uc3Qgb3ZlcmxheURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnN0IG1vZGFsSUQgPSBiYXNlQ29tcG9uZW50LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICBjb25zdCBhcmlhTGFiZWxsZWRCeSA9IGJhc2VDb21wb25lbnQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpO1xuICBjb25zdCBhcmlhRGVzY3JpYmVkQnkgPSBiYXNlQ29tcG9uZW50LmdldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIik7XG4gIGNvbnN0IGZvcmNlVXNlckFjdGlvbiA9IGJhc2VDb21wb25lbnQuaGFzQXR0cmlidXRlKEZPUkNFX0FDVElPTl9BVFRSSUJVVEUpXG4gICAgPyBiYXNlQ29tcG9uZW50Lmhhc0F0dHJpYnV0ZShGT1JDRV9BQ1RJT05fQVRUUklCVVRFKVxuICAgIDogZmFsc2U7XG5cbiAgLy8gUmVidWlsZCB0aGUgbW9kYWwgZWxlbWVudFxuICBtb2RhbENvbnRlbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobW9kYWxXcmFwcGVyLCBtb2RhbENvbnRlbnQpO1xuICBtb2RhbFdyYXBwZXIuYXBwZW5kQ2hpbGQobW9kYWxDb250ZW50KTtcbiAgbW9kYWxDb250ZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG92ZXJsYXlEaXYsIG1vZGFsQ29udGVudCk7XG4gIG92ZXJsYXlEaXYuYXBwZW5kQ2hpbGQobW9kYWxDb250ZW50KTtcblxuICAvLyBBZGQgY2xhc3NlcyBhbmQgYXR0cmlidXRlc1xuICBtb2RhbFdyYXBwZXIuY2xhc3NMaXN0LmFkZChISURERU5fQ0xBU1MpO1xuICBtb2RhbFdyYXBwZXIuY2xhc3NMaXN0LmFkZChXUkFQUEVSX0NMQVNTTkFNRSk7XG4gIG92ZXJsYXlEaXYuY2xhc3NMaXN0LmFkZChPVkVSTEFZX0NMQVNTTkFNRSk7XG5cbiAgLy8gU2V0IGF0dHJpYnV0ZXNcbiAgbW9kYWxXcmFwcGVyLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJkaWFsb2dcIik7XG4gIG1vZGFsV3JhcHBlci5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBtb2RhbElEKTtcblxuICBpZiAoYXJpYUxhYmVsbGVkQnkpIHtcbiAgICBtb2RhbFdyYXBwZXIuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIsIGFyaWFMYWJlbGxlZEJ5KTtcbiAgfVxuXG4gIGlmIChhcmlhRGVzY3JpYmVkQnkpIHtcbiAgICBtb2RhbFdyYXBwZXIuc2V0QXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiLCBhcmlhRGVzY3JpYmVkQnkpO1xuICB9XG5cbiAgaWYgKGZvcmNlVXNlckFjdGlvbikge1xuICAgIG1vZGFsV3JhcHBlci5zZXRBdHRyaWJ1dGUoRk9SQ0VfQUNUSU9OX0FUVFJJQlVURSwgXCJ0cnVlXCIpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHRoZSBiYXNlIGVsZW1lbnQgSFRNTFxuICBiYXNlQ29tcG9uZW50LnJlbW92ZUF0dHJpYnV0ZShcImlkXCIpO1xuICBiYXNlQ29tcG9uZW50LnJlbW92ZUF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgYmFzZUNvbXBvbmVudC5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpO1xuICBiYXNlQ29tcG9uZW50LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIik7XG5cbiAgLy8gQWRkIGFyaWEtY29udHJvbHNcbiAgY29uc3QgbW9kYWxDbG9zZXJzID0gbW9kYWxXcmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoQ0xPU0VSUyk7XG4gIHNlbGVjdChtb2RhbENsb3NlcnMpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgZWwuc2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiLCBtb2RhbElEKTtcbiAgfSk7XG5cbiAgLy8gTW92ZSBhbGwgbW9kYWxzIHRvIHRoZSBlbmQgb2YgdGhlIERPTS4gRG9pbmcgdGhpcyBhbGxvd3MgdXMgdG9cbiAgLy8gbW9yZSBlYXNpbHkgZmluZCB0aGUgZWxlbWVudHMgdG8gaGlkZSBmcm9tIHNjcmVlbiByZWFkZXJzXG4gIC8vIHdoZW4gdGhlIG1vZGFsIGlzIG9wZW4uXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobW9kYWxXcmFwcGVyKTtcbn07XG5cbm1vZGFsID0gYmVoYXZpb3IoXG4gIHtcbiAgICBbQ0xJQ0tdOiB7XG4gICAgICBbT1BFTkVSU106IHRvZ2dsZU1vZGFsLFxuICAgICAgW0NMT1NFUlNdOiB0b2dnbGVNb2RhbCxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgaW5pdChyb290KSB7XG4gICAgICBzZWxlY3QoTU9EQUwsIHJvb3QpLmZvckVhY2goKG1vZGFsV2luZG93KSA9PiB7XG4gICAgICAgIHNldFVwQXR0cmlidXRlcyhtb2RhbFdpbmRvdyk7XG4gICAgICB9KTtcblxuICAgICAgc2VsZWN0KE9QRU5FUlMsIHJvb3QpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgLy8gVHVybiBhbmNob3IgbGlua3MgaW50byBidXR0b25zIGJlY2F1c2Ugb2ZcbiAgICAgICAgLy8gVm9pY2VPdmVyIG9uIFNhZmFyaVxuICAgICAgICBpZiAoaXRlbS5ub2RlTmFtZSA9PT0gXCJBXCIpIHtcbiAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJidXR0b25cIik7XG4gICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbiB1bmNvbW1lbnQgd2hlbiBhcmlhLWhhc3BvcHVwPVwiZGlhbG9nXCIgaXMgc3VwcG9ydGVkXG4gICAgICAgIC8vIGh0dHBzOi8vYTExeXN1cHBvcnQuaW8vdGVjaC9hcmlhL2FyaWEtaGFzcG9wdXBfYXR0cmlidXRlXG4gICAgICAgIC8vIE1vc3Qgc2NyZWVuIHJlYWRlcnMgc3VwcG9ydCBhcmlhLWhhc3BvcHVwLCBidXQgbWlnaHQgYW5ub3VuY2VcbiAgICAgICAgLy8gYXMgb3BlbmluZyBhIG1lbnUgaWYgXCJkaWFsb2dcIiBpcyBub3Qgc3VwcG9ydGVkLlxuICAgICAgICAvLyBpdGVtLnNldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIiwgXCJkaWFsb2dcIik7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGZvY3VzVHJhcDogbnVsbCxcbiAgICB0b2dnbGVNb2RhbCxcbiAgfVxuKTtcblxubW9kdWxlLmV4cG9ydHMgPSBtb2RhbDtcbiIsImNvbnN0IGJlaGF2aW9yID0gcmVxdWlyZShcIi4uL3V0aWxzL2JlaGF2aW9yXCIpO1xuY29uc3Qgc2VsZWN0ID0gcmVxdWlyZShcIi4uL3V0aWxzL3NlbGVjdFwiKTtcbmNvbnN0IHRvZ2dsZSA9IHJlcXVpcmUoXCIuLi91dGlscy90b2dnbGVcIik7XG5jb25zdCBGb2N1c1RyYXAgPSByZXF1aXJlKFwiLi4vdXRpbHMvZm9jdXMtdHJhcFwiKTtcbmNvbnN0IGFjY29yZGlvbiA9IHJlcXVpcmUoXCIuL2FjY29yZGlvblwiKTtcbmNvbnN0IFNjcm9sbEJhcldpZHRoID0gcmVxdWlyZShcIi4uL3V0aWxzL3Njcm9sbGJhci13aWR0aFwiKTtcblxuY29uc3QgeyBDTElDSyB9ID0gcmVxdWlyZShcIi4uL2V2ZW50c1wiKTtcbmNvbnN0IHsgcHJlZml4OiBQUkVGSVggfSA9IHJlcXVpcmUoXCIuLi9jb25maWdcIik7XG5cbmNvbnN0IEJPRFkgPSBcImJvZHlcIjtcbmNvbnN0IE5BViA9IGAuJHtQUkVGSVh9LW5hdmA7XG5jb25zdCBOQVZfTElOS1MgPSBgJHtOQVZ9IGFgO1xuY29uc3QgTkFWX0NPTlRST0wgPSBgYnV0dG9uLiR7UFJFRklYfS1uYXZfX2xpbmtgO1xuY29uc3QgT1BFTkVSUyA9IGAuJHtQUkVGSVh9LW1lbnUtYnRuYDtcbmNvbnN0IENMT1NFX0JVVFRPTiA9IGAuJHtQUkVGSVh9LW5hdl9fY2xvc2VgO1xuY29uc3QgT1ZFUkxBWSA9IGAuJHtQUkVGSVh9LW92ZXJsYXlgO1xuY29uc3QgQ0xPU0VSUyA9IGAke0NMT1NFX0JVVFRPTn0sIC4ke1BSRUZJWH0tb3ZlcmxheWA7XG5jb25zdCBUT0dHTEVTID0gW05BViwgT1ZFUkxBWV0uam9pbihcIiwgXCIpO1xuXG5jb25zdCBBQ1RJVkVfQ0xBU1MgPSBcInVzYS1qcy1tb2JpbGUtbmF2LS1hY3RpdmVcIjtcbmNvbnN0IFZJU0lCTEVfQ0xBU1MgPSBcImlzLXZpc2libGVcIjtcblxubGV0IG5hdmlnYXRpb247XG5sZXQgbmF2QWN0aXZlO1xuXG5jb25zdCBpc0FjdGl2ZSA9ICgpID0+IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKEFDVElWRV9DTEFTUyk7XG5jb25zdCBTQ1JPTExCQVJfV0lEVEggPSBTY3JvbGxCYXJXaWR0aCgpO1xuY29uc3QgSU5JVElBTF9QQURESU5HID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy1yaWdodCcpO1xuY29uc3QgVEVNUE9SQVJZX1BBRERJTkcgPSBwYXJzZUludChJTklUSUFMX1BBRERJTkcucmVwbGFjZSgvcHgvLFwiXCIpLCAxMCkgKyBwYXJzZUludChTQ1JPTExCQVJfV0lEVEgucmVwbGFjZSgvcHgvLFwiXCIpLCAxMCkgKyBcInB4XCI7XG5cbmNvbnN0IHRvZ2dsZU5hdiA9IChhY3RpdmUpID0+IHtcbiAgY29uc3QgeyBib2R5IH0gPSBkb2N1bWVudDtcbiAgY29uc3Qgc2FmZUFjdGl2ZSA9IHR5cGVvZiBhY3RpdmUgPT09IFwiYm9vbGVhblwiID8gYWN0aXZlIDogIWlzQWN0aXZlKCk7XG5cbiAgYm9keS5jbGFzc0xpc3QudG9nZ2xlKEFDVElWRV9DTEFTUywgc2FmZUFjdGl2ZSk7XG5cbiAgc2VsZWN0KFRPR0dMRVMpLmZvckVhY2goKGVsKSA9PlxuICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoVklTSUJMRV9DTEFTUywgc2FmZUFjdGl2ZSlcbiAgKTtcblxuICBuYXZpZ2F0aW9uLmZvY3VzVHJhcC51cGRhdGUoc2FmZUFjdGl2ZSk7XG5cbiAgY29uc3QgY2xvc2VCdXR0b24gPSBib2R5LnF1ZXJ5U2VsZWN0b3IoQ0xPU0VfQlVUVE9OKTtcbiAgY29uc3QgbWVudUJ1dHRvbiA9IGJvZHkucXVlcnlTZWxlY3RvcihPUEVORVJTKTtcbiAgXG4gIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPT09IFRFTVBPUkFSWV9QQURESU5HID8gSU5JVElBTF9QQURESU5HIDogVEVNUE9SQVJZX1BBRERJTkc7XG5cbiAgaWYgKHNhZmVBY3RpdmUgJiYgY2xvc2VCdXR0b24pIHtcbiAgICAvLyBUaGUgbW9iaWxlIG5hdiB3YXMganVzdCBhY3RpdmF0ZWQsIHNvIGZvY3VzIG9uIHRoZSBjbG9zZSBidXR0b24sXG4gICAgLy8gd2hpY2ggaXMganVzdCBiZWZvcmUgYWxsIHRoZSBuYXYgZWxlbWVudHMgaW4gdGhlIHRhYiBvcmRlci5cbiAgICBjbG9zZUJ1dHRvbi5mb2N1cygpO1xuICB9IGVsc2UgaWYgKFxuICAgICFzYWZlQWN0aXZlICYmXG4gICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gY2xvc2VCdXR0b24gJiZcbiAgICBtZW51QnV0dG9uXG4gICkge1xuICAgIC8vIFRoZSBtb2JpbGUgbmF2IHdhcyBqdXN0IGRlYWN0aXZhdGVkLCBhbmQgZm9jdXMgd2FzIG9uIHRoZSBjbG9zZVxuICAgIC8vIGJ1dHRvbiwgd2hpY2ggaXMgbm8gbG9uZ2VyIHZpc2libGUuIFdlIGRvbid0IHdhbnQgdGhlIGZvY3VzIHRvXG4gICAgLy8gZGlzYXBwZWFyIGludG8gdGhlIHZvaWQsIHNvIGZvY3VzIG9uIHRoZSBtZW51IGJ1dHRvbiBpZiBpdCdzXG4gICAgLy8gdmlzaWJsZSAodGhpcyBtYXkgaGF2ZSBiZWVuIHdoYXQgdGhlIHVzZXIgd2FzIGp1c3QgZm9jdXNlZCBvbixcbiAgICAvLyBpZiB0aGV5IHRyaWdnZXJlZCB0aGUgbW9iaWxlIG5hdiBieSBtaXN0YWtlKS5cbiAgICBtZW51QnV0dG9uLmZvY3VzKCk7XG4gIH1cblxuICByZXR1cm4gc2FmZUFjdGl2ZTtcbn07XG5cbmNvbnN0IHJlc2l6ZSA9ICgpID0+IHtcbiAgY29uc3QgY2xvc2VyID0gZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yKENMT1NFX0JVVFRPTik7XG5cbiAgaWYgKGlzQWN0aXZlKCkgJiYgY2xvc2VyICYmIGNsb3Nlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA9PT0gMCkge1xuICAgIC8vIFdoZW4gdGhlIG1vYmlsZSBuYXYgaXMgYWN0aXZlLCBhbmQgdGhlIGNsb3NlIGJveCBpc24ndCB2aXNpYmxlLFxuICAgIC8vIHdlIGtub3cgdGhlIHVzZXIncyB2aWV3cG9ydCBoYXMgYmVlbiByZXNpemVkIHRvIGJlIGxhcmdlci5cbiAgICAvLyBMZXQncyBtYWtlIHRoZSBwYWdlIHN0YXRlIGNvbnNpc3RlbnQgYnkgZGVhY3RpdmF0aW5nIHRoZSBtb2JpbGUgbmF2LlxuICAgIG5hdmlnYXRpb24udG9nZ2xlTmF2LmNhbGwoY2xvc2VyLCBmYWxzZSk7XG4gIH1cbn07XG5cbmNvbnN0IG9uTWVudUNsb3NlID0gKCkgPT4gbmF2aWdhdGlvbi50b2dnbGVOYXYuY2FsbChuYXZpZ2F0aW9uLCBmYWxzZSk7XG5jb25zdCBoaWRlQWN0aXZlTmF2RHJvcGRvd24gPSAoKSA9PiB7XG4gIHRvZ2dsZShuYXZBY3RpdmUsIGZhbHNlKTtcbiAgbmF2QWN0aXZlID0gbnVsbDtcbn07XG5cbm5hdmlnYXRpb24gPSBiZWhhdmlvcihcbiAge1xuICAgIFtDTElDS106IHtcbiAgICAgIFtOQVZfQ09OVFJPTF0oKSB7XG4gICAgICAgIC8vIElmIGFub3RoZXIgbmF2IGlzIG9wZW4sIGNsb3NlIGl0XG4gICAgICAgIGlmIChuYXZBY3RpdmUgJiYgbmF2QWN0aXZlICE9PSB0aGlzKSB7XG4gICAgICAgICAgaGlkZUFjdGl2ZU5hdkRyb3Bkb3duKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIGxhc3QgY2xpY2tlZCBuYXYgbGluayBlbGVtZW50LCBzbyB3ZVxuICAgICAgICAvLyBjYW4gaGlkZSB0aGUgZHJvcGRvd24gaWYgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwYWdlIGlzIGNsaWNrZWRcbiAgICAgICAgaWYgKG5hdkFjdGl2ZSkge1xuICAgICAgICAgIGhpZGVBY3RpdmVOYXZEcm9wZG93bigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5hdkFjdGl2ZSA9IHRoaXM7XG4gICAgICAgICAgdG9nZ2xlKG5hdkFjdGl2ZSwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEbyB0aGlzIHNvIHRoZSBldmVudCBoYW5kbGVyIG9uIHRoZSBib2R5IGRvZXNuJ3QgZmlyZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgICAgW0JPRFldKCkge1xuICAgICAgICBpZiAobmF2QWN0aXZlKSB7XG4gICAgICAgICAgaGlkZUFjdGl2ZU5hdkRyb3Bkb3duKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbT1BFTkVSU106IHRvZ2dsZU5hdixcbiAgICAgIFtDTE9TRVJTXTogdG9nZ2xlTmF2LFxuICAgICAgW05BVl9MSU5LU10oKSB7XG4gICAgICAgIC8vIEEgbmF2aWdhdGlvbiBsaW5rIGhhcyBiZWVuIGNsaWNrZWQhIFdlIHdhbnQgdG8gY29sbGFwc2UgYW55XG4gICAgICAgIC8vIGhpZXJhcmNoaWNhbCBuYXZpZ2F0aW9uIFVJIGl0J3MgYSBwYXJ0IG9mLCBzbyB0aGF0IHRoZSB1c2VyXG4gICAgICAgIC8vIGNhbiBmb2N1cyBvbiB3aGF0ZXZlciB0aGV5J3ZlIGp1c3Qgc2VsZWN0ZWQuXG5cbiAgICAgICAgLy8gU29tZSBuYXZpZ2F0aW9uIGxpbmtzIGFyZSBpbnNpZGUgYWNjb3JkaW9uczsgd2hlbiB0aGV5J3JlXG4gICAgICAgIC8vIGNsaWNrZWQsIHdlIHdhbnQgdG8gY29sbGFwc2UgdGhvc2UgYWNjb3JkaW9ucy5cbiAgICAgICAgY29uc3QgYWNjID0gdGhpcy5jbG9zZXN0KGFjY29yZGlvbi5BQ0NPUkRJT04pO1xuXG4gICAgICAgIGlmIChhY2MpIHtcbiAgICAgICAgICBhY2NvcmRpb24uZ2V0QnV0dG9ucyhhY2MpLmZvckVhY2goKGJ0bikgPT4gYWNjb3JkaW9uLmhpZGUoYnRuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgbW9iaWxlIG5hdmlnYXRpb24gbWVudSBpcyBhY3RpdmUsIHdlIHdhbnQgdG8gaGlkZSBpdC5cbiAgICAgICAgaWYgKGlzQWN0aXZlKCkpIHtcbiAgICAgICAgICBuYXZpZ2F0aW9uLnRvZ2dsZU5hdi5jYWxsKG5hdmlnYXRpb24sIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgaW5pdChyb290KSB7XG4gICAgICBjb25zdCB0cmFwQ29udGFpbmVyID0gcm9vdC5xdWVyeVNlbGVjdG9yKE5BVik7XG5cbiAgICAgIGlmICh0cmFwQ29udGFpbmVyKSB7XG4gICAgICAgIG5hdmlnYXRpb24uZm9jdXNUcmFwID0gRm9jdXNUcmFwKHRyYXBDb250YWluZXIsIHtcbiAgICAgICAgICBFc2NhcGU6IG9uTWVudUNsb3NlLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmVzaXplKCk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCByZXNpemUsIGZhbHNlKTtcbiAgICB9LFxuICAgIHRlYXJkb3duKCkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplLCBmYWxzZSk7XG4gICAgICBuYXZBY3RpdmUgPSBmYWxzZTtcbiAgICB9LFxuICAgIGZvY3VzVHJhcDogbnVsbCxcbiAgICB0b2dnbGVOYXYsXG4gIH1cbik7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF2aWdhdGlvbjtcbiIsImNvbnN0IGJlaGF2aW9yID0gcmVxdWlyZShcIi4uL3V0aWxzL2JlaGF2aW9yXCIpO1xuY29uc3QgdG9nZ2xlRm9ybUlucHV0ID0gcmVxdWlyZShcIi4uL3V0aWxzL3RvZ2dsZS1mb3JtLWlucHV0XCIpO1xuXG5jb25zdCB7IENMSUNLIH0gPSByZXF1aXJlKFwiLi4vZXZlbnRzXCIpO1xuY29uc3QgeyBwcmVmaXg6IFBSRUZJWCB9ID0gcmVxdWlyZShcIi4uL2NvbmZpZ1wiKTtcblxuY29uc3QgTElOSyA9IGAuJHtQUkVGSVh9LXNob3ctcGFzc3dvcmQsIC4ke1BSRUZJWH0tc2hvdy1tdWx0aXBhc3N3b3JkYDtcblxuZnVuY3Rpb24gdG9nZ2xlKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIHRvZ2dsZUZvcm1JbnB1dCh0aGlzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiZWhhdmlvcih7XG4gIFtDTElDS106IHtcbiAgICBbTElOS106IHRvZ2dsZSxcbiAgfSxcbn0pO1xuIiwiY29uc3QgaWdub3JlID0gcmVxdWlyZShcInJlY2VwdG9yL2lnbm9yZVwiKTtcbmNvbnN0IGJlaGF2aW9yID0gcmVxdWlyZShcIi4uL3V0aWxzL2JlaGF2aW9yXCIpO1xuY29uc3Qgc2VsZWN0ID0gcmVxdWlyZShcIi4uL3V0aWxzL3NlbGVjdFwiKTtcblxuY29uc3QgeyBDTElDSyB9ID0gcmVxdWlyZShcIi4uL2V2ZW50c1wiKTtcblxuY29uc3QgQlVUVE9OID0gXCIuanMtc2VhcmNoLWJ1dHRvblwiO1xuY29uc3QgRk9STSA9IFwiLmpzLXNlYXJjaC1mb3JtXCI7XG5jb25zdCBJTlBVVCA9IFwiW3R5cGU9c2VhcmNoXVwiO1xuY29uc3QgQ09OVEVYVCA9IFwiaGVhZGVyXCI7IC8vIFhYWFxuXG5sZXQgbGFzdEJ1dHRvbjtcblxuY29uc3QgZ2V0Rm9ybSA9IChidXR0b24pID0+IHtcbiAgY29uc3QgY29udGV4dCA9IGJ1dHRvbi5jbG9zZXN0KENPTlRFWFQpO1xuICByZXR1cm4gY29udGV4dCA/IGNvbnRleHQucXVlcnlTZWxlY3RvcihGT1JNKSA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoRk9STSk7XG59O1xuXG5jb25zdCB0b2dnbGVTZWFyY2ggPSAoYnV0dG9uLCBhY3RpdmUpID0+IHtcbiAgY29uc3QgZm9ybSA9IGdldEZvcm0oYnV0dG9uKTtcblxuICBpZiAoIWZvcm0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vICR7Rk9STX0gZm91bmQgZm9yIHNlYXJjaCB0b2dnbGUgaW4gJHtDT05URVhUfSFgKTtcbiAgfVxuXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG4gIGJ1dHRvbi5oaWRkZW4gPSBhY3RpdmU7XG4gIGZvcm0uaGlkZGVuID0gIWFjdGl2ZTtcbiAgLyogZXNsaW50LWVuYWJsZSAqL1xuXG4gIGlmICghYWN0aXZlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaW5wdXQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoSU5QVVQpO1xuXG4gIGlmIChpbnB1dCkge1xuICAgIGlucHV0LmZvY3VzKCk7XG4gIH1cbiAgLy8gd2hlbiB0aGUgdXNlciBjbGlja3MgX291dHNpZGVfIG9mIHRoZSBmb3JtIHcvaWdub3JlKCk6IGhpZGUgdGhlXG4gIC8vIHNlYXJjaCwgdGhlbiByZW1vdmUgdGhlIGxpc3RlbmVyXG4gIGNvbnN0IGxpc3RlbmVyID0gaWdub3JlKGZvcm0sICgpID0+IHtcbiAgICBpZiAobGFzdEJ1dHRvbikge1xuICAgICAgaGlkZVNlYXJjaC5jYWxsKGxhc3RCdXR0b24pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgfVxuXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKENMSUNLLCBsaXN0ZW5lcik7XG4gIH0pO1xuXG4gIC8vIE5vcm1hbGx5IHdlIHdvdWxkIGp1c3QgcnVuIHRoaXMgY29kZSB3aXRob3V0IGEgdGltZW91dCwgYnV0XG4gIC8vIElFMTEgYW5kIEVkZ2Ugd2lsbCBhY3R1YWxseSBjYWxsIHRoZSBsaXN0ZW5lciAqaW1tZWRpYXRlbHkqIGJlY2F1c2VcbiAgLy8gdGhleSBhcmUgY3VycmVudGx5IGhhbmRsaW5nIHRoaXMgZXhhY3QgdHlwZSBvZiBldmVudCwgc28gd2UnbGxcbiAgLy8gbWFrZSBzdXJlIHRoZSBicm93c2VyIGlzIGRvbmUgaGFuZGxpbmcgdGhlIGN1cnJlbnQgY2xpY2sgZXZlbnQsXG4gIC8vIGlmIGFueSwgYmVmb3JlIHdlIGF0dGFjaCB0aGUgbGlzdGVuZXIuXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihDTElDSywgbGlzdGVuZXIpO1xuICB9LCAwKTtcbn07XG5cbmZ1bmN0aW9uIHNob3dTZWFyY2goKSB7XG4gIHRvZ2dsZVNlYXJjaCh0aGlzLCB0cnVlKTtcbiAgbGFzdEJ1dHRvbiA9IHRoaXM7XG59XG5cbmZ1bmN0aW9uIGhpZGVTZWFyY2goKSB7XG4gIHRvZ2dsZVNlYXJjaCh0aGlzLCBmYWxzZSk7XG4gIGxhc3RCdXR0b24gPSB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IHNlYXJjaCA9IGJlaGF2aW9yKFxuICB7XG4gICAgW0NMSUNLXToge1xuICAgICAgW0JVVFRPTl06IHNob3dTZWFyY2gsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIGluaXQodGFyZ2V0KSB7XG4gICAgICBzZWxlY3QoQlVUVE9OLCB0YXJnZXQpLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgICB0b2dnbGVTZWFyY2goYnV0dG9uLCBmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHRlYXJkb3duKCkge1xuICAgICAgLy8gZm9yZ2V0IHRoZSBsYXN0IGJ1dHRvbiBjbGlja2VkXG4gICAgICBsYXN0QnV0dG9uID0gdW5kZWZpbmVkO1xuICAgIH0sXG4gIH1cbik7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VhcmNoO1xuIiwiY29uc3Qgb25jZSA9IHJlcXVpcmUoXCJyZWNlcHRvci9vbmNlXCIpO1xuY29uc3QgYmVoYXZpb3IgPSByZXF1aXJlKFwiLi4vdXRpbHMvYmVoYXZpb3JcIik7XG5jb25zdCB7IENMSUNLIH0gPSByZXF1aXJlKFwiLi4vZXZlbnRzXCIpO1xuY29uc3QgeyBwcmVmaXg6IFBSRUZJWCB9ID0gcmVxdWlyZShcIi4uL2NvbmZpZ1wiKTtcblxuY29uc3QgTElOSyA9IGAuJHtQUkVGSVh9LXNraXBuYXZbaHJlZl49XCIjXCJdLCAuJHtQUkVGSVh9LWZvb3Rlcl9fcmV0dXJuLXRvLXRvcCBbaHJlZl49XCIjXCJdYDtcbmNvbnN0IE1BSU5DT05URU5UID0gXCJtYWluLWNvbnRlbnRcIjtcblxuZnVuY3Rpb24gc2V0VGFiaW5kZXgoKSB7XG4gIC8vIE5COiB3ZSBrbm93IGJlY2F1c2Ugb2YgdGhlIHNlbGVjdG9yIHdlJ3JlIGRlbGVnYXRpbmcgdG8gYmVsb3cgdGhhdCB0aGVcbiAgLy8gaHJlZiBhbHJlYWR5IGJlZ2lucyB3aXRoICcjJ1xuICBjb25zdCBpZCA9IGVuY29kZVVSSSh0aGlzLmdldEF0dHJpYnV0ZShcImhyZWZcIikpO1xuICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICBpZCA9PT0gXCIjXCIgPyBNQUlOQ09OVEVOVCA6IGlkLnNsaWNlKDEpXG4gICk7XG5cbiAgaWYgKHRhcmdldCkge1xuICAgIHRhcmdldC5zdHlsZS5vdXRsaW5lID0gXCIwXCI7XG4gICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIDApO1xuICAgIHRhcmdldC5mb2N1cygpO1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJibHVyXCIsXG4gICAgICBvbmNlKCgpID0+IHtcbiAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIC0xKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aHJvdyBhbiBlcnJvcj9cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJlaGF2aW9yKHtcbiAgW0NMSUNLXToge1xuICAgIFtMSU5LXTogc2V0VGFiaW5kZXgsXG4gIH0sXG59KTtcbiIsImNvbnN0IHNlbGVjdCA9IHJlcXVpcmUoXCIuLi91dGlscy9zZWxlY3RcIik7XG5jb25zdCBiZWhhdmlvciA9IHJlcXVpcmUoXCIuLi91dGlscy9iZWhhdmlvclwiKTtcbmNvbnN0IHsgQ0xJQ0sgfSA9IHJlcXVpcmUoXCIuLi9ldmVudHNcIik7XG5jb25zdCB7IHByZWZpeDogUFJFRklYIH0gPSByZXF1aXJlKFwiLi4vY29uZmlnXCIpO1xuXG5jb25zdCBUQUJMRSA9IGAuJHtQUkVGSVh9LXRhYmxlYDtcbmNvbnN0IFNPUlRFRCA9IFwiYXJpYS1zb3J0XCI7XG5jb25zdCBBU0NFTkRJTkcgPSBcImFzY2VuZGluZ1wiO1xuY29uc3QgREVTQ0VORElORyA9IFwiZGVzY2VuZGluZ1wiO1xuY29uc3QgU09SVF9PVkVSUklERSA9IFwiZGF0YS1zb3J0LXZhbHVlXCI7XG5cbmNvbnN0IElDT05fU09VUkNFID0gYFxuICA8c3ZnIGNsYXNzPVwiJHtQUkVGSVh9LWljb25cIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgIDxnIGNsYXNzPVwiZGVzY2VuZGluZ1wiIGZpbGw9XCJ0cmFuc3BhcmVudFwiPlxuICAgICAgPHBhdGggZD1cIk0xNyAxN0wxNS41OSAxNS41OUwxMi45OTk5IDE4LjE3VjJIMTAuOTk5OVYxOC4xN0w4LjQxIDE1LjU4TDcgMTdMMTEuOTk5OSAyMkwxNyAxN1pcIiAvPlxuICAgIDwvZz5cbiAgICA8ZyBjbGFzcz1cImFzY2VuZGluZ1wiIGZpbGw9XCJ0cmFuc3BhcmVudFwiPlxuICAgICAgPHBhdGggdHJhbnNmb3JtPVwicm90YXRlKDE4MCwgMTIsIDEyKVwiIGQ9XCJNMTcgMTdMMTUuNTkgMTUuNTlMMTIuOTk5OSAxOC4xN1YySDEwLjk5OTlWMTguMTdMOC40MSAxNS41OEw3IDE3TDExLjk5OTkgMjJMMTcgMTdaXCIgLz5cbiAgICA8L2c+XG4gICAgPGcgY2xhc3M9XCJ1bnNvcnRlZFwiIGZpbGw9XCJ0cmFuc3BhcmVudFwiPlxuICAgICAgPHBvbHlnb24gcG9pbnRzPVwiMTUuMTcgMTUgMTMgMTcuMTcgMTMgNi44MyAxNS4xNyA5IDE2LjU4IDcuNTkgMTIgMyA3LjQxIDcuNTkgOC44MyA5IDExIDYuODMgMTEgMTcuMTcgOC44MyAxNSA3LjQyIDE2LjQxIDEyIDIxIDE2LjU5IDE2LjQxIDE1LjE3IDE1XCIvPlxuICAgIDwvZz5cbiAgPC9zdmc+XG5gO1xuXG5jb25zdCBTT1JUX0JVVFRPTl9DTEFTUyA9IGAke1BSRUZJWH0tdGFibGVfX2hlYWRlcl9fYnV0dG9uYDtcbmNvbnN0IFNPUlRfQlVUVE9OID0gYC4ke1NPUlRfQlVUVE9OX0NMQVNTfWA7XG5jb25zdCBTT1JUQUJMRV9IRUFERVIgPSBgdGhbZGF0YS1zb3J0YWJsZV1gO1xuY29uc3QgQU5OT1VOQ0VNRU5UX1JFR0lPTiA9IGAuJHtQUkVGSVh9LXRhYmxlX19hbm5vdW5jZW1lbnQtcmVnaW9uW2FyaWEtbGl2ZT1cInBvbGl0ZVwiXWA7XG5cbi8qKiBHZXRzIHRoZSBkYXRhLXNvcnQtdmFsdWUgYXR0cmlidXRlIHZhbHVlLCBpZiBwcm92aWRlZCDigJQgb3RoZXJ3aXNlLCBnZXRzXG4gKiB0aGUgaW5uZXJUZXh0IG9yIHRleHRDb250ZW50IOKAlCBvZiB0aGUgY2hpbGQgZWxlbWVudCAoSFRNTFRhYmxlQ2VsbEVsZW1lbnQpXG4gKiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoZSBnaXZlbiB0YWJsZSByb3dcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7YXJyYXk8SFRNTFRhYmxlUm93RWxlbWVudD59IHRyXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5jb25zdCBnZXRDZWxsVmFsdWUgPSAodHIsIGluZGV4KSA9PlxuICB0ci5jaGlsZHJlbltpbmRleF0uZ2V0QXR0cmlidXRlKFNPUlRfT1ZFUlJJREUpIHx8XG4gIHRyLmNoaWxkcmVuW2luZGV4XS5pbm5lclRleHQgfHxcbiAgdHIuY2hpbGRyZW5baW5kZXhdLnRleHRDb250ZW50O1xuXG4vKipcbiAqIENvbXBhcmVzIHRoZSB2YWx1ZXMgb2YgdHdvIHJvdyBhcnJheSBpdGVtcyBhdCB0aGUgZ2l2ZW4gaW5kZXgsIHRoZW4gc29ydHMgYnkgdGhlIGdpdmVuIGRpcmVjdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyZWN0aW9uXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5jb25zdCBjb21wYXJlRnVuY3Rpb24gPSAoaW5kZXgsIGlzQXNjZW5kaW5nKSA9PiAodGhpc1JvdywgbmV4dFJvdykgPT4ge1xuICAvLyBnZXQgdmFsdWVzIHRvIGNvbXBhcmUgZnJvbSBkYXRhIGF0dHJpYnV0ZSBvciBjZWxsIGNvbnRlbnRcbiAgY29uc3QgdmFsdWUxID0gZ2V0Q2VsbFZhbHVlKGlzQXNjZW5kaW5nID8gdGhpc1JvdyA6IG5leHRSb3csIGluZGV4KTtcbiAgY29uc3QgdmFsdWUyID0gZ2V0Q2VsbFZhbHVlKGlzQXNjZW5kaW5nID8gbmV4dFJvdyA6IHRoaXNSb3csIGluZGV4KTtcblxuICAvLyBpZiBuZWl0aGVyIHZhbHVlIGlzIGVtcHR5LCBhbmQgaWYgYm90aCB2YWx1ZXMgYXJlIGFscmVhZHkgbnVtYmVycywgY29tcGFyZSBudW1lcmljYWxseVxuICBpZiAoXG4gICAgdmFsdWUxICYmXG4gICAgdmFsdWUyICYmXG4gICAgIU51bWJlci5pc05hTihOdW1iZXIodmFsdWUxKSkgJiZcbiAgICAhTnVtYmVyLmlzTmFOKE51bWJlcih2YWx1ZTIpKVxuICApIHtcbiAgICByZXR1cm4gdmFsdWUxIC0gdmFsdWUyO1xuICB9XG4gIC8vIE90aGVyd2lzZSwgY29tcGFyZSBhbHBoYWJldGljYWxseSBiYXNlZCBvbiBjdXJyZW50IHVzZXIgbG9jYWxlXG4gIHJldHVybiB2YWx1ZTFcbiAgICAudG9TdHJpbmcoKVxuICAgIC5sb2NhbGVDb21wYXJlKHZhbHVlMiwgbmF2aWdhdG9yLmxhbmd1YWdlLCB7XG4gICAgICBudW1lcmljOiB0cnVlLFxuICAgICAgaWdub3JlUHVuY3R1YXRpb246IHRydWUsXG4gICAgfSk7XG59O1xuXG4vKipcbiAqIEdldCBhbiBBcnJheSBvZiBjb2x1bW4gaGVhZGVycyBlbGVtZW50cyBiZWxvbmdpbmcgZGlyZWN0bHkgdG8gdGhlIGdpdmVuXG4gKiB0YWJsZSBlbGVtZW50LlxuICogQHBhcmFtIHtIVE1MVGFibGVFbGVtZW50fSB0YWJsZVxuICogQHJldHVybiB7YXJyYXk8SFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ+fVxuICovXG5jb25zdCBnZXRDb2x1bW5IZWFkZXJzID0gKHRhYmxlKSA9PiB7XG4gIGNvbnN0IGhlYWRlcnMgPSBzZWxlY3QoU09SVEFCTEVfSEVBREVSLCB0YWJsZSk7XG4gIHJldHVybiBoZWFkZXJzLmZpbHRlcigoaGVhZGVyKSA9PiBoZWFkZXIuY2xvc2VzdChUQUJMRSkgPT09IHRhYmxlKTtcbn07XG5cbi8qKlxuICogVXBkYXRlIHRoZSBidXR0b24gbGFiZWwgd2l0aGluIHRoZSBnaXZlbiBoZWFkZXIgZWxlbWVudCwgcmVzZXR0aW5nIGl0XG4gKiB0byB0aGUgZGVmYXVsdCBzdGF0ZSAocmVhZHkgdG8gc29ydCBhc2NlbmRpbmcpIGlmIGl0J3Mgbm8gbG9uZ2VyIHNvcnRlZFxuICogQHBhcmFtIHtIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudH0gaGVhZGVyXG4gKi9cbmNvbnN0IHVwZGF0ZVNvcnRMYWJlbCA9IChoZWFkZXIpID0+IHtcbiAgY29uc3QgaGVhZGVyTmFtZSA9IGhlYWRlci5pbm5lclRleHQ7XG4gIGNvbnN0IHNvcnRlZEFzY2VuZGluZyA9IGhlYWRlci5nZXRBdHRyaWJ1dGUoU09SVEVEKSA9PT0gQVNDRU5ESU5HO1xuICBjb25zdCBpc1NvcnRlZCA9XG4gICAgaGVhZGVyLmdldEF0dHJpYnV0ZShTT1JURUQpID09PSBBU0NFTkRJTkcgfHxcbiAgICBoZWFkZXIuZ2V0QXR0cmlidXRlKFNPUlRFRCkgPT09IERFU0NFTkRJTkcgfHxcbiAgICBmYWxzZTtcbiAgY29uc3QgaGVhZGVyTGFiZWwgPSBgJHtoZWFkZXJOYW1lfScsIHNvcnRhYmxlIGNvbHVtbiwgY3VycmVudGx5ICR7XG4gICAgaXNTb3J0ZWRcbiAgICAgID8gYCR7c29ydGVkQXNjZW5kaW5nID8gYHNvcnRlZCAke0FTQ0VORElOR31gIDogYHNvcnRlZCAke0RFU0NFTkRJTkd9YH1gXG4gICAgICA6IFwidW5zb3J0ZWRcIlxuICB9YDtcbiAgY29uc3QgaGVhZGVyQnV0dG9uTGFiZWwgPSBgQ2xpY2sgdG8gc29ydCBieSAke2hlYWRlck5hbWV9IGluICR7XG4gICAgc29ydGVkQXNjZW5kaW5nID8gREVTQ0VORElORyA6IEFTQ0VORElOR1xuICB9IG9yZGVyLmA7XG4gIGhlYWRlci5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIGhlYWRlckxhYmVsKTtcbiAgaGVhZGVyLnF1ZXJ5U2VsZWN0b3IoU09SVF9CVVRUT04pLnNldEF0dHJpYnV0ZShcInRpdGxlXCIsIGhlYWRlckJ1dHRvbkxhYmVsKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBhcmlhLXNvcnQgYXR0cmlidXRlIG9uIHRoZSBnaXZlbiBoZWFkZXIgZWxlbWVudCwgYW5kIHJlc2V0IHRoZSBsYWJlbCBhbmQgYnV0dG9uIGljb25cbiAqIEBwYXJhbSB7SFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnR9IGhlYWRlclxuICovXG5jb25zdCB1bnNldFNvcnQgPSAoaGVhZGVyKSA9PiB7XG4gIGhlYWRlci5yZW1vdmVBdHRyaWJ1dGUoU09SVEVEKTtcbiAgdXBkYXRlU29ydExhYmVsKGhlYWRlcik7XG59O1xuXG4vKipcbiAqIFNvcnQgcm93cyBlaXRoZXIgYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcsIGJhc2VkIG9uIGEgZ2l2ZW4gaGVhZGVyJ3MgYXJpYS1zb3J0IGF0dHJpYnV0ZVxuICogQHBhcmFtIHtIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudH0gaGVhZGVyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzQXNjZW5kaW5nXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlXG4gKi9cbmNvbnN0IHNvcnRSb3dzID0gKGhlYWRlciwgaXNBc2NlbmRpbmcpID0+IHtcbiAgaGVhZGVyLnNldEF0dHJpYnV0ZShTT1JURUQsIGlzQXNjZW5kaW5nID09PSB0cnVlID8gREVTQ0VORElORyA6IEFTQ0VORElORyk7XG4gIHVwZGF0ZVNvcnRMYWJlbChoZWFkZXIpO1xuXG4gIGNvbnN0IHRib2R5ID0gaGVhZGVyLmNsb3Nlc3QoVEFCTEUpLnF1ZXJ5U2VsZWN0b3IoXCJ0Ym9keVwiKTtcblxuICAvLyBXZSBjYW4gdXNlIEFycmF5LmZyb20oKSBhbmQgQXJyYXkuc29ydCgpIGluc3RlYWQgb25jZSB3ZSBkcm9wIElFMTEgc3VwcG9ydCwgbGlrZWx5IGluIHRoZSBzdW1tZXIgb2YgMjAyMVxuICAvL1xuICAvLyBBcnJheS5mcm9tKHRib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJykuc29ydChcbiAgLy8gICBjb21wYXJlRnVuY3Rpb24oXG4gIC8vICAgICBBcnJheS5mcm9tKGhlYWRlci5wYXJlbnROb2RlLmNoaWxkcmVuKS5pbmRleE9mKGhlYWRlciksXG4gIC8vICAgICAhaXNBc2NlbmRpbmcpXG4gIC8vICAgKVxuICAvLyAuZm9yRWFjaCh0ciA9PiB0Ym9keS5hcHBlbmRDaGlsZCh0cikgKTtcblxuICAvLyBbXS5zbGljZS5jYWxsKCkgdHVybnMgYXJyYXktbGlrZSBzZXRzIGludG8gdHJ1ZSBhcnJheXMgc28gdGhhdCB3ZSBjYW4gc29ydCB0aGVtXG4gIGNvbnN0IGFsbFJvd3MgPSBbXS5zbGljZS5jYWxsKHRib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0clwiKSk7XG4gIGNvbnN0IGFsbEhlYWRlcnMgPSBbXS5zbGljZS5jYWxsKGhlYWRlci5wYXJlbnROb2RlLmNoaWxkcmVuKTtcbiAgY29uc3QgdGhpc0hlYWRlckluZGV4ID0gYWxsSGVhZGVycy5pbmRleE9mKGhlYWRlcik7XG4gIGFsbFJvd3Muc29ydChjb21wYXJlRnVuY3Rpb24odGhpc0hlYWRlckluZGV4LCAhaXNBc2NlbmRpbmcpKS5mb3JFYWNoKCh0cikgPT4ge1xuICAgIFtdLnNsaWNlXG4gICAgICAuY2FsbCh0ci5jaGlsZHJlbilcbiAgICAgIC5mb3JFYWNoKCh0ZCkgPT4gdGQucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1zb3J0LWFjdGl2ZVwiKSk7XG4gICAgdHIuY2hpbGRyZW5bdGhpc0hlYWRlckluZGV4XS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXNvcnQtYWN0aXZlXCIsIHRydWUpO1xuICAgIHRib2R5LmFwcGVuZENoaWxkKHRyKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIFVwZGF0ZSB0aGUgbGl2ZSByZWdpb24gaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSB0YWJsZSB3aGVuZXZlciBzb3J0IGNoYW5nZXMuXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50fSBzb3J0ZWRIZWFkZXJcbiAqL1xuXG5jb25zdCB1cGRhdGVMaXZlUmVnaW9uID0gKHRhYmxlLCBzb3J0ZWRIZWFkZXIpID0+IHtcbiAgY29uc3QgY2FwdGlvbiA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoXCJjYXB0aW9uXCIpLmlubmVyVGV4dDtcbiAgY29uc3Qgc29ydGVkQXNjZW5kaW5nID0gc29ydGVkSGVhZGVyLmdldEF0dHJpYnV0ZShTT1JURUQpID09PSBBU0NFTkRJTkc7XG4gIGNvbnN0IGhlYWRlckxhYmVsID0gc29ydGVkSGVhZGVyLmlubmVyVGV4dDtcbiAgY29uc3QgbGl2ZVJlZ2lvbiA9IHRhYmxlLm5leHRFbGVtZW50U2libGluZztcbiAgaWYgKGxpdmVSZWdpb24gJiYgbGl2ZVJlZ2lvbi5tYXRjaGVzKEFOTk9VTkNFTUVOVF9SRUdJT04pKSB7XG4gICAgY29uc3Qgc29ydEFubm91bmNlbWVudCA9IGBUaGUgdGFibGUgbmFtZWQgXCIke2NhcHRpb259XCIgaXMgbm93IHNvcnRlZCBieSAke2hlYWRlckxhYmVsfSBpbiAke1xuICAgICAgc29ydGVkQXNjZW5kaW5nID8gQVNDRU5ESU5HIDogREVTQ0VORElOR1xuICAgIH0gb3JkZXIuYDtcbiAgICBsaXZlUmVnaW9uLmlubmVyVGV4dCA9IHNvcnRBbm5vdW5jZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRhYmxlIGNvbnRhaW5pbmcgYSBzb3J0YWJsZSBjb2x1bW4gaGVhZGVyIGlzIG5vdCBmb2xsb3dlZCBieSBhbiBhcmlhLWxpdmUgcmVnaW9uLmBcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIFRvZ2dsZSBhIGhlYWRlcidzIHNvcnQgc3RhdGUsIG9wdGlvbmFsbHkgcHJvdmlkaW5nIGEgdGFyZ2V0XG4gKiBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50fSBoZWFkZXJcbiAqIEBwYXJhbSB7Ym9vbGVhbj99IGlzQXNjZW5kaW5nIElmIG5vIHN0YXRlIGlzIHByb3ZpZGVkLCB0aGUgY3VycmVudFxuICogc3RhdGUgd2lsbCBiZSB0b2dnbGVkIChmcm9tIGZhbHNlIHRvIHRydWUsIGFuZCB2aWNlLXZlcnNhKS5cbiAqL1xuY29uc3QgdG9nZ2xlU29ydCA9IChoZWFkZXIsIGlzQXNjZW5kaW5nKSA9PiB7XG4gIGNvbnN0IHRhYmxlID0gaGVhZGVyLmNsb3Nlc3QoVEFCTEUpO1xuICBsZXQgc2FmZUFzY2VuZGluZyA9IGlzQXNjZW5kaW5nO1xuICBpZiAodHlwZW9mIHNhZmVBc2NlbmRpbmcgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgc2FmZUFzY2VuZGluZyA9IGhlYWRlci5nZXRBdHRyaWJ1dGUoU09SVEVEKSA9PT0gQVNDRU5ESU5HO1xuICB9XG5cbiAgaWYgKCF0YWJsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtTT1JUQUJMRV9IRUFERVJ9IGlzIG1pc3Npbmcgb3V0ZXIgJHtUQUJMRX1gKTtcbiAgfVxuXG4gIHNhZmVBc2NlbmRpbmcgPSBzb3J0Um93cyhoZWFkZXIsIGlzQXNjZW5kaW5nKTtcblxuICBpZiAoc2FmZUFzY2VuZGluZykge1xuICAgIGdldENvbHVtbkhlYWRlcnModGFibGUpLmZvckVhY2goKG90aGVySGVhZGVyKSA9PiB7XG4gICAgICBpZiAob3RoZXJIZWFkZXIgIT09IGhlYWRlcikge1xuICAgICAgICB1bnNldFNvcnQob3RoZXJIZWFkZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHVwZGF0ZUxpdmVSZWdpb24odGFibGUsIGhlYWRlcik7XG4gIH1cbn07XG5cbi8qKlxuICoqIEluc2VydHMgYSBidXR0b24gd2l0aCBpY29uIGluc2lkZSBhIHNvcnRhYmxlIGhlYWRlclxuICogQHBhcmFtIHtIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudH0gaGVhZGVyXG4gKi9cblxuY29uc3QgY3JlYXRlSGVhZGVyQnV0dG9uID0gKGhlYWRlcikgPT4ge1xuICBjb25zdCBidXR0b25FbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gIGJ1dHRvbkVsLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiMFwiKTtcbiAgYnV0dG9uRWwuY2xhc3NMaXN0LmFkZChTT1JUX0JVVFRPTl9DTEFTUyk7XG4gIGJ1dHRvbkVsLmlubmVySFRNTCA9IGAke0lDT05fU09VUkNFfWA7XG4gIGhlYWRlci5hcHBlbmRDaGlsZChidXR0b25FbCk7XG4gIHVwZGF0ZVNvcnRMYWJlbChoZWFkZXIpO1xufTtcblxuY29uc3QgdGFibGUgPSBiZWhhdmlvcihcbiAge1xuICAgIFtDTElDS106IHtcbiAgICAgIFtTT1JUX0JVVFRPTl0oZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdG9nZ2xlU29ydChcbiAgICAgICAgICBldmVudC50YXJnZXQuY2xvc2VzdChTT1JUQUJMRV9IRUFERVIpLFxuICAgICAgICAgIGV2ZW50LnRhcmdldC5jbG9zZXN0KFNPUlRBQkxFX0hFQURFUikuZ2V0QXR0cmlidXRlKFNPUlRFRCkgPT09XG4gICAgICAgICAgICBBU0NFTkRJTkdcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIGluaXQocm9vdCkge1xuICAgICAgY29uc3Qgc29ydGFibGVIZWFkZXJzID0gc2VsZWN0KFNPUlRBQkxFX0hFQURFUiwgcm9vdCk7XG4gICAgICBzb3J0YWJsZUhlYWRlcnMuZm9yRWFjaCgoaGVhZGVyKSA9PiBjcmVhdGVIZWFkZXJCdXR0b24oaGVhZGVyKSk7XG5cbiAgICAgIGNvbnN0IGZpcnN0U29ydGVkID0gc29ydGFibGVIZWFkZXJzLmZpbHRlcihcbiAgICAgICAgKGhlYWRlcikgPT5cbiAgICAgICAgICBoZWFkZXIuZ2V0QXR0cmlidXRlKFNPUlRFRCkgPT09IEFTQ0VORElORyB8fFxuICAgICAgICAgIGhlYWRlci5nZXRBdHRyaWJ1dGUoU09SVEVEKSA9PT0gREVTQ0VORElOR1xuICAgICAgKVswXTtcbiAgICAgIGlmICh0eXBlb2YgZmlyc3RTb3J0ZWQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgLy8gbm8gc29ydGFibGUgaGVhZGVycyBmb3VuZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzb3J0RGlyID0gZmlyc3RTb3J0ZWQuZ2V0QXR0cmlidXRlKFNPUlRFRCk7XG4gICAgICBpZiAoc29ydERpciA9PT0gQVNDRU5ESU5HKSB7XG4gICAgICAgIHRvZ2dsZVNvcnQoZmlyc3RTb3J0ZWQsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChzb3J0RGlyID09PSBERVNDRU5ESU5HKSB7XG4gICAgICAgIHRvZ2dsZVNvcnQoZmlyc3RTb3J0ZWQsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFRBQkxFLFxuICAgIFNPUlRBQkxFX0hFQURFUixcbiAgICBTT1JUX0JVVFRPTixcbiAgfVxuKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0YWJsZTtcbiIsImNvbnN0IGJlaGF2aW9yID0gcmVxdWlyZShcIi4uL3V0aWxzL2JlaGF2aW9yXCIpO1xuY29uc3Qgc2VsZWN0ID0gcmVxdWlyZShcIi4uL3V0aWxzL3NlbGVjdFwiKTtcbmNvbnN0IHsgcHJlZml4OiBQUkVGSVggfSA9IHJlcXVpcmUoXCIuLi9jb25maWdcIik7XG5jb25zdCB7IENPTUJPX0JPWF9DTEFTUywgZW5oYW5jZUNvbWJvQm94IH0gPSByZXF1aXJlKFwiLi9jb21iby1ib3hcIik7XG5cbmNvbnN0IFRJTUVfUElDS0VSX0NMQVNTID0gYCR7UFJFRklYfS10aW1lLXBpY2tlcmA7XG5jb25zdCBUSU1FX1BJQ0tFUiA9IGAuJHtUSU1FX1BJQ0tFUl9DTEFTU31gO1xuY29uc3QgTUFYX1RJTUUgPSA2MCAqIDI0IC0gMTtcbmNvbnN0IE1JTl9USU1FID0gMDtcbmNvbnN0IERFRkFVTFRfU1RFUCA9IDMwO1xuY29uc3QgTUlOX1NURVAgPSAxO1xuXG5jb25zdCBGSUxURVJfREFUQVNFVCA9IHtcbiAgZmlsdGVyOlxuICAgIFwiMD97eyBob3VyUXVlcnlGaWx0ZXIgfX06e3ttaW51dGVRdWVyeUZpbHRlcn19Lip7eyBhcFF1ZXJ5RmlsdGVyIH19bT9cIixcbiAgYXBRdWVyeUZpbHRlcjogXCIoW2FwXSlcIixcbiAgaG91clF1ZXJ5RmlsdGVyOiBcIihbMS05XVswLTJdPylcIixcbiAgbWludXRlUXVlcnlGaWx0ZXI6IFwiW1xcXFxkXSs6KFswLTldezAsMn0pXCIsXG59O1xuXG4vKipcbiAqIFBhcnNlIGEgc3RyaW5nIG9mIGhoOm1tIGludG8gbWludXRlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lU3RyIHRoZSB0aW1lIHN0cmluZyB0byBwYXJzZVxuICogQHJldHVybnMge251bWJlcn0gdGhlIG51bWJlciBvZiBtaW51dGVzXG4gKi9cbmNvbnN0IHBhcnNlVGltZVN0cmluZyA9ICh0aW1lU3RyKSA9PiB7XG4gIGxldCBtaW51dGVzO1xuXG4gIGlmICh0aW1lU3RyKSB7XG4gICAgY29uc3QgW2hvdXJzLCBtaW5zXSA9IHRpbWVTdHIuc3BsaXQoXCI6XCIpLm1hcCgoc3RyKSA9PiB7XG4gICAgICBsZXQgdmFsdWU7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludChzdHIsIDEwKTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKHBhcnNlZCkpIHZhbHVlID0gcGFyc2VkO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuXG4gICAgaWYgKGhvdXJzICE9IG51bGwgJiYgbWlucyAhPSBudWxsKSB7XG4gICAgICBtaW51dGVzID0gaG91cnMgKiA2MCArIG1pbnM7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1pbnV0ZXM7XG59O1xuXG4vKipcbiAqIEVuaGFuY2UgYW4gaW5wdXQgd2l0aCB0aGUgZGF0ZSBwaWNrZXIgZWxlbWVudHNcbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBUaGUgaW5pdGlhbCB3cmFwcGluZyBlbGVtZW50IG9mIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnRcbiAqL1xuY29uc3QgdHJhbnNmb3JtVGltZVBpY2tlciA9IChlbCkgPT4ge1xuICBjb25zdCB0aW1lUGlja2VyRWwgPSBlbC5jbG9zZXN0KFRJTUVfUElDS0VSKTtcblxuICBjb25zdCBpbml0aWFsSW5wdXRFbCA9IHRpbWVQaWNrZXJFbC5xdWVyeVNlbGVjdG9yKGBpbnB1dGApO1xuXG4gIGlmICghaW5pdGlhbElucHV0RWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7VElNRV9QSUNLRVJ9IGlzIG1pc3NpbmcgaW5uZXIgaW5wdXRgKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGVjdEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcblxuICBbXCJpZFwiLCBcIm5hbWVcIiwgXCJyZXF1aXJlZFwiLCBcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0uZm9yRWFjaChcbiAgICAobmFtZSkgPT4ge1xuICAgICAgaWYgKGluaXRpYWxJbnB1dEVsLmhhc0F0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGluaXRpYWxJbnB1dEVsLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgc2VsZWN0RWwuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgaW5pdGlhbElucHV0RWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcblxuICBjb25zdCBwYWRaZXJvcyA9ICh2YWx1ZSwgbGVuZ3RoKSA9PiB7XG4gICAgcmV0dXJuIGAwMDAwJHt2YWx1ZX1gLnNsaWNlKC1sZW5ndGgpO1xuICB9O1xuXG4gIGNvbnN0IGdldFRpbWVDb250ZXh0ID0gKG1pbnV0ZXMpID0+IHtcbiAgICBjb25zdCBtaW51dGUgPSBtaW51dGVzICUgNjA7XG4gICAgY29uc3QgaG91cjI0ID0gTWF0aC5mbG9vcihtaW51dGVzIC8gNjApO1xuICAgIGNvbnN0IGhvdXIxMiA9IGhvdXIyNCAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IGFtcG0gPSBob3VyMjQgPCAxMiA/IFwiYW1cIiA6IFwicG1cIjtcblxuICAgIHJldHVybiB7XG4gICAgICBtaW51dGUsXG4gICAgICBob3VyMjQsXG4gICAgICBob3VyMTIsXG4gICAgICBhbXBtLFxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgbWluVGltZSA9IE1hdGgubWF4KFxuICAgIE1JTl9USU1FLFxuICAgIHBhcnNlVGltZVN0cmluZyh0aW1lUGlja2VyRWwuZGF0YXNldC5taW5UaW1lKSB8fCBNSU5fVElNRVxuICApO1xuICBjb25zdCBtYXhUaW1lID0gTWF0aC5taW4oXG4gICAgTUFYX1RJTUUsXG4gICAgcGFyc2VUaW1lU3RyaW5nKHRpbWVQaWNrZXJFbC5kYXRhc2V0Lm1heFRpbWUpIHx8IE1BWF9USU1FXG4gICk7XG4gIGNvbnN0IHN0ZXAgPSBNYXRoLmZsb29yKFxuICAgIE1hdGgubWF4KE1JTl9TVEVQLCB0aW1lUGlja2VyRWwuZGF0YXNldC5zdGVwIHx8IERFRkFVTFRfU1RFUClcbiAgKTtcblxuICBmb3IgKGxldCB0aW1lID0gbWluVGltZTsgdGltZSA8PSBtYXhUaW1lOyB0aW1lICs9IHN0ZXApIHtcbiAgICBjb25zdCB7IG1pbnV0ZSwgaG91cjI0LCBob3VyMTIsIGFtcG0gfSA9IGdldFRpbWVDb250ZXh0KHRpbWUpO1xuXG4gICAgY29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcbiAgICBvcHRpb24udmFsdWUgPSBgJHtwYWRaZXJvcyhob3VyMjQsIDIpfToke3BhZFplcm9zKG1pbnV0ZSwgMil9YDtcbiAgICBvcHRpb24udGV4dCA9IGAke2hvdXIxMn06JHtwYWRaZXJvcyhtaW51dGUsIDIpfSR7YW1wbX1gO1xuICAgIHNlbGVjdEVsLmFwcGVuZENoaWxkKG9wdGlvbik7XG4gIH1cblxuICB0aW1lUGlja2VyRWwuY2xhc3NMaXN0LmFkZChDT01CT19CT1hfQ0xBU1MpO1xuXG4gIC8vIGNvbWJvIGJveCBwcm9wZXJ0aWVzXG4gIE9iamVjdC5rZXlzKEZJTFRFUl9EQVRBU0VUKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICB0aW1lUGlja2VyRWwuZGF0YXNldFtrZXldID0gRklMVEVSX0RBVEFTRVRba2V5XTtcbiAgfSk7XG4gIHRpbWVQaWNrZXJFbC5kYXRhc2V0LmRpc2FibGVGaWx0ZXJpbmcgPSBcInRydWVcIjtcblxuICB0aW1lUGlja2VyRWwuYXBwZW5kQ2hpbGQoc2VsZWN0RWwpO1xuICBpbml0aWFsSW5wdXRFbC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG59O1xuXG5jb25zdCB0aW1lUGlja2VyID0gYmVoYXZpb3IoXG4gIHt9LFxuICB7XG4gICAgaW5pdChyb290KSB7XG4gICAgICBzZWxlY3QoVElNRV9QSUNLRVIsIHJvb3QpLmZvckVhY2goKHRpbWVQaWNrZXJFbCkgPT4ge1xuICAgICAgICB0cmFuc2Zvcm1UaW1lUGlja2VyKHRpbWVQaWNrZXJFbCk7XG4gICAgICAgIGVuaGFuY2VDb21ib0JveCh0aW1lUGlja2VyRWwpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBGSUxURVJfREFUQVNFVCxcbiAgfVxuKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0aW1lUGlja2VyO1xuIiwiLy8gVG9vbHRpcHNcbmNvbnN0IHNlbGVjdCA9IHJlcXVpcmUoXCIuLi91dGlscy9zZWxlY3RcIik7XG5jb25zdCBiZWhhdmlvciA9IHJlcXVpcmUoXCIuLi91dGlscy9iZWhhdmlvclwiKTtcbmNvbnN0IHsgcHJlZml4OiBQUkVGSVggfSA9IHJlcXVpcmUoXCIuLi9jb25maWdcIik7XG5jb25zdCBpc0VsZW1lbnRJblZpZXdwb3J0ID0gcmVxdWlyZShcIi4uL3V0aWxzL2lzLWluLXZpZXdwb3J0XCIpO1xuXG5jb25zdCBUT09MVElQID0gYC4ke1BSRUZJWH0tdG9vbHRpcGA7XG5jb25zdCBUT09MVElQX1RSSUdHRVJfQ0xBU1MgPSBgJHtQUkVGSVh9LXRvb2x0aXBfX3RyaWdnZXJgO1xuY29uc3QgVE9PTFRJUF9DTEFTUyA9IGAke1BSRUZJWH0tdG9vbHRpcGA7XG5jb25zdCBUT09MVElQX0JPRFlfQ0xBU1MgPSBgJHtQUkVGSVh9LXRvb2x0aXBfX2JvZHlgO1xuY29uc3QgU0VUX0NMQVNTID0gXCJpcy1zZXRcIjtcbmNvbnN0IFZJU0lCTEVfQ0xBU1MgPSBcImlzLXZpc2libGVcIjtcbmNvbnN0IFRSSUFOR0xFX1NJWkUgPSA1O1xuY29uc3QgQURKVVNUX1dJRFRIX0NMQVNTID0gYCR7UFJFRklYfS10b29sdGlwX19ib2R5LS13cmFwYDtcblxuLyoqXG4gKiBBZGQgb25lIG9yIG1vcmUgbGlzdGVuZXJzIHRvIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCAtIERPTSBlbGVtZW50IHRvIGFkZCBsaXN0ZW5lcnMgdG9cbiAqIEBwYXJhbSB7ZXZlbnRzfSBldmVudE5hbWVzIC0gc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnQgbmFtZXMsIGUuZy4gJ2NsaWNrIGNoYW5nZSdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gZnVuY3Rpb24gdG8gYXR0YWNoIGZvciBlYWNoIGV2ZW50IGFzIGEgbGlzdGVuZXJcbiAqL1xuY29uc3QgYWRkTGlzdGVuZXJNdWx0aSA9IChlbGVtZW50LCBldmVudE5hbWVzLCBsaXN0ZW5lcikgPT4ge1xuICBjb25zdCBldmVudHMgPSBldmVudE5hbWVzLnNwbGl0KFwiIFwiKTtcbiAgZm9yIChsZXQgaSA9IDAsIGlMZW4gPSBldmVudHMubGVuZ3RoOyBpIDwgaUxlbjsgaSArPSAxKSB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50c1tpXSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTaG93cyB0aGUgdG9vbHRpcFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9vbHRpcFRyaWdnZXIgLSB0aGUgZWxlbWVudCB0aGF0IGluaXRpYWxpemVzIHRoZSB0b29sdGlwXG4gKi9cbmNvbnN0IHNob3dUb29sVGlwID0gKHRvb2x0aXBCb2R5LCB0b29sdGlwVHJpZ2dlciwgcG9zaXRpb24pID0+IHtcbiAgdG9vbHRpcEJvZHkuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJmYWxzZVwiKTtcblxuICAvLyBUaGlzIHNldHMgdXAgdGhlIHRvb2x0aXAgYm9keS4gVGhlIG9wYWNpdHkgaXMgMCwgYnV0XG4gIC8vIHdlIGNhbiBiZWdpbiBydW5uaW5nIHRoZSBjYWxjdWxhdGlvbnMgYmVsb3cuXG4gIHRvb2x0aXBCb2R5LmNsYXNzTGlzdC5hZGQoU0VUX0NMQVNTKTtcblxuICAvKipcbiAgICogUG9zaXRpb24gdGhlIHRvb2x0aXAgYm9keSB3aGVuIHRoZSB0cmlnZ2VyIGlzIGhvdmVyZWRcbiAgICogUmVtb3ZlcyBvbGQgcG9zaXRpb25pbmcgY2xhc3NuYW1lcyBhbmQgcmVhcHBsaWVzLiBUaGlzIGFsbG93c1xuICAgKiBwb3NpdGlvbmluZyB0byBjaGFuZ2UgaW4gY2FzZSB0aGUgdXNlciByZXNpemVzIGJyb3dzZXIgb3IgRE9NIG1hbmlwdWxhdGlvblxuICAgKiBjYXVzZXMgdG9vbHRpcCB0byBnZXQgY2xpcHBlZCBmcm9tIHZpZXdwb3J0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXRQb3MgLSBjYW4gYmUgXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJyaWdodFwiLCBcImxlZnRcIlxuICAgKi9cbiAgY29uc3Qgc2V0UG9zaXRpb25DbGFzcyA9IChzZXRQb3MpID0+IHtcbiAgICB0b29sdGlwQm9keS5jbGFzc0xpc3QucmVtb3ZlKGAke1RPT0xUSVBfQk9EWV9DTEFTU30tLXRvcGApO1xuICAgIHRvb2x0aXBCb2R5LmNsYXNzTGlzdC5yZW1vdmUoYCR7VE9PTFRJUF9CT0RZX0NMQVNTfS0tYm90dG9tYCk7XG4gICAgdG9vbHRpcEJvZHkuY2xhc3NMaXN0LnJlbW92ZShgJHtUT09MVElQX0JPRFlfQ0xBU1N9LS1yaWdodGApO1xuICAgIHRvb2x0aXBCb2R5LmNsYXNzTGlzdC5yZW1vdmUoYCR7VE9PTFRJUF9CT0RZX0NMQVNTfS0tbGVmdGApO1xuICAgIHRvb2x0aXBCb2R5LmNsYXNzTGlzdC5hZGQoYCR7VE9PTFRJUF9CT0RZX0NMQVNTfS0tJHtzZXRQb3N9YCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgb2xkIHBvc2l0aW9uaW5nIHN0eWxlcy4gVGhpcyBhbGxvd3NcbiAgICogcmUtcG9zaXRpb25pbmcgdG8gY2hhbmdlIHdpdGhvdXQgaW5oZXJpdGluZyBvdGhlclxuICAgKiBkeW5hbWljIHN0eWxlc1xuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlIC0gdGhpcyBpcyB0aGUgdG9vbHRpcCBib2R5XG4gICAqL1xuICBjb25zdCByZXNldFBvc2l0aW9uU3R5bGVzID0gKGUpID0+IHtcbiAgICAvLyB3ZSBkb24ndCBvdmVycmlkZSBhbnl0aGluZyBpbiB0aGUgc3R5bGVzaGVldCB3aGVuIGZpbmRpbmcgYWx0IHBvc2l0aW9uc1xuICAgIGUuc3R5bGUudG9wID0gbnVsbDtcbiAgICBlLnN0eWxlLmJvdHRvbSA9IG51bGw7XG4gICAgZS5zdHlsZS5yaWdodCA9IG51bGw7XG4gICAgZS5zdHlsZS5sZWZ0ID0gbnVsbDtcbiAgICBlLnN0eWxlLm1hcmdpbiA9IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIGdldCBtYXJnaW4gb2Zmc2V0IGNhbGN1bGF0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0YXJnZXQgLSB0aGlzIGlzIHRoZSB0b29sdGlwIGJvZHlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5VmFsdWUgLSB0aGlzIGlzIHRoZSB0b29sdGlwIGJvZHlcbiAgICovXG5cbiAgY29uc3Qgb2Zmc2V0TWFyZ2luID0gKHRhcmdldCwgcHJvcGVydHlWYWx1ZSkgPT5cbiAgICBwYXJzZUludChcbiAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eVZhbHVlKSxcbiAgICAgIDEwXG4gICAgKTtcblxuICAvLyBvZmZzZXRMZWZ0ID0gdGhlIGxlZnQgcG9zaXRpb24sIGFuZCBtYXJnaW4gb2YgdGhlIGVsZW1lbnQsIHRoZSBsZWZ0XG4gIC8vIHBhZGRpbmcsIHNjcm9sbGJhciBhbmQgYm9yZGVyIG9mIHRoZSBvZmZzZXRQYXJlbnQgZWxlbWVudFxuICAvLyBvZmZzZXRXaWR0aCA9IFRoZSBvZmZzZXRXaWR0aCBwcm9wZXJ0eSByZXR1cm5zIHRoZSB2aWV3YWJsZSB3aWR0aCBvZiBhblxuICAvLyBlbGVtZW50IGluIHBpeGVscywgaW5jbHVkaW5nIHBhZGRpbmcsIGJvcmRlciBhbmQgc2Nyb2xsYmFyLCBidXQgbm90XG4gIC8vIHRoZSBtYXJnaW4uXG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBtYXJnaW4gb2Zmc2V0XG4gICAqIHRvb2x0aXAgdHJpZ2dlciBtYXJnaW4ocG9zaXRpb24pIG9mZnNldCArIHRvb2x0aXBCb2R5IG9mZnNldFdpZHRoXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtYXJnaW5Qb3NpdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gdG9vbHRpcEJvZHlPZmZzZXRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdHJpZ2dlclxuICAgKi9cblxuICBjb25zdCBjYWxjdWxhdGVNYXJnaW5PZmZzZXQgPSAoXG4gICAgbWFyZ2luUG9zaXRpb24sXG4gICAgdG9vbHRpcEJvZHlPZmZzZXQsXG4gICAgdHJpZ2dlclxuICApID0+IHtcbiAgICBjb25zdCBvZmZzZXQgPVxuICAgICAgb2Zmc2V0TWFyZ2luKHRyaWdnZXIsIGBtYXJnaW4tJHttYXJnaW5Qb3NpdGlvbn1gKSA+IDBcbiAgICAgICAgPyB0b29sdGlwQm9keU9mZnNldCAtIG9mZnNldE1hcmdpbih0cmlnZ2VyLCBgbWFyZ2luLSR7bWFyZ2luUG9zaXRpb259YClcbiAgICAgICAgOiB0b29sdGlwQm9keU9mZnNldDtcblxuICAgIHJldHVybiBvZmZzZXQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFBvc2l0aW9ucyB0b29sdGlwIGF0IHRoZSB0b3BcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZSAtIHRoaXMgaXMgdGhlIHRvb2x0aXAgYm9keVxuICAgKi9cbiAgY29uc3QgcG9zaXRpb25Ub3AgPSAoZSkgPT4ge1xuICAgIHJlc2V0UG9zaXRpb25TdHlsZXMoZSk7IC8vIGVuc3VyZXMgd2Ugc3RhcnQgZnJvbSB0aGUgc2FtZSBwb2ludFxuICAgIC8vIGdldCBkZXRhaWxzIG9uIHRoZSBlbGVtZW50cyBvYmplY3Qgd2l0aFxuXG4gICAgY29uc3QgdG9wTWFyZ2luID0gY2FsY3VsYXRlTWFyZ2luT2Zmc2V0KFxuICAgICAgXCJ0b3BcIixcbiAgICAgIGUub2Zmc2V0SGVpZ2h0LFxuICAgICAgdG9vbHRpcFRyaWdnZXJcbiAgICApO1xuXG4gICAgY29uc3QgbGVmdE1hcmdpbiA9IGNhbGN1bGF0ZU1hcmdpbk9mZnNldChcbiAgICAgIFwibGVmdFwiLFxuICAgICAgZS5vZmZzZXRXaWR0aCxcbiAgICAgIHRvb2x0aXBUcmlnZ2VyXG4gICAgKTtcblxuICAgIHNldFBvc2l0aW9uQ2xhc3MoXCJ0b3BcIik7XG4gICAgZS5zdHlsZS5sZWZ0ID0gYDUwJWA7IC8vIGNlbnRlciB0aGUgZWxlbWVudFxuICAgIGUuc3R5bGUudG9wID0gYC0ke1RSSUFOR0xFX1NJWkV9cHhgOyAvLyBjb25zaWRlciB0aGUgcHN1ZWRvIGVsZW1lbnRcbiAgICAvLyBhcHBseSBvdXIgbWFyZ2lucyBiYXNlZCBvbiB0aGUgb2ZmZXN0XG4gICAgZS5zdHlsZS5tYXJnaW4gPSBgLSR7dG9wTWFyZ2lufXB4IDAgMCAtJHtsZWZ0TWFyZ2luIC8gMn1weGA7XG4gIH07XG5cbiAgLyoqXG4gICAqIFBvc2l0aW9ucyB0b29sdGlwIGF0IHRoZSBib3R0b21cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZSAtIHRoaXMgaXMgdGhlIHRvb2x0aXAgYm9keVxuICAgKi9cbiAgY29uc3QgcG9zaXRpb25Cb3R0b20gPSAoZSkgPT4ge1xuICAgIHJlc2V0UG9zaXRpb25TdHlsZXMoZSk7XG5cbiAgICBjb25zdCBsZWZ0TWFyZ2luID0gY2FsY3VsYXRlTWFyZ2luT2Zmc2V0KFxuICAgICAgXCJsZWZ0XCIsXG4gICAgICBlLm9mZnNldFdpZHRoLFxuICAgICAgdG9vbHRpcFRyaWdnZXJcbiAgICApO1xuXG4gICAgc2V0UG9zaXRpb25DbGFzcyhcImJvdHRvbVwiKTtcbiAgICBlLnN0eWxlLmxlZnQgPSBgNTAlYDtcbiAgICBlLnN0eWxlLm1hcmdpbiA9IGAke1RSSUFOR0xFX1NJWkV9cHggMCAwIC0ke2xlZnRNYXJnaW4gLyAyfXB4YDtcbiAgfTtcblxuICAvKipcbiAgICogUG9zaXRpb25zIHRvb2x0aXAgYXQgdGhlIHJpZ2h0XG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGUgLSB0aGlzIGlzIHRoZSB0b29sdGlwIGJvZHlcbiAgICovXG4gIGNvbnN0IHBvc2l0aW9uUmlnaHQgPSAoZSkgPT4ge1xuICAgIHJlc2V0UG9zaXRpb25TdHlsZXMoZSk7XG5cbiAgICBjb25zdCB0b3BNYXJnaW4gPSBjYWxjdWxhdGVNYXJnaW5PZmZzZXQoXG4gICAgICBcInRvcFwiLFxuICAgICAgZS5vZmZzZXRIZWlnaHQsXG4gICAgICB0b29sdGlwVHJpZ2dlclxuICAgICk7XG5cbiAgICBzZXRQb3NpdGlvbkNsYXNzKFwicmlnaHRcIik7XG4gICAgZS5zdHlsZS50b3AgPSBgNTAlYDtcbiAgICBlLnN0eWxlLmxlZnQgPSBgJHtcbiAgICAgIHRvb2x0aXBUcmlnZ2VyLm9mZnNldExlZnQgKyB0b29sdGlwVHJpZ2dlci5vZmZzZXRXaWR0aCArIFRSSUFOR0xFX1NJWkVcbiAgICB9cHhgO1xuICAgIGUuc3R5bGUubWFyZ2luID0gYC0ke3RvcE1hcmdpbiAvIDJ9cHggMCAwIDBgO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQb3NpdGlvbnMgdG9vbHRpcCBhdCB0aGUgcmlnaHRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZSAtIHRoaXMgaXMgdGhlIHRvb2x0aXAgYm9keVxuICAgKi9cbiAgY29uc3QgcG9zaXRpb25MZWZ0ID0gKGUpID0+IHtcbiAgICByZXNldFBvc2l0aW9uU3R5bGVzKGUpO1xuXG4gICAgY29uc3QgdG9wTWFyZ2luID0gY2FsY3VsYXRlTWFyZ2luT2Zmc2V0KFxuICAgICAgXCJ0b3BcIixcbiAgICAgIGUub2Zmc2V0SGVpZ2h0LFxuICAgICAgdG9vbHRpcFRyaWdnZXJcbiAgICApO1xuXG4gICAgLy8gd2UgaGF2ZSB0byBjaGVjayBmb3Igc29tZSB1dGlsaXR5IG1hcmdpbnNcbiAgICBjb25zdCBsZWZ0TWFyZ2luID0gY2FsY3VsYXRlTWFyZ2luT2Zmc2V0KFxuICAgICAgXCJsZWZ0XCIsXG4gICAgICB0b29sdGlwVHJpZ2dlci5vZmZzZXRMZWZ0ID4gZS5vZmZzZXRXaWR0aFxuICAgICAgICA/IHRvb2x0aXBUcmlnZ2VyLm9mZnNldExlZnQgLSBlLm9mZnNldFdpZHRoXG4gICAgICAgIDogZS5vZmZzZXRXaWR0aCxcbiAgICAgIHRvb2x0aXBUcmlnZ2VyXG4gICAgKTtcblxuICAgIHNldFBvc2l0aW9uQ2xhc3MoXCJsZWZ0XCIpO1xuICAgIGUuc3R5bGUudG9wID0gYDUwJWA7XG4gICAgZS5zdHlsZS5sZWZ0ID0gYC0ke1RSSUFOR0xFX1NJWkV9cHhgO1xuICAgIGUuc3R5bGUubWFyZ2luID0gYC0ke3RvcE1hcmdpbiAvIDJ9cHggMCAwICR7XG4gICAgICB0b29sdGlwVHJpZ2dlci5vZmZzZXRMZWZ0ID4gZS5vZmZzZXRXaWR0aCA/IGxlZnRNYXJnaW4gOiAtbGVmdE1hcmdpblxuICAgIH1weGA7IC8vIGFkanVzdCB0aGUgbWFyZ2luXG4gIH07XG5cbiAgLyoqXG4gICAqIFdlIHRyeSB0byBzZXQgdGhlIHBvc2l0aW9uIGJhc2VkIG9uIHRoZVxuICAgKiBvcmlnaW5hbCBpbnRlbnRpb24sIGJ1dCBtYWtlIGFkanVzdG1lbnRzXG4gICAqIGlmIHRoZSBlbGVtZW50IGlzIGNsaXBwZWQgb3V0IG9mIHRoZSB2aWV3cG9ydFxuICAgKiB3ZSBjb25zdHJhaW4gdGhlIHdpZHRoIG9ubHkgYXMgYSBsYXN0IHJlc29ydFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50KGFsaWFzIHRvb2x0aXBCb2R5KVxuICAgKiBAcGFyYW0ge051bWJlcn0gYXR0ZW1wdCAoLS1mbGFnKVxuICAgKi9cblxuICBjb25zdCBtYXhBdHRlbXB0cyA9IDI7XG5cbiAgZnVuY3Rpb24gZmluZEJlc3RQb3NpdGlvbihlbGVtZW50LCBhdHRlbXB0ID0gMSkge1xuICAgIC8vIGNyZWF0ZSBhcnJheSBvZiBvcHRpb25hbCBwb3NpdGlvbnNcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBbXG4gICAgICBwb3NpdGlvblRvcCxcbiAgICAgIHBvc2l0aW9uQm90dG9tLFxuICAgICAgcG9zaXRpb25SaWdodCxcbiAgICAgIHBvc2l0aW9uTGVmdCxcbiAgICBdO1xuXG4gICAgbGV0IGhhc1Zpc2libGVQb3NpdGlvbiA9IGZhbHNlO1xuXG4gICAgLy8gd2UgdGFrZSBhIHJlY3Vyc2l2ZSBhcHByb2FjaFxuICAgIGZ1bmN0aW9uIHRyeVBvc2l0aW9ucyhpKSB7XG4gICAgICBpZiAoaSA8IHBvc2l0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcG9zID0gcG9zaXRpb25zW2ldO1xuICAgICAgICBwb3MoZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKCFpc0VsZW1lbnRJblZpZXdwb3J0KGVsZW1lbnQpKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgdHJ5UG9zaXRpb25zKChpICs9IDEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYXNWaXNpYmxlUG9zaXRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5UG9zaXRpb25zKDApO1xuICAgIC8vIGlmIHdlIGNhbid0IGZpbmQgYSBwb3NpdGlvbiB3ZSBjb21wcmVzcyBpdCBhbmQgdHJ5IGFnYWluXG4gICAgaWYgKCFoYXNWaXNpYmxlUG9zaXRpb24pIHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChBREpVU1RfV0lEVEhfQ0xBU1MpO1xuICAgICAgaWYgKGF0dGVtcHQgPD0gbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGZpbmRCZXN0UG9zaXRpb24oZWxlbWVudCwgKGF0dGVtcHQgKz0gMSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICBjYXNlIFwidG9wXCI6XG4gICAgICBwb3NpdGlvblRvcCh0b29sdGlwQm9keSk7XG4gICAgICBpZiAoIWlzRWxlbWVudEluVmlld3BvcnQodG9vbHRpcEJvZHkpKSB7XG4gICAgICAgIGZpbmRCZXN0UG9zaXRpb24odG9vbHRpcEJvZHkpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImJvdHRvbVwiOlxuICAgICAgcG9zaXRpb25Cb3R0b20odG9vbHRpcEJvZHkpO1xuICAgICAgaWYgKCFpc0VsZW1lbnRJblZpZXdwb3J0KHRvb2x0aXBCb2R5KSkge1xuICAgICAgICBmaW5kQmVzdFBvc2l0aW9uKHRvb2x0aXBCb2R5KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJyaWdodFwiOlxuICAgICAgcG9zaXRpb25SaWdodCh0b29sdGlwQm9keSk7XG4gICAgICBpZiAoIWlzRWxlbWVudEluVmlld3BvcnQodG9vbHRpcEJvZHkpKSB7XG4gICAgICAgIGZpbmRCZXN0UG9zaXRpb24odG9vbHRpcEJvZHkpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImxlZnRcIjpcbiAgICAgIHBvc2l0aW9uTGVmdCh0b29sdGlwQm9keSk7XG4gICAgICBpZiAoIWlzRWxlbWVudEluVmlld3BvcnQodG9vbHRpcEJvZHkpKSB7XG4gICAgICAgIGZpbmRCZXN0UG9zaXRpb24odG9vbHRpcEJvZHkpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gc2tpcCBkZWZhdWx0IGNhc2VcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdHVhbGx5IHNob3cgdGhlIHRvb2x0aXAuIFRoZSBWSVNJQkxFX0NMQVNTXG4gICAqIHdpbGwgY2hhbmdlIHRoZSBvcGFjaXR5IHRvIDFcbiAgICovXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHRvb2x0aXBCb2R5LmNsYXNzTGlzdC5hZGQoVklTSUJMRV9DTEFTUyk7XG4gIH0sIDIwKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgdGhlIHByb3BlcnRpZXMgdG8gc2hvdyBhbmQgcG9zaXRpb24gdGhlIHRvb2x0aXAsXG4gKiBhbmQgcmVzZXRzIHRoZSB0b29sdGlwIHBvc2l0aW9uIHRvIHRoZSBvcmlnaW5hbCBpbnRlbnRpb25cbiAqIGluIGNhc2UgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHRoZSBlbGVtZW50IGlzIG1vdmVkIHRocm91Z2hcbiAqIERPTSBtYW5pdWxhdGlvbi5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvb2x0aXBCb2R5IC0gVGhlIGJvZHkgb2YgdGhlIHRvb2x0aXBcbiAqL1xuY29uc3QgaGlkZVRvb2xUaXAgPSAodG9vbHRpcEJvZHkpID0+IHtcbiAgdG9vbHRpcEJvZHkuY2xhc3NMaXN0LnJlbW92ZShWSVNJQkxFX0NMQVNTKTtcbiAgdG9vbHRpcEJvZHkuY2xhc3NMaXN0LnJlbW92ZShTRVRfQ0xBU1MpO1xuICB0b29sdGlwQm9keS5jbGFzc0xpc3QucmVtb3ZlKEFESlVTVF9XSURUSF9DTEFTUyk7XG4gIHRvb2x0aXBCb2R5LnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbn07XG5cbi8qKlxuICogU2V0dXAgdGhlIHRvb2x0aXAgY29tcG9uZW50XG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0b29sdGlwVHJpZ2dlciBUaGUgZWxlbWVudCB0aGF0IGNyZWF0ZXMgdGhlIHRvb2x0aXBcbiAqL1xuY29uc3Qgc2V0VXBBdHRyaWJ1dGVzID0gKHRvb2x0aXBUcmlnZ2VyKSA9PiB7XG4gIGNvbnN0IHRvb2x0aXBJRCA9IGB0b29sdGlwLSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOTAwMDAwKSArIDEwMDAwMH1gO1xuICBjb25zdCB0b29sdGlwQ29udGVudCA9IHRvb2x0aXBUcmlnZ2VyLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO1xuICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIGNvbnN0IHRvb2x0aXBCb2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIGNvbnN0IHBvc2l0aW9uID0gdG9vbHRpcFRyaWdnZXIuZ2V0QXR0cmlidXRlKFwiZGF0YS1wb3NpdGlvblwiKVxuICAgID8gdG9vbHRpcFRyaWdnZXIuZ2V0QXR0cmlidXRlKFwiZGF0YS1wb3NpdGlvblwiKVxuICAgIDogXCJ0b3BcIjtcbiAgY29uc3QgYWRkaXRpb25hbENsYXNzZXMgPSB0b29sdGlwVHJpZ2dlci5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNsYXNzZXNcIik7XG5cbiAgLy8gU2V0IHVwIHRvb2x0aXAgYXR0cmlidXRlc1xuICB0b29sdGlwVHJpZ2dlci5zZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIsIHRvb2x0aXBJRCk7XG4gIHRvb2x0aXBUcmlnZ2VyLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiMFwiKTtcbiAgdG9vbHRpcFRyaWdnZXIuc2V0QXR0cmlidXRlKFwidGl0bGVcIiwgXCJcIik7XG4gIHRvb2x0aXBUcmlnZ2VyLmNsYXNzTGlzdC5yZW1vdmUoVE9PTFRJUF9DTEFTUyk7XG4gIHRvb2x0aXBUcmlnZ2VyLmNsYXNzTGlzdC5hZGQoVE9PTFRJUF9UUklHR0VSX0NMQVNTKTtcblxuICAvLyBpbnNlcnQgd3JhcHBlciBiZWZvcmUgZWwgaW4gdGhlIERPTSB0cmVlXG4gIHRvb2x0aXBUcmlnZ2VyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIHRvb2x0aXBUcmlnZ2VyKTtcblxuICAvLyBzZXQgdXAgdGhlIHdyYXBwZXJcbiAgd3JhcHBlci5hcHBlbmRDaGlsZCh0b29sdGlwVHJpZ2dlcik7XG4gIHdyYXBwZXIuY2xhc3NMaXN0LmFkZChUT09MVElQX0NMQVNTKTtcbiAgd3JhcHBlci5hcHBlbmRDaGlsZCh0b29sdGlwQm9keSk7XG5cbiAgLy8gQXBwbHkgYWRkaXRpb25hbCBjbGFzcyBuYW1lcyB0byB3cmFwcGVyIGVsZW1lbnRcbiAgaWYgKGFkZGl0aW9uYWxDbGFzc2VzKSB7XG4gICAgY29uc3QgY2xhc3Nlc0FycmF5ID0gYWRkaXRpb25hbENsYXNzZXMuc3BsaXQoXCIgXCIpO1xuICAgIGNsYXNzZXNBcnJheS5mb3JFYWNoKChjbGFzc25hbWUpID0+IHdyYXBwZXIuY2xhc3NMaXN0LmFkZChjbGFzc25hbWUpKTtcbiAgfVxuXG4gIC8vIHNldCB1cCB0aGUgdG9vbHRpcCBib2R5XG4gIHRvb2x0aXBCb2R5LmNsYXNzTGlzdC5hZGQoVE9PTFRJUF9CT0RZX0NMQVNTKTtcbiAgdG9vbHRpcEJvZHkuc2V0QXR0cmlidXRlKFwiaWRcIiwgdG9vbHRpcElEKTtcbiAgdG9vbHRpcEJvZHkuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInRvb2x0aXBcIik7XG4gIHRvb2x0aXBCb2R5LnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcblxuICAvLyBwbGFjZSB0aGUgdGV4dCBpbiB0aGUgdG9vbHRpcFxuICB0b29sdGlwQm9keS5pbm5lckhUTUwgPSB0b29sdGlwQ29udGVudDtcblxuICByZXR1cm4geyB0b29sdGlwQm9keSwgcG9zaXRpb24sIHRvb2x0aXBDb250ZW50LCB3cmFwcGVyIH07XG59O1xuXG4vLyBTZXR1cCBvdXIgZnVuY3Rpb24gdG8gcnVuIG9uIHZhcmlvdXMgZXZlbnRzXG5jb25zdCB0b29sdGlwID0gYmVoYXZpb3IoXG4gIHt9LFxuICB7XG4gICAgaW5pdChyb290KSB7XG4gICAgICBzZWxlY3QoVE9PTFRJUCwgcm9vdCkuZm9yRWFjaCgodG9vbHRpcFRyaWdnZXIpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHRvb2x0aXBCb2R5LFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHRvb2x0aXBDb250ZW50LFxuICAgICAgICAgIHdyYXBwZXIsXG4gICAgICAgIH0gPSBzZXRVcEF0dHJpYnV0ZXModG9vbHRpcFRyaWdnZXIpO1xuXG4gICAgICAgIGlmICh0b29sdGlwQ29udGVudCkge1xuICAgICAgICAgIC8vIExpc3RlbmVycyBmb3Igc2hvd2luZyBhbmQgaGlkaW5nIHRoZSB0b29sdGlwXG4gICAgICAgICAgYWRkTGlzdGVuZXJNdWx0aSh0b29sdGlwVHJpZ2dlciwgXCJtb3VzZWVudGVyIGZvY3VzXCIsICgpID0+IHtcbiAgICAgICAgICAgIHNob3dUb29sVGlwKHRvb2x0aXBCb2R5LCB0b29sdGlwVHJpZ2dlciwgcG9zaXRpb24sIHdyYXBwZXIpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gS2V5ZG93biBoZXJlIHByZXZlbnRzIHRvb2x0aXBzIGZyb20gYmVpbmcgcmVhZCB0d2ljZSBieVxuICAgICAgICAgIC8vIHNjcmVlbiByZWFkZXIuIGFsc28gYWxsb3dzIGV4Y2FwZSBrZXkgdG8gY2xvc2UgaXRcbiAgICAgICAgICAvLyAoYWxvbmcgd2l0aCBhbnkgb3RoZXIuKVxuICAgICAgICAgIGFkZExpc3RlbmVyTXVsdGkodG9vbHRpcFRyaWdnZXIsIFwibW91c2VsZWF2ZSBibHVyIGtleWRvd25cIiwgKCkgPT4ge1xuICAgICAgICAgICAgaGlkZVRvb2xUaXAodG9vbHRpcEJvZHkpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRocm93IGVycm9yIG9yIGxldCBvdGhlciB0b29sdGlwcyBvbiBwYWdlIGZ1bmN0aW9uP1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICB9XG4pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRvb2x0aXA7XG4iLCJjb25zdCBiZWhhdmlvciA9IHJlcXVpcmUoXCIuLi91dGlscy9iZWhhdmlvclwiKTtcbmNvbnN0IHZhbGlkYXRlID0gcmVxdWlyZShcIi4uL3V0aWxzL3ZhbGlkYXRlLWlucHV0XCIpO1xuXG5mdW5jdGlvbiBjaGFuZ2UoKSB7XG4gIHZhbGlkYXRlKHRoaXMpO1xufVxuXG5jb25zdCB2YWxpZGF0b3IgPSBiZWhhdmlvcih7XG4gIFwia2V5dXAgY2hhbmdlXCI6IHtcbiAgICBcImlucHV0W2RhdGEtdmFsaWRhdGlvbi1lbGVtZW50XVwiOiBjaGFuZ2UsXG4gIH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB2YWxpZGF0b3I7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgcHJlZml4OiBcInVzYVwiLFxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBUaGlzIHVzZWQgdG8gYmUgY29uZGl0aW9uYWxseSBkZXBlbmRlbnQgb24gd2hldGhlciB0aGVcbiAgLy8gYnJvd3NlciBzdXBwb3J0ZWQgdG91Y2ggZXZlbnRzOyBpZiBpdCBkaWQsIGBDTElDS2Agd2FzIHNldCB0b1xuICAvLyBgdG91Y2hzdGFydGAuICBIb3dldmVyLCB0aGlzIGhhZCBkb3duc2lkZXM6XG4gIC8vXG4gIC8vICogSXQgcHJlLWVtcHRlZCBtb2JpbGUgYnJvd3NlcnMnIGRlZmF1bHQgYmVoYXZpb3Igb2YgZGV0ZWN0aW5nXG4gIC8vICAgd2hldGhlciBhIHRvdWNoIHR1cm5lZCBpbnRvIGEgc2Nyb2xsLCB0aGVyZWJ5IHByZXZlbnRpbmdcbiAgLy8gICB1c2VycyBmcm9tIHVzaW5nIHNvbWUgb2Ygb3VyIGNvbXBvbmVudHMgYXMgc2Nyb2xsIHN1cmZhY2VzLlxuICAvL1xuICAvLyAqIFNvbWUgZGV2aWNlcywgc3VjaCBhcyB0aGUgTWljcm9zb2Z0IFN1cmZhY2UgUHJvLCBzdXBwb3J0ICpib3RoKlxuICAvLyAgIHRvdWNoIGFuZCBjbGlja3MuIFRoaXMgbWVhbnQgdGhlIGNvbmRpdGlvbmFsIGVmZmVjdGl2ZWx5IGRyb3BwZWRcbiAgLy8gICBzdXBwb3J0IGZvciB0aGUgdXNlcidzIG1vdXNlLCBmcnVzdHJhdGluZyB1c2VycyB3aG8gcHJlZmVycmVkXG4gIC8vICAgaXQgb24gdGhvc2Ugc3lzdGVtcy5cbiAgQ0xJQ0s6IFwiY2xpY2tcIixcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjb25zaXN0ZW50LXJldHVybiAqL1xuLyogZXNsaW50LWRpc2FibGUgZnVuYy1uYW1lcyAqL1xuKGZ1bmN0aW9uICgpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIGZ1bmN0aW9uIEN1c3RvbUV2ZW50KGV2ZW50LCBfcGFyYW1zKSB7XG4gICAgY29uc3QgcGFyYW1zID0gX3BhcmFtcyB8fCB7XG4gICAgICBidWJibGVzOiBmYWxzZSxcbiAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgZGV0YWlsOiBudWxsLFxuICAgIH07XG4gICAgY29uc3QgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKTtcbiAgICBldnQuaW5pdEN1c3RvbUV2ZW50KFxuICAgICAgZXZlbnQsXG4gICAgICBwYXJhbXMuYnViYmxlcyxcbiAgICAgIHBhcmFtcy5jYW5jZWxhYmxlLFxuICAgICAgcGFyYW1zLmRldGFpbFxuICAgICk7XG4gICAgcmV0dXJuIGV2dDtcbiAgfVxuXG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKTtcbiIsImNvbnN0IGVscHJvdG8gPSB3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlO1xuY29uc3QgSElEREVOID0gXCJoaWRkZW5cIjtcblxuaWYgKCEoSElEREVOIGluIGVscHJvdG8pKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbHByb3RvLCBISURERU4sIHtcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoSElEREVOKTtcbiAgICB9LFxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKEhJRERFTiwgXCJcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShISURERU4pO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuIiwiLy8gcG9seWZpbGxzIEhUTUxFbGVtZW50LnByb3RvdHlwZS5jbGFzc0xpc3QgYW5kIERPTVRva2VuTGlzdFxucmVxdWlyZShcImNsYXNzbGlzdC1wb2x5ZmlsbFwiKTtcbi8vIHBvbHlmaWxscyBIVE1MRWxlbWVudC5wcm90b3R5cGUuaGlkZGVuXG5yZXF1aXJlKFwiLi9lbGVtZW50LWhpZGRlblwiKTtcbi8vIHBvbHlmaWxscyBOdW1iZXIuaXNOYU4oKVxucmVxdWlyZShcIi4vbnVtYmVyLWlzLW5hblwiKTtcbi8vIHBvbHlmaWxscyBDdXN0b21FdmVudFxucmVxdWlyZShcIi4vY3VzdG9tLWV2ZW50XCIpO1xuLy8gcG9seWZpbGxzIHN2ZzRldmVyeWJvZHlcbnJlcXVpcmUoXCIuL3N2ZzRldmVyeWJvZHlcIik7XG5cbiIsIk51bWJlci5pc05hTiA9XG4gIE51bWJlci5pc05hTiB8fFxuICBmdW5jdGlvbiBpc05hTihpbnB1dCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSBcIm51bWJlclwiICYmIGlucHV0ICE9PSBpbnB1dDtcbiAgfTtcbiIsIi8qIGVzbGludC1kaXNhYmxlICovXG4hZnVuY3Rpb24oZmFjdG9yeSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbn0oZnVuY3Rpb24oKSB7XG4gIC8qISBzdmc0ZXZlcnlib2R5IHYyLjEuOSB8IGdpdGh1Yi5jb20vam9uYXRoYW50bmVhbC9zdmc0ZXZlcnlib2R5ICovXG4gIGZ1bmN0aW9uIGVtYmVkKHBhcmVudCwgc3ZnLCB0YXJnZXQsIHVzZSkge1xuICAgICAgLy8gaWYgdGhlIHRhcmdldCBleGlzdHNcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAvLyBjcmVhdGUgYSBkb2N1bWVudCBmcmFnbWVudCB0byBob2xkIHRoZSBjb250ZW50cyBvZiB0aGUgdGFyZ2V0XG4gICAgICAgICAgdmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLCB2aWV3Qm94ID0gIXN2Zy5oYXNBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpO1xuICAgICAgICAgIC8vIGNvbmRpdGlvbmFsbHkgc2V0IHRoZSB2aWV3Qm94IG9uIHRoZSBzdmdcbiAgICAgICAgICB2aWV3Qm94ICYmIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIHZpZXdCb3gpO1xuICAgICAgICAgIC8vIGNvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBjbG9uZSBpbnRvIHRoZSBmcmFnbWVudFxuICAgICAgICAgIGZvciAoLy8gY2xvbmUgdGhlIHRhcmdldFxuICAgICAgICAgIHZhciBjbG9uZSA9IGRvY3VtZW50LmltcG9ydE5vZGUgPyBkb2N1bWVudC5pbXBvcnROb2RlKHRhcmdldCwgITApIDogdGFyZ2V0LmNsb25lTm9kZSghMCksIGcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoc3ZnLm5hbWVzcGFjZVVSSSB8fCBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTsgY2xvbmUuY2hpbGROb2Rlcy5sZW5ndGg7ICkge1xuICAgICAgICAgICAgICBnLmFwcGVuZENoaWxkKGNsb25lLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodXNlKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyB1c2UuYXR0cmlidXRlcy5sZW5ndGggPiBpOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIHZhciBhdHRyID0gdXNlLmF0dHJpYnV0ZXNbaV07XG4gICAgICAgICAgICAgICAgICBcInhsaW5rOmhyZWZcIiAhPT0gYXR0ci5uYW1lICYmIFwiaHJlZlwiICE9PSBhdHRyLm5hbWUgJiYgZy5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChnKSwgLy8gYXBwZW5kIHRoZSBmcmFnbWVudCBpbnRvIHRoZSBzdmdcbiAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICAgICAgfVxuICB9XG4gIGZ1bmN0aW9uIGxvYWRyZWFkeXN0YXRlY2hhbmdlKHhociwgdXNlKSB7XG4gICAgICAvLyBsaXN0ZW4gdG8gY2hhbmdlcyBpbiB0aGUgcmVxdWVzdFxuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIGlmIHRoZSByZXF1ZXN0IGlzIHJlYWR5XG4gICAgICAgICAgaWYgKDQgPT09IHhoci5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgICAgIC8vIGdldCB0aGUgY2FjaGVkIGh0bWwgZG9jdW1lbnRcbiAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0geGhyLl9jYWNoZWREb2N1bWVudDtcbiAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoZSBjYWNoZWQgaHRtbCBkb2N1bWVudCBiYXNlZCBvbiB0aGUgeGhyIHJlc3BvbnNlXG4gICAgICAgICAgICAgIGNhY2hlZERvY3VtZW50IHx8IChjYWNoZWREb2N1bWVudCA9IHhoci5fY2FjaGVkRG9jdW1lbnQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoXCJcIiksXG4gICAgICAgICAgICAgIGNhY2hlZERvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0geGhyLnJlc3BvbnNlVGV4dCwgLy8gZW5zdXJlIGRvbWFpbnMgYXJlIHRoZSBzYW1lLCBvdGhlcndpc2Ugd2UnbGwgaGF2ZSBpc3N1ZXMgYXBwZW5kaW5nIHRoZVxuICAgICAgICAgICAgICAvLyBlbGVtZW50IGluIElFIDExXG4gICAgICAgICAgICAgIGNhY2hlZERvY3VtZW50LmRvbWFpbiAhPT0gZG9jdW1lbnQuZG9tYWluICYmIChjYWNoZWREb2N1bWVudC5kb21haW4gPSBkb2N1bWVudC5kb21haW4pLFxuICAgICAgICAgICAgICB4aHIuX2NhY2hlZFRhcmdldCA9IHt9KSwgLy8gY2xlYXIgdGhlIHhociBlbWJlZHMgbGlzdCBhbmQgZW1iZWQgZWFjaCBpdGVtXG4gICAgICAgICAgICAgIHhoci5fZW1iZWRzLnNwbGljZSgwKS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjYWNoZWQgdGFyZ2V0XG4gICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0geGhyLl9jYWNoZWRUYXJnZXRbaXRlbS5pZF07XG4gICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhlIGNhY2hlZCB0YXJnZXRcbiAgICAgICAgICAgICAgICAgIHRhcmdldCB8fCAodGFyZ2V0ID0geGhyLl9jYWNoZWRUYXJnZXRbaXRlbS5pZF0gPSBjYWNoZWREb2N1bWVudC5nZXRFbGVtZW50QnlJZChpdGVtLmlkKSksXG4gICAgICAgICAgICAgICAgICAvLyBlbWJlZCB0aGUgdGFyZ2V0IGludG8gdGhlIHN2Z1xuICAgICAgICAgICAgICAgICAgZW1iZWQoaXRlbS5wYXJlbnQsIGl0ZW0uc3ZnLCB0YXJnZXQsIHVzZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgIH0sIC8vIHRlc3QgdGhlIHJlYWR5IHN0YXRlIGNoYW5nZSBpbW1lZGlhdGVseVxuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSgpO1xuICB9XG4gIGZ1bmN0aW9uIHN2ZzRldmVyeWJvZHkocmF3b3B0cykge1xuICAgICAgZnVuY3Rpb24gb25pbnRlcnZhbCgpIHtcbiAgICAgICAgICAvLyBpZiBhbGwgPHVzZT5zIGluIHRoZSBhcnJheSBhcmUgYmVpbmcgYnlwYXNzZWQsIGRvbid0IHByb2NlZWQuXG4gICAgICAgICAgaWYgKG51bWJlck9mU3ZnVXNlRWxlbWVudHNUb0J5cGFzcyAmJiB1c2VzLmxlbmd0aCAtIG51bWJlck9mU3ZnVXNlRWxlbWVudHNUb0J5cGFzcyA8PSAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiB2b2lkIHJlcXVlc3RBbmltYXRpb25GcmFtZShvbmludGVydmFsLCA2Nyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSA8dXNlPnMgdG8gcHJvY2VzcywgcHJvY2VlZC5cbiAgICAgICAgICAvLyByZXNldCB0aGUgYnlwYXNzIGNvdW50ZXIsIHNpbmNlIHRoZSBjb3VudGVyIHdpbGwgYmUgaW5jcmVtZW50ZWQgZm9yIGV2ZXJ5IGJ5cGFzc2VkIGVsZW1lbnQsXG4gICAgICAgICAgLy8gZXZlbiBvbmVzIHRoYXQgd2VyZSBjb3VudGVkIGJlZm9yZS5cbiAgICAgICAgICBudW1iZXJPZlN2Z1VzZUVsZW1lbnRzVG9CeXBhc3MgPSAwO1xuICAgICAgICAgIC8vIHdoaWxlIHRoZSBpbmRleCBleGlzdHMgaW4gdGhlIGxpdmUgPHVzZT4gY29sbGVjdGlvblxuICAgICAgICAgIGZvciAoLy8gZ2V0IHRoZSBjYWNoZWQgPHVzZT4gaW5kZXhcbiAgICAgICAgICB2YXIgaW5kZXggPSAwOyBpbmRleCA8IHVzZXMubGVuZ3RoOyApIHtcbiAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IDx1c2U+XG4gICAgICAgICAgICAgIHZhciB1c2UgPSB1c2VzW2luZGV4XSwgcGFyZW50ID0gdXNlLnBhcmVudE5vZGUsIHN2ZyA9IGdldFNWR0FuY2VzdG9yKHBhcmVudCksIHNyYyA9IHVzZS5nZXRBdHRyaWJ1dGUoXCJ4bGluazpocmVmXCIpIHx8IHVzZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICAgICAgICBpZiAoIXNyYyAmJiBvcHRzLmF0dHJpYnV0ZU5hbWUgJiYgKHNyYyA9IHVzZS5nZXRBdHRyaWJ1dGUob3B0cy5hdHRyaWJ1dGVOYW1lKSksXG4gICAgICAgICAgICAgIHN2ZyAmJiBzcmMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChwb2x5ZmlsbCkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0cy52YWxpZGF0ZSB8fCBvcHRzLnZhbGlkYXRlKHNyYywgc3ZnLCB1c2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgPHVzZT4gZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodXNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHNyYyBhbmQgZ2V0IHRoZSB1cmwgYW5kIGlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcmNTcGxpdCA9IHNyYy5zcGxpdChcIiNcIiksIHVybCA9IHNyY1NwbGl0LnNoaWZ0KCksIGlkID0gc3JjU3BsaXQuam9pbihcIiNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsaW5rIGlzIGV4dGVybmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmwubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNhY2hlZCB4aHIgcmVxdWVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IHJlcXVlc3RzW3VybF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhlIHhociByZXF1ZXN0IGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyIHx8ICh4aHIgPSByZXF1ZXN0c1t1cmxdID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCksIHhoci5vcGVuKFwiR0VUXCIsIHVybCksIHhoci5zZW5kKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuX2VtYmVkcyA9IFtdKSwgLy8gYWRkIHRoZSBzdmcgYW5kIGlkIGFzIGFuIGl0ZW0gdG8gdGhlIHhociBlbWJlZHMgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLl9lbWJlZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZnOiBzdmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgLy8gcHJlcGFyZSB0aGUgeGhyIHJlYWR5IHN0YXRlIGNoYW5nZSBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZHJlYWR5c3RhdGVjaGFuZ2UoeGhyLCB1c2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1iZWQgdGhlIGxvY2FsIGlkIGludG8gdGhlIHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWQocGFyZW50LCBzdmcsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSwgdXNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlIHRoZSBpbmRleCB3aGVuIHRoZSBwcmV2aW91cyB2YWx1ZSB3YXMgbm90IFwidmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICArK2luZGV4LCArK251bWJlck9mU3ZnVXNlRWxlbWVudHNUb0J5cGFzcztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBpbmNyZWFzZSB0aGUgaW5kZXggd2hlbiB0aGUgcHJldmlvdXMgdmFsdWUgd2FzIG5vdCBcInZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY29udGludWUgdGhlIGludGVydmFsXG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG9uaW50ZXJ2YWwsIDY3KTtcbiAgICAgIH1cbiAgICAgIHZhciBwb2x5ZmlsbCwgb3B0cyA9IE9iamVjdChyYXdvcHRzKSwgbmV3ZXJJRVVBID0gL1xcYlRyaWRlbnRcXC9bNTY3XVxcYnxcXGJNU0lFICg/Ojl8MTApXFwuMFxcYi8sIHdlYmtpdFVBID0gL1xcYkFwcGxlV2ViS2l0XFwvKFxcZCspXFxiLywgb2xkZXJFZGdlVUEgPSAvXFxiRWRnZVxcLzEyXFwuKFxcZCspXFxiLywgZWRnZVVBID0gL1xcYkVkZ2VcXC8uKFxcZCspXFxiLywgaW5JZnJhbWUgPSB3aW5kb3cudG9wICE9PSB3aW5kb3cuc2VsZjtcbiAgICAgIHBvbHlmaWxsID0gXCJwb2x5ZmlsbFwiIGluIG9wdHMgPyBvcHRzLnBvbHlmaWxsIDogbmV3ZXJJRVVBLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2gob2xkZXJFZGdlVUEpIHx8IFtdKVsxXSA8IDEwNTQ3IHx8IChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKHdlYmtpdFVBKSB8fCBbXSlbMV0gPCA1MzcgfHwgZWRnZVVBLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgaW5JZnJhbWU7XG4gICAgICAvLyBjcmVhdGUgeGhyIHJlcXVlc3RzIG9iamVjdFxuICAgICAgdmFyIHJlcXVlc3RzID0ge30sIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgc2V0VGltZW91dCwgdXNlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidXNlXCIpLCBudW1iZXJPZlN2Z1VzZUVsZW1lbnRzVG9CeXBhc3MgPSAwO1xuICAgICAgLy8gY29uZGl0aW9uYWxseSBzdGFydCB0aGUgaW50ZXJ2YWwgaWYgdGhlIHBvbHlmaWxsIGlzIGFjdGl2ZVxuICAgICAgcG9seWZpbGwgJiYgb25pbnRlcnZhbCgpO1xuICB9XG4gIGZ1bmN0aW9uIGdldFNWR0FuY2VzdG9yKG5vZGUpIHtcbiAgICAgIGZvciAodmFyIHN2ZyA9IG5vZGU7IFwic3ZnXCIgIT09IHN2Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICYmIChzdmcgPSBzdmcucGFyZW50Tm9kZSk7ICkge31cbiAgICAgIHJldHVybiBzdmc7XG4gIH1cbiAgcmV0dXJuIHN2ZzRldmVyeWJvZHk7XG59KTtcbiIsImNvbnN0IGRvbXJlYWR5ID0gcmVxdWlyZShcImRvbXJlYWR5XCIpO1xuXG53aW5kb3cudXN3ZHNQcmVzZW50ID0gdHJ1ZTsgLy8gR0xPQkFMIHZhcmlhYmxlIHRvIGluZGljYXRlIHRoYXQgdGhlIHVzd2RzLmpzIGhhcyBsb2FkZWQgaW4gdGhlIERPTS5cblxuLyoqXG4gKiBUaGUgJ3BvbHlmaWxscycgZGVmaW5lIGtleSBFQ01BU2NyaXB0IDUgbWV0aG9kcyB0aGF0IG1heSBiZSBtaXNzaW5nIGZyb21cbiAqIG9sZGVyIGJyb3dzZXJzLCBzbyBtdXN0IGJlIGxvYWRlZCBmaXJzdC5cbiAqL1xucmVxdWlyZShcIi4vcG9seWZpbGxzXCIpO1xuXG5jb25zdCB1c3dkcyA9IHJlcXVpcmUoXCIuL2NvbmZpZ1wiKTtcblxuY29uc3QgY29tcG9uZW50cyA9IHJlcXVpcmUoXCIuL2NvbXBvbmVudHNcIik7XG5jb25zdCBzdmc0ZXZlcnlib2R5ID0gcmVxdWlyZShcIi4vcG9seWZpbGxzL3N2ZzRldmVyeWJvZHlcIik7XG5cbnVzd2RzLmNvbXBvbmVudHMgPSBjb21wb25lbnRzO1xuXG5kb21yZWFkeSgoKSA9PiB7XG4gIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmJvZHk7XG4gIE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IGJlaGF2aW9yID0gY29tcG9uZW50c1trZXldO1xuICAgIGJlaGF2aW9yLm9uKHRhcmdldCk7XG4gIH0pO1xuICBzdmc0ZXZlcnlib2R5KCk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB1c3dkczsiLCJtb2R1bGUuZXhwb3J0cyA9IChodG1sRG9jdW1lbnQgPSBkb2N1bWVudCkgPT4gaHRtbERvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4iLCJjb25zdCBhc3NpZ24gPSByZXF1aXJlKFwib2JqZWN0LWFzc2lnblwiKTtcbmNvbnN0IEJlaGF2aW9yID0gcmVxdWlyZShcInJlY2VwdG9yL2JlaGF2aW9yXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNlcXVlbmNlXG4gKiBAcGFyYW0gey4uLkZ1bmN0aW9ufSBzZXEgYW4gYXJyYXkgb2YgZnVuY3Rpb25zXG4gKiBAcmV0dXJuIHsgY2xvc3VyZSB9IGNhbGxIb29rc1xuICovXG4vLyBXZSB1c2UgYSBuYW1lZCBmdW5jdGlvbiBoZXJlIGJlY2F1c2Ugd2Ugd2FudCBpdCB0byBpbmhlcml0IGl0cyBsZXhpY2FsIHNjb3BlXG4vLyBmcm9tIHRoZSBiZWhhdmlvciBwcm9wcyBvYmplY3QsIG5vdCBmcm9tIHRoZSBtb2R1bGVcbmNvbnN0IHNlcXVlbmNlID0gKC4uLnNlcSkgPT5cbiAgZnVuY3Rpb24gY2FsbEhvb2tzKHRhcmdldCA9IGRvY3VtZW50LmJvZHkpIHtcbiAgICBzZXEuZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRoaXNbbWV0aG9kXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRoaXNbbWV0aG9kXS5jYWxsKHRoaXMsIHRhcmdldCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogQG5hbWUgYmVoYXZpb3JcbiAqIEBwYXJhbSB7b2JqZWN0fSBldmVudHNcbiAqIEBwYXJhbSB7b2JqZWN0P30gcHJvcHNcbiAqIEByZXR1cm4ge3JlY2VwdG9yLmJlaGF2aW9yfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IChldmVudHMsIHByb3BzKSA9PlxuICBCZWhhdmlvcihcbiAgICBldmVudHMsXG4gICAgYXNzaWduKFxuICAgICAge1xuICAgICAgICBvbjogc2VxdWVuY2UoXCJpbml0XCIsIFwiYWRkXCIpLFxuICAgICAgICBvZmY6IHNlcXVlbmNlKFwidGVhcmRvd25cIiwgXCJyZW1vdmVcIiksXG4gICAgICB9LFxuICAgICAgcHJvcHNcbiAgICApXG4gICk7XG4iLCJjb25zdCBhc3NpZ24gPSByZXF1aXJlKFwib2JqZWN0LWFzc2lnblwiKTtcbmNvbnN0IHsga2V5bWFwIH0gPSByZXF1aXJlKFwicmVjZXB0b3JcIik7XG5jb25zdCBiZWhhdmlvciA9IHJlcXVpcmUoXCIuL2JlaGF2aW9yXCIpO1xuY29uc3Qgc2VsZWN0ID0gcmVxdWlyZShcIi4vc2VsZWN0XCIpO1xuY29uc3QgYWN0aXZlRWxlbWVudCA9IHJlcXVpcmUoXCIuL2FjdGl2ZS1lbGVtZW50XCIpO1xuXG5jb25zdCBGT0NVU0FCTEUgPVxuICAnYVtocmVmXSwgYXJlYVtocmVmXSwgaW5wdXQ6bm90KFtkaXNhYmxlZF0pLCBzZWxlY3Q6bm90KFtkaXNhYmxlZF0pLCB0ZXh0YXJlYTpub3QoW2Rpc2FibGVkXSksIGJ1dHRvbjpub3QoW2Rpc2FibGVkXSksIGlmcmFtZSwgb2JqZWN0LCBlbWJlZCwgW3RhYmluZGV4PVwiMFwiXSwgW2NvbnRlbnRlZGl0YWJsZV0nO1xuXG5jb25zdCB0YWJIYW5kbGVyID0gKGNvbnRleHQpID0+IHtcbiAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSBzZWxlY3QoRk9DVVNBQkxFLCBjb250ZXh0KTtcbiAgY29uc3QgZmlyc3RUYWJTdG9wID0gZm9jdXNhYmxlRWxlbWVudHNbMF07XG4gIGNvbnN0IGxhc3RUYWJTdG9wID0gZm9jdXNhYmxlRWxlbWVudHNbZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMV07XG5cbiAgLy8gU3BlY2lhbCBydWxlcyBmb3Igd2hlbiB0aGUgdXNlciBpcyB0YWJiaW5nIGZvcndhcmQgZnJvbSB0aGUgbGFzdCBmb2N1c2FibGUgZWxlbWVudCxcbiAgLy8gb3Igd2hlbiB0YWJiaW5nIGJhY2t3YXJkcyBmcm9tIHRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudFxuICBmdW5jdGlvbiB0YWJBaGVhZChldmVudCkge1xuICAgIGlmIChhY3RpdmVFbGVtZW50KCkgPT09IGxhc3RUYWJTdG9wKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZmlyc3RUYWJTdG9wLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdGFiQmFjayhldmVudCkge1xuICAgIGlmIChhY3RpdmVFbGVtZW50KCkgPT09IGZpcnN0VGFiU3RvcCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGxhc3RUYWJTdG9wLmZvY3VzKCk7XG4gICAgfVxuICAgIC8vIFRoaXMgY2hlY2tzIGlmIHlvdSB3YW50IHRvIHNldCB0aGUgaW5pdGlhbCBmb2N1cyB0byBhIGNvbnRhaW5lclxuICAgIC8vIGluc3RlYWQgb2YgYW4gZWxlbWVudCB3aXRoaW4sIGFuZCB0aGUgdXNlciB0YWJzIGJhY2suIFxuICAgIC8vIFRoZW4gd2Ugc2V0IHRoZSBmb2N1cyB0byB0aGUgZmlyc3RcbiAgICBlbHNlIGlmICghZm9jdXNhYmxlRWxlbWVudHMuaW5jbHVkZXMoYWN0aXZlRWxlbWVudCgpKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGZpcnN0VGFiU3RvcC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZmlyc3RUYWJTdG9wLFxuICAgIGxhc3RUYWJTdG9wLFxuICAgIHRhYkFoZWFkLFxuICAgIHRhYkJhY2ssXG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IChjb250ZXh0LCBhZGRpdGlvbmFsS2V5QmluZGluZ3MgPSB7fSkgPT4ge1xuICBjb25zdCB0YWJFdmVudEhhbmRsZXIgPSB0YWJIYW5kbGVyKGNvbnRleHQpO1xuICBjb25zdCBiaW5kaW5ncyA9IGFkZGl0aW9uYWxLZXlCaW5kaW5ncztcbiAgY29uc3QgeyBFc2MsIEVzY2FwZSB9ID0gYmluZGluZ3M7XG5cbiAgaWYgKEVzY2FwZSAmJiAhRXNjKSBiaW5kaW5ncy5Fc2MgPSBFc2NhcGU7XG5cbiAgLy8gIFRPRE86IEluIHRoZSBmdXR1cmUsIGxvb3Agb3ZlciBhZGRpdGlvbmFsIGtleWJpbmRpbmdzIGFuZCBwYXNzIGFuIGFycmF5XG4gIC8vIG9mIGZ1bmN0aW9ucywgaWYgbmVjZXNzYXJ5LCB0byB0aGUgbWFwIGtleXMuIFRoZW4gcGVvcGxlIGltcGxlbWVudGluZ1xuICAvLyB0aGUgZm9jdXMgdHJhcCBjb3VsZCBwYXNzIGNhbGxiYWNrcyB0byBmaXJlIHdoZW4gdGFiYmluZ1xuICBjb25zdCBrZXlNYXBwaW5ncyA9IGtleW1hcChcbiAgICBhc3NpZ24oXG4gICAgICB7XG4gICAgICAgIFRhYjogdGFiRXZlbnRIYW5kbGVyLnRhYkFoZWFkLFxuICAgICAgICBcIlNoaWZ0K1RhYlwiOiB0YWJFdmVudEhhbmRsZXIudGFiQmFjayxcbiAgICAgIH0sXG4gICAgICBhZGRpdGlvbmFsS2V5QmluZGluZ3NcbiAgICApXG4gICk7XG5cbiAgY29uc3QgZm9jdXNUcmFwID0gYmVoYXZpb3IoXG4gICAge1xuICAgICAga2V5ZG93bjoga2V5TWFwcGluZ3MsXG4gICAgfSxcbiAgICB7XG4gICAgICBpbml0KCkge1xuICAgICAgICAvLyBUT0RPOiBpcyB0aGlzIGRlc2lyZWFibGUgYmVoYXZpb3I/IFNob3VsZCB0aGUgdHJhcCBhbHdheXMgZG8gdGhpcyBieSBkZWZhdWx0IG9yIHNob3VsZFxuICAgICAgICAvLyB0aGUgY29tcG9uZW50IGdldHRpbmcgZGVjb3JhdGVkIGhhbmRsZSB0aGlzP1xuICAgICAgICBpZiAodGFiRXZlbnRIYW5kbGVyLmZpcnN0VGFiU3RvcCl7XG4gICAgICAgICAgdGFiRXZlbnRIYW5kbGVyLmZpcnN0VGFiU3RvcC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlKGlzQWN0aXZlKSB7XG4gICAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAgIHRoaXMub24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9mZigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgKTtcblxuICByZXR1cm4gZm9jdXNUcmFwO1xufTtcbiIsIi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS83NTU3NDMzXG5mdW5jdGlvbiBpc0VsZW1lbnRJblZpZXdwb3J0KFxuICBlbCxcbiAgd2luID0gd2luZG93LFxuICBkb2NFbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuKSB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICByZXR1cm4gKFxuICAgIHJlY3QudG9wID49IDAgJiZcbiAgICByZWN0LmxlZnQgPj0gMCAmJlxuICAgIHJlY3QuYm90dG9tIDw9ICh3aW4uaW5uZXJIZWlnaHQgfHwgZG9jRWwuY2xpZW50SGVpZ2h0KSAmJlxuICAgIHJlY3QucmlnaHQgPD0gKHdpbi5pbm5lcldpZHRoIHx8IGRvY0VsLmNsaWVudFdpZHRoKVxuICApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRWxlbWVudEluVmlld3BvcnQ7XG4iLCIvLyBpT1MgZGV0ZWN0aW9uIGZyb206IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzkwMzk4ODUvMTc3NzEwXG5mdW5jdGlvbiBpc0lvc0RldmljZSgpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhpUG9kfGlQaG9uZXxpUGFkKS9nKSB8fFxuICAgICAgKG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gXCJNYWNJbnRlbFwiICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDEpKSAmJlxuICAgICF3aW5kb3cuTVNTdHJlYW1cbiAgKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0lvc0RldmljZTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0U2Nyb2xsYmFyV2lkdGgoKSB7XG4gIC8vIENyZWF0aW5nIGludmlzaWJsZSBjb250YWluZXJcbiAgY29uc3Qgb3V0ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3V0ZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICBvdXRlci5zdHlsZS5vdmVyZmxvdyA9ICdzY3JvbGwnOyAvLyBmb3JjaW5nIHNjcm9sbGJhciB0byBhcHBlYXJcbiAgb3V0ZXIuc3R5bGUubXNPdmVyZmxvd1N0eWxlID0gJ3Njcm9sbGJhcic7IC8vIG5lZWRlZCBmb3IgV2luSlMgYXBwc1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG91dGVyKTtcblxuICAvLyBDcmVhdGluZyBpbm5lciBlbGVtZW50IGFuZCBwbGFjaW5nIGl0IGluIHRoZSBjb250YWluZXJcbiAgY29uc3QgaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3V0ZXIuYXBwZW5kQ2hpbGQoaW5uZXIpO1xuICBcbiAgLy8gQ2FsY3VsYXRpbmcgZGlmZmVyZW5jZSBiZXR3ZWVuIGNvbnRhaW5lcidzIGZ1bGwgd2lkdGggYW5kIHRoZSBjaGlsZCB3aWR0aFxuICBjb25zdCBzY3JvbGxiYXJXaWR0aCA9IGAkeyhvdXRlci5vZmZzZXRXaWR0aCAtIGlubmVyLm9mZnNldFdpZHRoKX1weGA7XG5cbiAgLy8gUmVtb3ZpbmcgdGVtcG9yYXJ5IGVsZW1lbnRzIGZyb20gdGhlIERPTVxuICBvdXRlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG91dGVyKTtcblxuICByZXR1cm4gc2Nyb2xsYmFyV2lkdGg7XG59O1xuIiwiLyoqXG4gKiBAbmFtZSBpc0VsZW1lbnRcbiAqIEBkZXNjIHJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIGFyZ3VtZW50IGlzIGEgRE9NIGVsZW1lbnQuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzRWxlbWVudCA9ICh2YWx1ZSkgPT5cbiAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlLm5vZGVUeXBlID09PSAxO1xuXG4vKipcbiAqIEBuYW1lIHNlbGVjdFxuICogQGRlc2Mgc2VsZWN0cyBlbGVtZW50cyBmcm9tIHRoZSBET00gYnkgY2xhc3Mgc2VsZWN0b3Igb3IgSUQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBUaGUgc2VsZWN0b3IgdG8gdHJhdmVyc2UgdGhlIERPTSB3aXRoLlxuICogQHBhcmFtIHtEb2N1bWVudHxIVE1MRWxlbWVudD99IGNvbnRleHQgLSBUaGUgY29udGV4dCB0byB0cmF2ZXJzZSB0aGUgRE9NXG4gKiAgIGluLiBJZiBub3QgcHJvdmlkZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBkb2N1bWVudC5cbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50W119IC0gQW4gYXJyYXkgb2YgRE9NIG5vZGVzIG9yIGFuIGVtcHR5IGFycmF5LlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IChzZWxlY3RvciwgY29udGV4dCkgPT4ge1xuICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKCFjb250ZXh0IHx8ICFpc0VsZW1lbnQoY29udGV4dCkpIHtcbiAgICBjb250ZXh0ID0gd2luZG93LmRvY3VtZW50OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIH1cblxuICBjb25zdCBzZWxlY3Rpb24gPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoc2VsZWN0aW9uKTtcbn07XG4iLCIvKipcbiAqIEZsaXBzIGdpdmVuIElOUFVUIGVsZW1lbnRzIGJldHdlZW4gbWFza2VkIChoaWRpbmcgdGhlIGZpZWxkIHZhbHVlKSBhbmQgdW5tYXNrZWRcbiAqIEBwYXJhbSB7QXJyYXkuSFRNTEVsZW1lbnR9IGZpZWxkcyAtIEFuIGFycmF5IG9mIElOUFVUIGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG1hc2sgLSBXaGV0aGVyIHRoZSBtYXNrIHNob3VsZCBiZSBhcHBsaWVkLCBoaWRpbmcgdGhlIGZpZWxkIHZhbHVlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gKGZpZWxkLCBtYXNrKSA9PiB7XG4gIGZpZWxkLnNldEF0dHJpYnV0ZShcImF1dG9jYXBpdGFsaXplXCIsIFwib2ZmXCIpO1xuICBmaWVsZC5zZXRBdHRyaWJ1dGUoXCJhdXRvY29ycmVjdFwiLCBcIm9mZlwiKTtcbiAgZmllbGQuc2V0QXR0cmlidXRlKFwidHlwZVwiLCBtYXNrID8gXCJwYXNzd29yZFwiIDogXCJ0ZXh0XCIpO1xufTtcbiIsImNvbnN0IHJlc29sdmVJZFJlZnMgPSByZXF1aXJlKFwicmVzb2x2ZS1pZC1yZWZzXCIpO1xuY29uc3QgdG9nZ2xlRmllbGRNYXNrID0gcmVxdWlyZShcIi4vdG9nZ2xlLWZpZWxkLW1hc2tcIik7XG5cbmNvbnN0IENPTlRST0xTID0gXCJhcmlhLWNvbnRyb2xzXCI7XG5jb25zdCBQUkVTU0VEID0gXCJhcmlhLXByZXNzZWRcIjtcbmNvbnN0IFNIT1dfQVRUUiA9IFwiZGF0YS1zaG93LXRleHRcIjtcbmNvbnN0IEhJREVfQVRUUiA9IFwiZGF0YS1oaWRlLXRleHRcIjtcblxuLyoqXG4gKiBSZXBsYWNlIHRoZSB3b3JkIFwiU2hvd1wiIChvciBcInNob3dcIikgd2l0aCBcIkhpZGVcIiAob3IgXCJoaWRlXCIpIGluIGEgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHNob3dUZXh0XG4gKiBAcmV0dXJuIHtzdHJvbmd9IGhpZGVUZXh0XG4gKi9cbmNvbnN0IGdldEhpZGVUZXh0ID0gKHNob3dUZXh0KSA9PlxuICBzaG93VGV4dC5yZXBsYWNlKC9cXGJTaG93XFxiL2ksIChzaG93KSA9PiBgJHtzaG93WzBdID09PSBcIlNcIiA/IFwiSFwiIDogXCJoXCJ9aWRlYCk7XG5cbi8qKlxuICogQ29tcG9uZW50IHRoYXQgZGVjb3JhdGVzIGFuIEhUTUwgZWxlbWVudCB3aXRoIHRoZSBhYmlsaXR5IHRvIHRvZ2dsZSB0aGVcbiAqIG1hc2tlZCBzdGF0ZSBvZiBhbiBpbnB1dCBmaWVsZCAobGlrZSBhIHBhc3N3b3JkKSB3aGVuIGNsaWNrZWQuXG4gKiBUaGUgaWRzIG9mIHRoZSBmaWVsZHMgdG8gYmUgbWFza2VkIHdpbGwgYmUgcHVsbGVkIGRpcmVjdGx5IGZyb20gdGhlIGJ1dHRvbidzXG4gKiBgYXJpYS1jb250cm9sc2AgYXR0cmlidXRlLlxuICpcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbCAgICBQYXJlbnQgZWxlbWVudCBjb250YWluaW5nIHRoZSBmaWVsZHMgdG8gYmUgbWFza2VkXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IChlbCkgPT4ge1xuICAvLyB0aGlzIGlzIHRoZSAqdGFyZ2V0KiBzdGF0ZTpcbiAgLy8gKiBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIGF0dHIgYW5kIGl0J3MgIT09IFwidHJ1ZVwiLCBwcmVzc2VkIGlzIHRydWVcbiAgLy8gKiBvdGhlcndpc2UsIHByZXNzZWQgaXMgZmFsc2VcbiAgY29uc3QgcHJlc3NlZCA9XG4gICAgZWwuaGFzQXR0cmlidXRlKFBSRVNTRUQpICYmIGVsLmdldEF0dHJpYnV0ZShQUkVTU0VEKSAhPT0gXCJ0cnVlXCI7XG5cbiAgY29uc3QgZmllbGRzID0gcmVzb2x2ZUlkUmVmcyhlbC5nZXRBdHRyaWJ1dGUoQ09OVFJPTFMpKTtcbiAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB0b2dnbGVGaWVsZE1hc2soZmllbGQsIHByZXNzZWQpKTtcblxuICBpZiAoIWVsLmhhc0F0dHJpYnV0ZShTSE9XX0FUVFIpKSB7XG4gICAgZWwuc2V0QXR0cmlidXRlKFNIT1dfQVRUUiwgZWwudGV4dENvbnRlbnQpO1xuICB9XG5cbiAgY29uc3Qgc2hvd1RleHQgPSBlbC5nZXRBdHRyaWJ1dGUoU0hPV19BVFRSKTtcbiAgY29uc3QgaGlkZVRleHQgPSBlbC5nZXRBdHRyaWJ1dGUoSElERV9BVFRSKSB8fCBnZXRIaWRlVGV4dChzaG93VGV4dCk7XG5cbiAgZWwudGV4dENvbnRlbnQgPSBwcmVzc2VkID8gc2hvd1RleHQgOiBoaWRlVGV4dDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBlbC5zZXRBdHRyaWJ1dGUoUFJFU1NFRCwgcHJlc3NlZCk7XG4gIHJldHVybiBwcmVzc2VkO1xufTtcbiIsImNvbnN0IEVYUEFOREVEID0gXCJhcmlhLWV4cGFuZGVkXCI7XG5jb25zdCBDT05UUk9MUyA9IFwiYXJpYS1jb250cm9sc1wiO1xuY29uc3QgSElEREVOID0gXCJoaWRkZW5cIjtcblxubW9kdWxlLmV4cG9ydHMgPSAoYnV0dG9uLCBleHBhbmRlZCkgPT4ge1xuICBsZXQgc2FmZUV4cGFuZGVkID0gZXhwYW5kZWQ7XG5cbiAgaWYgKHR5cGVvZiBzYWZlRXhwYW5kZWQgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgc2FmZUV4cGFuZGVkID0gYnV0dG9uLmdldEF0dHJpYnV0ZShFWFBBTkRFRCkgPT09IFwiZmFsc2VcIjtcbiAgfVxuXG4gIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoRVhQQU5ERUQsIHNhZmVFeHBhbmRlZCk7XG5cbiAgY29uc3QgaWQgPSBidXR0b24uZ2V0QXR0cmlidXRlKENPTlRST0xTKTtcbiAgY29uc3QgY29udHJvbHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIGlmICghY29udHJvbHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRvZ2dsZSB0YXJnZXQgZm91bmQgd2l0aCBpZDogXCIke2lkfVwiYCk7XG4gIH1cblxuICBpZiAoc2FmZUV4cGFuZGVkKSB7XG4gICAgY29udHJvbHMucmVtb3ZlQXR0cmlidXRlKEhJRERFTik7XG4gIH0gZWxzZSB7XG4gICAgY29udHJvbHMuc2V0QXR0cmlidXRlKEhJRERFTiwgXCJcIik7XG4gIH1cblxuICByZXR1cm4gc2FmZUV4cGFuZGVkO1xufTtcbiIsImNvbnN0IGRhdGFzZXQgPSByZXF1aXJlKFwiZWxlbS1kYXRhc2V0XCIpO1xuXG5jb25zdCB7IHByZWZpeDogUFJFRklYIH0gPSByZXF1aXJlKFwiLi4vY29uZmlnXCIpO1xuXG5jb25zdCBDSEVDS0VEID0gXCJhcmlhLWNoZWNrZWRcIjtcbmNvbnN0IENIRUNLRURfQ0xBU1MgPSBgJHtQUkVGSVh9LWNoZWNrbGlzdF9faXRlbS0tY2hlY2tlZGA7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsaWRhdGUoZWwpIHtcbiAgY29uc3QgZGF0YSA9IGRhdGFzZXQoZWwpO1xuICBjb25zdCBpZCA9IGRhdGEudmFsaWRhdGlvbkVsZW1lbnQ7XG4gIGNvbnN0IGNoZWNrTGlzdCA9XG4gICAgaWQuY2hhckF0KDApID09PSBcIiNcIlxuICAgICAgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlkKVxuICAgICAgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG5cbiAgaWYgKCFjaGVja0xpc3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHZhbGlkYXRpb24gZWxlbWVudCBmb3VuZCB3aXRoIGlkOiBcIiR7aWR9XCJgKTtcbiAgfVxuXG4gIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChcInZhbGlkYXRlXCIpKSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3JOYW1lID0ga2V5LnN1YnN0cihcInZhbGlkYXRlXCIubGVuZ3RoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdmFsaWRhdG9yUGF0dGVybiA9IG5ldyBSZWdFeHAodmFsdWUpO1xuICAgICAgY29uc3QgdmFsaWRhdG9yU2VsZWN0b3IgPSBgW2RhdGEtdmFsaWRhdG9yPVwiJHt2YWxpZGF0b3JOYW1lfVwiXWA7XG4gICAgICBjb25zdCB2YWxpZGF0b3JDaGVja2JveCA9IGNoZWNrTGlzdC5xdWVyeVNlbGVjdG9yKHZhbGlkYXRvclNlbGVjdG9yKTtcblxuICAgICAgaWYgKCF2YWxpZGF0b3JDaGVja2JveCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHZhbGlkYXRvciBjaGVja2JveCBmb3VuZCBmb3I6IFwiJHt2YWxpZGF0b3JOYW1lfVwiYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoZWNrZWQgPSB2YWxpZGF0b3JQYXR0ZXJuLnRlc3QoZWwudmFsdWUpO1xuICAgICAgdmFsaWRhdG9yQ2hlY2tib3guY2xhc3NMaXN0LnRvZ2dsZShDSEVDS0VEX0NMQVNTLCBjaGVja2VkKTtcbiAgICAgIHZhbGlkYXRvckNoZWNrYm94LnNldEF0dHJpYnV0ZShDSEVDS0VELCBjaGVja2VkKTtcbiAgICB9XG4gIH0pO1xufTtcbiJdfQ== diff --git a/assets/js/uswds.min.js b/assets/js/uswds.min.js new file mode 100644 index 00000000..b6ddf2d8 --- /dev/null +++ b/assets/js/uswds.min.js @@ -0,0 +1,2 @@ +!function a(r,o,i){function c(e,t){if(!o[e]){if(!r[e]){var n="function"==typeof require&&require;if(!t&&n)return n(e,!0);if(s)return s(e,!0);throw(n=new Error("Cannot find module '"+e+"'")).code="MODULE_NOT_FOUND",n}n=o[e]={exports:{}},r[e][0].call(n.exports,function(t){return c(r[e][1][t]||t)},n,n.exports,a,r,o,i)}return o[e].exports}for(var s="function"==typeof require&&require,t=0;t"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"'],224:"Meta",225:"AltGraph",246:"Attn",247:"CrSel",248:"ExSel",249:"EraseEof",250:"Play",251:"ZoomOut"}},t=1;t<25;t++)e.keys[111+t]="F"+t;var n="";for(t=65;t<91;t++)n=String.fromCharCode(t),e.keys[t]=[n.toLowerCase(),n.toUpperCase()];"function"==typeof define&&define.amd?define("keyboardevent-key-polyfill",e):void 0!==r&&void 0!==a?a.exports=e:window&&(window.keyboardeventKeyPolyfill=e)}()},{}],6:[function(t,e,n){"use strict";var s=Object.getOwnPropertySymbols,l=Object.prototype.hasOwnProperty,u=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return;for(var e={},n=0;n<10;n++)e["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(e).map(function(t){return e[t]}).join(""))return;var a={};return"abcdefghijklmnopqrst".split("").forEach(function(t){a[t]=t}),"abcdefghijklmnopqrst"!==Object.keys(Object.assign({},a)).join("")?void 0:1}catch(t){return}}()?Object.assign:function(t,e){for(var n,a,r=function(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}(t),o=1;o