├── .eslintrc.json ├── .github └── workflows │ └── linters.yaml ├── .gitignore ├── .hintrc ├── .stylelintrc.json ├── README.md ├── dist ├── index.html └── main.js ├── package-lock.json ├── package.json ├── src ├── index.html ├── index.js ├── list.js └── style.css └── webpack.config.js /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es6": true, 5 | "jest": true 6 | }, 7 | "parser": "babel-eslint", 8 | "parserOptions": { 9 | "ecmaVersion": 2018, 10 | "sourceType": "module" 11 | }, 12 | "extends": ["airbnb-base"], 13 | "rules": { 14 | "no-shadow": "off", 15 | "no-param-reassign": "off", 16 | "eol-last": "off", 17 | "import/extensions": [ 1, { 18 | "js": "always", "json": "always" 19 | }] 20 | }, 21 | "ignorePatterns": [ 22 | "dist/", 23 | "build/" 24 | ] 25 | } -------------------------------------------------------------------------------- /.github/workflows/linters.yaml: -------------------------------------------------------------------------------- 1 | name: Linters 2 | 3 | on: pull_request 4 | 5 | env: 6 | FORCE_COLOR: 1 7 | 8 | jobs: 9 | lighthouse: 10 | name: Lighthouse 11 | runs-on: ubuntu-18.04 12 | steps: 13 | - uses: actions/checkout@v2 14 | - uses: actions/setup-node@v1 15 | with: 16 | node-version: "12.x" 17 | - name: Setup Lighthouse 18 | run: npm install -g @lhci/cli@0.7.x 19 | - name: Lighthouse Report 20 | run: lhci autorun --upload.target=temporary-public-storage --collect.staticDistDir=. 21 | webhint: 22 | name: Webhint 23 | runs-on: ubuntu-18.04 24 | steps: 25 | - uses: actions/checkout@v2 26 | - uses: actions/setup-node@v1 27 | with: 28 | node-version: "12.x" 29 | - name: Setup Webhint 30 | run: | 31 | npm install --save-dev hint@6.x 32 | [ -f .hintrc ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.hintrc 33 | - name: Webhint Report 34 | run: npx hint . 35 | stylelint: 36 | name: Stylelint 37 | runs-on: ubuntu-18.04 38 | steps: 39 | - uses: actions/checkout@v2 40 | - uses: actions/setup-node@v1 41 | with: 42 | node-version: "12.x" 43 | - name: Setup Stylelint 44 | run: | 45 | npm install --save-dev stylelint@13.x stylelint-scss@3.x stylelint-config-standard@21.x stylelint-csstree-validator@1.x 46 | [ -f .stylelintrc.json ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.stylelintrc.json 47 | - name: Stylelint Report 48 | run: npx stylelint "**/*.{css,scss}" 49 | eslint: 50 | name: ESLint 51 | runs-on: ubuntu-18.04 52 | steps: 53 | - uses: actions/checkout@v2 54 | - uses: actions/setup-node@v1 55 | with: 56 | node-version: "12.x" 57 | - name: Setup ESLint 58 | run: | 59 | npm install --save-dev eslint@7.x eslint-config-airbnb-base@14.x eslint-plugin-import@2.x babel-eslint@10.x 60 | [ -f .eslintrc.json ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.eslintrc.json 61 | - name: ESLint Report 62 | run: npx eslint . -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.hintrc: -------------------------------------------------------------------------------- 1 | { 2 | "connector": { 3 | "name": "local", 4 | "options": { 5 | "pattern": ["**", "!.git/**", "!node_modules/**"] 6 | } 7 | }, 8 | "extends": ["development"], 9 | "formatters": ["stylish"], 10 | "hints": [ 11 | "button-type", 12 | "disown-opener", 13 | "html-checker", 14 | "meta-charset-utf-8", 15 | "meta-viewport", 16 | "no-inline-styles:error" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["stylelint-config-standard"], 3 | "plugins": ["stylelint-scss", "stylelint-csstree-validator"], 4 | "rules": { 5 | "at-rule-no-unknown": null, 6 | "scss/at-rule-no-unknown": true, 7 | "csstree/validator": true 8 | }, 9 | "ignoreFiles": ["build/**", "dist/**", "**/reset*.css", "**/bootstrap*.css", "**/*.js", "**/*.jsx"] 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Todo-List 2 | 3 | 4 | > This is my approach to the To-Do List project from M2W2. This will be a web app where you can add and remove things you need to do. 5 | 6 | ## Live Demo 7 | 8 | 9 | 10 | ### Features implemented: 11 | * Dynamically loading the list 12 | 13 | ## Built With 14 | - HTML5 15 | - CSS3 (Flex and Media queries) 16 | - Bootstrap styling (A popular CSS Framework for developing responsive and mobile-first websites.) 17 | - Lighthouse (An open-source, automated tool for improving the quality of web pages. It has audits for performance, accessibility, progressive web apps, SEO and more). 18 | - Webhint (A customizable linting tool that helps you improve your site's accessibility, speed, cross-browser compatibility, and more by checking your code for best practices and common errors). 19 | - Stylelint (A mighty, modern linter that helps you avoid errors and enforce conventions in your styles). 20 | - ESlint (A mighty, modern linter that helps you avoid errors and enforce conventions in JavaScript codes) 21 | 22 | ## Getting started 23 | 24 | Installl dependencies : npm install 25 | 26 | To build the project run : npm run build 27 | 28 | To start the server, run : npm start 29 | 30 | ## Acknowledgement 31 | 32 | --- 33 | 34 | ## License 35 | All source code files are licensed under the permissive zlib license 36 | (http://opensource.org/licenses/Zlib) unless marked differently in a particular folder/file. 37 | 38 | ## Author 39 | 40 | 👤 **Adrian** 41 | 42 | - GitHub: [Adrian's Github](https://github.com/AdrianCSM) 43 | - Twitter: [Adrian's Twitter](https://twitter.com/CosminAdriannn) 44 | - LinkedIn: [Adrian's LinkedIn](https://www.linkedin.com/in/gheorghita-cosmin-adrian-b7781122a/) -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | To-Do List 8 | 9 | 10 | 11 |
12 |
13 |
14 |

Today's To Do

15 | autorenew 16 |
17 |
18 | 19 | 22 |
23 | 26 |
27 | Clear All Completed 28 |
29 |
30 |
31 | 32 | -------------------------------------------------------------------------------- /dist/main.js: -------------------------------------------------------------------------------- 1 | /******/ (() => { // webpackBootstrap 2 | /******/ "use strict"; 3 | /******/ var __webpack_modules__ = ({ 4 | 5 | /***/ "./node_modules/css-loader/dist/cjs.js!./src/style.css": 6 | /*!*************************************************************!*\ 7 | !*** ./node_modules/css-loader/dist/cjs.js!./src/style.css ***! 8 | \*************************************************************/ 9 | /***/ ((module, __webpack_exports__, __webpack_require__) => { 10 | 11 | __webpack_require__.r(__webpack_exports__); 12 | /* harmony export */ __webpack_require__.d(__webpack_exports__, { 13 | /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 14 | /* harmony export */ }); 15 | /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); 16 | /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); 17 | /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); 18 | /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); 19 | // Imports 20 | 21 | 22 | var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); 23 | // Module 24 | ___CSS_LOADER_EXPORT___.push([module.id, "body {\r\n background: #f6f6f6;\r\n}\r\n\r\nbody * {\r\n color: rgb(84, 88, 98);\r\n font-family: 'Open Sans', 'Lucida Grande', tahoma, verdana, arial, sans-serif;\r\n}\r\n\r\nmain {\r\n justify-content: center;\r\n align-items: center;\r\n min-height: 95vh;\r\n margin: 0 auto;\r\n}\r\n\r\n.todo-list {\r\n box-shadow: rgba(0, 0, 0, 0.15) 0 2px 8px 0;\r\n width: 500px;\r\n max-width: 100%;\r\n}\r\n\r\nform button .material-icons {\r\n font-size: 15px;\r\n}\r\n\r\n.todo-list .material-icons {\r\n transition: 0.6s;\r\n color: #9797a5;\r\n cursor: pointer;\r\n}\r\n\r\n.header .material-icons {\r\n font-size: 18px;\r\n}\r\n\r\n.todo-list .material-icons:hover {\r\n color: #333;\r\n}\r\n\r\n.todo-list .material-icons.move {\r\n cursor: move;\r\n}\r\n\r\n.header {\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.header,\r\nform,\r\nul {\r\n background: #fff;\r\n margin: 0;\r\n width: 100%;\r\n padding: 0;\r\n list-style-type: none;\r\n}\r\n\r\n.header,\r\nh2 {\r\n align-items: center;\r\n color: #545862;\r\n font-size: 18px;\r\n font-weight: 400;\r\n padding: 1rem;\r\n line-height: 20px;\r\n margin: 0;\r\n width: calc(100% - 2rem);\r\n text-overflow: ellipsis;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n}\r\n\r\nform input {\r\n width: calc(100% - 25px);\r\n border: 0 solid transparent;\r\n outline: none;\r\n font-style: italic;\r\n line-height: 40px;\r\n height: 40px;\r\n font-size: 15px;\r\n}\r\n\r\nform {\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\r\n width: calc(100% - 40px);\r\n padding: 10px 10px 10px 30px;\r\n}\r\n\r\nform button {\r\n background: #fff;\r\n border: 0 solid transparent;\r\n}\r\n\r\n.list-item {\r\n width: calc(100% - 40px);\r\n padding: 10px 10px 10px 30px;\r\n font-size: 1rem;\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\r\n font-weight: 300;\r\n align-items: center;\r\n}\r\n\r\n.list-item p {\r\n width: calc(100% - 50px);\r\n border: 0 solid transparent;\r\n outline: none;\r\n height: 22px;\r\n line-height: 22px;\r\n padding: 0;\r\n margin: 0;\r\n padding-left: 20px;\r\n font-weight: 300;\r\n font-size: 15px;\r\n overflow-y: auto;\r\n background: #fff;\r\n}\r\n\r\n.list-item .material-icons.done {\r\n color: rgb(46, 138, 230);\r\n}\r\n\r\n.list-item p.completed {\r\n text-decoration-line: line-through;\r\n color: rgba(0, 0, 0, 0.45);\r\n}\r\n\r\n.list-item.editing {\r\n background-color: #fffeca;\r\n}\r\n\r\n.clear-completed {\r\n width: 100%;\r\n text-align: center;\r\n padding: 20px 6px;\r\n justify-content: center;\r\n}\r\n\r\n.clear-completed:hover {\r\n text-decoration: underline;\r\n cursor: pointer;\r\n}\r\n\r\n.d-flex {\r\n display: flex;\r\n}\r\n\r\n.cols {\r\n flex-direction: column;\r\n}\r\n\r\n.s-between {\r\n justify-content: space-between;\r\n}\r\n", "",{"version":3,"sources":["webpack://./src/style.css"],"names":[],"mappings":"AAAA;EACE,mBAAmB;AACrB;;AAEA;EACE,sBAAsB;EACtB,6EAA6E;AAC/E;;AAEA;EACE,uBAAuB;EACvB,mBAAmB;EACnB,gBAAgB;EAChB,cAAc;AAChB;;AAEA;EACE,2CAA2C;EAC3C,YAAY;EACZ,eAAe;AACjB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,cAAc;EACd,eAAe;AACjB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,4CAA4C;AAC9C;;AAEA;;;EAGE,gBAAgB;EAChB,SAAS;EACT,WAAW;EACX,UAAU;EACV,qBAAqB;AACvB;;AAEA;;EAEE,mBAAmB;EACnB,cAAc;EACd,eAAe;EACf,gBAAgB;EAChB,aAAa;EACb,iBAAiB;EACjB,SAAS;EACT,wBAAwB;EACxB,uBAAuB;EACvB,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,wBAAwB;EACxB,2BAA2B;EAC3B,aAAa;EACb,kBAAkB;EAClB,iBAAiB;EACjB,YAAY;EACZ,eAAe;AACjB;;AAEA;EACE,4CAA4C;EAC5C,wBAAwB;EACxB,4BAA4B;AAC9B;;AAEA;EACE,gBAAgB;EAChB,2BAA2B;AAC7B;;AAEA;EACE,wBAAwB;EACxB,4BAA4B;EAC5B,eAAe;EACf,4CAA4C;EAC5C,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,wBAAwB;EACxB,2BAA2B;EAC3B,aAAa;EACb,YAAY;EACZ,iBAAiB;EACjB,UAAU;EACV,SAAS;EACT,kBAAkB;EAClB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,kCAAkC;EAClC,0BAA0B;AAC5B;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,WAAW;EACX,kBAAkB;EAClB,iBAAiB;EACjB,uBAAuB;AACzB;;AAEA;EACE,0BAA0B;EAC1B,eAAe;AACjB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,8BAA8B;AAChC","sourcesContent":["body {\r\n background: #f6f6f6;\r\n}\r\n\r\nbody * {\r\n color: rgb(84, 88, 98);\r\n font-family: 'Open Sans', 'Lucida Grande', tahoma, verdana, arial, sans-serif;\r\n}\r\n\r\nmain {\r\n justify-content: center;\r\n align-items: center;\r\n min-height: 95vh;\r\n margin: 0 auto;\r\n}\r\n\r\n.todo-list {\r\n box-shadow: rgba(0, 0, 0, 0.15) 0 2px 8px 0;\r\n width: 500px;\r\n max-width: 100%;\r\n}\r\n\r\nform button .material-icons {\r\n font-size: 15px;\r\n}\r\n\r\n.todo-list .material-icons {\r\n transition: 0.6s;\r\n color: #9797a5;\r\n cursor: pointer;\r\n}\r\n\r\n.header .material-icons {\r\n font-size: 18px;\r\n}\r\n\r\n.todo-list .material-icons:hover {\r\n color: #333;\r\n}\r\n\r\n.todo-list .material-icons.move {\r\n cursor: move;\r\n}\r\n\r\n.header {\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.header,\r\nform,\r\nul {\r\n background: #fff;\r\n margin: 0;\r\n width: 100%;\r\n padding: 0;\r\n list-style-type: none;\r\n}\r\n\r\n.header,\r\nh2 {\r\n align-items: center;\r\n color: #545862;\r\n font-size: 18px;\r\n font-weight: 400;\r\n padding: 1rem;\r\n line-height: 20px;\r\n margin: 0;\r\n width: calc(100% - 2rem);\r\n text-overflow: ellipsis;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n}\r\n\r\nform input {\r\n width: calc(100% - 25px);\r\n border: 0 solid transparent;\r\n outline: none;\r\n font-style: italic;\r\n line-height: 40px;\r\n height: 40px;\r\n font-size: 15px;\r\n}\r\n\r\nform {\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\r\n width: calc(100% - 40px);\r\n padding: 10px 10px 10px 30px;\r\n}\r\n\r\nform button {\r\n background: #fff;\r\n border: 0 solid transparent;\r\n}\r\n\r\n.list-item {\r\n width: calc(100% - 40px);\r\n padding: 10px 10px 10px 30px;\r\n font-size: 1rem;\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\r\n font-weight: 300;\r\n align-items: center;\r\n}\r\n\r\n.list-item p {\r\n width: calc(100% - 50px);\r\n border: 0 solid transparent;\r\n outline: none;\r\n height: 22px;\r\n line-height: 22px;\r\n padding: 0;\r\n margin: 0;\r\n padding-left: 20px;\r\n font-weight: 300;\r\n font-size: 15px;\r\n overflow-y: auto;\r\n background: #fff;\r\n}\r\n\r\n.list-item .material-icons.done {\r\n color: rgb(46, 138, 230);\r\n}\r\n\r\n.list-item p.completed {\r\n text-decoration-line: line-through;\r\n color: rgba(0, 0, 0, 0.45);\r\n}\r\n\r\n.list-item.editing {\r\n background-color: #fffeca;\r\n}\r\n\r\n.clear-completed {\r\n width: 100%;\r\n text-align: center;\r\n padding: 20px 6px;\r\n justify-content: center;\r\n}\r\n\r\n.clear-completed:hover {\r\n text-decoration: underline;\r\n cursor: pointer;\r\n}\r\n\r\n.d-flex {\r\n display: flex;\r\n}\r\n\r\n.cols {\r\n flex-direction: column;\r\n}\r\n\r\n.s-between {\r\n justify-content: space-between;\r\n}\r\n"],"sourceRoot":""}]); 25 | // Exports 26 | /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); 27 | 28 | 29 | /***/ }), 30 | 31 | /***/ "./node_modules/css-loader/dist/runtime/api.js": 32 | /*!*****************************************************!*\ 33 | !*** ./node_modules/css-loader/dist/runtime/api.js ***! 34 | \*****************************************************/ 35 | /***/ ((module) => { 36 | 37 | 38 | 39 | /* 40 | MIT License http://www.opensource.org/licenses/mit-license.php 41 | Author Tobias Koppers @sokra 42 | */ 43 | module.exports = function (cssWithMappingToString) { 44 | var list = []; // return the list of modules as css string 45 | 46 | list.toString = function toString() { 47 | return this.map(function (item) { 48 | var content = ""; 49 | var needLayer = typeof item[5] !== "undefined"; 50 | 51 | if (item[4]) { 52 | content += "@supports (".concat(item[4], ") {"); 53 | } 54 | 55 | if (item[2]) { 56 | content += "@media ".concat(item[2], " {"); 57 | } 58 | 59 | if (needLayer) { 60 | content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {"); 61 | } 62 | 63 | content += cssWithMappingToString(item); 64 | 65 | if (needLayer) { 66 | content += "}"; 67 | } 68 | 69 | if (item[2]) { 70 | content += "}"; 71 | } 72 | 73 | if (item[4]) { 74 | content += "}"; 75 | } 76 | 77 | return content; 78 | }).join(""); 79 | }; // import a list of modules into the list 80 | 81 | 82 | list.i = function i(modules, media, dedupe, supports, layer) { 83 | if (typeof modules === "string") { 84 | modules = [[null, modules, undefined]]; 85 | } 86 | 87 | var alreadyImportedModules = {}; 88 | 89 | if (dedupe) { 90 | for (var k = 0; k < this.length; k++) { 91 | var id = this[k][0]; 92 | 93 | if (id != null) { 94 | alreadyImportedModules[id] = true; 95 | } 96 | } 97 | } 98 | 99 | for (var _k = 0; _k < modules.length; _k++) { 100 | var item = [].concat(modules[_k]); 101 | 102 | if (dedupe && alreadyImportedModules[item[0]]) { 103 | continue; 104 | } 105 | 106 | if (typeof layer !== "undefined") { 107 | if (typeof item[5] === "undefined") { 108 | item[5] = layer; 109 | } else { 110 | item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}"); 111 | item[5] = layer; 112 | } 113 | } 114 | 115 | if (media) { 116 | if (!item[2]) { 117 | item[2] = media; 118 | } else { 119 | item[1] = "@media ".concat(item[2], " {").concat(item[1], "}"); 120 | item[2] = media; 121 | } 122 | } 123 | 124 | if (supports) { 125 | if (!item[4]) { 126 | item[4] = "".concat(supports); 127 | } else { 128 | item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}"); 129 | item[4] = supports; 130 | } 131 | } 132 | 133 | list.push(item); 134 | } 135 | }; 136 | 137 | return list; 138 | }; 139 | 140 | /***/ }), 141 | 142 | /***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js": 143 | /*!************************************************************!*\ 144 | !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***! 145 | \************************************************************/ 146 | /***/ ((module) => { 147 | 148 | 149 | 150 | module.exports = function (item) { 151 | var content = item[1]; 152 | var cssMapping = item[3]; 153 | 154 | if (!cssMapping) { 155 | return content; 156 | } 157 | 158 | if (typeof btoa === "function") { 159 | var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping)))); 160 | var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64); 161 | var sourceMapping = "/*# ".concat(data, " */"); 162 | var sourceURLs = cssMapping.sources.map(function (source) { 163 | return "/*# sourceURL=".concat(cssMapping.sourceRoot || "").concat(source, " */"); 164 | }); 165 | return [content].concat(sourceURLs).concat([sourceMapping]).join("\n"); 166 | } 167 | 168 | return [content].join("\n"); 169 | }; 170 | 171 | /***/ }), 172 | 173 | /***/ "./src/style.css": 174 | /*!***********************!*\ 175 | !*** ./src/style.css ***! 176 | \***********************/ 177 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 178 | 179 | __webpack_require__.r(__webpack_exports__); 180 | /* harmony export */ __webpack_require__.d(__webpack_exports__, { 181 | /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 182 | /* harmony export */ }); 183 | /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); 184 | /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); 185 | /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); 186 | /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); 187 | /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); 188 | /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); 189 | /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); 190 | /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); 191 | /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); 192 | /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); 193 | /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); 194 | /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); 195 | /* harmony import */ var _node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./style.css */ "./node_modules/css-loader/dist/cjs.js!./src/style.css"); 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | var options = {}; 208 | 209 | options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); 210 | options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); 211 | 212 | options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); 213 | 214 | options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); 215 | options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); 216 | 217 | var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); 218 | 219 | 220 | 221 | 222 | /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); 223 | 224 | 225 | /***/ }), 226 | 227 | /***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js": 228 | /*!****************************************************************************!*\ 229 | !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***! 230 | \****************************************************************************/ 231 | /***/ ((module) => { 232 | 233 | 234 | 235 | var stylesInDOM = []; 236 | 237 | function getIndexByIdentifier(identifier) { 238 | var result = -1; 239 | 240 | for (var i = 0; i < stylesInDOM.length; i++) { 241 | if (stylesInDOM[i].identifier === identifier) { 242 | result = i; 243 | break; 244 | } 245 | } 246 | 247 | return result; 248 | } 249 | 250 | function modulesToDom(list, options) { 251 | var idCountMap = {}; 252 | var identifiers = []; 253 | 254 | for (var i = 0; i < list.length; i++) { 255 | var item = list[i]; 256 | var id = options.base ? item[0] + options.base : item[0]; 257 | var count = idCountMap[id] || 0; 258 | var identifier = "".concat(id, " ").concat(count); 259 | idCountMap[id] = count + 1; 260 | var indexByIdentifier = getIndexByIdentifier(identifier); 261 | var obj = { 262 | css: item[1], 263 | media: item[2], 264 | sourceMap: item[3], 265 | supports: item[4], 266 | layer: item[5] 267 | }; 268 | 269 | if (indexByIdentifier !== -1) { 270 | stylesInDOM[indexByIdentifier].references++; 271 | stylesInDOM[indexByIdentifier].updater(obj); 272 | } else { 273 | var updater = addElementStyle(obj, options); 274 | options.byIndex = i; 275 | stylesInDOM.splice(i, 0, { 276 | identifier: identifier, 277 | updater: updater, 278 | references: 1 279 | }); 280 | } 281 | 282 | identifiers.push(identifier); 283 | } 284 | 285 | return identifiers; 286 | } 287 | 288 | function addElementStyle(obj, options) { 289 | var api = options.domAPI(options); 290 | api.update(obj); 291 | 292 | var updater = function updater(newObj) { 293 | if (newObj) { 294 | if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) { 295 | return; 296 | } 297 | 298 | api.update(obj = newObj); 299 | } else { 300 | api.remove(); 301 | } 302 | }; 303 | 304 | return updater; 305 | } 306 | 307 | module.exports = function (list, options) { 308 | options = options || {}; 309 | list = list || []; 310 | var lastIdentifiers = modulesToDom(list, options); 311 | return function update(newList) { 312 | newList = newList || []; 313 | 314 | for (var i = 0; i < lastIdentifiers.length; i++) { 315 | var identifier = lastIdentifiers[i]; 316 | var index = getIndexByIdentifier(identifier); 317 | stylesInDOM[index].references--; 318 | } 319 | 320 | var newLastIdentifiers = modulesToDom(newList, options); 321 | 322 | for (var _i = 0; _i < lastIdentifiers.length; _i++) { 323 | var _identifier = lastIdentifiers[_i]; 324 | 325 | var _index = getIndexByIdentifier(_identifier); 326 | 327 | if (stylesInDOM[_index].references === 0) { 328 | stylesInDOM[_index].updater(); 329 | 330 | stylesInDOM.splice(_index, 1); 331 | } 332 | } 333 | 334 | lastIdentifiers = newLastIdentifiers; 335 | }; 336 | }; 337 | 338 | /***/ }), 339 | 340 | /***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js": 341 | /*!********************************************************************!*\ 342 | !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***! 343 | \********************************************************************/ 344 | /***/ ((module) => { 345 | 346 | 347 | 348 | var memo = {}; 349 | /* istanbul ignore next */ 350 | 351 | function getTarget(target) { 352 | if (typeof memo[target] === "undefined") { 353 | var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself 354 | 355 | if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) { 356 | try { 357 | // This will throw an exception if access to iframe is blocked 358 | // due to cross-origin restrictions 359 | styleTarget = styleTarget.contentDocument.head; 360 | } catch (e) { 361 | // istanbul ignore next 362 | styleTarget = null; 363 | } 364 | } 365 | 366 | memo[target] = styleTarget; 367 | } 368 | 369 | return memo[target]; 370 | } 371 | /* istanbul ignore next */ 372 | 373 | 374 | function insertBySelector(insert, style) { 375 | var target = getTarget(insert); 376 | 377 | if (!target) { 378 | throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid."); 379 | } 380 | 381 | target.appendChild(style); 382 | } 383 | 384 | module.exports = insertBySelector; 385 | 386 | /***/ }), 387 | 388 | /***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js": 389 | /*!**********************************************************************!*\ 390 | !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***! 391 | \**********************************************************************/ 392 | /***/ ((module) => { 393 | 394 | 395 | 396 | /* istanbul ignore next */ 397 | function insertStyleElement(options) { 398 | var element = document.createElement("style"); 399 | options.setAttributes(element, options.attributes); 400 | options.insert(element, options.options); 401 | return element; 402 | } 403 | 404 | module.exports = insertStyleElement; 405 | 406 | /***/ }), 407 | 408 | /***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js": 409 | /*!**********************************************************************************!*\ 410 | !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***! 411 | \**********************************************************************************/ 412 | /***/ ((module, __unused_webpack_exports, __webpack_require__) => { 413 | 414 | 415 | 416 | /* istanbul ignore next */ 417 | function setAttributesWithoutAttributes(styleElement) { 418 | var nonce = true ? __webpack_require__.nc : 0; 419 | 420 | if (nonce) { 421 | styleElement.setAttribute("nonce", nonce); 422 | } 423 | } 424 | 425 | module.exports = setAttributesWithoutAttributes; 426 | 427 | /***/ }), 428 | 429 | /***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js": 430 | /*!***************************************************************!*\ 431 | !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***! 432 | \***************************************************************/ 433 | /***/ ((module) => { 434 | 435 | 436 | 437 | /* istanbul ignore next */ 438 | function apply(styleElement, options, obj) { 439 | var css = ""; 440 | 441 | if (obj.supports) { 442 | css += "@supports (".concat(obj.supports, ") {"); 443 | } 444 | 445 | if (obj.media) { 446 | css += "@media ".concat(obj.media, " {"); 447 | } 448 | 449 | var needLayer = typeof obj.layer !== "undefined"; 450 | 451 | if (needLayer) { 452 | css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {"); 453 | } 454 | 455 | css += obj.css; 456 | 457 | if (needLayer) { 458 | css += "}"; 459 | } 460 | 461 | if (obj.media) { 462 | css += "}"; 463 | } 464 | 465 | if (obj.supports) { 466 | css += "}"; 467 | } 468 | 469 | var sourceMap = obj.sourceMap; 470 | 471 | if (sourceMap && typeof btoa !== "undefined") { 472 | css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */"); 473 | } // For old IE 474 | 475 | /* istanbul ignore if */ 476 | 477 | 478 | options.styleTagTransform(css, styleElement, options.options); 479 | } 480 | 481 | function removeStyleElement(styleElement) { 482 | // istanbul ignore if 483 | if (styleElement.parentNode === null) { 484 | return false; 485 | } 486 | 487 | styleElement.parentNode.removeChild(styleElement); 488 | } 489 | /* istanbul ignore next */ 490 | 491 | 492 | function domAPI(options) { 493 | var styleElement = options.insertStyleElement(options); 494 | return { 495 | update: function update(obj) { 496 | apply(styleElement, options, obj); 497 | }, 498 | remove: function remove() { 499 | removeStyleElement(styleElement); 500 | } 501 | }; 502 | } 503 | 504 | module.exports = domAPI; 505 | 506 | /***/ }), 507 | 508 | /***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js": 509 | /*!*********************************************************************!*\ 510 | !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***! 511 | \*********************************************************************/ 512 | /***/ ((module) => { 513 | 514 | 515 | 516 | /* istanbul ignore next */ 517 | function styleTagTransform(css, styleElement) { 518 | if (styleElement.styleSheet) { 519 | styleElement.styleSheet.cssText = css; 520 | } else { 521 | while (styleElement.firstChild) { 522 | styleElement.removeChild(styleElement.firstChild); 523 | } 524 | 525 | styleElement.appendChild(document.createTextNode(css)); 526 | } 527 | } 528 | 529 | module.exports = styleTagTransform; 530 | 531 | /***/ }), 532 | 533 | /***/ "./src/list.js": 534 | /*!*********************!*\ 535 | !*** ./src/list.js ***! 536 | \*********************/ 537 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 538 | 539 | __webpack_require__.r(__webpack_exports__); 540 | /* harmony export */ __webpack_require__.d(__webpack_exports__, { 541 | /* harmony export */ "default": () => (/* binding */ List) 542 | /* harmony export */ }); 543 | class List { 544 | constructor() { 545 | this.list = JSON.parse(localStorage.getItem('todo-list')); 546 | if (!this.list) { 547 | this.list = []; 548 | } 549 | this.display(); 550 | } 551 | 552 | display() { 553 | this.saveData(); 554 | const listSection = document.getElementById('list-items'); 555 | listSection.innerHTML = ''; 556 | this.list.forEach((activity) => { 557 | let activityItem = `
  • `; 558 | if (activity.completed) { 559 | activityItem += ` 560 | done 561 | 562 |

    563 | ${activity.description} 564 |

    565 | `; 566 | } else { 567 | activityItem += ` 568 | 569 | check_box_outline_blank 570 | 571 |

    572 | ${activity.description} 573 |

    `; 574 | } 575 | activityItem += ` 576 | 577 | delete 578 | 579 |
  • 580 | `; 581 | listSection.innerHTML += activityItem; 582 | }); 583 | this.activityActions(); 584 | } 585 | 586 | saveData() { 587 | for (let i = 0; i < this.list.length; i += 1) { 588 | this.list[i].index = i; 589 | } 590 | this.list.sort((a, b) => { 591 | if (a.index < b.index) { 592 | return -1; 593 | } 594 | if (a.index > b.index) { 595 | return 1; 596 | } 597 | return 0; 598 | }); 599 | localStorage.setItem('todo-list', JSON.stringify(this.list)); 600 | } 601 | 602 | addActivity(activity) { 603 | if (activity.length > 0) { 604 | const newActivity = { 605 | description: activity, 606 | completed: false, 607 | index: this.list.length, 608 | }; 609 | this.list.push(newActivity); 610 | this.display(); 611 | this.saveData(); 612 | } 613 | } 614 | 615 | deleteAll() { 616 | localStorage.clear(); 617 | this.list = []; 618 | this.display(); 619 | } 620 | 621 | updateStatus(index) { 622 | if (this.list[index].completed === true) { 623 | this.list[index].completed = false; 624 | } else if (this.list[index].completed === false) { 625 | this.list[index].completed = true; 626 | } 627 | this.display(); 628 | } 629 | 630 | deleteCompleted(index) { 631 | this.list.splice(index, 1); 632 | this.display(); 633 | } 634 | 635 | clearCompleted() { 636 | this.list = this.list.filter((activity) => activity.completed === false); 637 | this.display(); 638 | } 639 | 640 | editActivity(index, description) { 641 | this.list[index].description = description; 642 | this.saveData(); 643 | } 644 | 645 | activityActions() { 646 | const checkbox = document.querySelectorAll('.update-status'); 647 | if (checkbox !== null) { 648 | checkbox.forEach((box) => { 649 | box.addEventListener('click', () => { 650 | this.updateStatus(box.getAttribute('data')); 651 | }); 652 | }); 653 | } 654 | 655 | const deleteActivity = document.querySelectorAll('.delete-activity'); 656 | deleteActivity.forEach((activity) => { 657 | activity.addEventListener('click', () => { 658 | this.deleteCompleted(activity.getAttribute('data')); 659 | }); 660 | }); 661 | 662 | const editedActivity = document.querySelectorAll('.activity'); 663 | if (editedActivity) { 664 | editedActivity.forEach((activity) => { 665 | activity.addEventListener('input', (e) => { 666 | const description = e.target.innerText; 667 | const index = e.target.getAttribute('data'); 668 | this.editActivity(index, description); 669 | }); 670 | }); 671 | } 672 | } 673 | } 674 | 675 | 676 | /***/ }) 677 | 678 | /******/ }); 679 | /************************************************************************/ 680 | /******/ // The module cache 681 | /******/ var __webpack_module_cache__ = {}; 682 | /******/ 683 | /******/ // The require function 684 | /******/ function __webpack_require__(moduleId) { 685 | /******/ // Check if module is in cache 686 | /******/ var cachedModule = __webpack_module_cache__[moduleId]; 687 | /******/ if (cachedModule !== undefined) { 688 | /******/ return cachedModule.exports; 689 | /******/ } 690 | /******/ // Create a new module (and put it into the cache) 691 | /******/ var module = __webpack_module_cache__[moduleId] = { 692 | /******/ id: moduleId, 693 | /******/ // no module.loaded needed 694 | /******/ exports: {} 695 | /******/ }; 696 | /******/ 697 | /******/ // Execute the module function 698 | /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); 699 | /******/ 700 | /******/ // Return the exports of the module 701 | /******/ return module.exports; 702 | /******/ } 703 | /******/ 704 | /************************************************************************/ 705 | /******/ /* webpack/runtime/compat get default export */ 706 | /******/ (() => { 707 | /******/ // getDefaultExport function for compatibility with non-harmony modules 708 | /******/ __webpack_require__.n = (module) => { 709 | /******/ var getter = module && module.__esModule ? 710 | /******/ () => (module['default']) : 711 | /******/ () => (module); 712 | /******/ __webpack_require__.d(getter, { a: getter }); 713 | /******/ return getter; 714 | /******/ }; 715 | /******/ })(); 716 | /******/ 717 | /******/ /* webpack/runtime/define property getters */ 718 | /******/ (() => { 719 | /******/ // define getter functions for harmony exports 720 | /******/ __webpack_require__.d = (exports, definition) => { 721 | /******/ for(var key in definition) { 722 | /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { 723 | /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); 724 | /******/ } 725 | /******/ } 726 | /******/ }; 727 | /******/ })(); 728 | /******/ 729 | /******/ /* webpack/runtime/hasOwnProperty shorthand */ 730 | /******/ (() => { 731 | /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) 732 | /******/ })(); 733 | /******/ 734 | /******/ /* webpack/runtime/make namespace object */ 735 | /******/ (() => { 736 | /******/ // define __esModule on exports 737 | /******/ __webpack_require__.r = (exports) => { 738 | /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 739 | /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 740 | /******/ } 741 | /******/ Object.defineProperty(exports, '__esModule', { value: true }); 742 | /******/ }; 743 | /******/ })(); 744 | /******/ 745 | /************************************************************************/ 746 | var __webpack_exports__ = {}; 747 | // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. 748 | (() => { 749 | /*!**********************!*\ 750 | !*** ./src/index.js ***! 751 | \**********************/ 752 | __webpack_require__.r(__webpack_exports__); 753 | /* harmony import */ var _style_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style.css */ "./src/style.css"); 754 | /* harmony import */ var _list_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./list.js */ "./src/list.js"); 755 | 756 | 757 | 758 | const tasks = new _list_js__WEBPACK_IMPORTED_MODULE_1__["default"](); 759 | 760 | document.querySelector('#add-task').addEventListener('submit', (e) => { 761 | e.preventDefault(); 762 | const activity = e.target.elements.activity.value; 763 | tasks.addActivity(activity); 764 | e.target.reset(); 765 | }); 766 | 767 | document.querySelector('#delete-all').addEventListener('click', () => { 768 | tasks.deleteAll(); 769 | }); 770 | 771 | document.querySelector('.clear-completed').addEventListener('click', () => { 772 | tasks.clearCompleted(); 773 | }); 774 | })(); 775 | 776 | /******/ })() 777 | ; 778 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7Ozs7Ozs7VUNsSUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0N0QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGlDQUFpQyxXQUFXO1dBQzVDO1dBQ0E7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7QUNOcUI7QUFDUTs7QUFFN0Isa0JBQWtCLGdEQUFJOztBQUV0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsQ0FBQyxFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL3NyYy9zdHlsZS5jc3MiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL3RvLWRvLWxpc3QvLi9zcmMvc3R5bGUuY3NzPzcxNjMiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcyIsIndlYnBhY2s6Ly90by1kby1saXN0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly90by1kby1saXN0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzIiwid2VicGFjazovL3RvLWRvLWxpc3QvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL3RvLWRvLWxpc3QvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly90by1kby1saXN0Ly4vc3JjL2xpc3QuanMiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly90by1kby1saXN0L3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3RvLWRvLWxpc3Qvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3RvLWRvLWxpc3Qvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly90by1kby1saXN0L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcImJvZHkge1xcclxcbiAgYmFja2dyb3VuZDogI2Y2ZjZmNjtcXHJcXG59XFxyXFxuXFxyXFxuYm9keSAqIHtcXHJcXG4gIGNvbG9yOiByZ2IoODQsIDg4LCA5OCk7XFxyXFxuICBmb250LWZhbWlseTogJ09wZW4gU2FucycsICdMdWNpZGEgR3JhbmRlJywgdGFob21hLCB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjtcXHJcXG59XFxyXFxuXFxyXFxubWFpbiB7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBtaW4taGVpZ2h0OiA5NXZoO1xcclxcbiAgbWFyZ2luOiAwIGF1dG87XFxyXFxufVxcclxcblxcclxcbi50b2RvLWxpc3Qge1xcclxcbiAgYm94LXNoYWRvdzogcmdiYSgwLCAwLCAwLCAwLjE1KSAwIDJweCA4cHggMDtcXHJcXG4gIHdpZHRoOiA1MDBweDtcXHJcXG4gIG1heC13aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuZm9ybSBidXR0b24gLm1hdGVyaWFsLWljb25zIHtcXHJcXG4gIGZvbnQtc2l6ZTogMTVweDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8tbGlzdCAubWF0ZXJpYWwtaWNvbnMge1xcclxcbiAgdHJhbnNpdGlvbjogMC42cztcXHJcXG4gIGNvbG9yOiAjOTc5N2E1O1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uaGVhZGVyIC5tYXRlcmlhbC1pY29ucyB7XFxyXFxuICBmb250LXNpemU6IDE4cHg7XFxyXFxufVxcclxcblxcclxcbi50b2RvLWxpc3QgLm1hdGVyaWFsLWljb25zOmhvdmVyIHtcXHJcXG4gIGNvbG9yOiAjMzMzO1xcclxcbn1cXHJcXG5cXHJcXG4udG9kby1saXN0IC5tYXRlcmlhbC1pY29ucy5tb3ZlIHtcXHJcXG4gIGN1cnNvcjogbW92ZTtcXHJcXG59XFxyXFxuXFxyXFxuLmhlYWRlciB7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjA4KTtcXHJcXG59XFxyXFxuXFxyXFxuLmhlYWRlcixcXHJcXG5mb3JtLFxcclxcbnVsIHtcXHJcXG4gIGJhY2tncm91bmQ6ICNmZmY7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5oZWFkZXIsXFxyXFxuaDIge1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGNvbG9yOiAjNTQ1ODYyO1xcclxcbiAgZm9udC1zaXplOiAxOHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXHJcXG4gIHBhZGRpbmc6IDFyZW07XFxyXFxuICBsaW5lLWhlaWdodDogMjBweDtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIHdpZHRoOiBjYWxjKDEwMCUgLSAycmVtKTtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxufVxcclxcblxcclxcbmZvcm0gaW5wdXQge1xcclxcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDI1cHgpO1xcclxcbiAgYm9yZGVyOiAwIHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXHJcXG4gIGxpbmUtaGVpZ2h0OiA0MHB4O1xcclxcbiAgaGVpZ2h0OiA0MHB4O1xcclxcbiAgZm9udC1zaXplOiAxNXB4O1xcclxcbn1cXHJcXG5cXHJcXG5mb3JtIHtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xcclxcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDQwcHgpO1xcclxcbiAgcGFkZGluZzogMTBweCAxMHB4IDEwcHggMzBweDtcXHJcXG59XFxyXFxuXFxyXFxuZm9ybSBidXR0b24ge1xcclxcbiAgYmFja2dyb3VuZDogI2ZmZjtcXHJcXG4gIGJvcmRlcjogMCBzb2xpZCB0cmFuc3BhcmVudDtcXHJcXG59XFxyXFxuXFxyXFxuLmxpc3QtaXRlbSB7XFxyXFxuICB3aWR0aDogY2FsYygxMDAlIC0gNDBweCk7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHggMTBweCAzMHB4O1xcclxcbiAgZm9udC1zaXplOiAxcmVtO1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4wOCk7XFxyXFxuICBmb250LXdlaWdodDogMzAwO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLmxpc3QtaXRlbSBwIHtcXHJcXG4gIHdpZHRoOiBjYWxjKDEwMCUgLSA1MHB4KTtcXHJcXG4gIGJvcmRlcjogMCBzb2xpZCB0cmFuc3BhcmVudDtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxuICBoZWlnaHQ6IDIycHg7XFxyXFxuICBsaW5lLWhlaWdodDogMjJweDtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxyXFxuICBmb250LXdlaWdodDogMzAwO1xcclxcbiAgZm9udC1zaXplOiAxNXB4O1xcclxcbiAgb3ZlcmZsb3cteTogYXV0bztcXHJcXG4gIGJhY2tncm91bmQ6ICNmZmY7XFxyXFxufVxcclxcblxcclxcbi5saXN0LWl0ZW0gLm1hdGVyaWFsLWljb25zLmRvbmUge1xcclxcbiAgY29sb3I6IHJnYig0NiwgMTM4LCAyMzApO1xcclxcbn1cXHJcXG5cXHJcXG4ubGlzdC1pdGVtIHAuY29tcGxldGVkIHtcXHJcXG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiBsaW5lLXRocm91Z2g7XFxyXFxuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQ1KTtcXHJcXG59XFxyXFxuXFxyXFxuLmxpc3QtaXRlbS5lZGl0aW5nIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZlY2E7XFxyXFxufVxcclxcblxcclxcbi5jbGVhci1jb21wbGV0ZWQge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBwYWRkaW5nOiAyMHB4IDZweDtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uY2xlYXItY29tcGxldGVkOmhvdmVyIHtcXHJcXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uZC1mbGV4IHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxufVxcclxcblxcclxcbi5jb2xzIHtcXHJcXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxyXFxufVxcclxcblxcclxcbi5zLWJldHdlZW4ge1xcclxcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcclxcbn1cXHJcXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvc3R5bGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0VBQ0UsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLDZFQUE2RTtBQUMvRTs7QUFFQTtFQUNFLHVCQUF1QjtFQUN2QixtQkFBbUI7RUFDbkIsZ0JBQWdCO0VBQ2hCLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSwyQ0FBMkM7RUFDM0MsWUFBWTtFQUNaLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLGNBQWM7RUFDZCxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLFdBQVc7QUFDYjs7QUFFQTtFQUNFLFlBQVk7QUFDZDs7QUFFQTtFQUNFLDRDQUE0QztBQUM5Qzs7QUFFQTs7O0VBR0UsZ0JBQWdCO0VBQ2hCLFNBQVM7RUFDVCxXQUFXO0VBQ1gsVUFBVTtFQUNWLHFCQUFxQjtBQUN2Qjs7QUFFQTs7RUFFRSxtQkFBbUI7RUFDbkIsY0FBYztFQUNkLGVBQWU7RUFDZixnQkFBZ0I7RUFDaEIsYUFBYTtFQUNiLGlCQUFpQjtFQUNqQixTQUFTO0VBQ1Qsd0JBQXdCO0VBQ3hCLHVCQUF1QjtFQUN2QixnQkFBZ0I7RUFDaEIsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0Usd0JBQXdCO0VBQ3hCLDJCQUEyQjtFQUMzQixhQUFhO0VBQ2Isa0JBQWtCO0VBQ2xCLGlCQUFpQjtFQUNqQixZQUFZO0VBQ1osZUFBZTtBQUNqQjs7QUFFQTtFQUNFLDRDQUE0QztFQUM1Qyx3QkFBd0I7RUFDeEIsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLDJCQUEyQjtBQUM3Qjs7QUFFQTtFQUNFLHdCQUF3QjtFQUN4Qiw0QkFBNEI7RUFDNUIsZUFBZTtFQUNmLDRDQUE0QztFQUM1QyxnQkFBZ0I7RUFDaEIsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0Usd0JBQXdCO0VBQ3hCLDJCQUEyQjtFQUMzQixhQUFhO0VBQ2IsWUFBWTtFQUNaLGlCQUFpQjtFQUNqQixVQUFVO0VBQ1YsU0FBUztFQUNULGtCQUFrQjtFQUNsQixnQkFBZ0I7RUFDaEIsZUFBZTtFQUNmLGdCQUFnQjtFQUNoQixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSx3QkFBd0I7QUFDMUI7O0FBRUE7RUFDRSxrQ0FBa0M7RUFDbEMsMEJBQTBCO0FBQzVCOztBQUVBO0VBQ0UseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0UsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixpQkFBaUI7RUFDakIsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0UsMEJBQTBCO0VBQzFCLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxzQkFBc0I7QUFDeEI7O0FBRUE7RUFDRSw4QkFBOEI7QUFDaENcIixcInNvdXJjZXNDb250ZW50XCI6W1wiYm9keSB7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZjZmNmY2O1xcclxcbn1cXHJcXG5cXHJcXG5ib2R5ICoge1xcclxcbiAgY29sb3I6IHJnYig4NCwgODgsIDk4KTtcXHJcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJywgJ0x1Y2lkYSBHcmFuZGUnLCB0YWhvbWEsIHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmO1xcclxcbn1cXHJcXG5cXHJcXG5tYWluIHtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIG1pbi1oZWlnaHQ6IDk1dmg7XFxyXFxuICBtYXJnaW46IDAgYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8tbGlzdCB7XFxyXFxuICBib3gtc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuMTUpIDAgMnB4IDhweCAwO1xcclxcbiAgd2lkdGg6IDUwMHB4O1xcclxcbiAgbWF4LXdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG5mb3JtIGJ1dHRvbiAubWF0ZXJpYWwtaWNvbnMge1xcclxcbiAgZm9udC1zaXplOiAxNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4udG9kby1saXN0IC5tYXRlcmlhbC1pY29ucyB7XFxyXFxuICB0cmFuc2l0aW9uOiAwLjZzO1xcclxcbiAgY29sb3I6ICM5Nzk3YTU7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5oZWFkZXIgLm1hdGVyaWFsLWljb25zIHtcXHJcXG4gIGZvbnQtc2l6ZTogMThweDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8tbGlzdCAubWF0ZXJpYWwtaWNvbnM6aG92ZXIge1xcclxcbiAgY29sb3I6ICMzMzM7XFxyXFxufVxcclxcblxcclxcbi50b2RvLWxpc3QgLm1hdGVyaWFsLWljb25zLm1vdmUge1xcclxcbiAgY3Vyc29yOiBtb3ZlO1xcclxcbn1cXHJcXG5cXHJcXG4uaGVhZGVyIHtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xcclxcbn1cXHJcXG5cXHJcXG4uaGVhZGVyLFxcclxcbmZvcm0sXFxyXFxudWwge1xcclxcbiAgYmFja2dyb3VuZDogI2ZmZjtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLmhlYWRlcixcXHJcXG5oMiB7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgY29sb3I6ICM1NDU4NjI7XFxyXFxuICBmb250LXNpemU6IDE4cHg7XFxyXFxuICBmb250LXdlaWdodDogNDAwO1xcclxcbiAgcGFkZGluZzogMXJlbTtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDJyZW0pO1xcclxcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG59XFxyXFxuXFxyXFxuZm9ybSBpbnB1dCB7XFxyXFxuICB3aWR0aDogY2FsYygxMDAlIC0gMjVweCk7XFxyXFxuICBib3JkZXI6IDAgc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcclxcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XFxyXFxuICBoZWlnaHQ6IDQwcHg7XFxyXFxuICBmb250LXNpemU6IDE1cHg7XFxyXFxufVxcclxcblxcclxcbmZvcm0ge1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4wOCk7XFxyXFxuICB3aWR0aDogY2FsYygxMDAlIC0gNDBweCk7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHggMTBweCAzMHB4O1xcclxcbn1cXHJcXG5cXHJcXG5mb3JtIGJ1dHRvbiB7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbiAgYm9yZGVyOiAwIHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbn1cXHJcXG5cXHJcXG4ubGlzdC1pdGVtIHtcXHJcXG4gIHdpZHRoOiBjYWxjKDEwMCUgLSA0MHB4KTtcXHJcXG4gIHBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDMwcHg7XFxyXFxuICBmb250LXNpemU6IDFyZW07XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjA4KTtcXHJcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4ubGlzdC1pdGVtIHAge1xcclxcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDUwcHgpO1xcclxcbiAgYm9yZGVyOiAwIHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG4gIGhlaWdodDogMjJweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAyMnB4O1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIHBhZGRpbmctbGVmdDogMjBweDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxyXFxuICBmb250LXNpemU6IDE1cHg7XFxyXFxuICBvdmVyZmxvdy15OiBhdXRvO1xcclxcbiAgYmFja2dyb3VuZDogI2ZmZjtcXHJcXG59XFxyXFxuXFxyXFxuLmxpc3QtaXRlbSAubWF0ZXJpYWwtaWNvbnMuZG9uZSB7XFxyXFxuICBjb2xvcjogcmdiKDQ2LCAxMzgsIDIzMCk7XFxyXFxufVxcclxcblxcclxcbi5saXN0LWl0ZW0gcC5jb21wbGV0ZWQge1xcclxcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IGxpbmUtdGhyb3VnaDtcXHJcXG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNDUpO1xcclxcbn1cXHJcXG5cXHJcXG4ubGlzdC1pdGVtLmVkaXRpbmcge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmVjYTtcXHJcXG59XFxyXFxuXFxyXFxuLmNsZWFyLWNvbXBsZXRlZCB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHBhZGRpbmc6IDIwcHggNnB4O1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5jbGVhci1jb21wbGV0ZWQ6aG92ZXIge1xcclxcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5kLWZsZXgge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbHMge1xcclxcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG59XFxyXFxuXFxyXFxuLnMtYmV0d2VlbiB7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxyXFxufVxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTsgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcblxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cblxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuXG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07IC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG5cblxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuXG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcblxuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgaWQgPSB0aGlzW2tdWzBdO1xuXG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG5cbiAgICAgIGlmIChkZWR1cGUgJiYgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN1cHBvcnRzKSB7XG4gICAgICAgIGlmICghaXRlbVs0XSkge1xuICAgICAgICAgIGl0ZW1bNF0gPSBcIlwiLmNvbmNhdChzdXBwb3J0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzRdID0gc3VwcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG5cbiAgaWYgKCFjc3NNYXBwaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgdmFyIHNvdXJjZVVSTHMgPSBjc3NNYXBwaW5nLnNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIHJldHVybiBcIi8qIyBzb3VyY2VVUkw9XCIuY29uY2F0KGNzc01hcHBpbmcuc291cmNlUm9vdCB8fCBcIlwiKS5jb25jYXQoc291cmNlLCBcIiAqL1wiKTtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChzb3VyY2VVUkxzKS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3R5bGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zdHlsZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5cbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5ET00ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5ET01baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleEJ5SWRlbnRpZmllciA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXSxcbiAgICAgIHN1cHBvcnRzOiBpdGVtWzRdLFxuICAgICAgbGF5ZXI6IGl0ZW1bNV1cbiAgICB9O1xuXG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIHJldHVybiBpZGVudGlmaWVycztcbn1cblxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcblxuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFwaS51cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbW92ZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdXBkYXRlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW2ldO1xuICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleF0ucmVmZXJlbmNlcy0tO1xuICAgIH1cblxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcblxuICAgICAgdmFyIF9pbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKF9pZGVudGlmaWVyKTtcblxuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcblxuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsYXN0SWRlbnRpZmllcnMgPSBuZXdMYXN0SWRlbnRpZmllcnM7XG4gIH07XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbWVtbyA9IHt9O1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5cbmZ1bmN0aW9uIGdldFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHR5cGVvZiBtZW1vW3RhcmdldF0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgc3R5bGVUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7IC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG5cbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWVtb1t0YXJnZXRdID0gc3R5bGVUYXJnZXQ7XG4gIH1cblxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5cblxuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcblxuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG4gIH1cblxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIG9wdGlvbnMuc2V0QXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICBvcHRpb25zLmluc2VydChlbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG5cbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlczsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gXCJcIjtcblxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQob2JqLnN1cHBvcnRzLCBcIikge1wiKTtcbiAgfVxuXG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuXG4gIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2Ygb2JqLmxheWVyICE9PSBcInVuZGVmaW5lZFwiO1xuXG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJAbGF5ZXJcIi5jb25jYXQob2JqLmxheWVyLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQob2JqLmxheWVyKSA6IFwiXCIsIFwiIHtcIik7XG4gIH1cblxuICBjc3MgKz0gb2JqLmNzcztcblxuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG5cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuXG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cblxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcblxuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH0gLy8gRm9yIG9sZCBJRVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cblxuXG4gIG9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cblxuXG5mdW5jdGlvbiBkb21BUEkob3B0aW9ucykge1xuICB2YXIgc3R5bGVFbGVtZW50ID0gb3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaik7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkb21BUEk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQpIHtcbiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R5bGVUYWdUcmFuc2Zvcm07IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlzdCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubGlzdCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvZG8tbGlzdCcpKTtcbiAgICBpZiAoIXRoaXMubGlzdCkge1xuICAgICAgdGhpcy5saXN0ID0gW107XG4gICAgfVxuICAgIHRoaXMuZGlzcGxheSgpO1xuICB9XG5cbiAgZGlzcGxheSgpIHtcbiAgICB0aGlzLnNhdmVEYXRhKCk7XG4gICAgY29uc3QgbGlzdFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlzdC1pdGVtcycpO1xuICAgIGxpc3RTZWN0aW9uLmlubmVySFRNTCA9ICcnO1xuICAgIHRoaXMubGlzdC5mb3JFYWNoKChhY3Rpdml0eSkgPT4ge1xuICAgICAgbGV0IGFjdGl2aXR5SXRlbSA9IGA8bGkgY2xhc3MgPSdkLWZsZXggcy1iZXR3ZWVuIGxpc3QtaXRlbScgaWQgPSdpdGVtLWRhdGEtJHthY3Rpdml0eS5pbmRleH0nPiBgO1xuICAgICAgaWYgKGFjdGl2aXR5LmNvbXBsZXRlZCkge1xuICAgICAgICBhY3Rpdml0eUl0ZW0gKz0gYDxzcGFuIGNsYXNzPSdtYXRlcmlhbC1pY29ucyBkb25lIHVwZGF0ZS1zdGF0dXMnIGRhdGE9JyR7YWN0aXZpdHkuaW5kZXh9Jz5cbiAgICAgICAgICAgICAgICBkb25lXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHAgY29udGVudGVkaXRhYmxlPSd0cnVlJyBjbGFzcz0nY29tcGxldGVkIGFjdGl2aXR5JyBkYXRhPScke2FjdGl2aXR5LmluZGV4fSc+XG4gICAgICAgICAgICAgICAgJHthY3Rpdml0eS5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICBgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZpdHlJdGVtICs9IGBcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J21hdGVyaWFsLWljb25zICB1cGRhdGUtc3RhdHVzJyAgZGF0YT0nJHthY3Rpdml0eS5pbmRleH0nPlxuICAgICAgICAgICAgICAgIGNoZWNrX2JveF9vdXRsaW5lX2JsYW5rXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHAgY29udGVudGVkaXRhYmxlPSd0cnVlJyBjbGFzcz0nYWN0aXZpdHknIGRhdGE9JyR7YWN0aXZpdHkuaW5kZXh9Jz5cbiAgICAgICAgICAgICAgICAke2FjdGl2aXR5LmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICA8L3A+YDtcbiAgICAgIH1cbiAgICAgIGFjdGl2aXR5SXRlbSArPSBgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz0nbWF0ZXJpYWwtaWNvbnMgZGVsZXRlLWFjdGl2aXR5JyBkYXRhPScke2FjdGl2aXR5LmluZGV4fSc+XG4gICAgICAgICAgICAgIGRlbGV0ZVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIGA7XG4gICAgICBsaXN0U2VjdGlvbi5pbm5lckhUTUwgKz0gYWN0aXZpdHlJdGVtO1xuICAgIH0pO1xuICAgIHRoaXMuYWN0aXZpdHlBY3Rpb25zKCk7XG4gIH1cblxuICBzYXZlRGF0YSgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGlzdC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdGhpcy5saXN0W2ldLmluZGV4ID0gaTtcbiAgICB9XG4gICAgdGhpcy5saXN0LnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGlmIChhLmluZGV4IDwgYi5pbmRleCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBpZiAoYS5pbmRleCA+IGIuaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9kby1saXN0JywgSlNPTi5zdHJpbmdpZnkodGhpcy5saXN0KSk7XG4gIH1cblxuICBhZGRBY3Rpdml0eShhY3Rpdml0eSkge1xuICAgIGlmIChhY3Rpdml0eS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXdBY3Rpdml0eSA9IHtcbiAgICAgICAgZGVzY3JpcHRpb246IGFjdGl2aXR5LFxuICAgICAgICBjb21wbGV0ZWQ6IGZhbHNlLFxuICAgICAgICBpbmRleDogdGhpcy5saXN0Lmxlbmd0aCxcbiAgICAgIH07XG4gICAgICB0aGlzLmxpc3QucHVzaChuZXdBY3Rpdml0eSk7XG4gICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgIHRoaXMuc2F2ZURhdGEoKTtcbiAgICB9XG4gIH1cblxuICBkZWxldGVBbGwoKSB7XG4gICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XG4gICAgdGhpcy5saXN0ID0gW107XG4gICAgdGhpcy5kaXNwbGF5KCk7XG4gIH1cblxuICB1cGRhdGVTdGF0dXMoaW5kZXgpIHtcbiAgICBpZiAodGhpcy5saXN0W2luZGV4XS5jb21wbGV0ZWQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMubGlzdFtpbmRleF0uY29tcGxldGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxpc3RbaW5kZXhdLmNvbXBsZXRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubGlzdFtpbmRleF0uY29tcGxldGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5kaXNwbGF5KCk7XG4gIH1cblxuICBkZWxldGVDb21wbGV0ZWQoaW5kZXgpIHtcbiAgICB0aGlzLmxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmRpc3BsYXkoKTtcbiAgfVxuXG4gIGNsZWFyQ29tcGxldGVkKCkge1xuICAgIHRoaXMubGlzdCA9IHRoaXMubGlzdC5maWx0ZXIoKGFjdGl2aXR5KSA9PiBhY3Rpdml0eS5jb21wbGV0ZWQgPT09IGZhbHNlKTtcbiAgICB0aGlzLmRpc3BsYXkoKTtcbiAgfVxuXG4gIGVkaXRBY3Rpdml0eShpbmRleCwgZGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLmxpc3RbaW5kZXhdLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5zYXZlRGF0YSgpO1xuICB9XG5cbiAgYWN0aXZpdHlBY3Rpb25zKCkge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnVwZGF0ZS1zdGF0dXMnKTtcbiAgICBpZiAoY2hlY2tib3ggIT09IG51bGwpIHtcbiAgICAgIGNoZWNrYm94LmZvckVhY2goKGJveCkgPT4ge1xuICAgICAgICBib3guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoYm94LmdldEF0dHJpYnV0ZSgnZGF0YScpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxldGVBY3Rpdml0eSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZWxldGUtYWN0aXZpdHknKTtcbiAgICBkZWxldGVBY3Rpdml0eS5mb3JFYWNoKChhY3Rpdml0eSkgPT4ge1xuICAgICAgYWN0aXZpdHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVsZXRlQ29tcGxldGVkKGFjdGl2aXR5LmdldEF0dHJpYnV0ZSgnZGF0YScpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZWRpdGVkQWN0aXZpdHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWN0aXZpdHknKTtcbiAgICBpZiAoZWRpdGVkQWN0aXZpdHkpIHtcbiAgICAgIGVkaXRlZEFjdGl2aXR5LmZvckVhY2goKGFjdGl2aXR5KSA9PiB7XG4gICAgICAgIGFjdGl2aXR5LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHtcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGUudGFyZ2V0LmlubmVyVGV4dDtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YScpO1xuICAgICAgICAgIHRoaXMuZWRpdEFjdGl2aXR5KGluZGV4LCBkZXNjcmlwdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0ICcuL3N0eWxlLmNzcyc7XG5pbXBvcnQgTGlzdCBmcm9tICcuL2xpc3QuanMnO1xuXG5jb25zdCB0YXNrcyA9IG5ldyBMaXN0KCk7XG5cbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhZGQtdGFzaycpLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChlKSA9PiB7XG4gIGUucHJldmVudERlZmF1bHQoKTtcbiAgY29uc3QgYWN0aXZpdHkgPSBlLnRhcmdldC5lbGVtZW50cy5hY3Rpdml0eS52YWx1ZTtcbiAgdGFza3MuYWRkQWN0aXZpdHkoYWN0aXZpdHkpO1xuICBlLnRhcmdldC5yZXNldCgpO1xufSk7XG5cbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkZWxldGUtYWxsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gIHRhc2tzLmRlbGV0ZUFsbCgpO1xufSk7XG5cbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jbGVhci1jb21wbGV0ZWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgdGFza3MuY2xlYXJDb21wbGV0ZWQoKTtcbn0pOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "to-do-list", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "dependencies": { 7 | "abab": "^2.0.5", 8 | "abbrev": "^1.1.1", 9 | "accepts": "^1.3.8", 10 | "acorn": "^8.7.0", 11 | "acorn-globals": "^6.0.0", 12 | "acorn-import-assertions": "^1.8.0", 13 | "acorn-jsx": "^5.3.2", 14 | "acorn-jsx-walk": "^2.0.0", 15 | "acorn-walk": "^8.2.0", 16 | "agent-base": "^6.0.2", 17 | "agentkeepalive": "^4.2.1", 18 | "aggregate-error": "^3.1.0", 19 | "ajv": "^6.12.6", 20 | "ajv-formats": "^2.1.1", 21 | "ajv-keywords": "^3.5.2", 22 | "ansi-align": "^3.0.1", 23 | "ansi-colors": "^4.1.1", 24 | "ansi-html-community": "^0.0.8", 25 | "ansi-regex": "^5.0.1", 26 | "ansi-styles": "^3.2.1", 27 | "anymatch": "^3.1.2", 28 | "aproba": "^2.0.0", 29 | "are-we-there-yet": "^2.0.0", 30 | "argparse": "^1.0.10", 31 | "array-flatten": "^2.1.2", 32 | "array-includes": "^3.1.4", 33 | "array-union": "^2.1.0", 34 | "array.prototype.flat": "^1.2.5", 35 | "arrify": "^1.0.1", 36 | "asn1": "^0.2.6", 37 | "assert-plus": "^1.0.0", 38 | "ast-types": "^0.13.4", 39 | "astral-regex": "^2.0.0", 40 | "async": "^2.6.3", 41 | "asynckit": "^0.4.0", 42 | "autoprefixer": "^9.8.8", 43 | "aws-sign2": "^0.7.0", 44 | "aws4": "^1.11.0", 45 | "axe-core": "^4.4.1", 46 | "bail": "^1.0.5", 47 | "balanced-match": "^1.0.2", 48 | "base64-js": "^1.5.1", 49 | "batch": "^0.6.1", 50 | "bcp47": "^1.1.2", 51 | "bcrypt-pbkdf": "^1.0.2", 52 | "binary-extensions": "^2.2.0", 53 | "bl": "^4.1.0", 54 | "body-parser": "^1.19.2", 55 | "bonjour": "^3.5.0", 56 | "boolbase": "^1.0.0", 57 | "boxen": "^5.1.2", 58 | "brace-expansion": "^1.1.11", 59 | "braces": "^3.0.2", 60 | "browser-process-hrtime": "^1.0.0", 61 | "browserslist": "^4.20.2", 62 | "buffer": "^5.7.1", 63 | "buffer-crc32": "^0.2.13", 64 | "buffer-from": "^1.1.2", 65 | "buffer-indexof": "^1.1.1", 66 | "builtins": "^1.0.3", 67 | "bytes": "^3.0.0", 68 | "cacache": "^16.0.3", 69 | "cacheable-lookup": "^5.0.4", 70 | "cacheable-request": "^7.0.2", 71 | "call-bind": "^1.0.2", 72 | "callsites": "^3.1.0", 73 | "camel-case": "^4.1.2", 74 | "camelcase": "^5.3.1", 75 | "camelcase-keys": "^6.2.2", 76 | "caniuse-lite": "^1.0.30001320", 77 | "canvas": "^2.9.1", 78 | "caseless": "^0.12.0", 79 | "chalk": "^2.4.2", 80 | "character-entities": "^1.2.4", 81 | "character-entities-legacy": "^1.1.4", 82 | "character-reference-invalid": "^1.1.4", 83 | "chokidar": "^3.5.3", 84 | "chownr": "^2.0.0", 85 | "chrome-trace-event": "^1.0.3", 86 | "ci-info": "^3.3.0", 87 | "clean-css": "^5.2.4", 88 | "clean-stack": "^2.2.0", 89 | "cli-boxes": "^2.2.1", 90 | "cli-cursor": "^3.1.0", 91 | "cli-spinners": "^2.6.1", 92 | "clone": "^1.0.4", 93 | "clone-deep": "^4.0.1", 94 | "clone-regexp": "^2.2.0", 95 | "clone-response": "^1.0.2", 96 | "cloudinary": "^1.29.0", 97 | "cloudinary-core": "^2.12.3", 98 | "color-convert": "^1.9.3", 99 | "color-name": "^1.1.3", 100 | "color-string": "^1.9.0", 101 | "color-support": "^1.1.3", 102 | "colorette": "^2.0.16", 103 | "combined-stream": "^1.0.8", 104 | "commander": "^2.20.3", 105 | "compressible": "^2.0.18", 106 | "compression": "^1.7.4", 107 | "concat-map": "^0.0.1", 108 | "configstore": "^5.0.1", 109 | "confusing-browser-globals": "^1.0.11", 110 | "connect-history-api-fallback": "^1.6.0", 111 | "console-control-strings": "^1.1.0", 112 | "content-disposition": "^0.5.4", 113 | "content-type": "^1.0.4", 114 | "convert-source-map": "^1.8.0", 115 | "cookie": "^0.4.2", 116 | "cookie-signature": "^1.0.6", 117 | "core-js": "^3.6.5", 118 | "core-util-is": "^1.0.3", 119 | "cosmiconfig": "^7.0.1", 120 | "cross-fetch": "^3.1.5", 121 | "cross-spawn": "^7.0.3", 122 | "crypto-random-string": "^2.0.0", 123 | "css-loader": "^6.7.1", 124 | "css-select": "^4.2.1", 125 | "css-tree": "^1.1.3", 126 | "css-what": "^5.1.0", 127 | "cssesc": "^3.0.0", 128 | "cssom": "^0.5.0", 129 | "cssstyle": "^2.3.0", 130 | "dashdash": "^1.14.1", 131 | "data-uri-to-buffer": "^3.0.1", 132 | "data-urls": "^3.0.1", 133 | "debug": "^2.6.9", 134 | "decamelize": "^1.2.0", 135 | "decamelize-keys": "^1.1.0", 136 | "decimal.js": "^10.3.1", 137 | "decompress-response": "^6.0.0", 138 | "deep-equal": "^1.1.1", 139 | "deep-extend": "^0.6.0", 140 | "deep-is": "^0.1.4", 141 | "default-gateway": "^6.0.3", 142 | "defaults": "^1.0.3", 143 | "defer-to-connect": "^2.0.1", 144 | "define-lazy-prop": "^2.0.0", 145 | "define-properties": "^1.1.3", 146 | "degenerator": "^3.0.2", 147 | "del": "^6.0.0", 148 | "delayed-stream": "^1.0.0", 149 | "delegates": "^1.0.0", 150 | "depd": "^1.1.2", 151 | "destroy": "^1.0.4", 152 | "detect-libc": "^1.0.3", 153 | "detect-node": "^2.1.0", 154 | "devtools-protocol": "^0.0.969999", 155 | "dir-glob": "^3.0.1", 156 | "dns-equal": "^1.0.0", 157 | "dns-packet": "^1.3.4", 158 | "dns-txt": "^2.0.2", 159 | "doctrine": "^3.0.0", 160 | "dom-converter": "^0.2.0", 161 | "dom-serializer": "^1.3.2", 162 | "domelementtype": "^2.2.0", 163 | "domexception": "^4.0.0", 164 | "domhandler": "^4.3.1", 165 | "domutils": "^2.8.0", 166 | "dot-case": "^3.0.4", 167 | "dot-prop": "^5.3.0", 168 | "duplexer3": "^0.1.4", 169 | "ecc-jsbn": "^0.1.2", 170 | "ee-first": "^1.1.1", 171 | "ejs": "^3.1.6", 172 | "electron-to-chromium": "^1.4.92", 173 | "emoji-regex": "^8.0.0", 174 | "encodeurl": "^1.0.2", 175 | "encoding": "^0.1.13", 176 | "end-of-stream": "^1.4.4", 177 | "enhanced-resolve": "^5.9.2", 178 | "enquirer": "^2.3.6", 179 | "entities": "^2.2.0", 180 | "envinfo": "^7.8.1", 181 | "err-code": "^2.0.3", 182 | "error-ex": "^1.3.2", 183 | "es-abstract": "^1.19.1", 184 | "es-module-lexer": "^0.9.3", 185 | "es-to-primitive": "^1.2.1", 186 | "escalade": "^3.1.1", 187 | "escape-goat": "^2.1.1", 188 | "escape-html": "^1.0.3", 189 | "escape-string-regexp": "^1.0.5", 190 | "escodegen": "^2.0.0", 191 | "eslint-import-resolver-node": "^0.3.6", 192 | "eslint-module-utils": "^2.7.3", 193 | "eslint-scope": "^5.1.1", 194 | "eslint-utils": "^2.1.0", 195 | "eslint-visitor-keys": "^1.3.0", 196 | "espree": "^7.3.1", 197 | "esprima": "^4.0.1", 198 | "esquery": "^1.4.0", 199 | "esrecurse": "^4.3.0", 200 | "estraverse": "^4.3.0", 201 | "esutils": "^2.0.3", 202 | "etag": "^1.8.1", 203 | "eventemitter2": "^6.4.5", 204 | "eventemitter3": "^4.0.7", 205 | "events": "^3.3.0", 206 | "execa": "^5.1.1", 207 | "execall": "^2.0.0", 208 | "express": "^4.17.3", 209 | "extend": "^3.0.2", 210 | "extract-zip": "^2.0.1", 211 | "extsprintf": "^1.3.0", 212 | "fast-deep-equal": "^3.1.3", 213 | "fast-glob": "^3.2.11", 214 | "fast-json-stable-stringify": "^2.1.0", 215 | "fast-levenshtein": "^2.0.6", 216 | "fast-xml-parser": "^3.21.1", 217 | "fastest-levenshtein": "^1.0.12", 218 | "fastq": "^1.13.0", 219 | "faye-websocket": "^0.11.4", 220 | "fd-slicer": "^1.1.0", 221 | "file-entry-cache": "^6.0.1", 222 | "file-type": "^16.5.3", 223 | "file-uri-to-path": "^2.0.0", 224 | "filelist": "^1.0.2", 225 | "fill-range": "^7.0.1", 226 | "finalhandler": "^1.1.2", 227 | "find-up": "^4.1.0", 228 | "flat-cache": "^3.0.4", 229 | "flatted": "^3.2.5", 230 | "follow-redirects": "^1.14.9", 231 | "forever-agent": "^0.6.1", 232 | "form-data": "^4.0.0", 233 | "forwarded": "^0.2.0", 234 | "fresh": "^0.5.2", 235 | "fs-constants": "^1.0.0", 236 | "fs-extra": "^10.0.1", 237 | "fs-minipass": "^2.1.0", 238 | "fs-monkey": "^1.0.3", 239 | "fs.realpath": "^1.0.0", 240 | "ftp": "^0.3.10", 241 | "function-bind": "^1.1.1", 242 | "functional-red-black-tree": "^1.0.1", 243 | "gauge": "^3.0.2", 244 | "gensync": "^1.0.0-beta.2", 245 | "get-intrinsic": "^1.1.1", 246 | "get-stdin": "^8.0.0", 247 | "get-stream": "^6.0.1", 248 | "get-symbol-description": "^1.0.0", 249 | "get-uri": "^3.0.2", 250 | "getpass": "^0.1.7", 251 | "glob": "^7.2.0", 252 | "glob-parent": "^5.1.2", 253 | "glob-to-regexp": "^0.4.1", 254 | "global-dirs": "^3.0.0", 255 | "global-modules": "^2.0.0", 256 | "global-prefix": "^3.0.0", 257 | "globals": "^11.12.0", 258 | "globby": "^11.1.0", 259 | "globjoin": "^0.1.4", 260 | "gonzales-pe": "^4.3.0", 261 | "got": "^11.8.3", 262 | "graceful-fs": "^4.2.9", 263 | "handle-thing": "^2.0.1", 264 | "har-schema": "^2.0.0", 265 | "har-validator": "^5.1.5", 266 | "hard-rejection": "^2.1.0", 267 | "has": "^1.0.3", 268 | "has-bigints": "^1.0.1", 269 | "has-flag": "^4.0.0", 270 | "has-symbols": "^1.0.3", 271 | "has-tostringtag": "^1.0.0", 272 | "has-unicode": "^2.0.1", 273 | "has-yarn": "^2.1.0", 274 | "he": "^1.2.0", 275 | "hosted-git-info": "^5.0.0", 276 | "hpack.js": "^2.1.6", 277 | "html-encoding-sniffer": "^3.0.0", 278 | "html-entities": "^2.3.2", 279 | "html-minifier-terser": "^6.1.0", 280 | "html-tags": "^3.1.0", 281 | "html-webpack-plugin": "^5.5.0", 282 | "htmlparser2": "^6.1.0", 283 | "http-cache-semantics": "^4.1.0", 284 | "http-deceiver": "^1.2.7", 285 | "http-errors": "^1.8.1", 286 | "http-parser-js": "^0.5.6", 287 | "http-proxy": "^1.18.1", 288 | "http-proxy-agent": "^5.0.0", 289 | "http-proxy-middleware": "^2.0.4", 290 | "http-signature": "^1.2.0", 291 | "http2-wrapper": "^1.0.3", 292 | "https-proxy-agent": "^5.0.0", 293 | "human-signals": "^2.1.0", 294 | "humanize-ms": "^1.2.1", 295 | "iconv-lite": "^0.4.24", 296 | "icss-utils": "^5.1.0", 297 | "ieee754": "^1.2.1", 298 | "ignore": "^5.2.0", 299 | "image-size": "^1.0.1", 300 | "import-fresh": "^3.3.0", 301 | "import-lazy": "^4.0.0", 302 | "import-local": "^3.1.0", 303 | "imurmurhash": "^0.1.4", 304 | "indent-string": "^4.0.0", 305 | "infer-owner": "^1.0.4", 306 | "inflight": "^1.0.6", 307 | "inherits": "^2.0.4", 308 | "ini": "^1.3.8", 309 | "internal-slot": "^1.0.3", 310 | "interpret": "^2.2.0", 311 | "invert-kv": "^3.0.1", 312 | "ip": "^1.1.5", 313 | "ipaddr.js": "^2.0.1", 314 | "is-alphabetical": "^1.0.4", 315 | "is-alphanumerical": "^1.0.4", 316 | "is-arguments": "^1.1.1", 317 | "is-arrayish": "^0.3.2", 318 | "is-bigint": "^1.0.4", 319 | "is-binary-path": "^2.1.0", 320 | "is-boolean-object": "^1.1.2", 321 | "is-buffer": "^2.0.5", 322 | "is-callable": "^1.2.4", 323 | "is-ci": "^3.0.1", 324 | "is-core-module": "^2.8.1", 325 | "is-date-object": "^1.0.5", 326 | "is-decimal": "^1.0.4", 327 | "is-docker": "^2.2.1", 328 | "is-extglob": "^2.1.1", 329 | "is-fullwidth-code-point": "^3.0.0", 330 | "is-glob": "^4.0.3", 331 | "is-hexadecimal": "^1.0.4", 332 | "is-installed-globally": "^0.4.0", 333 | "is-interactive": "^1.0.0", 334 | "is-lambda": "^1.0.1", 335 | "is-negative-zero": "^2.0.2", 336 | "is-npm": "^5.0.0", 337 | "is-number": "^7.0.0", 338 | "is-number-object": "^1.0.6", 339 | "is-obj": "^2.0.0", 340 | "is-path-cwd": "^2.2.0", 341 | "is-path-inside": "^3.0.3", 342 | "is-plain-obj": "^3.0.0", 343 | "is-plain-object": "^2.0.4", 344 | "is-potential-custom-element-name": "^1.0.1", 345 | "is-regex": "^1.1.4", 346 | "is-regexp": "^2.1.0", 347 | "is-shared-array-buffer": "^1.0.1", 348 | "is-stream": "^2.0.1", 349 | "is-string": "^1.0.7", 350 | "is-svg": "^4.3.2", 351 | "is-symbol": "^1.0.4", 352 | "is-typedarray": "^1.0.0", 353 | "is-unicode-supported": "^0.1.0", 354 | "is-weakref": "^1.0.2", 355 | "is-wsl": "^2.2.0", 356 | "is-yarn-global": "^0.3.0", 357 | "isarray": "^1.0.0", 358 | "isexe": "^2.0.0", 359 | "isobject": "^3.0.1", 360 | "isstream": "^0.1.2", 361 | "jake": "^10.8.4", 362 | "jest-worker": "^27.5.1", 363 | "js-library-detector": "^6.4.0", 364 | "js-tokens": "^4.0.0", 365 | "js-yaml": "^3.14.1", 366 | "jsbn": "^0.1.1", 367 | "jsdom": "^19.0.0", 368 | "jsesc": "^2.5.2", 369 | "json-buffer": "^3.0.1", 370 | "json-parse-better-errors": "^1.0.2", 371 | "json-parse-even-better-errors": "^2.3.1", 372 | "json-schema": "^0.4.0", 373 | "json-schema-traverse": "^0.4.1", 374 | "json-stable-stringify-without-jsonify": "^1.0.1", 375 | "json-stringify-safe": "^5.0.1", 376 | "json5": "^2.2.1", 377 | "jsonc-parser": "^3.0.0", 378 | "jsonfile": "^6.1.0", 379 | "jsonparse": "^1.3.1", 380 | "jsprim": "^1.4.2", 381 | "keyv": "^4.1.1", 382 | "kind-of": "^6.0.3", 383 | "known-css-properties": "^0.21.0", 384 | "latest-version": "^5.1.0", 385 | "lcid": "^3.1.1", 386 | "levn": "^0.4.1", 387 | "lines-and-columns": "^1.2.4", 388 | "loader-runner": "^4.2.0", 389 | "locate-path": "^5.0.0", 390 | "lockfile": "^1.0.4", 391 | "lodash": "^4.17.21", 392 | "lodash.merge": "^4.6.2", 393 | "lodash.truncate": "^4.4.2", 394 | "log-symbols": "^4.1.0", 395 | "longest-streak": "^2.0.4", 396 | "lower-case": "^2.0.2", 397 | "lowercase-keys": "^2.0.0", 398 | "lru-cache": "^6.0.0", 399 | "make-dir": "^3.1.0", 400 | "make-fetch-happen": "^10.0.6", 401 | "map-age-cleaner": "^0.1.3", 402 | "map-obj": "^4.3.0", 403 | "mathml-tag-names": "^2.1.3", 404 | "mdast-util-from-markdown": "^0.8.5", 405 | "mdast-util-to-markdown": "^0.6.5", 406 | "mdast-util-to-string": "^2.0.0", 407 | "mdn-data": "^2.0.27", 408 | "media-typer": "^0.3.0", 409 | "mem": "^5.1.1", 410 | "memfs": "^3.4.1", 411 | "meow": "^9.0.0", 412 | "merge-descriptors": "^1.0.1", 413 | "merge-stream": "^2.0.0", 414 | "merge2": "^1.4.1", 415 | "metaviewport-parser": "^0.2.0", 416 | "methods": "^1.1.2", 417 | "micromark": "^2.11.4", 418 | "micromatch": "^4.0.4", 419 | "mime": "^1.6.0", 420 | "mime-db": "^1.52.0", 421 | "mime-types": "^2.1.35", 422 | "mimic-fn": "^2.1.0", 423 | "mimic-response": "^1.0.1", 424 | "min-indent": "^1.0.1", 425 | "minimalistic-assert": "^1.0.1", 426 | "minimatch": "^3.1.2", 427 | "minimist": "^1.2.6", 428 | "minimist-options": "^4.1.0", 429 | "minipass": "^3.1.6", 430 | "minipass-collect": "^1.0.2", 431 | "minipass-fetch": "^2.0.3", 432 | "minipass-flush": "^1.0.5", 433 | "minipass-json-stream": "^1.0.1", 434 | "minipass-pipeline": "^1.2.4", 435 | "minipass-sized": "^1.0.3", 436 | "minizlib": "^2.1.2", 437 | "mkdirp": "^0.5.6", 438 | "mkdirp-classic": "^0.5.3", 439 | "ms": "^2.0.0", 440 | "multicast-dns": "^6.2.3", 441 | "multicast-dns-service-types": "^1.1.0", 442 | "mutationobserver-shim": "^0.3.7", 443 | "nan": "^2.15.0", 444 | "nanoid": "^3.3.1", 445 | "natural-compare": "^1.4.0", 446 | "negotiator": "^0.6.3", 447 | "neo-async": "^2.6.2", 448 | "netmask": "^2.0.2", 449 | "no-case": "^3.0.4", 450 | "node-fetch": "^2.6.7", 451 | "node-forge": "^1.3.0", 452 | "node-releases": "^2.0.2", 453 | "nopt": "^5.0.0", 454 | "normalize-package-data": "^3.0.3", 455 | "normalize-path": "^3.0.0", 456 | "normalize-range": "^0.1.2", 457 | "normalize-selector": "^0.2.0", 458 | "normalize-url": "^6.1.0", 459 | "npm-package-arg": "^9.0.1", 460 | "npm-registry-fetch": "^13.1.0", 461 | "npm-run-path": "^4.0.1", 462 | "npmlog": "^5.0.1", 463 | "nth-check": "^2.0.1", 464 | "num2fraction": "^1.2.2", 465 | "nwsapi": "^2.2.0", 466 | "oauth-sign": "^0.9.0", 467 | "object-assign": "^4.1.1", 468 | "object-inspect": "^1.12.0", 469 | "object-is": "^1.1.5", 470 | "object-keys": "^1.1.1", 471 | "object.assign": "^4.1.2", 472 | "object.entries": "^1.1.5", 473 | "object.values": "^1.1.5", 474 | "obuf": "^1.1.2", 475 | "on-finished": "^2.3.0", 476 | "on-headers": "^1.0.2", 477 | "once": "^1.4.0", 478 | "onetime": "^5.1.2", 479 | "open": "^8.4.0", 480 | "optionator": "^0.9.1", 481 | "ora": "^5.4.1", 482 | "os-locale": "^5.0.0", 483 | "p-cancelable": "^2.1.1", 484 | "p-defer": "^1.0.0", 485 | "p-is-promise": "^2.1.0", 486 | "p-limit": "^2.3.0", 487 | "p-locate": "^4.1.0", 488 | "p-map": "^4.0.0", 489 | "p-retry": "^4.6.1", 490 | "p-try": "^2.2.0", 491 | "pac-proxy-agent": "^5.0.0", 492 | "pac-resolver": "^5.0.0", 493 | "package-json": "^6.5.0", 494 | "param-case": "^3.0.4", 495 | "parent-module": "^1.0.1", 496 | "parse-entities": "^2.0.0", 497 | "parse-json": "^5.2.0", 498 | "parse5": "^6.0.1", 499 | "parse5-htmlparser2-tree-adapter": "^6.0.1", 500 | "parseurl": "^1.3.3", 501 | "pascal-case": "^3.1.2", 502 | "path-exists": "^4.0.0", 503 | "path-is-absolute": "^1.0.1", 504 | "path-key": "^3.1.1", 505 | "path-parse": "^1.0.7", 506 | "path-to-regexp": "^0.1.7", 507 | "path-type": "^4.0.0", 508 | "peek-readable": "^4.1.0", 509 | "pend": "^1.2.0", 510 | "performance-now": "^2.1.0", 511 | "picocolors": "^1.0.0", 512 | "picomatch": "^2.3.1", 513 | "pkg-dir": "^4.2.0", 514 | "portfinder": "^1.0.28", 515 | "postcss": "^8.4.12", 516 | "postcss-html": "^0.36.0", 517 | "postcss-less": "^5.0.0", 518 | "postcss-media-query-parser": "^0.2.3", 519 | "postcss-modules-extract-imports": "^3.0.0", 520 | "postcss-modules-local-by-default": "^4.0.0", 521 | "postcss-modules-scope": "^3.0.0", 522 | "postcss-modules-values": "^4.0.0", 523 | "postcss-resolve-nested-selector": "^0.1.1", 524 | "postcss-safe-parser": "^6.0.0", 525 | "postcss-sass": "^0.5.0", 526 | "postcss-scss": "^4.0.3", 527 | "postcss-selector-parser": "^6.0.9", 528 | "postcss-syntax": "^0.36.2", 529 | "postcss-value-parser": "^4.2.0", 530 | "prelude-ls": "^1.2.1", 531 | "prepend-http": "^2.0.0", 532 | "pretty-error": "^4.0.0", 533 | "proc-log": "^2.0.0", 534 | "process-nextick-args": "^2.0.1", 535 | "progress": "^2.0.3", 536 | "promise-inflight": "^1.0.1", 537 | "promise-retry": "^2.0.1", 538 | "proxy-addr": "^2.0.7", 539 | "proxy-agent": "^5.0.0", 540 | "proxy-from-env": "^1.1.0", 541 | "psl": "^1.8.0", 542 | "pump": "^3.0.0", 543 | "punycode": "^2.1.1", 544 | "pupa": "^2.1.1", 545 | "puppeteer-core": "^13.5.1", 546 | "q": "^1.5.1", 547 | "qs": "^6.9.7", 548 | "queue": "^6.0.2", 549 | "queue-microtask": "^1.2.3", 550 | "quick-lru": "^5.1.1", 551 | "randombytes": "^2.1.0", 552 | "range-parser": "^1.2.1", 553 | "raw-body": "^2.4.3", 554 | "rc": "^1.2.8", 555 | "read-pkg": "^5.2.0", 556 | "read-pkg-up": "^7.0.1", 557 | "readable-stream": "^3.6.0", 558 | "readable-web-to-node-stream": "^3.0.2", 559 | "readdirp": "^3.6.0", 560 | "rechoir": "^0.7.1", 561 | "redent": "^3.0.0", 562 | "regexp.prototype.flags": "^1.4.1", 563 | "regexpp": "^3.2.0", 564 | "registry-auth-token": "^4.2.1", 565 | "registry-url": "^5.1.0", 566 | "relateurl": "^0.2.7", 567 | "remark": "^13.0.0", 568 | "remark-parse": "^9.0.0", 569 | "remark-stringify": "^9.0.1", 570 | "renderkid": "^3.0.0", 571 | "repeat-string": "^1.6.1", 572 | "request": "^2.88.2", 573 | "require-from-string": "^2.0.2", 574 | "requires-port": "^1.0.0", 575 | "resolve": "^1.22.0", 576 | "resolve-alpn": "^1.2.1", 577 | "resolve-cwd": "^3.0.0", 578 | "resolve-from": "^5.0.0", 579 | "responselike": "^2.0.0", 580 | "restore-cursor": "^3.1.0", 581 | "retry": "^0.13.1", 582 | "reusify": "^1.0.4", 583 | "rimraf": "^3.0.2", 584 | "run-parallel": "^1.2.0", 585 | "safe-buffer": "^5.2.1", 586 | "safer-buffer": "^2.1.2", 587 | "saxes": "^5.0.1", 588 | "schema-utils": "^3.1.1", 589 | "select-hose": "^2.0.0", 590 | "selfsigned": "^2.0.0", 591 | "semver": "^7.3.5", 592 | "semver-diff": "^3.1.1", 593 | "send": "^0.17.2", 594 | "serialize-javascript": "^6.0.0", 595 | "serve-index": "^1.9.1", 596 | "serve-static": "^1.14.2", 597 | "set-blocking": "^2.0.0", 598 | "setimmediate": "^1.0.5", 599 | "setprototypeof": "^1.2.0", 600 | "shallow-clone": "^3.0.1", 601 | "shebang-command": "^2.0.0", 602 | "shebang-regex": "^3.0.0", 603 | "side-channel": "^1.0.4", 604 | "signal-exit": "^3.0.7", 605 | "simple-concat": "^1.0.1", 606 | "simple-get": "^3.1.1", 607 | "simple-swizzle": "^0.2.2", 608 | "slash": "^3.0.0", 609 | "slice-ansi": "^4.0.0", 610 | "smart-buffer": "^4.2.0", 611 | "sockjs": "^0.3.24", 612 | "socks": "^2.6.2", 613 | "socks-proxy-agent": "^6.1.1", 614 | "source-map": "^0.6.1", 615 | "source-map-js": "^1.0.2", 616 | "source-map-support": "^0.5.21", 617 | "spdx-correct": "^3.1.1", 618 | "spdx-exceptions": "^2.3.0", 619 | "spdx-expression-parse": "^3.0.1", 620 | "spdx-license-ids": "^3.0.11", 621 | "spdy": "^4.0.2", 622 | "spdy-transport": "^3.0.0", 623 | "specificity": "^0.4.1", 624 | "sprintf-js": "^1.0.3", 625 | "sshpk": "^1.17.0", 626 | "ssri": "^8.0.1", 627 | "statuses": "^1.5.0", 628 | "string_decoder": "^1.3.0", 629 | "string-width": "^4.2.3", 630 | "string.prototype.trimend": "^1.0.4", 631 | "string.prototype.trimstart": "^1.0.4", 632 | "strip-ansi": "^6.0.1", 633 | "strip-bom": "^3.0.0", 634 | "strip-final-newline": "^2.0.0", 635 | "strip-indent": "^3.0.0", 636 | "strip-json-comments": "^3.1.1", 637 | "strnum": "^1.0.5", 638 | "strtok3": "^6.3.0", 639 | "style-loader": "^3.3.1", 640 | "style-search": "^0.1.0", 641 | "stylelint-config-recommended": "^4.0.0", 642 | "sugarss": "^2.0.0", 643 | "supports-color": "^8.1.1", 644 | "supports-preserve-symlinks-flag": "^1.0.0", 645 | "svg-tags": "^1.0.0", 646 | "symbol-tree": "^3.2.4", 647 | "table": "^6.8.0", 648 | "tapable": "^2.2.1", 649 | "tar": "^6.1.11", 650 | "tar-fs": "^2.1.1", 651 | "tar-stream": "^2.2.0", 652 | "terser": "^5.12.1", 653 | "terser-webpack-plugin": "^5.3.1", 654 | "text-table": "^0.2.0", 655 | "through": "^2.3.8", 656 | "thunky": "^1.1.0", 657 | "to-fast-properties": "^2.0.0", 658 | "to-readable-stream": "^1.0.0", 659 | "to-regex-range": "^5.0.1", 660 | "toidentifier": "^1.0.1", 661 | "token-types": "^4.2.0", 662 | "tough-cookie": "^4.0.0", 663 | "tr46": "^3.0.0", 664 | "trim-newlines": "^3.0.1", 665 | "trough": "^1.0.5", 666 | "tsconfig-paths": "^3.14.1", 667 | "tslib": "^2.3.1", 668 | "tsutils": "^3.21.0", 669 | "tunnel-agent": "^0.6.0", 670 | "tweetnacl": "^0.14.5", 671 | "type-check": "^0.4.0", 672 | "type-fest": "^0.18.1", 673 | "type-is": "^1.6.18", 674 | "typedarray-to-buffer": "^3.1.5", 675 | "typescript": "^4.6.2", 676 | "unbox-primitive": "^1.0.1", 677 | "unbzip2-stream": "^1.4.3", 678 | "unified": "^9.2.2", 679 | "unique-filename": "^1.1.1", 680 | "unique-slug": "^2.0.2", 681 | "unique-string": "^2.0.0", 682 | "unist-util-find-all-after": "^3.0.2", 683 | "unist-util-is": "^4.1.0", 684 | "unist-util-stringify-position": "^2.0.3", 685 | "universalify": "^2.0.0", 686 | "unpipe": "^1.0.0", 687 | "update-notifier": "^5.1.0", 688 | "uri-js": "^4.4.1", 689 | "url-parse-lax": "^3.0.0", 690 | "util-deprecate": "^1.0.2", 691 | "utila": "^0.4.0", 692 | "utils-merge": "^1.0.1", 693 | "uuid": "^8.3.2", 694 | "v8-compile-cache": "^2.3.0", 695 | "validate-npm-package-license": "^3.0.4", 696 | "validate-npm-package-name": "^3.0.0", 697 | "vary": "^1.1.2", 698 | "verror": "^1.10.0", 699 | "vfile": "^4.2.1", 700 | "vfile-message": "^2.0.4", 701 | "vm2": "^3.9.9", 702 | "w3c-hr-time": "^1.0.2", 703 | "w3c-xmlserializer": "^3.0.0", 704 | "watchpack": "^2.3.1", 705 | "wbuf": "^1.7.3", 706 | "wcwidth": "^1.0.1", 707 | "webidl-conversions": "^7.0.0", 708 | "webpack": "^5.70.0", 709 | "webpack-dev-middleware": "^5.3.1", 710 | "webpack-dev-server": "^4.7.4", 711 | "webpack-merge": "^5.8.0", 712 | "webpack-sources": "^3.2.3", 713 | "websocket-driver": "^0.7.4", 714 | "websocket-extensions": "^0.1.4", 715 | "whatwg-encoding": "^2.0.0", 716 | "whatwg-mimetype": "^3.0.0", 717 | "whatwg-url": "^10.0.0", 718 | "which": "^2.0.2", 719 | "which-boxed-primitive": "^1.0.2", 720 | "wide-align": "^1.1.5", 721 | "widest-line": "^3.1.0", 722 | "wildcard": "^2.0.0", 723 | "word-wrap": "^1.2.3", 724 | "wrap-ansi": "^7.0.0", 725 | "wrappy": "^1.0.2", 726 | "write-file-atomic": "^3.0.3", 727 | "ws": "^8.5.0", 728 | "xdg-basedir": "^4.0.0", 729 | "xml-name-validator": "^4.0.0", 730 | "xmlchars": "^2.2.0", 731 | "xregexp": "^2.0.0", 732 | "yallist": "^4.0.0", 733 | "yaml": "^1.10.2", 734 | "yargs-parser": "^20.2.9", 735 | "yauzl": "^2.10.0", 736 | "zwitch": "^1.0.5" 737 | }, 738 | "devDependencies": { 739 | "babel-eslint": "^10.1.0", 740 | "css-loader": "^6.7.1", 741 | "deploy-to-git": "^0.4.1", 742 | "eslint": "^7.32.0", 743 | "eslint-config-airbnb-base": "^14.2.1", 744 | "eslint-plugin-import": "^2.25.4", 745 | "gh-pages": "^3.2.3", 746 | "hint": "^6.1.10", 747 | "html-webpack-plugin": "^5.5.0", 748 | "style-loader": "^3.3.1", 749 | "stylelint": "^13.13.1", 750 | "stylelint-config-standard": "^21.0.0", 751 | "stylelint-csstree-validator": "^1.9.0", 752 | "stylelint-scss": "^3.21.0", 753 | "webpack": "^5.70.0", 754 | "webpack-cli": "^4.9.2", 755 | "webpack-dev-server": "^4.7.4" 756 | }, 757 | "scripts": { 758 | "test": "echo \"Error: no test specified\" && exit 1", 759 | "build": "webpack", 760 | "start": "webpack serve --open", 761 | "deploy": "gh-pages -d dist" 762 | }, 763 | "repository": { 764 | "type": "git", 765 | "url": "git+https://github.com/AdrianCSM/To-Do-List.git" 766 | }, 767 | "keywords": [], 768 | "author": "", 769 | "license": "ISC", 770 | "bugs": { 771 | "url": "https://github.com/AdrianCSM/To-Do-List/issues" 772 | }, 773 | "homepage": "https://github.com/AdrianCSM/To-Do-List" 774 | } 775 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | To-Do List 8 | 9 | 10 | 11 |
    12 |
    13 | 14 |
    15 |

    Today's To Do

    16 | autorenew 17 |
    18 | 19 |
    20 | 21 | 24 |
    25 | 26 | 29 | 30 |
    31 | Clear All Completed 32 |
    33 | 34 |
    35 |
    36 | 37 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import './style.css'; 2 | import List from './list.js'; 3 | 4 | const tasks = new List(); 5 | 6 | document.querySelector('#add-task').addEventListener('submit', (e) => { 7 | e.preventDefault(); 8 | const activity = e.target.elements.activity.value; 9 | tasks.addActivity(activity); 10 | e.target.reset(); 11 | }); 12 | 13 | document.querySelector('#delete-all').addEventListener('click', () => { 14 | tasks.deleteAll(); 15 | }); 16 | 17 | document.querySelector('.clear-completed').addEventListener('click', () => { 18 | tasks.clearCompleted(); 19 | }); -------------------------------------------------------------------------------- /src/list.js: -------------------------------------------------------------------------------- 1 | export default class List { 2 | constructor() { 3 | this.list = JSON.parse(localStorage.getItem('todo-list')); 4 | if (!this.list) { 5 | this.list = []; 6 | } 7 | this.display(); 8 | } 9 | 10 | display() { 11 | this.saveData(); 12 | const listSection = document.getElementById('list-items'); 13 | listSection.innerHTML = ''; 14 | this.list.forEach((activity) => { 15 | let activityItem = `
  • `; 16 | if (activity.completed) { 17 | activityItem += ` 18 | done 19 | 20 |

    21 | ${activity.description} 22 |

    23 | `; 24 | } else { 25 | activityItem += ` 26 | 27 | check_box_outline_blank 28 | 29 |

    30 | ${activity.description} 31 |

    `; 32 | } 33 | activityItem += ` 34 | 35 | delete 36 | 37 |
  • 38 | `; 39 | listSection.innerHTML += activityItem; 40 | }); 41 | this.activityActions(); 42 | } 43 | 44 | saveData() { 45 | for (let i = 0; i < this.list.length; i += 1) { 46 | this.list[i].index = i; 47 | } 48 | this.list.sort((a, b) => { 49 | if (a.index < b.index) { 50 | return -1; 51 | } 52 | if (a.index > b.index) { 53 | return 1; 54 | } 55 | return 0; 56 | }); 57 | localStorage.setItem('todo-list', JSON.stringify(this.list)); 58 | } 59 | 60 | addActivity(activity) { 61 | if (activity.length > 0) { 62 | const newActivity = { 63 | description: activity, 64 | completed: false, 65 | index: this.list.length, 66 | }; 67 | this.list.push(newActivity); 68 | this.display(); 69 | this.saveData(); 70 | } 71 | } 72 | 73 | deleteAll() { 74 | localStorage.clear(); 75 | this.list = []; 76 | this.display(); 77 | } 78 | 79 | updateStatus(index) { 80 | if (this.list[index].completed === true) { 81 | this.list[index].completed = false; 82 | } else if (this.list[index].completed === false) { 83 | this.list[index].completed = true; 84 | } 85 | this.display(); 86 | } 87 | 88 | deleteCompleted(index) { 89 | this.list.splice(index, 1); 90 | this.display(); 91 | } 92 | 93 | clearCompleted() { 94 | this.list = this.list.filter((activity) => activity.completed === false); 95 | this.display(); 96 | } 97 | 98 | editActivity(index, description) { 99 | this.list[index].description = description; 100 | this.saveData(); 101 | } 102 | 103 | activityActions() { 104 | const checkbox = document.querySelectorAll('.update-status'); 105 | if (checkbox !== null) { 106 | checkbox.forEach((box) => { 107 | box.addEventListener('click', () => { 108 | this.updateStatus(box.getAttribute('data')); 109 | }); 110 | }); 111 | } 112 | 113 | const deleteActivity = document.querySelectorAll('.delete-activity'); 114 | deleteActivity.forEach((activity) => { 115 | activity.addEventListener('click', () => { 116 | this.deleteCompleted(activity.getAttribute('data')); 117 | }); 118 | }); 119 | 120 | const editedActivity = document.querySelectorAll('.activity'); 121 | if (editedActivity) { 122 | editedActivity.forEach((activity) => { 123 | activity.addEventListener('input', (e) => { 124 | const description = e.target.innerText; 125 | const index = e.target.getAttribute('data'); 126 | this.editActivity(index, description); 127 | }); 128 | }); 129 | } 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: #f6f6f6; 3 | } 4 | 5 | body * { 6 | color: rgb(84, 88, 98); 7 | font-family: 'Open Sans', 'Lucida Grande', tahoma, verdana, arial, sans-serif; 8 | } 9 | 10 | main { 11 | justify-content: center; 12 | align-items: center; 13 | min-height: 95vh; 14 | margin: 0 auto; 15 | } 16 | 17 | .todo-list { 18 | box-shadow: rgba(0, 0, 0, 0.15) 0 2px 8px 0; 19 | width: 500px; 20 | max-width: 100%; 21 | } 22 | 23 | form button .material-icons { 24 | font-size: 15px; 25 | } 26 | 27 | .todo-list .material-icons { 28 | transition: 0.6s; 29 | color: #9797a5; 30 | cursor: pointer; 31 | } 32 | 33 | .header .material-icons { 34 | font-size: 18px; 35 | } 36 | 37 | .todo-list .material-icons:hover { 38 | color: #333; 39 | } 40 | 41 | .todo-list .material-icons.move { 42 | cursor: move; 43 | } 44 | 45 | .header { 46 | border-bottom: 1px solid rgba(0, 0, 0, 0.08); 47 | } 48 | 49 | .header, 50 | form, 51 | ul { 52 | background: #fff; 53 | margin: 0; 54 | width: 100%; 55 | padding: 0; 56 | list-style-type: none; 57 | } 58 | 59 | .header, 60 | h2 { 61 | align-items: center; 62 | color: #545862; 63 | font-size: 18px; 64 | font-weight: 400; 65 | padding: 1rem; 66 | line-height: 20px; 67 | margin: 0; 68 | width: calc(100% - 2rem); 69 | text-overflow: ellipsis; 70 | overflow: hidden; 71 | white-space: nowrap; 72 | } 73 | 74 | form input { 75 | width: calc(100% - 25px); 76 | border: 0 solid transparent; 77 | outline: none; 78 | font-style: italic; 79 | line-height: 40px; 80 | height: 40px; 81 | font-size: 15px; 82 | } 83 | 84 | form { 85 | border-bottom: 1px solid rgba(0, 0, 0, 0.08); 86 | width: calc(100% - 40px); 87 | padding: 10px 10px 10px 30px; 88 | } 89 | 90 | form button { 91 | background: #fff; 92 | border: 0 solid transparent; 93 | } 94 | 95 | .list-item { 96 | width: calc(100% - 40px); 97 | padding: 10px 10px 10px 30px; 98 | font-size: 1rem; 99 | border-bottom: 1px solid rgba(0, 0, 0, 0.08); 100 | font-weight: 300; 101 | align-items: center; 102 | } 103 | 104 | .list-item p { 105 | width: calc(100% - 50px); 106 | border: 0 solid transparent; 107 | outline: none; 108 | height: 22px; 109 | line-height: 22px; 110 | padding: 0; 111 | margin: 0; 112 | padding-left: 20px; 113 | font-weight: 300; 114 | font-size: 15px; 115 | overflow-y: auto; 116 | background: #fff; 117 | } 118 | 119 | .list-item .material-icons.done { 120 | color: rgb(46, 138, 230); 121 | } 122 | 123 | .list-item p.completed { 124 | text-decoration-line: line-through; 125 | color: rgba(0, 0, 0, 0.45); 126 | } 127 | 128 | .list-item.editing { 129 | background-color: #fffeca; 130 | } 131 | 132 | .clear-completed { 133 | width: 100%; 134 | text-align: center; 135 | padding: 20px 6px; 136 | justify-content: center; 137 | } 138 | 139 | .clear-completed:hover { 140 | text-decoration: underline; 141 | cursor: pointer; 142 | } 143 | 144 | .d-flex { 145 | display: flex; 146 | } 147 | 148 | .cols { 149 | flex-direction: column; 150 | } 151 | 152 | .s-between { 153 | justify-content: space-between; 154 | } 155 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 3 | 4 | module.exports = { 5 | mode: 'development', 6 | entry: './src/index.js', 7 | devtool: 'inline-source-map', 8 | devServer: { 9 | static: './dist', 10 | }, 11 | output: { 12 | filename: 'main.js', 13 | path: path.resolve(__dirname, 'dist'), 14 | clean: true, 15 | }, 16 | 17 | plugins: [ 18 | new HtmlWebpackPlugin({ 19 | template: './src/index.html', 20 | }), 21 | ], 22 | module: { 23 | rules: [ 24 | { 25 | test: /\.css$/i, 26 | use: ['style-loader', 'css-loader'], 27 | }, 28 | { 29 | test: /\.(png|svg|jpg|jpeg|gif)$/i, 30 | type: 'asset/resource', 31 | }, 32 | ], 33 | }, 34 | }; --------------------------------------------------------------------------------