├── .babelrc ├── .eslintrc.json ├── .github └── workflows │ └── linters.yml ├── .gitignore ├── .hintrc ├── .stylelintrc.json ├── LICENSE ├── README.md ├── babel.config.json ├── dist ├── assets │ └── img │ │ ├── icons8-menu-rounded-24.png │ │ ├── icons8-multiply-24.png │ │ └── user.png ├── index.bundle.js ├── index.bundle.js.LICENSE.txt ├── index.css ├── index.html └── runtime.bundle.js ├── murple_logo.png ├── package-lock.json ├── package.json ├── src ├── Test │ ├── test_comments.test.js │ ├── test_item_count.test.js │ └── test_reservations.test.js ├── assets │ └── img │ │ ├── comment.png │ │ ├── home.png │ │ ├── icons8-menu-rounded-24.png │ │ ├── icons8-multiply-24.png │ │ ├── reservation.png │ │ └── user.png ├── index.html ├── index.js ├── modules │ ├── apiUrls.js │ ├── commentCounter.js │ ├── displayItems.js │ ├── domSelector.js │ ├── itemCounter.js │ ├── popupComment.js │ ├── popupReservation.js │ └── reservationCounter.js └── style.css └── webpack.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "test": { 4 | "plugins": ["@babel/plugin-transform-modules-commonjs"] 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /.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.yml: -------------------------------------------------------------------------------- 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-22.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-22.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@7.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-22.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-22.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 . 63 | nodechecker: 64 | name: node_modules checker 65 | runs-on: ubuntu-22.04 66 | steps: 67 | - uses: actions/checkout@v2 68 | - name: Check node_modules existence 69 | run: | 70 | if [ -d "node_modules/" ]; then echo -e "\e[1;31mThe node_modules/ folder was pushed to the repo. Please remove it from the GitHub repository and try again."; echo -e "\e[1;32mYou can set up a .gitignore file with this folder included on it to prevent this from happening in the future." && exit 1; fi -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | coverage/ -------------------------------------------------------------------------------- /.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 | } -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["stylelint-config-standard"], 3 | "plugins": ["stylelint-scss", "stylelint-csstree-validator"], 4 | "rules": { 5 | "at-rule-no-unknown": [ 6 | true, 7 | { 8 | "ignoreAtRules": ["tailwind", "apply", "variants", "responsive", "screen"] 9 | } 10 | ], 11 | "scss/at-rule-no-unknown": [ 12 | true, 13 | { 14 | "ignoreAtRules": ["tailwind", "apply", "variants", "responsive", "screen"] 15 | } 16 | ], 17 | "csstree/validator": true 18 | }, 19 | "ignoreFiles": ["build/**", "dist/**", "**/reset*.css", "**/bootstrap*.css", "**/*.js", "**/*.jsx"] 20 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Abu Raihan, Salwa Ballouti, Lugard Agu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | logo 6 |
7 | 8 |

Microverse README Template

9 | 10 |
11 | 12 | 13 | # 📗 Table of Contents 14 | 15 | - [📗 Table of Contents](#-table-of-contents) 16 | - [🎥 RSL Media ](#-rsl-media-) 17 | - [🛠 Built With ](#-built-with-) 18 | - [Tech Stack ](#tech-stack-) 19 | - [Key Features ](#key-features-) 20 | - [🚀 Live Demo ](#-live-demo-) 21 | - [💻 Getting Started ](#-getting-started-) 22 | - [Prerequisites](#prerequisites) 23 | - [Setup](#setup) 24 | - [Install](#install) 25 | - [Usage](#usage) 26 | - [👥 Author ](#-author-) 27 | - [How to access the database?](#how-to-access-the-database) 28 | - [🤝 Contributing ](#-contributing-) 29 | - [⭐️ Show your support ](#️-show-your-support-) 30 | - [🙏 Acknowledgments ](#-acknowledgments-) 31 | - [📝 License ](#-license-) 32 | 33 | 34 | # 🎥 RSL Media 35 | 36 | > 37 | > **The RSL Media** is a Microverce group project. It's an online entertainment streaming source for TV shows, movies. All data is preserved thanks to the external **tvmaze** API service. 38 | 39 | ## 🛠 Built With 40 | 41 | ### Tech Stack 42 | 43 | > We used HTML, CSS, Javascript ES6, Webpack and Jest Unit testing. 44 | 45 |
46 | Client 47 | 52 |
53 | 54 | 55 | ### Key Features 56 | 57 | > Some key feature of this project 58 | Features 59 | - **User can add like to their favourite show** 60 | - **User can add comments** 61 | - **User can reserve a show** 62 | 63 |

(back to top)

64 | 65 | 66 | ## 🚀 Live Demo 67 | 68 | > ## Project demo picture 69 | - [Live Demo Link](https://raihan2bd.github.io/js-capstone/) 70 | > 71 | >
72 | > 73 | comment-popup-window 74 | reservation-popup-window 75 | home-page(back to top)

81 | 82 | 83 | ## 💻 Getting Started 84 | 85 | >Please follow the instructions to clone the repo 86 | To get a local copy, follow these simple example steps. 87 | Clone this repository or download the Zip folder: 88 | 89 | ### Prerequisites 90 | 91 | >In order to check the linters errors make sure you have installed the [nodejs](https://nodejs.org) 92 | 93 | 94 | ### Setup 95 | 96 | >Clone this repository to your desired folder: cd [folder] to navigate and run the below comand to clone the project 97 | 98 | ```sh 99 | git clone https://github.com/raihan2bd/js-capstone.git 100 | ``` 101 | 102 | 103 | ### Install 104 | 105 | Install this project with: 106 | 107 | download npm the packages 108 | ```sh 109 | npm install --save-dev 110 | ``` 111 | 112 | ### Usage 113 | 114 | > To see the project in your local browser first of all, go to the dist folder then open the index.html file. 115 | 116 | 117 | 118 |

(back to top)

119 | 120 | 121 | ## 👥 Author 122 | 123 | 124 | 125 | 👤 **Abu Raihan** 126 | 127 | - GitHub: [@githubhandle](https://github.com/githubhandle) 128 | - Twitter: [@twitterhandle](https://twitter.com/raihan2bd) 129 | - LinkedIn: [LinkedIn](https://linkedin.com/in/raihan2bd) 130 | 131 | 👤 **Salwa Ballouti** 132 | 133 | - GitHub: [@githubhandle](https://github.com/Salwa99) 134 | - Twitter: [@twitterhandle](https://twitter.com/salwa-ballouti) 135 | - LinkedIn: [LinkedIn](https://linkedin.com/in/salwa-ballouti) 136 | 137 | 👤 **Lugard Agu** 138 | 139 | - GitHub: [@githubhandle](https://github.com/lugard1) 140 | - Twitter: [@twitterhandle](https://twitter.com/Dsn3kings) 141 | - LinkedIn: [LinkedIn](https://www.linkedin.com/in/lugard-agu-45bb05b6/) 142 | 143 |

(back to top)

144 | 145 | 146 |

(back to top)

147 | 148 | 149 | ## How to access the database? 150 | 151 | - It's not available for now I'm still working on it, once it's available I'll update this answer. 152 | 153 | 154 | 155 | ## 🤝 Contributing 156 | 157 | Contributions, issues, and feature requests are welcome! 158 | 159 | Feel free to check the [issues page](../../issues/). 160 | 161 |

(back to top)

162 | 163 | 164 | ## ⭐️ Show your support 165 | 166 | > Give a ⭐️ if you like this project! 167 | 168 | 169 |

(back to top)

170 | 171 | 172 | ## 🙏 Acknowledgments 173 | 174 | > Without Microverse Help this project not compleated at all so thanks a lot Microverse for giving us this kind of opertunity. 175 | 176 | 177 |

(back to top)

178 | 179 | 180 | 181 | ## 📝 License 182 | 183 | This project is [MIT](./LICENSE) licensed. 184 | 185 |

(back to top)

186 | -------------------------------------------------------------------------------- /babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-env" 4 | ] 5 | } -------------------------------------------------------------------------------- /dist/assets/img/icons8-menu-rounded-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/ef4f1f486f31741823e225f95aa58aa338f56e9c/dist/assets/img/icons8-menu-rounded-24.png -------------------------------------------------------------------------------- /dist/assets/img/icons8-multiply-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/ef4f1f486f31741823e225f95aa58aa338f56e9c/dist/assets/img/icons8-multiply-24.png -------------------------------------------------------------------------------- /dist/assets/img/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/ef4f1f486f31741823e225f95aa58aa338f56e9c/dist/assets/img/user.png -------------------------------------------------------------------------------- /dist/index.bundle.js: -------------------------------------------------------------------------------- 1 | /*! For license information please see index.bundle.js.LICENSE.txt */ 2 | "use strict";(self.webpackChunkjs_capstone=self.webpackChunkjs_capstone||[]).push([[826],{963:(t,e,n)=>{n.p,n.p,n.p;var r=document.getElementById("mobile-menu"),o=document.getElementById("cross-menu"),i=document.querySelectorAll(".mobile-nav-group .nav-link"),a=document.querySelector(".mobile-nav-group"),c=document.querySelector(".popup-modal"),s=document.querySelector(".show-group"),u=document.getElementById("count_item"),l="https://us-central1-involvement-api.cloudfunctions.net/capstoneApi/apps/Y1Ocl2k5LoJdVEhHia5O";const f=function(t,e){var n=e.childElementCount;return t.innerText="(".concat(n,")"),n};function p(t){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},p(t)}function m(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function h(t){for(var e=1;e=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var c=n.call(i,"catchLoc"),s=n.call(i,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),_(n),f}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var o=r.arg;_(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:S(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},t}function y(t,e,n,r,o,i,a){try{var c=t[i](a),s=c.value}catch(t){return void n(t)}c.done?e(s):Promise.resolve(s).then(r,o)}function g(t){return function(){var e=this,n=arguments;return new Promise((function(r,o){var i=t.apply(e,n);function a(t){y(i,r,o,a,c,"next",t)}function c(t){y(i,r,o,a,c,"throw",t)}a(void 0)}))}}var w=function(){var t=g(v().mark((function t(e,n,r,o){var i,a,c,s,u,p,m,h,d;return v().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});case 2:if((i=t.sent).ok||201===i.status){t.next=5;break}return t.abrupt("return");case 5:return a="".concat(l,"/comments?item_id=").concat(n.item_id),t.next=8,fetch(a);case 8:return c=t.sent,t.next=11,c.json();case 11:s=t.sent,(u=document.createElement("div")).className="comment-title",(p=document.createElement("h3")).className="comment-header",p.innerHTML="Comments",(m=document.createElement("p")).id="show_comment_count",m.innerText=0,u.append(p,m),(h=document.createElement("ul")).className="comment-goup",d="",s.length>0&&s.forEach((function(t){d+="
  • \n \n

    ").concat(t.comment,"

    \n
  • ")})),h.innerHTML=d,r.innerHTML="",f(m,h),r.append(u,h),o.elements.name.value="",o.elements.insight.value="";case 31:case"end":return t.stop()}}),t)})));return function(e,n,r,o){return t.apply(this,arguments)}}(),b=function(t){var e=document.createElement("div");e.className="modal-card";var n=document.createElement("button");n.className="btn-cross",n.innerHTML='X',n.addEventListener("click",(function(){c.classList.remove("show")}));var r=document.createElement("div");r.className="card-img",r.innerHTML='');var o=document.createElement("h2");o.className="card-title",o.innerText=t.name;var i=document.createElement("div");i.className="card-des",i.innerHTML=t.summary;var a=document.createElement("div");a.className="card-spec-group",a.innerHTML='
      \n
    • Season: '.concat(t.season,'
    • \n
    • Duration: ').concat(t.runtime,'
    • \n
    \n
      \n
    • airdate: ').concat(t.airdate,'
    • \n
    • Rating: ').concat(t.rating.average,"
    • \n
    ");var s=document.createElement("div");s.className="comment-section";var u=document.createElement("div");u.className="comment-title";var p=document.createElement("h3");p.className="comment-header",p.innerHTML="Comments";var m=document.createElement("p");m.id="show_comment_count",m.innerText=0,u.append(p,m);var h=document.createElement("ul");h.className="comment-goup";var d="";t.comments.length>0&&t.comments.forEach((function(t){d+="
  • \n \n

    ").concat(t.comment,"

    \n
  • ")})),h.innerHTML=d,f(m,h),s.append(u,h);var y=document.createElement("div");y.className="comment-form";var b=document.createElement("h3");b.className="comment-title",b.innerText="Add a comment";var x=document.createElement("form");x.innerHTML='\n\n\n',y.append(b,x),x.addEventListener("submit",function(){var e=g(v().mark((function e(n){var r,o,i,a;return v().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.preventDefault(),r=x.elements.name.value,o=x.elements.insight.value,i={item_id:t.id,username:r,comment:o},a="".concat(l,"/comments"),w(a,i,s,x);case 6:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),e.append(n,r,o,i,a,s,y),c.innerHTML="",c.append(e)};const x=function(){var t=g(v().mark((function t(e){var n,r,o,i,a,s,u;return v().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return c.classList.add("show"),n=e.target.parentElement.parentElement.id,r="https://api.tvmaze.com/episodes/".concat(n),t.next=5,fetch(r);case 5:return o=t.sent,t.next=8,o.json();case 8:return i=t.sent,t.next=11,fetch("".concat(l,"/comments?item_id=").concat(n));case 11:return a=t.sent,s=h({},i),t.next=15,a.json();case 15:u=t.sent,s=u&&!u.error?h(h({},s),{},{comments:u}):h(h({},s),{},{comments:[]}),b(s);case 18:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),E=function(t,e){var n=e.childElementCount;return t.innerText="(".concat(n,")"),n};function L(t){return L="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},L(t)}function O(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function j(t){for(var e=1;e=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var c=n.call(i,"catchLoc"),s=n.call(i,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),j(n),f}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var o=r.arg;j(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:S(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},t}function S(t,e,n,r,o,i,a){try{var c=t[i](a),s=c.value}catch(t){return void n(t)}c.done?e(s):Promise.resolve(s).then(r,o)}function T(t){return function(){var e=this,n=arguments;return new Promise((function(r,o){var i=t.apply(e,n);function a(t){S(i,r,o,a,c,"next",t)}function c(t){S(i,r,o,a,c,"throw",t)}a(void 0)}))}}var N=function(){var t=T(k().mark((function t(e,n,r,o){var i,a,c,s,u,f,p;return k().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});case 2:if((i=t.sent).ok||201===i.status){t.next=5;break}return t.abrupt("return");case 5:return a="".concat(l,"/reservations?item_id=").concat(n.item_id),t.next=8,fetch(a);case 8:return c=t.sent,t.next=11,c.json();case 11:s=t.sent,(u=document.createElement("h3")).className="reservation-title",u.innerHTML="Reservations (0)",(f=document.createElement("ul")).className="reservation-group",p="",s.length>0&&s.forEach((function(t){p+="
  • \n \n
  • ")})),f.innerHTML=p,r.innerHTML="",E(u.children[0],f),r.append(u,f),o.elements.name.value="",o.elements.start_date.value="",o.elements.end_date.value="";case 26:case"end":return t.stop()}}),t)})));return function(e,n,r,o){return t.apply(this,arguments)}}(),P=function(t){var e=document.createElement("div");e.className="modal-card";var n=document.createElement("button");n.className="btn-cross",n.innerHTML='X',n.addEventListener("click",(function(){c.classList.remove("show")}));var r=document.createElement("div");r.className="card-img",r.innerHTML='');var o=document.createElement("h2");o.className="card-title",o.innerText=t.name;var i=document.createElement("div");i.className="card-des",i.innerHTML=t.summary;var a=document.createElement("div");a.className="card-spec-group",a.innerHTML='
      \n
    • Season: '.concat(t.season,'
    • \n
    • Duration: ').concat(t.runtime,'
    • \n
    \n
      \n
    • airdate: ').concat(t.airdate,'
    • \n
    • Rating: ').concat(t.rating.average,"
    • \n
    ");var s=document.createElement("div");s.className="reservation-section";var u=document.createElement("h3");u.className="reservation-title",u.innerHTML="Reservations (0)";var f=document.createElement("ul");f.className="reservation-group";var p="";t.reservations.length>0&&t.reservations.forEach((function(t){p+="
  • \n \n
  • ")})),f.innerHTML=p,E(u.children[0],f),s.append(u,f);var m=document.createElement("div");m.className="reservation-form";var h=document.createElement("h3");h.className="reservation-title",h.innerText="Add a Reservation";var d=document.createElement("form");d.innerHTML='\n \n \n \n \n \n ',m.append(h,d),d.addEventListener("submit",function(){var e=T(k().mark((function e(n){var r,o,i,a,c;return k().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.preventDefault(),r=d.elements.name.value,o=d.elements.start_date.value,i=d.elements.end_date.value,a={item_id:t.id,username:r,date_start:o,date_end:i},c="".concat(l,"/reservations/"),N(c,a,s,d);case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),e.append(n,r,o,i,a,s,m),c.innerHTML="",c.append(e)};const M=function(){var t=T(k().mark((function t(e){var n,r,o,i,a,s,u;return k().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return c.classList.add("show"),n=e.target.parentElement.parentElement.id,r="https://api.tvmaze.com/episodes/".concat(n),t.next=5,fetch(r);case 5:return o=t.sent,t.next=8,o.json();case 8:return i=t.sent,t.next=11,fetch("".concat(l,"/reservations?item_id=").concat(n));case 11:return a=t.sent,s=j({},i),t.next=15,a.json();case 15:u=t.sent,s=u&&!u.error?j(j({},s),{},{reservations:u}):j(j({},s),{},{reservations:[]}),P(s);case 18:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();function G(t){return G="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},G(t)}function H(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function C(t){for(var e=1;e=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var c=n.call(i,"catchLoc"),s=n.call(i,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),O(n),f}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var o=r.arg;O(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:_(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},t}function A(t,e,n,r,o,i,a){try{var c=t[i](a),s=c.value}catch(t){return void n(t)}c.done?e(s):Promise.resolve(s).then(r,o)}function I(t){return function(){var e=this,n=arguments;return new Promise((function(r,o){var i=t.apply(e,n);function a(t){A(i,r,o,a,c,"next",t)}function c(t){A(i,r,o,a,c,"throw",t)}a(void 0)}))}}var R=function(){var t=I(F().mark((function t(e,n,r){var o,i,a,c;return F().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r.setAttribute("disabled",""),t.next=3,fetch("".concat(l,"/likes"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({item_id:e})});case 3:if((o=t.sent).ok||201===o.status){t.next=6;break}return t.abrupt("return");case 6:return t.next=8,fetch("".concat(l,"/likes"));case 8:return i=t.sent,t.next=11,i.json();case 11:a=t.sent,(c=a.find((function(t){return t.item_id===e})))&&(n.innerText=c.likes>1?"".concat(c.likes," likes"):"".concat(c.likes," like"),r.innerHTML='\n \x3c!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools --\x3e\n \n \n ');case 14:case"end":return t.stop()}}),t)})));return function(e,n,r){return t.apply(this,arguments)}}();const Y=function(){var t=I(F().mark((function t(){var e,n,r,o,i,a,c,f;return F().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,fetch("https://api.tvmaze.com/seasons/1/episodes");case 2:return e=t.sent,t.next=5,e.json();case 5:return n=t.sent,t.next=8,fetch("".concat(l,"/likes/"));case 8:return r=t.sent,t.next=11,r.json();case 11:o=t.sent,i=[],n.forEach((function(t){o.forEach((function(e){t.id===e.item_id&&i.push(C(C({},t),{},{likes:e.likes}))}))})),a=[],a=n.filter((function(t){return!i.find((function(e){return e.id===t.id}))})),c=[],a.forEach((function(t){c.push(C(C({},t),{},{likes:0}))})),(f=c.concat(i)).sort((function(t,e){return t.id-e.id})),(h=f).length>0?(s.innerHTML="",h.forEach((function(t){var e=document.createElement("li");e.id=t.id,e.className="show-item";var n=document.createElement("div");n.className="show-item-img",n.innerHTML="");var r=document.createElement("div");r.className="show-info";var o=document.createElement("h3");o.className="show-title",o.innerText=t.name;var i=document.createElement("div");i.className="shwo-like-action";var a=document.createElement("button");a.className="btn-like",a.innerHTML='\n \x3c!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools --\x3e\n \n \n ';var c=document.createElement("span");t.likes>1?c.innerText="".concat(t.likes," likes"):c.innerHTML="".concat(t.likes," like"),a.addEventListener("click",(function(){R(t.id,c,a)})),i.append(a,c),r.append(o,i);var u=document.createElement("div");u.className="show-actions";var l=document.createElement("button");l.className="btn-action btn-comment",l.innerText="Comments",l.addEventListener("click",(function(t){x(t)}));var f=document.createElement("button");f.className="btn-action btn-reservation",f.innerText="Reservations",f.addEventListener("click",(function(t){M(t)})),u.append(l,f),e.append(n,r,u),s.appendChild(e)})),p=u,m=void 0,m=s.childElementCount,p.innerText="(".concat(m,")")):s.innerHTML='

    No Data Found

    ';case 21:case"end":return t.stop()}var p,m,h}),t)})));return function(){return t.apply(this,arguments)}}();r.addEventListener("click",(function(){a.classList.toggle("display-flex")})),o.addEventListener("click",(function(){a.classList.remove("display-flex")})),i.forEach((function(t){t.addEventListener("click",(function(){a.classList.remove("display-flex")}))})),window.onload=function(){Y()}}},t=>{t(t.s=963)}]); 3 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7b0hBQU8sSUFBTUEsRUFBVUMsU0FBU0MsZUFBZSxlQUNsQ0MsRUFBV0YsU0FBU0MsZUFBZSxjQUNuQ0UsRUFBaUJILFNBQVNJLGlCQUNyQywrQkFFV0MsRUFBY0wsU0FBU00sY0FBYyxxQkFDckNDLEVBQWlCUCxTQUFTTSxjQUFjLGdCQUN4Q0UsRUFBcUJSLFNBQVNNLGNBQWMsZUFDNUNHLEVBQXFCVCxTQUFTQyxlQUFlLGNDUjdDUyxFQUFXLCtGQ014QixRQU51QixTQUFDQyxFQUFnQkMsR0FDdEMsSUFBTUMsRUFBUUQsRUFBaUJFLGtCQUUvQixPQURBSCxFQUFlSSxVQUFZLElBQUgsT0FBT0YsRUFBSyxLQUM3QkEsQ0FDVCxpdENDSEEsZ25HQUFBRyxHQUFBLHdCQUFBQSxFQUFBLHNCQUFBQSxHQUFBLGlCQUFBQSxHQUFBLHNzREFBQUEsRUFBQSx5QkFBQUEsR0FBQSxJQUFBQSxFQUFBLHVCQUFBQSxHQUFBLDRiQUFBQSxFQUFBLHlCQUFBQSxHQUFBLElBQUFBLEVBQUEsdUJBQUFBLEdBQUEseWhCQUFBQSxFQUFBLHlCQUFBQSxHQUFBLElBQUFBLEVBQUEsdUJBQUFBLEdBQUEscUdBQUFBLEVBQUEseUJBQUFBLEdBQUEsSUFBQUEsRUFBQSx1QkFBQUEsR0FBQSxra0JBR0EsSUFBTUMsRUFBZ0IsNkJBQUcsV0FBT0MsRUFBS0MsRUFBTUMsRUFBbUJDLEdBQUksdUdBQ3pDQyxNQUFNSixFQUFLLENBQ2hDSyxPQUFRLE9BQ1JDLFFBQVMsQ0FDUCxlQUFnQixvQkFFbEJDLEtBQU1DLEtBQUtDLFVBQVVSLEtBQ3JCLE9BTlksSUFBUlMsRUFBVyxFQUFILE1BUUFDLElBQTBCLE1BQXBCRCxFQUFTRSxPQUFjLGlEQUlxQixPQUExREMsRUFBYyxHQUFILE9BQU1yQixFQUFRLDZCQUFxQlMsRUFBS2EsU0FBTyxTQUVsQ1YsTUFBTVMsR0FBWSxPQUEzQixPQUFmRSxFQUFrQixFQUFILGVBRUFBLEVBQWdCQyxPQUFNLFFBQXJDQyxFQUFTLEVBQUgsTUFHTkMsRUFBY3BDLFNBQVNxQyxjQUFjLFFBQy9CQyxVQUFZLGlCQUNsQkMsRUFBZ0J2QyxTQUFTcUMsY0FBYyxPQUMvQkMsVUFBWSxpQkFDMUJDLEVBQWNDLFVBQVksWUFDcEJDLEVBQWV6QyxTQUFTcUMsY0FBYyxNQUMvQkssR0FBSyxxQkFDbEJELEVBQWExQixVQUFZLEVBRXpCcUIsRUFBWU8sT0FBT0osRUFBZUUsSUFFNUJHLEVBQWU1QyxTQUFTcUMsY0FBYyxPQUMvQkMsVUFBWSxlQUVyQk8sRUFBZSxHQUVmVixFQUFPVyxPQUFTLEdBQ2xCWCxFQUFPWSxTQUFRLFNBQUNDLEdBQ2RILEdBQWdCLGdKQUFKLE9BR2dDRyxFQUFLQyxTQUFRLDhEQUUvQkQsRUFBS0MsU0FBUSxvREFDVEQsRUFBS0UsY0FBYSw2REFFekJGLEVBQUtHLFFBQU8sa0JBRXJDLElBR0ZQLEVBQWFKLFVBQVlLLEVBQ3pCekIsRUFBa0JvQixVQUFZLEdBRTlCWSxFQUFlWCxFQUFjRyxHQUU3QnhCLEVBQWtCdUIsT0FBT1AsRUFBYVEsR0FFdEN2QixFQUFLZ0MsU0FBU0MsS0FBS0MsTUFBUSxHQUMzQmxDLEVBQUtnQyxTQUFTRyxRQUFRRCxNQUFRLEdBQUcsNENBQ2xDLGdCQTVEcUIsNENBOERoQkUsRUFBUyxTQUFDdEMsR0FFZCxJQUFNdUMsRUFBWTFELFNBQVNxQyxjQUFjLE9BQ3pDcUIsRUFBVXBCLFVBQVksYUFHdEIsSUFBTXFCLEVBQVczRCxTQUFTcUMsY0FBYyxVQUN4Q3NCLEVBQVNyQixVQUFZLFlBQ3JCcUIsRUFBU25CLFVBQVksNERBQ3JCbUIsRUFBU0MsaUJBQWlCLFNBQVMsV0FDakNyRCxFQUFlc0QsVUFBVUMsT0FBTyxPQUNsQyxJQUdBLElBQU1DLEVBQVUvRCxTQUFTcUMsY0FBYyxPQUN2QzBCLEVBQVF6QixVQUFZLFdBQ3BCeUIsRUFBUXZCLFVBQVksZ0JBQUgsT0FDVnJCLEVBQUs2QyxNQUFNQyxTQUFRLHFCQUNuQjlDLEVBQUttQyxLQUFJLFNBSWhCLElBQU1ZLEVBQVFsRSxTQUFTcUMsY0FBYyxNQUNyQzZCLEVBQU01QixVQUFZLGFBQ2xCNEIsRUFBTW5ELFVBQVlJLEVBQUttQyxLQUV2QixJQUFNYSxFQUFNbkUsU0FBU3FDLGNBQWMsT0FDbkM4QixFQUFJN0IsVUFBWSxXQUNoQjZCLEVBQUkzQixVQUFZckIsRUFBS2lELFFBR3JCLElBQU1DLEVBQVdyRSxTQUFTcUMsY0FBYyxPQUN4Q2dDLEVBQVMvQixVQUFZLGtCQUNyQitCLEVBQVM3QixVQUFZLDJEQUFILE9BQ2NyQixFQUFLbUQsT0FBTSxvREFDVG5ELEVBQUtvRCxRQUFPLGtGQUdicEQsRUFBS3FELFFBQU8sa0RBQ2JyRCxFQUFLc0QsT0FBT0MsUUFBTyxnQkFHbkQsSUFBTUMsRUFBaUIzRSxTQUFTcUMsY0FBYyxPQUM5Q3NDLEVBQWVyQyxVQUFZLGtCQUUzQixJQUFNRixFQUFjcEMsU0FBU3FDLGNBQWMsT0FDM0NELEVBQVlFLFVBQVksZ0JBQ3hCLElBQU1DLEVBQWdCdkMsU0FBU3FDLGNBQWMsTUFDN0NFLEVBQWNELFVBQVksaUJBQzFCQyxFQUFjQyxVQUFZLFdBQzFCLElBQU1DLEVBQWV6QyxTQUFTcUMsY0FBYyxLQUM1Q0ksRUFBYUMsR0FBSyxxQkFDbEJELEVBQWExQixVQUFZLEVBRXpCcUIsRUFBWU8sT0FBT0osRUFBZUUsR0FFbEMsSUFBTUcsRUFBZTVDLFNBQVNxQyxjQUFjLE1BQzVDTyxFQUFhTixVQUFZLGVBRXpCLElBQUlPLEVBQWUsR0FFZjFCLEVBQUt5RCxTQUFTOUIsT0FBUyxHQUN6QjNCLEVBQUt5RCxTQUFTN0IsU0FBUSxTQUFDQyxHQUNyQkgsR0FBZ0Isc0pBQUosT0FHa0NHLEVBQUtDLFNBQVEsa0VBRS9CRCxFQUFLQyxTQUFRLHNEQUNURCxFQUFLRSxjQUFhLGlFQUV6QkYsRUFBS0csUUFBTyxvQkFFdkMsSUFHRlAsRUFBYUosVUFBWUssRUFFekJPLEVBQWVYLEVBQWNHLEdBRTdCK0IsRUFBZWhDLE9BQU9QLEVBQWFRLEdBR25DLElBQU1pQyxFQUFjN0UsU0FBU3FDLGNBQWMsT0FDM0N3QyxFQUFZdkMsVUFBWSxlQUN4QixJQUFNd0MsRUFBYTlFLFNBQVNxQyxjQUFjLE1BQzFDeUMsRUFBV3hDLFVBQVksZ0JBQ3ZCd0MsRUFBVy9ELFVBQVksZ0JBQ3ZCLElBQU1NLEVBQU9yQixTQUFTcUMsY0FBYyxRQUNwQ2hCLEVBQUttQixVQUFZLG9PQUtqQnFDLEVBQVlsQyxPQUFPbUMsRUFBWXpELEdBRS9CQSxFQUFLdUMsaUJBQWlCLFNBQVEsNkJBQUUsV0FBT21CLEdBQUMsNkVBQ3RDQSxFQUFFQyxpQkFDSTFCLEVBQU9qQyxFQUFLZ0MsU0FBU0MsS0FBS0MsTUFDMUJDLEVBQVVuQyxFQUFLZ0MsU0FBU0csUUFBUUQsTUFDaEMwQixFQUFjLENBQ2xCakQsUUFBU2IsRUFBS3VCLEdBQ2RPLFNBQVVLLEVBQ1ZILFFBQVNLLEdBRUx0QyxFQUFNLEdBQUgsT0FBTVIsRUFBUSxhQUN2Qk8sRUFBaUJDLEVBQUsrRCxFQUFhTixFQUFnQnRELEdBQU0sMkNBQzFELG1EQVg2QixJQWE5QnFDLEVBQVVmLE9BQ1JnQixFQUNBSSxFQUNBRyxFQUNBQyxFQUNBRSxFQUNBTSxFQUNBRSxHQUdGdEUsRUFBZWlDLFVBQVksR0FDM0JqQyxFQUFlb0MsT0FBT2UsRUFDeEIsRUF1QkEsUUFyQjRCLDZCQUFHLFdBQU9xQixHQUFDLG1GQUdZLE9BRmpEeEUsRUFBZXNELFVBQVVxQixJQUFJLFFBQ3JCeEMsRUFBT3FDLEVBQUVJLE9BQU9DLGNBQWNBLGNBQTlCMUMsR0FDRnhCLEVBQU0sbUNBQUgsT0FBc0N3QixHQUFFLFNBQzFCcEIsTUFBTUosR0FBSSxPQUFuQixPQUFSVSxFQUFXLEVBQUgsY0FDT0EsRUFBU00sT0FBTSxPQUF4QixPQUFOQyxFQUFTLEVBQUgsZUFFa0JiLE1BQU0sR0FBRCxPQUFJWixFQUFRLDZCQUFxQmdDLElBQUssUUFFM0MsT0FGeEJULEVBQWtCLEVBQUgsS0FFakJvRCxFQUFlLEVBQUgsR0FBUWxELEdBQU0sVUFFRkYsRUFBZ0JDLE9BQU0sUUFBNUNvRCxFQUFnQixFQUFILEtBRWpCRCxFQURFQyxJQUFrQkEsRUFBY0MsTUFDbkIsRUFBSCxLQUFRRixHQUFZLElBQUVULFNBQVVVLElBRTdCLEVBQUgsS0FBUUQsR0FBWSxJQUFFVCxTQUFVLEtBRzlDbkIsRUFBTzRCLEdBQWMsNENBQ3RCLGdCQW5CMkIsc0NDdkw1QixFQU4yQixTQUFDMUUsRUFBZ0I2RSxHQUMxQyxJQUFNM0UsRUFBUTJFLEVBQXFCMUUsa0JBRW5DLE9BREFILEVBQWVJLFVBQVksSUFBSCxPQUFPRixFQUFLLEtBQzdCQSxDQUNULGl0Q0NIQSxnbkdBQUFHLEdBQUEsd0JBQUFBLEVBQUEsc0JBQUFBLEdBQUEsaUJBQUFBLEdBQUEsc3NEQUFBQSxFQUFBLHlCQUFBQSxHQUFBLElBQUFBLEVBQUEsdUJBQUFBLEdBQUEsNGJBQUFBLEVBQUEseUJBQUFBLEdBQUEsSUFBQUEsRUFBQSx1QkFBQUEsR0FBQSx5aEJBQUFBLEVBQUEseUJBQUFBLEdBQUEsSUFBQUEsRUFBQSx1QkFBQUEsR0FBQSxxR0FBQUEsRUFBQSx5QkFBQUEsR0FBQSxJQUFBQSxFQUFBLHVCQUFBQSxHQUFBLGtrQkFHQSxJQUFNeUUsRUFBb0IsNkJBQUcsV0FBT3ZFLEVBQUtDLEVBQU1xRSxFQUFzQm5FLEdBQUksbUdBQ2hEQyxNQUFNSixFQUFLLENBQ2hDSyxPQUFRLE9BQ1JDLFFBQVMsQ0FDUCxlQUFnQixvQkFFbEJDLEtBQU1DLEtBQUtDLFVBQVVSLEtBQ3JCLE9BTlksSUFBUlMsRUFBVyxFQUFILE1BUUFDLElBQTBCLE1BQXBCRCxFQUFTRSxPQUFjLGlEQUl5QixPQUE5REMsRUFBYyxHQUFILE9BQU1yQixFQUFRLGlDQUF5QlMsRUFBS2EsU0FBTyxTQUVsQ1YsTUFBTVMsR0FBWSxPQUEzQixPQUFuQjJELEVBQXNCLEVBQUgsZUFFSkEsRUFBb0J4RCxPQUFNLFFBQXpDQyxFQUFTLEVBQUgsTUFHTndELEVBQW9CM0YsU0FBU3FDLGNBQWMsT0FDL0JDLFVBQVksb0JBQzlCcUQsRUFBa0JuRCxVQUFZLHlEQUV4Qm9ELEVBQW1CNUYsU0FBU3FDLGNBQWMsT0FDL0JDLFVBQVksb0JBRXpCdUQsRUFBbUIsR0FFbkIxRCxFQUFPVyxPQUFTLEdBQ2xCWCxFQUFPWSxTQUFRLFNBQUNDLEdBQ2Q2QyxHQUFvQixvSkFBSixPQUc0QjdDLEVBQUtDLFNBQVEsOERBRS9CRCxFQUFLQyxTQUFRLG9EQUNURCxFQUFLOEMsV0FBVSxjQUFNOUMsRUFBSytDLFNBQVEsbUNBR2xFLElBR0ZILEVBQWlCcEQsVUFBWXFELEVBQzdCTCxFQUFxQmhELFVBQVksR0FFakN3RCxFQUFtQkwsRUFBa0JNLFNBQVMsR0FBSUwsR0FFbERKLEVBQXFCN0MsT0FBT2dELEVBQW1CQyxHQUUvQ3ZFLEVBQUtnQyxTQUFTQyxLQUFLQyxNQUFRLEdBQzNCbEMsRUFBS2dDLFNBQVM2QyxXQUFXM0MsTUFBUSxHQUNqQ2xDLEVBQUtnQyxTQUFTOEMsU0FBUzVDLE1BQVEsR0FBRyw0Q0FDbkMsZ0JBckR5Qiw0Q0F1RHBCRSxFQUFTLFNBQUN0QyxHQUVkLElBQU11QyxFQUFZMUQsU0FBU3FDLGNBQWMsT0FDekNxQixFQUFVcEIsVUFBWSxhQUd0QixJQUFNcUIsRUFBVzNELFNBQVNxQyxjQUFjLFVBQ3hDc0IsRUFBU3JCLFVBQVksWUFDckJxQixFQUFTbkIsVUFBWSw0REFDckJtQixFQUFTQyxpQkFBaUIsU0FBUyxXQUNqQ3JELEVBQWVzRCxVQUFVQyxPQUFPLE9BQ2xDLElBR0EsSUFBTUMsRUFBVS9ELFNBQVNxQyxjQUFjLE9BQ3ZDMEIsRUFBUXpCLFVBQVksV0FDcEJ5QixFQUFRdkIsVUFBWSxnQkFBSCxPQUNWckIsRUFBSzZDLE1BQU1DLFNBQVEscUJBQ25COUMsRUFBS21DLEtBQUksU0FJaEIsSUFBTVksRUFBUWxFLFNBQVNxQyxjQUFjLE1BQ3JDNkIsRUFBTTVCLFVBQVksYUFDbEI0QixFQUFNbkQsVUFBWUksRUFBS21DLEtBR3ZCLElBQU1hLEVBQU1uRSxTQUFTcUMsY0FBYyxPQUNuQzhCLEVBQUk3QixVQUFZLFdBQ2hCNkIsRUFBSTNCLFVBQVlyQixFQUFLaUQsUUFHckIsSUFBTUMsRUFBV3JFLFNBQVNxQyxjQUFjLE9BQ3hDZ0MsRUFBUy9CLFVBQVksa0JBQ3JCK0IsRUFBUzdCLFVBQVksMkRBQUgsT0FDY3JCLEVBQUttRCxPQUFNLG9EQUNUbkQsRUFBS29ELFFBQU8sa0ZBR2JwRCxFQUFLcUQsUUFBTyxrREFDYnJELEVBQUtzRCxPQUFPQyxRQUFPLGdCQUduRCxJQUFNMEIsRUFBcUJwRyxTQUFTcUMsY0FBYyxPQUNsRCtELEVBQW1COUQsVUFBWSxzQkFFL0IsSUFBTXFELEVBQW9CM0YsU0FBU3FDLGNBQWMsTUFDakRzRCxFQUFrQnJELFVBQVksb0JBQzlCcUQsRUFBa0JuRCxVQUFZLHdEQUU5QixJQUFNb0QsRUFBbUI1RixTQUFTcUMsY0FBYyxNQUNoRHVELEVBQWlCdEQsVUFBWSxvQkFFN0IsSUFBSXVELEVBQW1CLEdBRW5CMUUsRUFBS2tGLGFBQWF2RCxPQUFTLEdBQzdCM0IsRUFBS2tGLGFBQWF0RCxTQUFRLFNBQUNDLEdBQ3pCNkMsR0FBb0Isb0pBQUosT0FHNEI3QyxFQUFLQyxTQUFRLDhEQUUvQkQsRUFBS0MsU0FBUSxvREFDVEQsRUFBSzhDLFdBQVUsY0FBTTlDLEVBQUsrQyxTQUFRLG1DQUdsRSxJQUdGSCxFQUFpQnBELFVBQVlxRCxFQUU3QkcsRUFBbUJMLEVBQWtCTSxTQUFTLEdBQUlMLEdBRWxEUSxFQUFtQnpELE9BQU9nRCxFQUFtQkMsR0FHN0MsSUFBTVUsRUFBa0J0RyxTQUFTcUMsY0FBYyxPQUMvQ2lFLEVBQWdCaEUsVUFBWSxtQkFDNUIsSUFBTWlFLEVBQWlCdkcsU0FBU3FDLGNBQWMsTUFDOUNrRSxFQUFlakUsVUFBWSxvQkFDM0JpRSxFQUFleEYsVUFBWSxvQkFDM0IsSUFBTU0sRUFBT3JCLFNBQVNxQyxjQUFjLFFBQ3BDaEIsRUFBS21CLFVBQVksb2VBUWpCOEQsRUFBZ0IzRCxPQUFPNEQsRUFBZ0JsRixHQUV2Q0EsRUFBS3VDLGlCQUFpQixTQUFRLDZCQUFFLFdBQU9tQixHQUFDLCtFQUN0Q0EsRUFBRUMsaUJBQ0kxQixFQUFPakMsRUFBS2dDLFNBQVNDLEtBQUtDLE1BQzFCaUQsRUFBWW5GLEVBQUtnQyxTQUFTNkMsV0FBVzNDLE1BQ3JDa0QsRUFBVXBGLEVBQUtnQyxTQUFTOEMsU0FBUzVDLE1BQ2pDbUQsRUFBYyxDQUNsQjFFLFFBQVNiLEVBQUt1QixHQUNkTyxTQUFVSyxFQUNWd0MsV0FBWVUsRUFDWlQsU0FBVVUsR0FFTnZGLEVBQU0sR0FBSCxPQUFNUixFQUFRLGtCQUN2QitFLEVBQXFCdkUsRUFBS3dGLEVBQWFOLEVBQW9CL0UsR0FBTSwyQ0FDbEUsbURBYjZCLElBaUI5QnFDLEVBQVVmLE9BQ1JnQixFQUNBSSxFQUNBRyxFQUNBQyxFQUNBRSxFQUNBK0IsRUFDQUUsR0FHRi9GLEVBQWVpQyxVQUFZLEdBQzNCakMsRUFBZW9DLE9BQU9lLEVBQ3hCLEVBeUJBLFFBdkJxQiw2QkFBRyxXQUFPcUIsR0FBQyxtRkFHbUIsT0FGakR4RSxFQUFlc0QsVUFBVXFCLElBQUksUUFDckJ4QyxFQUFPcUMsRUFBRUksT0FBT0MsY0FBY0EsY0FBOUIxQyxHQUNGeEIsRUFBTSxtQ0FBSCxPQUFzQ3dCLEdBQUUsU0FDMUJwQixNQUFNSixHQUFJLE9BQW5CLE9BQVJVLEVBQVcsRUFBSCxjQUNPQSxFQUFTTSxPQUFNLE9BQXhCLE9BQU5DLEVBQVMsRUFBSCxlQUVzQmIsTUFBTSxHQUFELE9BQ2xDWixFQUFRLGlDQUF5QmdDLElBQ3JDLFFBRTZCLE9BSnhCZ0QsRUFBc0IsRUFBSCxLQUlyQkwsRUFBZSxLQUFLbEQsR0FBTSxVQUVFdUQsRUFBb0J4RCxPQUFNLFFBQXBEeUUsRUFBb0IsRUFBSCxLQUVyQnRCLEVBREVzQixJQUFzQkEsRUFBa0JwQixNQUMzQixPQUFLRixHQUFZLElBQUVnQixhQUFjTSxJQUVqQyxPQUFLdEIsR0FBWSxJQUFFZ0IsYUFBYyxLQUdsRDVDLEVBQU80QixHQUFjLDRDQUN0QixnQkFyQm9CLHF2Q0NyTHJCLGduR0FBQXJFLEdBQUEsd0JBQUFBLEVBQUEsc0JBQUFBLEdBQUEsaUJBQUFBLEdBQUEsc3NEQUFBQSxFQUFBLHlCQUFBQSxHQUFBLElBQUFBLEVBQUEsdUJBQUFBLEdBQUEsNGJBQUFBLEVBQUEseUJBQUFBLEdBQUEsSUFBQUEsRUFBQSx1QkFBQUEsR0FBQSx5aEJBQUFBLEVBQUEseUJBQUFBLEdBQUEsSUFBQUEsRUFBQSx1QkFBQUEsR0FBQSxxR0FBQUEsRUFBQSx5QkFBQUEsR0FBQSxJQUFBQSxFQUFBLHVCQUFBQSxHQUFBLGtrQkFNQSxJQUFNNEYsRUFBYSw2QkFBRyxXQUFPbEUsRUFBSW1FLEVBQVdDLEdBQU8sNkVBQ1osT0FBckNBLEVBQVFDLGFBQWEsV0FBWSxJQUFJLFNBQ2R6RixNQUFNLEdBQUQsT0FBSVosRUFBUSxVQUFVLENBQ2hEYSxPQUFRLE9BQ1JDLFFBQVMsQ0FDUCxlQUFnQixvQkFFbEJDLEtBQU1DLEtBQUtDLFVBQVUsQ0FBRUssUUFBU1UsTUFDaEMsT0FOWSxJQUFSZCxFQUFXLEVBQUgsTUFRQUMsSUFBMEIsTUFBcEJELEVBQVNFLE9BQWMsaUVBSWZSLE1BQU0sR0FBRCxPQUFJWixFQUFRLFdBQVMsT0FBbkMsT0FBYnNHLEVBQWdCLEVBQUgsZUFDRUEsRUFBYzlFLE9BQU0sUUFBbkNDLEVBQVMsRUFBSCxNQUNOOEUsRUFBVzlFLEVBQU8rRSxNQUFLLFNBQUNsRSxHQUFJLE9BQUtBLEVBQUtoQixVQUFZVSxDQUFFLE9BRXhEbUUsRUFBVTlGLFVBQVlrRyxFQUFTRSxNQUFRLEVBQUksR0FBSCxPQUFNRixFQUFTRSxNQUFLLG9CQUFjRixFQUFTRSxNQUFLLFNBQ3hGTCxFQUFRdEUsVUFBWSxxdkJBU3JCLDRDQUNGLGdCQTdCa0IsMENBaUtuQixRQXRDa0IsNkJBQUcsa0hBQ0lsQixNTGxJQSw2Q0trSWdCLE9BQXpCLE9BQVJNLEVBQVcsRUFBSCxjQUNPQSxFQUFTTSxPQUFNLE9BQXhCLE9BQU5DLEVBQVMsRUFBSCxjQUdzQmIsTUFBTSxHQUFELE9BQUlaLEVBQVEsWUFBVSxPQUFwQyxPQUFuQjBHLEVBQXNCLEVBQUgsZUFDQ0EsRUFBb0JsRixPQUFNLFFBQTlDbUYsRUFBYyxFQUFILEtBR1hDLEVBQXFCLEdBQzNCbkYsRUFBT1ksU0FBUSxTQUFDQyxHQUNkcUUsRUFBWXRFLFNBQVEsU0FBQ3dFLEdBQ2Z2RSxFQUFLTixLQUFPNkUsRUFBU3ZGLFNBQ3ZCc0YsRUFBbUJFLEtBQUssT0FBS3hFLEdBQUksSUFBRW1FLE1BQU9JLEVBQVNKLFFBRXZELEdBQ0YsSUFHSU0sRUFBcUIsR0FDekJBLEVBQXFCdEYsRUFBT3VGLFFBQzFCLFNBQUNDLEdBQUUsT0FBTUwsRUFBbUJKLE1BQUssU0FBQ1UsR0FBTyxPQUFLQSxFQUFRbEYsS0FBT2lGLEVBQUdqRixFQUFFLEdBQUMsSUFJL0RtRixFQUE0QixHQUNsQ0osRUFBbUIxRSxTQUFRLFNBQUNDLEdBQzFCNkUsRUFBMEJMLEtBQUssT0FBS3hFLEdBQUksSUFBRW1FLE1BQU8sSUFDbkQsS0FHTVcsRUFBVUQsRUFBMEJFLE9BQU9ULElBQ3pDVSxNQUFLLFNBQUNDLEVBQUdDLEdBQUMsT0FBS0QsRUFBRXZGLEdBQUt3RixFQUFFeEYsRUFBRSxLQTNIcEJ2QixFQThIUDJHLEdBN0hFaEYsT0FBUyxHQUNoQnRDLEVBQW1CZ0MsVUFBWSxHQUUvQnJCLEVBQUs0QixTQUFRLFNBQUMvQixHQUNaLElBQU1nQyxFQUFPaEQsU0FBU3FDLGNBQWMsTUFDcENXLEVBQUtOLEdBQUsxQixFQUFFMEIsR0FDWk0sRUFBS1YsVUFBWSxZQUdqQixJQUFNNkYsRUFBVW5JLFNBQVNxQyxjQUFjLE9BQ3ZDOEYsRUFBUTdGLFVBQVksZ0JBQ3BCNkYsRUFBUTNGLFVBQVksYUFBSCxPQUFnQnhCLEVBQUVnRCxNQUFNQyxTQUFRLE1BR2pELElBQU1tRSxFQUFXcEksU0FBU3FDLGNBQWMsT0FDeEMrRixFQUFTOUYsVUFBWSxZQUdyQixJQUFNNEIsRUFBUWxFLFNBQVNxQyxjQUFjLE1BQ3JDNkIsRUFBTTVCLFVBQVksYUFDbEI0QixFQUFNbkQsVUFBWUMsRUFBRXNDLEtBR3BCLElBQU0rRSxFQUFpQnJJLFNBQVNxQyxjQUFjLE9BQzlDZ0csRUFBZS9GLFVBQVksbUJBRzNCLElBQU13RSxFQUFVOUcsU0FBU3FDLGNBQWMsVUFDdkN5RSxFQUFReEUsVUFBWSxXQUNwQndFLEVBQVF0RSxVQUFZLDhvQ0FjcEIsSUFBTXFFLEVBQVk3RyxTQUFTcUMsY0FBYyxRQUNyQ3JCLEVBQUVtRyxNQUFRLEVBQ1pOLEVBQVU5RixVQUFZLEdBQUgsT0FBTUMsRUFBRW1HLE1BQUssVUFFaENOLEVBQVVyRSxVQUFZLEdBQUgsT0FBTXhCLEVBQUVtRyxNQUFLLFNBSWxDTCxFQUFRbEQsaUJBQWlCLFNBQVMsV0FDaENnRCxFQUFjNUYsRUFBRTBCLEdBQUltRSxFQUFXQyxFQUNqQyxJQUVBdUIsRUFBZTFGLE9BQU9tRSxFQUFTRCxHQUUvQnVCLEVBQVN6RixPQUFPdUIsRUFBT21FLEdBR3ZCLElBQU1DLEVBQWN0SSxTQUFTcUMsY0FBYyxPQUMzQ2lHLEVBQVloRyxVQUFZLGVBR3hCLElBQU1pRyxFQUFhdkksU0FBU3FDLGNBQWMsVUFDMUNrRyxFQUFXakcsVUFBWSx5QkFDdkJpRyxFQUFXeEgsVUFBWSxXQUN2QndILEVBQVczRSxpQkFBaUIsU0FBUyxTQUFDbUIsR0FDcEN5RCxFQUF1QnpELEVBQ3pCLElBRUEsSUFBTTBELEVBQWlCekksU0FBU3FDLGNBQWMsVUFDOUNvRyxFQUFlbkcsVUFBWSw2QkFDM0JtRyxFQUFlMUgsVUFBWSxlQUMzQjBILEVBQWU3RSxpQkFBaUIsU0FBUyxTQUFDbUIsR0FDeEMyRCxFQUFnQjNELEVBQ2xCLElBRUF1RCxFQUFZM0YsT0FBTzRGLEVBQVlFLEdBRS9CekYsRUFBS0wsT0FBT3dGLEVBQVNDLEVBQVVFLEdBRS9COUgsRUFBbUJtSSxZQUFZM0YsRUFDakMsSUMzSGlCckMsRUQ0SExGLEVDM0hSSSxXRDJINEJMLEVDM0hOTSxrQkFDNUJILEVBQWVJLFVBQVksSUFBSCxPQUFPRixFQUFLLE1ENEhsQ0wsRUFBbUJnQyxVQUFZLHVDQXVDakIsa0NDcktFLElBQUM3QixFQUNiRSxFRHNDUU0sQ0E4SEUsVUFDakIsa0JBcENpQixtQ0VuSGxCcEIsRUFBUTZELGlCQUFpQixTQUFTLFdBQ2hDdkQsRUFBWXdELFVBQVUrRSxPQUFPLGVBQy9CLElBRUExSSxFQUFTMEQsaUJBQWlCLFNBQVMsV0FDakN2RCxFQUFZd0QsVUFBVUMsT0FBTyxlQUMvQixJQUVBM0QsRUFBZTRDLFNBQVEsU0FBQ0MsR0FDdEJBLEVBQUtZLGlCQUFpQixTQUFTLFdBQzdCdkQsRUFBWXdELFVBQVVDLE9BQU8sZUFDL0IsR0FDRixJQUdBK0UsT0FBT0MsT0FBUyxXQUNkQyxHQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vanMtY2Fwc3RvbmUvLi9zcmMvbW9kdWxlcy9kb21TZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9qcy1jYXBzdG9uZS8uL3NyYy9tb2R1bGVzL2FwaVVybHMuanMiLCJ3ZWJwYWNrOi8vanMtY2Fwc3RvbmUvLi9zcmMvbW9kdWxlcy9jb21tZW50Q291bnRlci5qcyIsIndlYnBhY2s6Ly9qcy1jYXBzdG9uZS8uL3NyYy9tb2R1bGVzL3BvcHVwQ29tbWVudC5qcyIsIndlYnBhY2s6Ly9qcy1jYXBzdG9uZS8uL3NyYy9tb2R1bGVzL3Jlc2VydmF0aW9uQ291bnRlci5qcyIsIndlYnBhY2s6Ly9qcy1jYXBzdG9uZS8uL3NyYy9tb2R1bGVzL3BvcHVwUmVzZXJ2YXRpb24uanMiLCJ3ZWJwYWNrOi8vanMtY2Fwc3RvbmUvLi9zcmMvbW9kdWxlcy9kaXNwbGF5SXRlbXMuanMiLCJ3ZWJwYWNrOi8vanMtY2Fwc3RvbmUvLi9zcmMvbW9kdWxlcy9pdGVtQ291bnRlci5qcyIsIndlYnBhY2s6Ly9qcy1jYXBzdG9uZS8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgbWVudUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2JpbGUtbWVudScpO1xuZXhwb3J0IGNvbnN0IGNsb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nyb3NzLW1lbnUnKTtcbmV4cG9ydCBjb25zdCBtb2JpbGVOYXZsaW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICcubW9iaWxlLW5hdi1ncm91cCAubmF2LWxpbmsnLFxuKTtcbmV4cG9ydCBjb25zdCBtb2JOYXZHcm91cCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tb2JpbGUtbmF2LWdyb3VwJyk7XG5leHBvcnQgY29uc3QgbW9kYWxDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucG9wdXAtbW9kYWwnKTtcbmV4cG9ydCBjb25zdCBsaXN0SXRlbXNDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2hvdy1ncm91cCcpO1xuZXhwb3J0IGNvbnN0IGl0ZW1Db3VudENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb3VudF9pdGVtJyk7XG4iLCJleHBvcnQgY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly91cy1jZW50cmFsMS1pbnZvbHZlbWVudC1hcGkuY2xvdWRmdW5jdGlvbnMubmV0L2NhcHN0b25lQXBpL2FwcHMvWTFPY2wyazVMb0pkVkVoSGlhNU8nO1xuZXhwb3J0IGNvbnN0IE1PVklFX0FQSSA9ICdodHRwczovL2FwaS50dm1hemUuY29tL3NlYXNvbnMvMS9lcGlzb2Rlcyc7XG4iLCJjb25zdCBjb21tZW50Q291bnRlciA9IChjb3VudENvbnRhaW5lciwgY29tbWVudENvbnRhaW5lcikgPT4ge1xuICBjb25zdCBjb3VudCA9IGNvbW1lbnRDb250YWluZXIuY2hpbGRFbGVtZW50Q291bnQ7XG4gIGNvdW50Q29udGFpbmVyLmlubmVyVGV4dCA9IGAoJHtjb3VudH0pYDtcbiAgcmV0dXJuIGNvdW50O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWVudENvdW50ZXI7XG4iLCJpbXBvcnQgeyBCQVNFX1VSTCB9IGZyb20gJy4vYXBpVXJscy5qcyc7XG5pbXBvcnQgY29tbWVudENvdW50ZXIgZnJvbSAnLi9jb21tZW50Q291bnRlci5qcyc7XG5pbXBvcnQgeyBtb2RhbENvbnRhaW5lciB9IGZyb20gJy4vZG9tU2VsZWN0b3IuanMnO1xuXG5jb25zdCBjcmVhdGVOZXdDb21tZW50ID0gYXN5bmMgKHVybCwgZGF0YSwgY29tbWVudHNDb250YWluZXIsIEZvcm0pID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2sgJiYgcmVzcG9uc2Uuc3RhdHVzICE9PSAyMDEpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBmZXRjaENvbVVybCA9IGAke0JBU0VfVVJMfS9jb21tZW50cz9pdGVtX2lkPSR7ZGF0YS5pdGVtX2lkfWA7XG5cbiAgY29uc3QgY29tbWVudFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZmV0Y2hDb21VcmwpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbW1lbnRSZXNwb25zZS5qc29uKCk7XG5cbiAgLy8gbWFudXB1bGF0ZSB0aGUgZG9tXG4gIGNvbnN0IGNvbW1lbnRUaXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbW1lbnRUaXRlLmNsYXNzTmFtZSA9ICdjb21tZW50LXRpdGxlJztcbiAgY29uc3QgY29tbWVudEhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2gzJyk7XG4gIGNvbW1lbnRIZWFkZXIuY2xhc3NOYW1lID0gJ2NvbW1lbnQtaGVhZGVyJztcbiAgY29tbWVudEhlYWRlci5pbm5lckhUTUwgPSAnQ29tbWVudHMnO1xuICBjb25zdCBjb21tZW50Q291bnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gIGNvbW1lbnRDb3VudC5pZCA9ICdzaG93X2NvbW1lbnRfY291bnQnO1xuICBjb21tZW50Q291bnQuaW5uZXJUZXh0ID0gMDtcblxuICBjb21tZW50VGl0ZS5hcHBlbmQoY29tbWVudEhlYWRlciwgY29tbWVudENvdW50KTtcblxuICBjb25zdCBjb21tZW50R3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICBjb21tZW50R3JvdXAuY2xhc3NOYW1lID0gJ2NvbW1lbnQtZ291cCc7XG5cbiAgbGV0IGNvbW1lbnRJdGVtcyA9ICcnO1xuXG4gIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgIHJlc3VsdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb21tZW50SXRlbXMgKz0gYDxsaSBjbGFzcz0nY29tbWVudC1pdGVtJz5cbiAgICAgIDxkaXYgY2xhc3M9J3VzZXItaW5mbyc+XG4gICAgICAgIDxkaXYgY2xhc3M9J3VzZXItYXZhdGFyJz5cbiAgICAgICAgICA8aW1nIHNyYz0nLi9hc3NldHMvaW1nL3VzZXIucG5nJyBhbHQ9JyR7aXRlbS51c2VybmFtZX0nLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxoNCBjbGFzcz0ndXNlci1uYW1lJz4ke2l0ZW0udXNlcm5hbWV9PC9oND5cbiAgICAgICAgPHNwYW4gY2xhc3M9J3N1Ym1pdC1kYXRlJz4ke2l0ZW0uY3JlYXRpb25fZGF0ZX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGNsYXNzPSd1c2VyLWRhdGEnPiR7aXRlbS5jb21tZW50fTwvcD5cbiAgICA8L2xpPmA7XG4gICAgfSk7XG4gIH1cblxuICBjb21tZW50R3JvdXAuaW5uZXJIVE1MID0gY29tbWVudEl0ZW1zOyAvLyBhcHBlbmQgY29tbWVudCBsaXN0XG4gIGNvbW1lbnRzQ29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gIGNvbW1lbnRDb3VudGVyKGNvbW1lbnRDb3VudCwgY29tbWVudEdyb3VwKTtcblxuICBjb21tZW50c0NvbnRhaW5lci5hcHBlbmQoY29tbWVudFRpdGUsIGNvbW1lbnRHcm91cCk7XG5cbiAgRm9ybS5lbGVtZW50cy5uYW1lLnZhbHVlID0gJyc7XG4gIEZvcm0uZWxlbWVudHMuaW5zaWdodC52YWx1ZSA9ICcnO1xufTtcblxuY29uc3QgcmVuZGVyID0gKGRhdGEpID0+IHtcbiAgLy8gbW9kYWwgY2FyZFxuICBjb25zdCBtb2RhbENhcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbW9kYWxDYXJkLmNsYXNzTmFtZSA9ICdtb2RhbC1jYXJkJztcblxuICAvLyBidXR0b25cbiAgY29uc3QgYnRuQ3Jvc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgYnRuQ3Jvc3MuY2xhc3NOYW1lID0gJ2J0bi1jcm9zcyc7XG4gIGJ0bkNyb3NzLmlubmVySFRNTCA9ICc8aW1nIHNyYz1cIi4vYXNzZXRzL2ltZy9pY29uczgtbXVsdGlwbHktMjQucG5nXCIgYWx0PVwiWFwiIC8+JztcbiAgYnRuQ3Jvc3MuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWxDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9KTtcblxuICAvLyBjYXJkIGltZ1xuICBjb25zdCBjYXJkSW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNhcmRJbWcuY2xhc3NOYW1lID0gJ2NhcmQtaW1nJztcbiAgY2FyZEltZy5pbm5lckhUTUwgPSBgPGltZ1xuICBzcmM9XCIke2RhdGEuaW1hZ2Uub3JpZ2luYWx9XCJcbiAgYWx0PVwiJHtkYXRhLm5hbWV9XCJcbi8+YDtcblxuICAvLyBjYXJkIHRpdGxlXG4gIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDInKTtcbiAgdGl0bGUuY2xhc3NOYW1lID0gJ2NhcmQtdGl0bGUnO1xuICB0aXRsZS5pbm5lclRleHQgPSBkYXRhLm5hbWU7XG4gIC8vIGNhcmQgZGVzXG4gIGNvbnN0IGRlcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBkZXMuY2xhc3NOYW1lID0gJ2NhcmQtZGVzJztcbiAgZGVzLmlubmVySFRNTCA9IGRhdGEuc3VtbWFyeTtcblxuICAvLyBjYXJkIHNwZWMgZ3JvdXBcbiAgY29uc3QgY2FyZFNwZWMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY2FyZFNwZWMuY2xhc3NOYW1lID0gJ2NhcmQtc3BlYy1ncm91cCc7XG4gIGNhcmRTcGVjLmlubmVySFRNTCA9IGA8dWwgY2xhc3M9XCJjYXJkLXNwZWNcIj5cbiAgPGxpIGNsYXNzPVwic3BlYy1pdGVtXCI+U2Vhc29uOiAke2RhdGEuc2Vhc29ufTwvbGk+XG4gIDxsaSBjbGFzcz1cInNwZWMtaXRlbVwiPkR1cmF0aW9uOiAke2RhdGEucnVudGltZX08L2xpPlxuPC91bD5cbjx1bCBjbGFzcz1cImNhcmQtc3BlY1wiPlxuICA8bGkgY2xhc3M9XCJzcGVjLWl0ZW1cIj5haXJkYXRlOiAke2RhdGEuYWlyZGF0ZX08L2xpPlxuICA8bGkgY2xhc3M9XCJzcGVjLWl0ZW1cIj5SYXRpbmc6ICR7ZGF0YS5yYXRpbmcuYXZlcmFnZX08L2xpPlxuPC91bD5gO1xuXG4gIGNvbnN0IGNvbW1lbnRTZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbW1lbnRTZWN0aW9uLmNsYXNzTmFtZSA9ICdjb21tZW50LXNlY3Rpb24nO1xuXG4gIGNvbnN0IGNvbW1lbnRUaXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbW1lbnRUaXRlLmNsYXNzTmFtZSA9ICdjb21tZW50LXRpdGxlJztcbiAgY29uc3QgY29tbWVudEhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2gzJyk7XG4gIGNvbW1lbnRIZWFkZXIuY2xhc3NOYW1lID0gJ2NvbW1lbnQtaGVhZGVyJztcbiAgY29tbWVudEhlYWRlci5pbm5lckhUTUwgPSAnQ29tbWVudHMnO1xuICBjb25zdCBjb21tZW50Q291bnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gIGNvbW1lbnRDb3VudC5pZCA9ICdzaG93X2NvbW1lbnRfY291bnQnO1xuICBjb21tZW50Q291bnQuaW5uZXJUZXh0ID0gMDtcblxuICBjb21tZW50VGl0ZS5hcHBlbmQoY29tbWVudEhlYWRlciwgY29tbWVudENvdW50KTtcblxuICBjb25zdCBjb21tZW50R3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICBjb21tZW50R3JvdXAuY2xhc3NOYW1lID0gJ2NvbW1lbnQtZ291cCc7XG5cbiAgbGV0IGNvbW1lbnRJdGVtcyA9ICcnO1xuXG4gIGlmIChkYXRhLmNvbW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBkYXRhLmNvbW1lbnRzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbW1lbnRJdGVtcyArPSBgPGxpIGNsYXNzPSdjb21tZW50LWl0ZW0nPlxuICAgICAgICA8ZGl2IGNsYXNzPSd1c2VyLWluZm8nPlxuICAgICAgICAgIDxkaXYgY2xhc3M9J3VzZXItYXZhdGFyJz5cbiAgICAgICAgICAgIDxpbWcgc3JjPScuL2Fzc2V0cy9pbWcvdXNlci5wbmcnIGFsdD0nJHtpdGVtLnVzZXJuYW1lfScvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxoNCBjbGFzcz0ndXNlci1uYW1lJz4ke2l0ZW0udXNlcm5hbWV9PC9oND5cbiAgICAgICAgICA8c3BhbiBjbGFzcz0nc3VibWl0LWRhdGUnPiR7aXRlbS5jcmVhdGlvbl9kYXRlfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwIGNsYXNzPSd1c2VyLWRhdGEnPiR7aXRlbS5jb21tZW50fTwvcD5cbiAgICAgIDwvbGk+YDtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbW1lbnRHcm91cC5pbm5lckhUTUwgPSBjb21tZW50SXRlbXM7IC8vIGFwcGVuZCBjb21tZW50IGxpc3RcblxuICBjb21tZW50Q291bnRlcihjb21tZW50Q291bnQsIGNvbW1lbnRHcm91cCk7XG5cbiAgY29tbWVudFNlY3Rpb24uYXBwZW5kKGNvbW1lbnRUaXRlLCBjb21tZW50R3JvdXApO1xuXG4gIC8vIEFkZCBjb21tZW50XG4gIGNvbnN0IGNvbW1lbnRGb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbW1lbnRGb3JtLmNsYXNzTmFtZSA9ICdjb21tZW50LWZvcm0nO1xuICBjb25zdCBhZGRDb21tZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTtcbiAgYWRkQ29tbWVudC5jbGFzc05hbWUgPSAnY29tbWVudC10aXRsZSc7XG4gIGFkZENvbW1lbnQuaW5uZXJUZXh0ID0gJ0FkZCBhIGNvbW1lbnQnO1xuICBjb25zdCBGb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO1xuICBGb3JtLmlubmVySFRNTCA9IGBcbjxpbnB1dCB0eXBlPVwidGV4dFwiICBuYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiIHBsYWNlaG9sZGVyPVwiWW91ciBuYW1lXCIgbWF4bGVuZ3RoPVwiMTBcIiByZXF1aXJlZD5cbjx0ZXh0YXJlYSBpZD1cImluc2lnaHRcIiBuYW1lPVwiaW5zaWdodFwiIHBsYWNlaG9sZGVyPVwiWW91ciBpbnNpZ2h0c1wiPjwvdGV4dGFyZWE+XG48YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBpZD1cInN1Ym1pdEJ0blwiPlN1Ym1pdDwvYnV0dG9uPmA7XG5cbiAgY29tbWVudEZvcm0uYXBwZW5kKGFkZENvbW1lbnQsIEZvcm0pO1xuXG4gIEZvcm0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgYXN5bmMgKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgbmFtZSA9IEZvcm0uZWxlbWVudHMubmFtZS52YWx1ZTtcbiAgICBjb25zdCBpbnNpZ2h0ID0gRm9ybS5lbGVtZW50cy5pbnNpZ2h0LnZhbHVlO1xuICAgIGNvbnN0IGNvbW1lbnREYXRhID0ge1xuICAgICAgaXRlbV9pZDogZGF0YS5pZCxcbiAgICAgIHVzZXJuYW1lOiBuYW1lLFxuICAgICAgY29tbWVudDogaW5zaWdodCxcbiAgICB9O1xuICAgIGNvbnN0IHVybCA9IGAke0JBU0VfVVJMfS9jb21tZW50c2A7XG4gICAgY3JlYXRlTmV3Q29tbWVudCh1cmwsIGNvbW1lbnREYXRhLCBjb21tZW50U2VjdGlvbiwgRm9ybSk7XG4gIH0pO1xuICAvLyBhcHBlbmQgY2hpbGQgZWxlbWVudHMgaW4gY2FyZE1vZGFsXG4gIG1vZGFsQ2FyZC5hcHBlbmQoXG4gICAgYnRuQ3Jvc3MsXG4gICAgY2FyZEltZyxcbiAgICB0aXRsZSxcbiAgICBkZXMsXG4gICAgY2FyZFNwZWMsXG4gICAgY29tbWVudFNlY3Rpb24sXG4gICAgY29tbWVudEZvcm0sXG4gICk7XG5cbiAgbW9kYWxDb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gIG1vZGFsQ29udGFpbmVyLmFwcGVuZChtb2RhbENhcmQpOyAvLyBhcHBlbmQgY2FyZE1vZGFsXG59O1xuXG5jb25zdCBmZXRjaFNpbmdsZVNob3dDb21tZW50ID0gYXN5bmMgKGUpID0+IHtcbiAgbW9kYWxDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICBjb25zdCB7IGlkIH0gPSBlLnRhcmdldC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIGNvbnN0IHVybCA9IGBodHRwczovL2FwaS50dm1hemUuY29tL2VwaXNvZGVzLyR7aWR9YDtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgY29uc3QgY29tbWVudFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QkFTRV9VUkx9L2NvbW1lbnRzP2l0ZW1faWQ9JHtpZH1gKTtcblxuICBsZXQgZmlsdGVyUmVzdWx0ID0geyAuLi5yZXN1bHQgfTtcblxuICBjb25zdCBjb21tZW50UmVzdWx0ID0gYXdhaXQgY29tbWVudFJlc3BvbnNlLmpzb24oKTtcbiAgaWYgKGNvbW1lbnRSZXN1bHQgJiYgIWNvbW1lbnRSZXN1bHQuZXJyb3IpIHtcbiAgICBmaWx0ZXJSZXN1bHQgPSB7IC4uLmZpbHRlclJlc3VsdCwgY29tbWVudHM6IGNvbW1lbnRSZXN1bHQgfTtcbiAgfSBlbHNlIHtcbiAgICBmaWx0ZXJSZXN1bHQgPSB7IC4uLmZpbHRlclJlc3VsdCwgY29tbWVudHM6IFtdIH07XG4gIH1cblxuICByZW5kZXIoZmlsdGVyUmVzdWx0KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZldGNoU2luZ2xlU2hvd0NvbW1lbnQ7XG4iLCJjb25zdCByZXNlcnZhdGlvbkNvdW50ZXIgPSAoY291bnRDb250YWluZXIsIHJlc2VydmF0aW9uQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IGNvdW50ID0gcmVzZXJ2YXRpb25Db250YWluZXIuY2hpbGRFbGVtZW50Q291bnQ7XG4gIGNvdW50Q29udGFpbmVyLmlubmVyVGV4dCA9IGAoJHtjb3VudH0pYDtcbiAgcmV0dXJuIGNvdW50O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVzZXJ2YXRpb25Db3VudGVyO1xuIiwiaW1wb3J0IHsgQkFTRV9VUkwgfSBmcm9tICcuL2FwaVVybHMuanMnO1xuaW1wb3J0IHsgbW9kYWxDb250YWluZXIgfSBmcm9tICcuL2RvbVNlbGVjdG9yLmpzJztcbmltcG9ydCByZXNlcnZhdGlvbkNvdW50ZXIgZnJvbSAnLi9yZXNlcnZhdGlvbkNvdW50ZXIuanMnO1xuXG5jb25zdCBjcmVhdGVOZXdSZXNlcnZhdGlvbiA9IGFzeW5jICh1cmwsIGRhdGEsIHJlc2VydmF0aW9uQ29udGFpbmVyLCBGb3JtKSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rICYmIHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAxKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmV0Y2hDb21VcmwgPSBgJHtCQVNFX1VSTH0vcmVzZXJ2YXRpb25zP2l0ZW1faWQ9JHtkYXRhLml0ZW1faWR9YDtcblxuICBjb25zdCByZXNlcnZhdGlvblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZmV0Y2hDb21VcmwpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc2VydmF0aW9uUmVzcG9uc2UuanNvbigpO1xuXG4gIC8vIG1hbnVwdWxhdGUgdGhlIGRvbVxuICBjb25zdCByZXNlcnZhdGlvbkhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2gzJyk7XG4gIHJlc2VydmF0aW9uSGVhZGVyLmNsYXNzTmFtZSA9ICdyZXNlcnZhdGlvbi10aXRsZSc7XG4gIHJlc2VydmF0aW9uSGVhZGVyLmlubmVySFRNTCA9IFwiUmVzZXJ2YXRpb25zIDxzcGFuIGlkPSdzaG93X2NvbW1lbnRfY291bnQnPigwKTwvc3Bhbj5cIjtcblxuICBjb25zdCByZXNlcnZhdGlvbkdyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcbiAgcmVzZXJ2YXRpb25Hcm91cC5jbGFzc05hbWUgPSAncmVzZXJ2YXRpb24tZ3JvdXAnO1xuXG4gIGxldCByZXNlcnZhdGlvbkl0ZW1zID0gJyc7XG5cbiAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgcmVzdWx0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHJlc2VydmF0aW9uSXRlbXMgKz0gYDxsaSBjbGFzcz0ncmVzZXJ2YXRpb24taXRlbSc+XG4gICAgICA8ZGl2IGNsYXNzPSd1c2VyLWluZm8nPlxuICAgICAgICA8ZGl2IGNsYXNzPSd1c2VyLWF2YXRhcic+XG4gICAgICAgICAgPGltZyBzcmM9Jy4vYXNzZXRzL2ltZy91c2VyLnBuZycgYWx0PScke2l0ZW0udXNlcm5hbWV9Jy8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aDQgY2xhc3M9J3VzZXItbmFtZSc+JHtpdGVtLnVzZXJuYW1lfTwvaDQ+XG4gICAgICAgIDxzcGFuIGNsYXNzPSdzdWJtaXQtZGF0ZSc+JHtpdGVtLmRhdGVfc3RhcnR9IC0gJHtpdGVtLmRhdGVfZW5kfTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbGk+YDtcbiAgICB9KTtcbiAgfVxuXG4gIHJlc2VydmF0aW9uR3JvdXAuaW5uZXJIVE1MID0gcmVzZXJ2YXRpb25JdGVtczsgLy8gYXBwZW5kIHJlc2VydmF0aW9uIGxpc3RcbiAgcmVzZXJ2YXRpb25Db250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgcmVzZXJ2YXRpb25Db3VudGVyKHJlc2VydmF0aW9uSGVhZGVyLmNoaWxkcmVuWzBdLCByZXNlcnZhdGlvbkdyb3VwKTtcblxuICByZXNlcnZhdGlvbkNvbnRhaW5lci5hcHBlbmQocmVzZXJ2YXRpb25IZWFkZXIsIHJlc2VydmF0aW9uR3JvdXApO1xuXG4gIEZvcm0uZWxlbWVudHMubmFtZS52YWx1ZSA9ICcnO1xuICBGb3JtLmVsZW1lbnRzLnN0YXJ0X2RhdGUudmFsdWUgPSAnJztcbiAgRm9ybS5lbGVtZW50cy5lbmRfZGF0ZS52YWx1ZSA9ICcnO1xufTtcblxuY29uc3QgcmVuZGVyID0gKGRhdGEpID0+IHtcbiAgLy8gbW9kYWwgY2FyZFxuICBjb25zdCBtb2RhbENhcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbW9kYWxDYXJkLmNsYXNzTmFtZSA9ICdtb2RhbC1jYXJkJztcblxuICAvLyBidXR0b25cbiAgY29uc3QgYnRuQ3Jvc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgYnRuQ3Jvc3MuY2xhc3NOYW1lID0gJ2J0bi1jcm9zcyc7XG4gIGJ0bkNyb3NzLmlubmVySFRNTCA9ICc8aW1nIHNyYz1cIi4vYXNzZXRzL2ltZy9pY29uczgtbXVsdGlwbHktMjQucG5nXCIgYWx0PVwiWFwiIC8+JztcbiAgYnRuQ3Jvc3MuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWxDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9KTtcblxuICAvLyBjYXJkIGltZ1xuICBjb25zdCBjYXJkSW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNhcmRJbWcuY2xhc3NOYW1lID0gJ2NhcmQtaW1nJztcbiAgY2FyZEltZy5pbm5lckhUTUwgPSBgPGltZ1xuICBzcmM9XCIke2RhdGEuaW1hZ2Uub3JpZ2luYWx9XCJcbiAgYWx0PVwiJHtkYXRhLm5hbWV9XCJcbi8+YDtcblxuICAvLyBjYXJkIHRpdGxlXG4gIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDInKTtcbiAgdGl0bGUuY2xhc3NOYW1lID0gJ2NhcmQtdGl0bGUnO1xuICB0aXRsZS5pbm5lclRleHQgPSBkYXRhLm5hbWU7XG5cbiAgLy8gY2FyZCBkZXNcbiAgY29uc3QgZGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGRlcy5jbGFzc05hbWUgPSAnY2FyZC1kZXMnO1xuICBkZXMuaW5uZXJIVE1MID0gZGF0YS5zdW1tYXJ5O1xuXG4gIC8vIGNhcmQgc3BlYyBncm91cFxuICBjb25zdCBjYXJkU3BlYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBjYXJkU3BlYy5jbGFzc05hbWUgPSAnY2FyZC1zcGVjLWdyb3VwJztcbiAgY2FyZFNwZWMuaW5uZXJIVE1MID0gYDx1bCBjbGFzcz1cImNhcmQtc3BlY1wiPlxuICA8bGkgY2xhc3M9XCJzcGVjLWl0ZW1cIj5TZWFzb246ICR7ZGF0YS5zZWFzb259PC9saT5cbiAgPGxpIGNsYXNzPVwic3BlYy1pdGVtXCI+RHVyYXRpb246ICR7ZGF0YS5ydW50aW1lfTwvbGk+XG48L3VsPlxuPHVsIGNsYXNzPVwiY2FyZC1zcGVjXCI+XG4gIDxsaSBjbGFzcz1cInNwZWMtaXRlbVwiPmFpcmRhdGU6ICR7ZGF0YS5haXJkYXRlfTwvbGk+XG4gIDxsaSBjbGFzcz1cInNwZWMtaXRlbVwiPlJhdGluZzogJHtkYXRhLnJhdGluZy5hdmVyYWdlfTwvbGk+XG48L3VsPmA7XG5cbiAgY29uc3QgcmVzZXJ2YXRpb25TZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHJlc2VydmF0aW9uU2VjdGlvbi5jbGFzc05hbWUgPSAncmVzZXJ2YXRpb24tc2VjdGlvbic7XG5cbiAgY29uc3QgcmVzZXJ2YXRpb25IZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMycpO1xuICByZXNlcnZhdGlvbkhlYWRlci5jbGFzc05hbWUgPSAncmVzZXJ2YXRpb24tdGl0bGUnO1xuICByZXNlcnZhdGlvbkhlYWRlci5pbm5lckhUTUwgPSBcIlJlc2VydmF0aW9ucyA8c3BhbiBpZD0nc2hvd19jb21tZW50X2NvdW50Jz4oMCk8L3NwYW4+XCI7XG5cbiAgY29uc3QgcmVzZXJ2YXRpb25Hcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG4gIHJlc2VydmF0aW9uR3JvdXAuY2xhc3NOYW1lID0gJ3Jlc2VydmF0aW9uLWdyb3VwJztcblxuICBsZXQgcmVzZXJ2YXRpb25JdGVtcyA9ICcnO1xuXG4gIGlmIChkYXRhLnJlc2VydmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgZGF0YS5yZXNlcnZhdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgcmVzZXJ2YXRpb25JdGVtcyArPSBgPGxpIGNsYXNzPSdyZXNlcnZhdGlvbi1pdGVtJz5cbiAgICAgIDxkaXYgY2xhc3M9J3VzZXItaW5mbyc+XG4gICAgICAgIDxkaXYgY2xhc3M9J3VzZXItYXZhdGFyJz5cbiAgICAgICAgICA8aW1nIHNyYz0nLi9hc3NldHMvaW1nL3VzZXIucG5nJyBhbHQ9JyR7aXRlbS51c2VybmFtZX0nLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxoNCBjbGFzcz0ndXNlci1uYW1lJz4ke2l0ZW0udXNlcm5hbWV9PC9oND5cbiAgICAgICAgPHNwYW4gY2xhc3M9J3N1Ym1pdC1kYXRlJz4ke2l0ZW0uZGF0ZV9zdGFydH0gLSAke2l0ZW0uZGF0ZV9lbmR9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9saT5gO1xuICAgIH0pO1xuICB9XG5cbiAgcmVzZXJ2YXRpb25Hcm91cC5pbm5lckhUTUwgPSByZXNlcnZhdGlvbkl0ZW1zOyAvLyBhcHBlbmQgcmVzZXJ2YXRpb24gbGlzdFxuXG4gIHJlc2VydmF0aW9uQ291bnRlcihyZXNlcnZhdGlvbkhlYWRlci5jaGlsZHJlblswXSwgcmVzZXJ2YXRpb25Hcm91cCk7XG5cbiAgcmVzZXJ2YXRpb25TZWN0aW9uLmFwcGVuZChyZXNlcnZhdGlvbkhlYWRlciwgcmVzZXJ2YXRpb25Hcm91cCk7XG5cbiAgLy8gQWRkIGNvbW1lbnRcbiAgY29uc3QgcmVzZXJ2YXRpb25Gb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHJlc2VydmF0aW9uRm9ybS5jbGFzc05hbWUgPSAncmVzZXJ2YXRpb24tZm9ybSc7XG4gIGNvbnN0IGFkZFJlc2VydmF0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTtcbiAgYWRkUmVzZXJ2YXRpb24uY2xhc3NOYW1lID0gJ3Jlc2VydmF0aW9uLXRpdGxlJztcbiAgYWRkUmVzZXJ2YXRpb24uaW5uZXJUZXh0ID0gJ0FkZCBhIFJlc2VydmF0aW9uJztcbiAgY29uc3QgRm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcbiAgRm9ybS5pbm5lckhUTUwgPSBgXG4gIDxpbnB1dCB0eXBlPVwidGV4dFwiICBuYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiIHBsYWNlaG9sZGVyPVwiWW91ciBuYW1lXCIgbWF4bGVuZ3RoPVwiMTBcIiByZXF1aXJlZD5cbiAgPGxhYmVsIGZvcj0nc3RhcnRfZGF0ZSc+QWRkIHlvdXIgc3RhcnQgZGF0ZSBiZWxvdzwvbGFiZWw+XG4gIDxpbnB1dCB0eXBlPVwiZGF0ZVwiICBuYW1lPVwic3RhcnRfZGF0ZVwiIGlkPVwic3RhcnRfZGF0ZVwiIHBsYWNlaG9sZGVyPVwiQWRkIHlvdXIgc3RhcnQgZGF0ZSBoZXJlLlwiIHJlcXVpcmVkPlxuICA8bGFiZWwgZm9yPSdlbmRfZGF0ZSc+QWRkIHlvdXIgZW5kIGRhdGUgYmVsb3c8L2xhYmVsPlxuICA8aW5wdXQgdHlwZT1cImRhdGVcIiAgbmFtZT1cImVuZF9kYXRlXCIgaWQ9XCJlbmRfZGF0ZVwiIHBsYWNlaG9sZGVyPVwiQWRkIHlvdXIgZW5kIGRhdGUgaGVyZS5cIiByZXF1aXJlZD5cbiAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgaWQ9XCJzdWJtaXRCdG5cIj5SZXNlcnZlPC9idXR0b24+YDtcblxuICByZXNlcnZhdGlvbkZvcm0uYXBwZW5kKGFkZFJlc2VydmF0aW9uLCBGb3JtKTtcblxuICBGb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGFzeW5jIChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IG5hbWUgPSBGb3JtLmVsZW1lbnRzLm5hbWUudmFsdWU7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gRm9ybS5lbGVtZW50cy5zdGFydF9kYXRlLnZhbHVlO1xuICAgIGNvbnN0IGVuZERhdGUgPSBGb3JtLmVsZW1lbnRzLmVuZF9kYXRlLnZhbHVlO1xuICAgIGNvbnN0IHJlc2VydmVEYXRhID0ge1xuICAgICAgaXRlbV9pZDogZGF0YS5pZCxcbiAgICAgIHVzZXJuYW1lOiBuYW1lLFxuICAgICAgZGF0ZV9zdGFydDogc3RhcnREYXRlLFxuICAgICAgZGF0ZV9lbmQ6IGVuZERhdGUsXG4gICAgfTtcbiAgICBjb25zdCB1cmwgPSBgJHtCQVNFX1VSTH0vcmVzZXJ2YXRpb25zL2A7XG4gICAgY3JlYXRlTmV3UmVzZXJ2YXRpb24odXJsLCByZXNlcnZlRGF0YSwgcmVzZXJ2YXRpb25TZWN0aW9uLCBGb3JtKTtcbiAgfSk7XG5cbiAgLy8gYXBwZW5kIGNoaWxkIGVsZW1lbnRzIGluIGNhcmRNb2RhbFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICBtb2RhbENhcmQuYXBwZW5kKFxuICAgIGJ0bkNyb3NzLFxuICAgIGNhcmRJbWcsXG4gICAgdGl0bGUsXG4gICAgZGVzLFxuICAgIGNhcmRTcGVjLFxuICAgIHJlc2VydmF0aW9uU2VjdGlvbixcbiAgICByZXNlcnZhdGlvbkZvcm0sXG4gICk7XG5cbiAgbW9kYWxDb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gIG1vZGFsQ29udGFpbmVyLmFwcGVuZChtb2RhbENhcmQpOyAvLyBhcHBlbmQgY2FyZE1vZGFsXG59O1xuXG5jb25zdCBmZXRjaFNpbmdsZVNob3cgPSBhc3luYyAoZSkgPT4ge1xuICBtb2RhbENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIGNvbnN0IHsgaWQgfSA9IGUudGFyZ2V0LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgY29uc3QgdXJsID0gYGh0dHBzOi8vYXBpLnR2bWF6ZS5jb20vZXBpc29kZXMvJHtpZH1gO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICBjb25zdCByZXNlcnZhdGlvblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYCR7QkFTRV9VUkx9L3Jlc2VydmF0aW9ucz9pdGVtX2lkPSR7aWR9YCxcbiAgKTtcblxuICBsZXQgZmlsdGVyUmVzdWx0ID0geyAuLi5yZXN1bHQgfTtcblxuICBjb25zdCByZXNlcnZhdGlvblJlc3VsdCA9IGF3YWl0IHJlc2VydmF0aW9uUmVzcG9uc2UuanNvbigpO1xuICBpZiAocmVzZXJ2YXRpb25SZXN1bHQgJiYgIXJlc2VydmF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgZmlsdGVyUmVzdWx0ID0geyAuLi5maWx0ZXJSZXN1bHQsIHJlc2VydmF0aW9uczogcmVzZXJ2YXRpb25SZXN1bHQgfTtcbiAgfSBlbHNlIHtcbiAgICBmaWx0ZXJSZXN1bHQgPSB7IC4uLmZpbHRlclJlc3VsdCwgcmVzZXJ2YXRpb25zOiBbXSB9O1xuICB9XG5cbiAgcmVuZGVyKGZpbHRlclJlc3VsdCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmZXRjaFNpbmdsZVNob3c7XG4iLCJpbXBvcnQgeyBpdGVtQ291bnRDb250YWluZXIsIGxpc3RJdGVtc0NvbnRhaW5lciB9IGZyb20gJy4vZG9tU2VsZWN0b3IuanMnO1xuaW1wb3J0IGZldGNoU2luZ2xlU2hvd0NvbW1lbnQgZnJvbSAnLi9wb3B1cENvbW1lbnQuanMnO1xuaW1wb3J0IGZldGNoU2luZ2xlU2hvdyBmcm9tICcuL3BvcHVwUmVzZXJ2YXRpb24uanMnO1xuaW1wb3J0IHsgQkFTRV9VUkwsIE1PVklFX0FQSSB9IGZyb20gJy4vYXBpVXJscy5qcyc7XG5pbXBvcnQgaXRlbUNvdW50ZXIgZnJvbSAnLi9pdGVtQ291bnRlci5qcyc7XG5cbi8vIGNyZWF0ZU5ldyBsaWtlXG5jb25zdCBjcmVhdGVOZXdMaWtlID0gYXN5bmMgKGlkLCBsaWtlQ291bnQsIGJ0bkxpa2UpID0+IHtcbiAgYnRuTGlrZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0JBU0VfVVJMfS9saWtlc2AsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpdGVtX2lkOiBpZCB9KSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vayAmJiByZXNwb25zZS5zdGF0dXMgIT09IDIwMSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlTGlrZXMgPSBhd2FpdCBmZXRjaChgJHtCQVNFX1VSTH0vbGlrZXNgKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2VMaWtlcy5qc29uKCk7XG4gIGNvbnN0IGxpa2VEYXRhID0gcmVzdWx0LmZpbmQoKGl0ZW0pID0+IGl0ZW0uaXRlbV9pZCA9PT0gaWQpO1xuICBpZiAobGlrZURhdGEpIHtcbiAgICBsaWtlQ291bnQuaW5uZXJUZXh0ID0gbGlrZURhdGEubGlrZXMgPiAxID8gYCR7bGlrZURhdGEubGlrZXN9IGxpa2VzYCA6IGAke2xpa2VEYXRhLmxpa2VzfSBsaWtlYDtcbiAgICBidG5MaWtlLmlubmVySFRNTCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJpc28tODg1OS0xXCI/PlxuICAgIDwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIEdlbmVyYXRvcjogU1ZHIFJlcG8gTWl4ZXIgVG9vbHMgLS0+XG4gICAgPHN2ZyBmaWxsPVwiI2ZmN2IwMFwiIGhlaWdodD1cIjIycHhcIiB3aWR0aD1cIjIycHhcIiB2ZXJzaW9uPVwiMS4xXCIgaWQ9XCJMYXllcl8xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIFxuICAgICAgIHZpZXdCb3g9XCIwIDAgNDU1IDQ1NVwiIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+XG4gICAgPHBhdGggZD1cIk0zMjYuNjMyLDEwLjM0NmMtMzguNzMzLDAtNzQuOTkxLDE3LjUzNy05OS4xMzIsNDYuOTJjLTI0LjE0MS0yOS4zODMtNjAuMzk5LTQ2LjkyLTk5LjEzMi00Ni45MlxuICAgICAgQzU3LjU4NiwxMC4zNDYsMCw2Ny45MzEsMCwxMzguNzE0YzAsNTUuNDI2LDMzLjA0OSwxMTkuNTM1LDk4LjIzLDE5MC41NDZjNTAuMTYyLDU0LjY0OSwxMDQuNzI5LDk2Ljk2LDEyMC4yNTcsMTA4LjYyNmw5LjAxLDYuNzY5XG4gICAgICBsOS4wMDktNi43NjhjMTUuNTMtMTEuNjY3LDcwLjA5OS01My45NzksMTIwLjI2LTEwOC42MjVDNDIxLjk1LDI1OC4yNTEsNDU1LDE5NC4xNDEsNDU1LDEzOC43MTRcbiAgICAgIEM0NTUsNjcuOTMxLDM5Ny40MTQsMTAuMzQ2LDMyNi42MzIsMTAuMzQ2elwiLz5cbiAgICA8L3N2Zz5gO1xuICB9XG59O1xuXG4vLyByZW5kZXIgdGhlIGl0ZW0gbGlzdFxuY29uc3QgcmVuZGVyID0gKGRhdGEpID0+IHtcbiAgaWYgKGRhdGEubGVuZ3RoID4gMCkge1xuICAgIGxpc3RJdGVtc0NvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgIGRhdGEuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgICBpdGVtLmlkID0gaS5pZDtcbiAgICAgIGl0ZW0uY2xhc3NOYW1lID0gJ3Nob3ctaXRlbSc7XG5cbiAgICAgIC8vIGNyZWF0ZSBzaG8gSW1nIGVsZW1lbnRcbiAgICAgIGNvbnN0IHNob3dJbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHNob3dJbWcuY2xhc3NOYW1lID0gJ3Nob3ctaXRlbS1pbWcnO1xuICAgICAgc2hvd0ltZy5pbm5lckhUTUwgPSBgPGltZyBzcmM9JyR7aS5pbWFnZS5vcmlnaW5hbH0nPmA7XG5cbiAgICAgIC8vIGNyZWF0ZSBzaG93IGluZm9cbiAgICAgIGNvbnN0IHNob3dJbmZvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzaG93SW5mby5jbGFzc05hbWUgPSAnc2hvdy1pbmZvJztcblxuICAgICAgLy8gY3JlYXRlIHRpbGUgZm9yIHNob3cgaW5mb1xuICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMycpO1xuICAgICAgdGl0bGUuY2xhc3NOYW1lID0gJ3Nob3ctdGl0bGUnO1xuICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gaS5uYW1lO1xuXG4gICAgICAvLyBsaWtlIGFjdGlvblxuICAgICAgY29uc3Qgc2hvd0xpa2VBY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHNob3dMaWtlQWN0aW9uLmNsYXNzTmFtZSA9ICdzaHdvLWxpa2UtYWN0aW9uJztcblxuICAgICAgLy8gbGlrZSBidXR0b25cbiAgICAgIGNvbnN0IGJ0bkxpa2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIGJ0bkxpa2UuY2xhc3NOYW1lID0gJ2J0bi1saWtlJztcbiAgICAgIGJ0bkxpa2UuaW5uZXJIVE1MID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cImlzby04ODU5LTFcIj8+XG4gICAgICA8IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPlxuICAgICAgPHN2ZyBmaWxsPVwiI2ZmN2IwMFwiIGhlaWdodD1cIjIycHhcIiB3aWR0aD1cIjIycHhcIiB2ZXJzaW9uPVwiMS4xXCIgaWQ9XCJMYXllcl8xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIFxuICAgICAgICAgdmlld0JveD1cIjAgMCA0NTUgNDU1XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj5cbiAgICAgIDxwYXRoIGQ9XCJNMzI2LjYzMiwxMC4zNDZjLTM4LjczMywwLTc0Ljk5MSwxNy41MzctOTkuMTMyLDQ2LjkyYy0yNC4xNDEtMjkuMzg0LTYwLjM5OC00Ni45Mi05OS4xMzItNDYuOTJcbiAgICAgICAgQzU3LjU4NiwxMC4zNDYsMCw2Ny45MzEsMCwxMzguNzE0YzAsNTUuNDI2LDMzLjA1LDExOS41MzUsOTguMjMsMTkwLjU0NmM1MC4xNjEsNTQuNjQ3LDEwNC43MjgsOTYuOTU5LDEyMC4yNTcsMTA4LjYyNmw5LjAxLDYuNzY5XG4gICAgICAgIGw5LjAxLTYuNzY4YzE1LjUyOS0xMS42NjcsNzAuMDk4LTUzLjk3OCwxMjAuMjYtMTA4LjYyNUM0MjEuOTQ5LDI1OC4yNTEsNDU1LDE5NC4xNDEsNDU1LDEzOC43MTRcbiAgICAgICAgQzQ1NSw2Ny45MzEsMzk3LjQxNCwxMC4zNDYsMzI2LjYzMiwxMC4zNDZ6IE0zMzQuNjY2LDMwOC45NzRjLTQxLjI1OSw0NC45NDgtODUuNjQ4LDgxLjI4My0xMDcuMTY5LDk4LjAyOVxuICAgICAgICBjLTIxLjUyLTE2Ljc0Ni02NS45MDctNTMuMDgyLTEwNy4xNjYtOTguMDNDNjEuMjM2LDI0NC41OTIsMzAsMTg1LjcxNywzMCwxMzguNzE0YzAtNTQuMjQsNDQuMTI4LTk4LjM2OCw5OC4zNjgtOTguMzY4XG4gICAgICAgIGMzNS42OTQsMCw2OC42NTIsMTkuNDU0LDg2LjAxMyw1MC43NzFsMTMuMTE5LDIzLjY2NmwxMy4xMTktMjMuNjY2YzE3LjM2LTMxLjMxNiw1MC4zMTgtNTAuNzcxLDg2LjAxMy01MC43NzFcbiAgICAgICAgYzU0LjI0LDAsOTguMzY4LDQ0LjEyNyw5OC4zNjgsOTguMzY4QzQyNSwxODUuNzE5LDM5My43NjMsMjQ0LjU5NCwzMzQuNjY2LDMwOC45NzR6XCIvPlxuICAgICAgPC9zdmc+YDtcblxuICAgICAgLy8gbGlrZSBjb3VudFxuICAgICAgY29uc3QgbGlrZUNvdW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgaWYgKGkubGlrZXMgPiAxKSB7XG4gICAgICAgIGxpa2VDb3VudC5pbm5lclRleHQgPSBgJHtpLmxpa2VzfSBsaWtlc2A7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWtlQ291bnQuaW5uZXJIVE1MID0gYCR7aS5saWtlc30gbGlrZWA7XG4gICAgICB9XG5cbiAgICAgIC8vIGJ0biBsaWtlIGV2ZW50IHRvIGNyZWF0ZSBuZXcgbGlrZVxuICAgICAgYnRuTGlrZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY3JlYXRlTmV3TGlrZShpLmlkLCBsaWtlQ291bnQsIGJ0bkxpa2UpO1xuICAgICAgfSk7XG5cbiAgICAgIHNob3dMaWtlQWN0aW9uLmFwcGVuZChidG5MaWtlLCBsaWtlQ291bnQpOyAvLyBhcHBlbmQgbGlrZSBhY3Rpb25zIGNoaWxkIGVsZW1lbnQuXG5cbiAgICAgIHNob3dJbmZvLmFwcGVuZCh0aXRsZSwgc2hvd0xpa2VBY3Rpb24pOyAvLyBhcHBlbmQgaW4gc2hvd0luZm9cblxuICAgICAgLy8gc2hvdyBhY3Rpb25cbiAgICAgIGNvbnN0IHNob3dBY3Rpb25zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzaG93QWN0aW9ucy5jbGFzc05hbWUgPSAnc2hvdy1hY3Rpb25zJztcblxuICAgICAgLy8gY3JlYXRlIGNoaWxkIGJ0blxuICAgICAgY29uc3QgY29tbWVudEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgY29tbWVudEJ0bi5jbGFzc05hbWUgPSAnYnRuLWFjdGlvbiBidG4tY29tbWVudCc7XG4gICAgICBjb21tZW50QnRuLmlubmVyVGV4dCA9ICdDb21tZW50cyc7XG4gICAgICBjb21tZW50QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgZmV0Y2hTaW5nbGVTaG93Q29tbWVudChlKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXNlcnZhdGlvbkJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgcmVzZXJ2YXRpb25CdG4uY2xhc3NOYW1lID0gJ2J0bi1hY3Rpb24gYnRuLXJlc2VydmF0aW9uJztcbiAgICAgIHJlc2VydmF0aW9uQnRuLmlubmVyVGV4dCA9ICdSZXNlcnZhdGlvbnMnO1xuICAgICAgcmVzZXJ2YXRpb25CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICBmZXRjaFNpbmdsZVNob3coZSk7XG4gICAgICB9KTtcblxuICAgICAgc2hvd0FjdGlvbnMuYXBwZW5kKGNvbW1lbnRCdG4sIHJlc2VydmF0aW9uQnRuKTsgLy8gYXBwZW5kIGNoaWxkIGFjdGlvbiBidXR0b25zIGluIHNob3dBY3Rpb25zXG5cbiAgICAgIGl0ZW0uYXBwZW5kKHNob3dJbWcsIHNob3dJbmZvLCBzaG93QWN0aW9ucyk7IC8vIGFwcGVuZCBjbGlsZCBhbGwgdGhlIGVsZW1lbnRzIGluIGl0ZW0uXG5cbiAgICAgIGxpc3RJdGVtc0NvbnRhaW5lci5hcHBlbmRDaGlsZChpdGVtKTtcbiAgICB9KTtcbiAgICBpdGVtQ291bnRlcihpdGVtQ291bnRDb250YWluZXIsIGxpc3RJdGVtc0NvbnRhaW5lcik7XG4gIH0gZWxzZSB7XG4gICAgbGlzdEl0ZW1zQ29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBjbGFzcz1cIm5vLWRhdGFcIj5ObyBEYXRhIEZvdW5kPC9wPic7XG4gIH1cbn07XG5cbmNvbnN0IGZldGNoVHZTaG93cyA9IGFzeW5jICgpID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChNT1ZJRV9BUEkpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgLy8gY2FsbCB0aGUgSW52b2xtZW50IGFwaSB0byBnZXQgbGlrZXNcbiAgY29uc3QgcmVzcG9uc2VJbnZvbHZlbWVudCA9IGF3YWl0IGZldGNoKGAke0JBU0VfVVJMfS9saWtlcy9gKTtcbiAgY29uc3QgbGlrZXNSZXN1bHQgPSBhd2FpdCByZXNwb25zZUludm9sdmVtZW50Lmpzb24oKTtcblxuICAvLyBmaWx0ZXIgQXJyYXkgdGhhdHMgaGF2ZSBMaWtlc1xuICBjb25zdCBmaWx0ZXJBcnJXaXRoTGlrZXMgPSBbXTtcbiAgcmVzdWx0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBsaWtlc1Jlc3VsdC5mb3JFYWNoKChsaWtlSXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0uaWQgPT09IGxpa2VJdGVtLml0ZW1faWQpIHtcbiAgICAgICAgZmlsdGVyQXJyV2l0aExpa2VzLnB1c2goeyAuLi5pdGVtLCBsaWtlczogbGlrZUl0ZW0ubGlrZXMgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIGZpbHRlciBBcnJheSB0aGF0cyBoYXZlIG5vdCBsaWtlc1xuICBsZXQgZmlsdGVyV2l0aG91dExpa2VzID0gW107XG4gIGZpbHRlcldpdGhvdXRMaWtlcyA9IHJlc3VsdC5maWx0ZXIoXG4gICAgKGVsKSA9PiAhZmlsdGVyQXJyV2l0aExpa2VzLmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQuaWQgPT09IGVsLmlkKSxcbiAgKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgLy8gbW9kaWZ5IHRoZSBmaWx0ZXJXaXRob3V0IGFycmF5IGxpa2VzIGNvdW50IDA7XG4gIGNvbnN0IG1vZGlmaXlGaWx0ZXJXaXRob3V0TGlrZXMgPSBbXTtcbiAgZmlsdGVyV2l0aG91dExpa2VzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBtb2RpZml5RmlsdGVyV2l0aG91dExpa2VzLnB1c2goeyAuLi5pdGVtLCBsaWtlczogMCB9KTtcbiAgfSk7XG5cbiAgLy8gam9pbiBhbmQgc29ydCB0aGUgYXJyYXlzXG4gIGNvbnN0IGpvaW5BcnIgPSBtb2RpZml5RmlsdGVyV2l0aG91dExpa2VzLmNvbmNhdChmaWx0ZXJBcnJXaXRoTGlrZXMpO1xuICBqb2luQXJyLnNvcnQoKGEsIGIpID0+IGEuaWQgLSBiLmlkKTtcblxuICAvLyBjYWxsIHJlbmRlciBmdW5jdGlvbiB0byBkaXNwbGF5IHRoZSBpdGVtIGxpc3RcbiAgcmVuZGVyKGpvaW5BcnIpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZmV0Y2hUdlNob3dzO1xuIiwiY29uc3QgaXRlbUNvdW50ZXIgPSAoY291bnRDb250YWluZXIsIGl0ZW1Db250YWluZXIpID0+IHtcbiAgY29uc3QgY291bnQgPSBpdGVtQ29udGFpbmVyLmNoaWxkRWxlbWVudENvdW50O1xuICBjb3VudENvbnRhaW5lci5pbm5lclRleHQgPSBgKCR7Y291bnR9KWA7XG4gIHJldHVybiBjb3VudDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGl0ZW1Db3VudGVyO1xuIiwiLy8gaW1wb3J0IHN0YXRpYyBmaWxlc1xuaW1wb3J0ICcuL3N0eWxlLmNzcyc7XG5pbXBvcnQgJy4vYXNzZXRzL2ltZy9pY29uczgtbWVudS1yb3VuZGVkLTI0LnBuZyc7XG5pbXBvcnQgJy4vYXNzZXRzL2ltZy9pY29uczgtbXVsdGlwbHktMjQucG5nJztcbmltcG9ydCAnLi9hc3NldHMvaW1nL3VzZXIucG5nJztcblxuaW1wb3J0IGZldGNoVHZTaG93IGZyb20gJy4vbW9kdWxlcy9kaXNwbGF5SXRlbXMuanMnO1xuaW1wb3J0IHtcbiAgY2xvc2VCdG4sXG4gIG1lbnVCdG4sXG4gIG1vYk5hdkdyb3VwLFxuICBtb2JpbGVOYXZsaW5rcyxcbn0gZnJvbSAnLi9tb2R1bGVzL2RvbVNlbGVjdG9yLmpzJztcblxuLy8gdG9nZ2xlIHRoZSBtZW51XG5tZW51QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICBtb2JOYXZHcm91cC5jbGFzc0xpc3QudG9nZ2xlKCdkaXNwbGF5LWZsZXgnKTtcbn0pO1xuXG5jbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgbW9iTmF2R3JvdXAuY2xhc3NMaXN0LnJlbW92ZSgnZGlzcGxheS1mbGV4Jyk7XG59KTtcblxubW9iaWxlTmF2bGlua3MuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vYk5hdkdyb3VwLmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc3BsYXktZmxleCcpO1xuICB9KTtcbn0pO1xuXG4vLyBsb2FkIHRoZSBpdGVtIGxpc3Qgb24gdGhlIGZseS5cbndpbmRvdy5vbmxvYWQgPSAoKSA9PiB7XG4gIGZldGNoVHZTaG93KCk7XG59O1xuIl0sIm5hbWVzIjpbIm1lbnVCdG4iLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiY2xvc2VCdG4iLCJtb2JpbGVOYXZsaW5rcyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJtb2JOYXZHcm91cCIsInF1ZXJ5U2VsZWN0b3IiLCJtb2RhbENvbnRhaW5lciIsImxpc3RJdGVtc0NvbnRhaW5lciIsIml0ZW1Db3VudENvbnRhaW5lciIsIkJBU0VfVVJMIiwiY291bnRDb250YWluZXIiLCJjb21tZW50Q29udGFpbmVyIiwiY291bnQiLCJjaGlsZEVsZW1lbnRDb3VudCIsImlubmVyVGV4dCIsImkiLCJjcmVhdGVOZXdDb21tZW50IiwidXJsIiwiZGF0YSIsImNvbW1lbnRzQ29udGFpbmVyIiwiRm9ybSIsImZldGNoIiwibWV0aG9kIiwiaGVhZGVycyIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwicmVzcG9uc2UiLCJvayIsInN0YXR1cyIsImZldGNoQ29tVXJsIiwiaXRlbV9pZCIsImNvbW1lbnRSZXNwb25zZSIsImpzb24iLCJyZXN1bHQiLCJjb21tZW50VGl0ZSIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJjb21tZW50SGVhZGVyIiwiaW5uZXJIVE1MIiwiY29tbWVudENvdW50IiwiaWQiLCJhcHBlbmQiLCJjb21tZW50R3JvdXAiLCJjb21tZW50SXRlbXMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiaXRlbSIsInVzZXJuYW1lIiwiY3JlYXRpb25fZGF0ZSIsImNvbW1lbnQiLCJjb21tZW50Q291bnRlciIsImVsZW1lbnRzIiwibmFtZSIsInZhbHVlIiwiaW5zaWdodCIsInJlbmRlciIsIm1vZGFsQ2FyZCIsImJ0bkNyb3NzIiwiYWRkRXZlbnRMaXN0ZW5lciIsImNsYXNzTGlzdCIsInJlbW92ZSIsImNhcmRJbWciLCJpbWFnZSIsIm9yaWdpbmFsIiwidGl0bGUiLCJkZXMiLCJzdW1tYXJ5IiwiY2FyZFNwZWMiLCJzZWFzb24iLCJydW50aW1lIiwiYWlyZGF0ZSIsInJhdGluZyIsImF2ZXJhZ2UiLCJjb21tZW50U2VjdGlvbiIsImNvbW1lbnRzIiwiY29tbWVudEZvcm0iLCJhZGRDb21tZW50IiwiZSIsInByZXZlbnREZWZhdWx0IiwiY29tbWVudERhdGEiLCJhZGQiLCJ0YXJnZXQiLCJwYXJlbnRFbGVtZW50IiwiZmlsdGVyUmVzdWx0IiwiY29tbWVudFJlc3VsdCIsImVycm9yIiwicmVzZXJ2YXRpb25Db250YWluZXIiLCJjcmVhdGVOZXdSZXNlcnZhdGlvbiIsInJlc2VydmF0aW9uUmVzcG9uc2UiLCJyZXNlcnZhdGlvbkhlYWRlciIsInJlc2VydmF0aW9uR3JvdXAiLCJyZXNlcnZhdGlvbkl0ZW1zIiwiZGF0ZV9zdGFydCIsImRhdGVfZW5kIiwicmVzZXJ2YXRpb25Db3VudGVyIiwiY2hpbGRyZW4iLCJzdGFydF9kYXRlIiwiZW5kX2RhdGUiLCJyZXNlcnZhdGlvblNlY3Rpb24iLCJyZXNlcnZhdGlvbnMiLCJyZXNlcnZhdGlvbkZvcm0iLCJhZGRSZXNlcnZhdGlvbiIsInN0YXJ0RGF0ZSIsImVuZERhdGUiLCJyZXNlcnZlRGF0YSIsInJlc2VydmF0aW9uUmVzdWx0IiwiY3JlYXRlTmV3TGlrZSIsImxpa2VDb3VudCIsImJ0bkxpa2UiLCJzZXRBdHRyaWJ1dGUiLCJyZXNwb25zZUxpa2VzIiwibGlrZURhdGEiLCJmaW5kIiwibGlrZXMiLCJyZXNwb25zZUludm9sdmVtZW50IiwibGlrZXNSZXN1bHQiLCJmaWx0ZXJBcnJXaXRoTGlrZXMiLCJsaWtlSXRlbSIsInB1c2giLCJmaWx0ZXJXaXRob3V0TGlrZXMiLCJmaWx0ZXIiLCJlbCIsImVsZW1lbnQiLCJtb2RpZml5RmlsdGVyV2l0aG91dExpa2VzIiwiam9pbkFyciIsImNvbmNhdCIsInNvcnQiLCJhIiwiYiIsInNob3dJbWciLCJzaG93SW5mbyIsInNob3dMaWtlQWN0aW9uIiwic2hvd0FjdGlvbnMiLCJjb21tZW50QnRuIiwiZmV0Y2hTaW5nbGVTaG93Q29tbWVudCIsInJlc2VydmF0aW9uQnRuIiwiZmV0Y2hTaW5nbGVTaG93IiwiYXBwZW5kQ2hpbGQiLCJ0b2dnbGUiLCJ3aW5kb3ciLCJvbmxvYWQiLCJmZXRjaFR2U2hvdyJdLCJzb3VyY2VSb290IjoiIn0= -------------------------------------------------------------------------------- /dist/index.bundle.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ 2 | -------------------------------------------------------------------------------- /dist/index.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | 5 | html, 6 | body { 7 | font-family: sans-serif; 8 | padding: 0; 9 | margin: 0; 10 | background: #0d1117; 11 | color: #fff; 12 | } 13 | 14 | a { 15 | text-decoration: none; 16 | } 17 | 18 | .display-flex { 19 | display: flex !important; 20 | } 21 | 22 | .display-none { 23 | display: none !important; 24 | } 25 | 26 | .header { 27 | padding: 3%; 28 | height: 70px; 29 | display: flex; 30 | justify-content: center; 31 | align-items: center; 32 | background: #161b22; 33 | } 34 | 35 | .logo { 36 | font-size: 1.6rem; 37 | font-weight: bold; 38 | color: #ff7b00; 39 | } 40 | 41 | .nav-menu { 42 | display: block; 43 | background: transparent; 44 | border: 1px solid #333; 45 | padding: 3px 5px; 46 | align-self: center; 47 | } 48 | 49 | .nav-menu:active { 50 | background: #333; 51 | } 52 | 53 | .navbar { 54 | display: flex; 55 | width: 100%; 56 | max-width: 1000px; 57 | justify-content: space-between; 58 | align-items: center; 59 | } 60 | 61 | .mobile-nav-group { 62 | display: none; 63 | position: fixed; 64 | left: 0; 65 | right: 0; 66 | bottom: 0; 67 | top: 0; 68 | list-style: none; 69 | flex-direction: column; 70 | margin: 0; 71 | padding: 50px 0; 72 | gap: 20px; 73 | background: #161b22; 74 | } 75 | 76 | .desktop-nav-group { 77 | display: none; 78 | } 79 | 80 | .nav-link { 81 | color: #fff; 82 | color: #ff7b00; 83 | padding: 8px 10px; 84 | text-decoration: none; 85 | transition: all 0.2s ease-in-out; 86 | } 87 | 88 | .mobile-nav-group .nav-link { 89 | display: block; 90 | padding: 15px 20px; 91 | margin-bottom: 5px; 92 | background: #0d1117; 93 | } 94 | 95 | .nav-link:hover { 96 | color: #fff; 97 | background: #ff7b00; 98 | } 99 | 100 | .footer { 101 | left: 0; 102 | right: 0; 103 | bottom: 0; 104 | z-index: 10; 105 | position: relative; 106 | text-align: center; 107 | padding: 20px 25px; 108 | background: #161b22; 109 | border-top: 1px solid #333; 110 | } 111 | 112 | /* Main content css start form here */ 113 | .main-container { 114 | display: flex; 115 | margin: 70px 0; 116 | flex-direction: column; 117 | } 118 | 119 | .tv-shows { 120 | display: flex; 121 | flex-direction: column; 122 | align-items: center; 123 | } 124 | 125 | .show-title { 126 | text-align: center; 127 | } 128 | 129 | .show-group { 130 | display: flex; 131 | list-style: none; 132 | flex-direction: column; 133 | margin: 0; 134 | padding: 0; 135 | align-items: center; 136 | justify-content: center; 137 | width: 100%; 138 | max-width: 1000px; 139 | gap: 20px; 140 | } 141 | 142 | .show-item { 143 | padding: 20px; 144 | background: #161b22; 145 | border: 1px solid #333; 146 | } 147 | 148 | .show-item-img { 149 | display: block; 150 | max-width: 100%; 151 | } 152 | 153 | .show-item-img img { 154 | max-width: 100%; 155 | } 156 | 157 | .show-info { 158 | display: flex; 159 | align-items: center; 160 | justify-content: space-between; 161 | } 162 | 163 | .btn-like { 164 | background: transparent; 165 | border: none; 166 | color: #fff; 167 | margin-left: 10px; 168 | cursor: pointer; 169 | transition: all 0.2s ease-in-out; 170 | } 171 | 172 | .btn-like:active { 173 | transform: translateY(-2px); 174 | } 175 | 176 | .btn-like img { 177 | width: 22px; 178 | max-width: 100%; 179 | filter: invert(54%) sepia(62%) saturate(3447%) hue-rotate(0deg) brightness(102%) contrast(103%); 180 | } 181 | 182 | .btn-like:disabled { 183 | cursor: not-allowed; 184 | } 185 | 186 | .show-actions { 187 | display: flex; 188 | flex-direction: column; 189 | gap: 15px; 190 | } 191 | 192 | .btn-action { 193 | padding: 10px 15px; 194 | background: #ff7b00; 195 | color: #fff; 196 | border: none; 197 | } 198 | 199 | .btn-action:active { 200 | transform: translateY(-2px); 201 | } 202 | 203 | /* Article modal css styles will start from here */ 204 | .popup-modal { 205 | display: none; 206 | width: 100%; 207 | height: 100%; 208 | position: fixed; 209 | z-index: 2000; 210 | left: 0; 211 | top: 0; 212 | bottom: 0; 213 | backdrop-filter: blur(7px); 214 | -webkit-backdrop-filter: blur(10px); 215 | background: rgba(8, 19, 43, 0.4); 216 | box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); 217 | justify-content: center; 218 | } 219 | 220 | .modal-card { 221 | border-radius: 20px; 222 | display: flex; 223 | flex-direction: column; 224 | background: #161b22; 225 | width: 100%; 226 | height: 100%; 227 | overflow: scroll; 228 | gap: 10px; 229 | padding: 24px; 230 | max-width: 1156px; 231 | margin: 25px 15px; 232 | position: relative; 233 | color: #fff; 234 | } 235 | 236 | .btn-cross { 237 | background: transparent; 238 | border: none; 239 | position: absolute; 240 | right: 10px; 241 | top: 10px; 242 | } 243 | 244 | .btn-cross:active { 245 | transform: translateY(-2px); 246 | } 247 | 248 | .card-img { 249 | display: flex; 250 | justify-content: center; 251 | align-items: center; 252 | margin-top: 15px; 253 | } 254 | 255 | .card-img img { 256 | max-width: 100%; 257 | } 258 | 259 | .card-title { 260 | text-align: center; 261 | font-size: 2rem; 262 | font-weight: normal; 263 | } 264 | 265 | .card-spec-group { 266 | display: flex; 267 | flex-direction: column; 268 | align-items: center; 269 | border: 1px solid #333; 270 | } 271 | 272 | .card-spec { 273 | display: flex; 274 | list-style: none; 275 | justify-content: space-between; 276 | margin: 0; 277 | padding: 0; 278 | width: 100%; 279 | flex-wrap: wrap; 280 | align-items: center; 281 | margin-bottom: 25px; 282 | max-width: 600px; 283 | } 284 | 285 | .spec-item { 286 | padding: 15px; 287 | text-align: justify; 288 | } 289 | 290 | .show { 291 | display: flex; 292 | } 293 | 294 | .comment-section { 295 | display: flex; 296 | flex-direction: column; 297 | align-items: center; 298 | } 299 | 300 | .comment-title { 301 | display: flex; 302 | align-items: center; 303 | text-align: center; 304 | margin: 10px 0; 305 | font-weight: normal; 306 | } 307 | 308 | .comment-header { 309 | margin-right: 10px; 310 | } 311 | 312 | #show_comment_count { 313 | font-size: 1.2rem; 314 | } 315 | 316 | .comment-goup { 317 | width: 100%; 318 | max-width: 600px; 319 | display: flex; 320 | align-items: center; 321 | flex-direction: column; 322 | list-style: none; 323 | padding: 0; 324 | margin: 0; 325 | gap: 15px; 326 | } 327 | 328 | .comment-item { 329 | width: 100%; 330 | margin: 5px; 331 | border: 1px solid #333; 332 | } 333 | 334 | .user-info { 335 | background: #0d1117; 336 | display: flex; 337 | align-items: center; 338 | border-bottom: 1px solid #333; 339 | padding: 0 15px; 340 | } 341 | 342 | .user-avatar { 343 | margin-right: 10px; 344 | } 345 | 346 | .user-name { 347 | margin-right: 10px; 348 | } 349 | 350 | .submit-date { 351 | margin-left: auto; 352 | } 353 | 354 | .user-data { 355 | padding: 15px; 356 | } 357 | 358 | .comment-form { 359 | width: 100%; 360 | display: flex; 361 | flex-direction: column; 362 | align-items: center; 363 | margin-bottom: 20px; 364 | } 365 | 366 | form { 367 | width: 100%; 368 | max-width: 600px; 369 | display: flex; 370 | flex-direction: column; 371 | gap: 15px; 372 | } 373 | 374 | input, 375 | #submitBtn { 376 | border: 2px solid #333; 377 | text-align: justify; 378 | border-radius: 5px; 379 | font-size: 1.2rem; 380 | color: #fff; 381 | background: #010409; 382 | padding: 8px 15px; 383 | /* stylelint-disable-next-line */ 384 | color-scheme: dark; 385 | } 386 | 387 | #submitBtn { 388 | width: fit-content; 389 | padding: 10px 20px; 390 | background: #ff7b00; 391 | color: #fff; 392 | border: none; 393 | } 394 | 395 | textarea { 396 | resize: none; 397 | height: 100px; 398 | padding: 10px 20px; 399 | border: 2px solid #333; 400 | border-radius: 5px; 401 | font-size: 1.2rem; 402 | background: #010409; 403 | color: #fff; 404 | } 405 | 406 | button { 407 | cursor: pointer; 408 | } 409 | 410 | .reservation-section { 411 | display: flex; 412 | flex-direction: column; 413 | align-items: center; 414 | } 415 | 416 | .reservation-title { 417 | text-align: center; 418 | margin: 10px 0; 419 | font-weight: normal; 420 | } 421 | 422 | .reservation-group { 423 | width: 100%; 424 | max-width: 600px; 425 | display: flex; 426 | align-items: center; 427 | flex-direction: column; 428 | list-style: none; 429 | padding: 0; 430 | margin: 0; 431 | gap: 15px; 432 | } 433 | 434 | .reservation-item { 435 | width: 100%; 436 | margin: 5px; 437 | border: 1px solid #333; 438 | } 439 | 440 | .reservation-form { 441 | width: 100%; 442 | display: flex; 443 | flex-direction: column; 444 | align-items: center; 445 | margin-bottom: 25px; 446 | } 447 | 448 | @media screen and (min-width: 768px) { 449 | .mobile-nav-group { 450 | display: none; 451 | } 452 | 453 | .desktop-nav-group { 454 | display: flex; 455 | list-style: none; 456 | gap: 10px; 457 | } 458 | 459 | .nav-menu { 460 | display: none; 461 | } 462 | 463 | /* Main content css start from here */ 464 | .show-group { 465 | flex-direction: row; 466 | flex-wrap: wrap; 467 | } 468 | 469 | .show-item { 470 | width: 31%; 471 | } 472 | 473 | /* popup modal css */ 474 | .card-des { 475 | padding: 0 5%; 476 | } 477 | } 478 | 479 | 480 | /*# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFXO0VBQ1gsV0FBVztFQUNYLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxhQUFhO0VBQ2Isc0JBQXNCO0VBQ3RCLG1CQUFtQjtFQUNuQixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRTtJQUNFLGFBQWE7RUFDZjs7RUFFQTtJQUNFLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsU0FBUztFQUNYOztFQUVBO0lBQ0UsYUFBYTtFQUNmOztFQUVBLHFDQUFxQztFQUNyQztJQUNFLG1CQUFtQjtJQUNuQixlQUFlO0VBQ2pCOztFQUVBO0lBQ0UsVUFBVTtFQUNaOztFQUVBLG9CQUFvQjtFQUNwQjtJQUNFLGFBQWE7RUFDZjtBQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vanMtY2Fwc3RvbmUvLi9zcmMvc3R5bGUuY3NzIl0sInNvdXJjZXNDb250ZW50IjpbIioge1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbn1cclxuXHJcbmh0bWwsXHJcbmJvZHkge1xyXG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xyXG4gIHBhZGRpbmc6IDA7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIGJhY2tncm91bmQ6ICMwZDExMTc7XHJcbiAgY29sb3I6ICNmZmY7XHJcbn1cclxuXHJcbmEge1xyXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxufVxyXG5cclxuLmRpc3BsYXktZmxleCB7XHJcbiAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uZGlzcGxheS1ub25lIHtcclxuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5oZWFkZXIge1xyXG4gIHBhZGRpbmc6IDMlO1xyXG4gIGhlaWdodDogNzBweDtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgYmFja2dyb3VuZDogIzE2MWIyMjtcclxufVxyXG5cclxuLmxvZ28ge1xyXG4gIGZvbnQtc2l6ZTogMS42cmVtO1xyXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gIGNvbG9yOiAjZmY3YjAwO1xyXG59XHJcblxyXG4ubmF2LW1lbnUge1xyXG4gIGRpc3BsYXk6IGJsb2NrO1xyXG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xyXG4gIGJvcmRlcjogMXB4IHNvbGlkICMzMzM7XHJcbiAgcGFkZGluZzogM3B4IDVweDtcclxuICBhbGlnbi1zZWxmOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5uYXYtbWVudTphY3RpdmUge1xyXG4gIGJhY2tncm91bmQ6ICMzMzM7XHJcbn1cclxuXHJcbi5uYXZiYXIge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgbWF4LXdpZHRoOiAxMDAwcHg7XHJcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5tb2JpbGUtbmF2LWdyb3VwIHtcclxuICBkaXNwbGF5OiBub25lO1xyXG4gIHBvc2l0aW9uOiBmaXhlZDtcclxuICBsZWZ0OiAwO1xyXG4gIHJpZ2h0OiAwO1xyXG4gIGJvdHRvbTogMDtcclxuICB0b3A6IDA7XHJcbiAgbGlzdC1zdHlsZTogbm9uZTtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIG1hcmdpbjogMDtcclxuICBwYWRkaW5nOiA1MHB4IDA7XHJcbiAgZ2FwOiAyMHB4O1xyXG4gIGJhY2tncm91bmQ6ICMxNjFiMjI7XHJcbn1cclxuXHJcbi5kZXNrdG9wLW5hdi1ncm91cCB7XHJcbiAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuLm5hdi1saW5rIHtcclxuICBjb2xvcjogI2ZmZjtcclxuICBjb2xvcjogI2ZmN2IwMDtcclxuICBwYWRkaW5nOiA4cHggMTBweDtcclxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZS1pbi1vdXQ7XHJcbn1cclxuXHJcbi5tb2JpbGUtbmF2LWdyb3VwIC5uYXYtbGluayB7XHJcbiAgZGlzcGxheTogYmxvY2s7XHJcbiAgcGFkZGluZzogMTVweCAyMHB4O1xyXG4gIG1hcmdpbi1ib3R0b206IDVweDtcclxuICBiYWNrZ3JvdW5kOiAjMGQxMTE3O1xyXG59XHJcblxyXG4ubmF2LWxpbms6aG92ZXIge1xyXG4gIGNvbG9yOiAjZmZmO1xyXG4gIGJhY2tncm91bmQ6ICNmZjdiMDA7XHJcbn1cclxuXHJcbi5mb290ZXIge1xyXG4gIGxlZnQ6IDA7XHJcbiAgcmlnaHQ6IDA7XHJcbiAgYm90dG9tOiAwO1xyXG4gIHotaW5kZXg6IDEwO1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgcGFkZGluZzogMjBweCAyNXB4O1xyXG4gIGJhY2tncm91bmQ6ICMxNjFiMjI7XHJcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICMzMzM7XHJcbn1cclxuXHJcbi8qIE1haW4gY29udGVudCBjc3Mgc3RhcnQgZm9ybSBoZXJlICovXHJcbi5tYWluLWNvbnRhaW5lciB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBtYXJnaW46IDcwcHggMDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG59XHJcblxyXG4udHYtc2hvd3Mge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG59XHJcblxyXG4uc2hvdy10aXRsZSB7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG4uc2hvdy1ncm91cCB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBsaXN0LXN0eWxlOiBub25lO1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgbWFyZ2luOiAwO1xyXG4gIHBhZGRpbmc6IDA7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICB3aWR0aDogMTAwJTtcclxuICBtYXgtd2lkdGg6IDEwMDBweDtcclxuICBnYXA6IDIwcHg7XHJcbn1cclxuXHJcbi5zaG93LWl0ZW0ge1xyXG4gIHBhZGRpbmc6IDIwcHg7XHJcbiAgYmFja2dyb3VuZDogIzE2MWIyMjtcclxuICBib3JkZXI6IDFweCBzb2xpZCAjMzMzO1xyXG59XHJcblxyXG4uc2hvdy1pdGVtLWltZyB7XHJcbiAgZGlzcGxheTogYmxvY2s7XHJcbiAgbWF4LXdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4uc2hvdy1pdGVtLWltZyBpbWcge1xyXG4gIG1heC13aWR0aDogMTAwJTtcclxufVxyXG5cclxuLnNob3ctaW5mbyB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxufVxyXG5cclxuLmJ0bi1saWtlIHtcclxuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgY29sb3I6ICNmZmY7XHJcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xyXG59XHJcblxyXG4uYnRuLWxpa2U6YWN0aXZlIHtcclxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7XHJcbn1cclxuXHJcbi5idG4tbGlrZSBpbWcge1xyXG4gIHdpZHRoOiAyMnB4O1xyXG4gIG1heC13aWR0aDogMTAwJTtcclxuICBmaWx0ZXI6IGludmVydCg1NCUpIHNlcGlhKDYyJSkgc2F0dXJhdGUoMzQ0NyUpIGh1ZS1yb3RhdGUoMGRlZykgYnJpZ2h0bmVzcygxMDIlKSBjb250cmFzdCgxMDMlKTtcclxufVxyXG5cclxuLmJ0bi1saWtlOmRpc2FibGVkIHtcclxuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xyXG59XHJcblxyXG4uc2hvdy1hY3Rpb25zIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgZ2FwOiAxNXB4O1xyXG59XHJcblxyXG4uYnRuLWFjdGlvbiB7XHJcbiAgcGFkZGluZzogMTBweCAxNXB4O1xyXG4gIGJhY2tncm91bmQ6ICNmZjdiMDA7XHJcbiAgY29sb3I6ICNmZmY7XHJcbiAgYm9yZGVyOiBub25lO1xyXG59XHJcblxyXG4uYnRuLWFjdGlvbjphY3RpdmUge1xyXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTtcclxufVxyXG5cclxuLyogQXJ0aWNsZSBtb2RhbCBjc3Mgc3R5bGVzIHdpbGwgc3RhcnQgZnJvbSBoZXJlICovXHJcbi5wb3B1cC1tb2RhbCB7XHJcbiAgZGlzcGxheTogbm9uZTtcclxuICB3aWR0aDogMTAwJTtcclxuICBoZWlnaHQ6IDEwMCU7XHJcbiAgcG9zaXRpb246IGZpeGVkO1xyXG4gIHotaW5kZXg6IDIwMDA7XHJcbiAgbGVmdDogMDtcclxuICB0b3A6IDA7XHJcbiAgYm90dG9tOiAwO1xyXG4gIGJhY2tkcm9wLWZpbHRlcjogYmx1cig3cHgpO1xyXG4gIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpO1xyXG4gIGJhY2tncm91bmQ6IHJnYmEoOCwgMTksIDQzLCAwLjQpO1xyXG4gIGJveC1zaGFkb3c6IDAgOHB4IDMycHggMCByZ2JhKDMxLCAzOCwgMTM1LCAwLjM3KTtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxufVxyXG5cclxuLm1vZGFsLWNhcmQge1xyXG4gIGJvcmRlci1yYWRpdXM6IDIwcHg7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIGJhY2tncm91bmQ6ICMxNjFiMjI7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIG92ZXJmbG93OiBzY3JvbGw7XHJcbiAgZ2FwOiAxMHB4O1xyXG4gIHBhZGRpbmc6IDI0cHg7XHJcbiAgbWF4LXdpZHRoOiAxMTU2cHg7XHJcbiAgbWFyZ2luOiAyNXB4IDE1cHg7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIGNvbG9yOiAjZmZmO1xyXG59XHJcblxyXG4uYnRuLWNyb3NzIHtcclxuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIHJpZ2h0OiAxMHB4O1xyXG4gIHRvcDogMTBweDtcclxufVxyXG5cclxuLmJ0bi1jcm9zczphY3RpdmUge1xyXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTtcclxufVxyXG5cclxuLmNhcmQtaW1nIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgbWFyZ2luLXRvcDogMTVweDtcclxufVxyXG5cclxuLmNhcmQtaW1nIGltZyB7XHJcbiAgbWF4LXdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4uY2FyZC10aXRsZSB7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIGZvbnQtc2l6ZTogMnJlbTtcclxuICBmb250LXdlaWdodDogbm9ybWFsO1xyXG59XHJcblxyXG4uY2FyZC1zcGVjLWdyb3VwIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBib3JkZXI6IDFweCBzb2xpZCAjMzMzO1xyXG59XHJcblxyXG4uY2FyZC1zcGVjIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XHJcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gIG1hcmdpbjogMDtcclxuICBwYWRkaW5nOiAwO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGZsZXgtd3JhcDogd3JhcDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIG1hcmdpbi1ib3R0b206IDI1cHg7XHJcbiAgbWF4LXdpZHRoOiA2MDBweDtcclxufVxyXG5cclxuLnNwZWMtaXRlbSB7XHJcbiAgcGFkZGluZzogMTVweDtcclxuICB0ZXh0LWFsaWduOiBqdXN0aWZ5O1xyXG59XHJcblxyXG4uc2hvdyB7XHJcbiAgZGlzcGxheTogZmxleDtcclxufVxyXG5cclxuLmNvbW1lbnQtc2VjdGlvbiB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5jb21tZW50LXRpdGxlIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIG1hcmdpbjogMTBweCAwO1xyXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XHJcbn1cclxuXHJcbi5jb21tZW50LWhlYWRlciB7XHJcbiAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xyXG59XHJcblxyXG4jc2hvd19jb21tZW50X2NvdW50IHtcclxuICBmb250LXNpemU6IDEuMnJlbTtcclxufVxyXG5cclxuLmNvbW1lbnQtZ291cCB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgbWF4LXdpZHRoOiA2MDBweDtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBsaXN0LXN0eWxlOiBub25lO1xyXG4gIHBhZGRpbmc6IDA7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIGdhcDogMTVweDtcclxufVxyXG5cclxuLmNvbW1lbnQtaXRlbSB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgbWFyZ2luOiA1cHg7XHJcbiAgYm9yZGVyOiAxcHggc29saWQgIzMzMztcclxufVxyXG5cclxuLnVzZXItaW5mbyB7XHJcbiAgYmFja2dyb3VuZDogIzBkMTExNztcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzMzM7XHJcbiAgcGFkZGluZzogMCAxNXB4O1xyXG59XHJcblxyXG4udXNlci1hdmF0YXIge1xyXG4gIG1hcmdpbi1yaWdodDogMTBweDtcclxufVxyXG5cclxuLnVzZXItbmFtZSB7XHJcbiAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xyXG59XHJcblxyXG4uc3VibWl0LWRhdGUge1xyXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xyXG59XHJcblxyXG4udXNlci1kYXRhIHtcclxuICBwYWRkaW5nOiAxNXB4O1xyXG59XHJcblxyXG4uY29tbWVudC1mb3JtIHtcclxuICB3aWR0aDogMTAwJTtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xyXG59XHJcblxyXG5mb3JtIHtcclxuICB3aWR0aDogMTAwJTtcclxuICBtYXgtd2lkdGg6IDYwMHB4O1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBnYXA6IDE1cHg7XHJcbn1cclxuXHJcbmlucHV0LFxyXG4jc3VibWl0QnRuIHtcclxuICBib3JkZXI6IDJweCBzb2xpZCAjMzMzO1xyXG4gIHRleHQtYWxpZ246IGp1c3RpZnk7XHJcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gIGZvbnQtc2l6ZTogMS4ycmVtO1xyXG4gIGNvbG9yOiAjZmZmO1xyXG4gIGJhY2tncm91bmQ6ICMwMTA0MDk7XHJcbiAgcGFkZGluZzogOHB4IDE1cHg7XHJcbiAgLyogc3R5bGVsaW50LWRpc2FibGUtbmV4dC1saW5lICovXHJcbiAgY29sb3Itc2NoZW1lOiBkYXJrO1xyXG59XHJcblxyXG4jc3VibWl0QnRuIHtcclxuICB3aWR0aDogZml0LWNvbnRlbnQ7XHJcbiAgcGFkZGluZzogMTBweCAyMHB4O1xyXG4gIGJhY2tncm91bmQ6ICNmZjdiMDA7XHJcbiAgY29sb3I6ICNmZmY7XHJcbiAgYm9yZGVyOiBub25lO1xyXG59XHJcblxyXG50ZXh0YXJlYSB7XHJcbiAgcmVzaXplOiBub25lO1xyXG4gIGhlaWdodDogMTAwcHg7XHJcbiAgcGFkZGluZzogMTBweCAyMHB4O1xyXG4gIGJvcmRlcjogMnB4IHNvbGlkICMzMzM7XHJcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gIGZvbnQtc2l6ZTogMS4ycmVtO1xyXG4gIGJhY2tncm91bmQ6ICMwMTA0MDk7XHJcbiAgY29sb3I6ICNmZmY7XHJcbn1cclxuXHJcbmJ1dHRvbiB7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4ucmVzZXJ2YXRpb24tc2VjdGlvbiB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5yZXNlcnZhdGlvbi10aXRsZSB7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIG1hcmdpbjogMTBweCAwO1xyXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XHJcbn1cclxuXHJcbi5yZXNlcnZhdGlvbi1ncm91cCB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgbWF4LXdpZHRoOiA2MDBweDtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBsaXN0LXN0eWxlOiBub25lO1xyXG4gIHBhZGRpbmc6IDA7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIGdhcDogMTVweDtcclxufVxyXG5cclxuLnJlc2VydmF0aW9uLWl0ZW0ge1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIG1hcmdpbjogNXB4O1xyXG4gIGJvcmRlcjogMXB4IHNvbGlkICMzMzM7XHJcbn1cclxuXHJcbi5yZXNlcnZhdGlvbi1mb3JtIHtcclxuICB3aWR0aDogMTAwJTtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBtYXJnaW4tYm90dG9tOiAyNXB4O1xyXG59XHJcblxyXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkge1xyXG4gIC5tb2JpbGUtbmF2LWdyb3VwIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgfVxyXG5cclxuICAuZGVza3RvcC1uYXYtZ3JvdXAge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XHJcbiAgICBnYXA6IDEwcHg7XHJcbiAgfVxyXG5cclxuICAubmF2LW1lbnUge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICB9XHJcblxyXG4gIC8qIE1haW4gY29udGVudCBjc3Mgc3RhcnQgZnJvbSBoZXJlICovXHJcbiAgLnNob3ctZ3JvdXAge1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGZsZXgtd3JhcDogd3JhcDtcclxuICB9XHJcblxyXG4gIC5zaG93LWl0ZW0ge1xyXG4gICAgd2lkdGg6IDMxJTtcclxuICB9XHJcblxyXG4gIC8qIHBvcHVwIG1vZGFsIGNzcyAqL1xyXG4gIC5jYXJkLWRlcyB7XHJcbiAgICBwYWRkaW5nOiAwIDUlO1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=*/ -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | RSL Media

    Favorite Tv Shows (0)

      ©2023 RSL Media, Inc. All Rights Reserved.
      -------------------------------------------------------------------------------- /dist/runtime.bundle.js: -------------------------------------------------------------------------------- 1 | (()=>{"use strict";var r,e={},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r](i,i.exports,n),i.exports}n.m=e,r=[],n.O=(e,t,o,i)=>{if(!t){var c=1/0;for(l=0;l=i)&&Object.keys(n.O).every((r=>n.O[r](t[s])))?t.splice(s--,1):(a=!1,i0&&r[l-1][2]>i;l--)r[l]=r[l-1];r[l]=[t,o,i]},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(r){if("object"==typeof window)return window}}(),n.o=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),(()=>{var r;n.g.importScripts&&(r=n.g.location+"");var e=n.g.document;if(!r&&e&&(e.currentScript&&(r=e.currentScript.src),!r)){var t=e.getElementsByTagName("script");t.length&&(r=t[t.length-1].src)}if(!r)throw new Error("Automatic publicPath is not supported in this browser");r=r.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=r})(),(()=>{var r={666:0};n.O.j=e=>0===r[e];var e=(e,t)=>{var o,i,[c,a,s]=t,p=0;if(c.some((e=>0!==r[e]))){for(o in a)n.o(a,o)&&(n.m[o]=a[o]);if(s)var l=s(n)}for(e&&e(t);p { 4 | document.body.innerHTML = ` 5 |

      Comments (0)

      6 |
        7 |
      • comment 1
      • 8 |
      • comment 2
      • 9 |
      • comment 3
      • 10 |
      • comment 4
      • 11 |
      • comment 5
      • 12 |
      `; 13 | 14 | test('Comment count should be 5', () => { 15 | const commentContainer = document.querySelector('.comment-item-group'); 16 | const commentCountContainer = document.getElementById('comment_count'); 17 | 18 | const count = commentCounter(commentCountContainer, commentContainer); 19 | expect(count).toBe(5); 20 | }); 21 | 22 | test('Comment count innerText should be equal to comment container chlild count', () => { 23 | const commentContainer = document.querySelector('.comment-item-group'); 24 | const commentCountContainer = document.getElementById('comment_count'); 25 | 26 | const count = commentCounter(commentCountContainer, commentContainer); 27 | expect(commentContainer.childElementCount).toBe(count); 28 | }); 29 | }); 30 | -------------------------------------------------------------------------------- /src/Test/test_item_count.test.js: -------------------------------------------------------------------------------- 1 | import itemCounter from '../modules/itemCounter.js'; 2 | 3 | describe('Test Display Item counter', () => { 4 | document.body.innerHTML = ` 5 |

      Favorite Tv Shows (0)

      6 |
        7 |
      • item 1
      • 8 |
      • item 2
      • 9 |
      • item 3
      • 10 |
      • item 4
      • 11 |
      • item 5
      • 12 |
      `; 13 | 14 | test('Item count should be 5', () => { 15 | const itemContainer = document.querySelector('.items'); 16 | const itemCountContainer = document.getElementById('item_count'); 17 | 18 | const count = itemCounter(itemCountContainer, itemContainer); 19 | expect(count).toBe(5); 20 | }); 21 | 22 | test('Item count innterText should be equal to item container chlild count', () => { 23 | const itemContainer = document.querySelector('.items'); 24 | const itemCountContainer = document.getElementById('item_count'); 25 | 26 | const count = itemCounter(itemCountContainer, itemContainer); 27 | expect(itemContainer.childElementCount).toBe(count); 28 | }); 29 | }); 30 | -------------------------------------------------------------------------------- /src/Test/test_reservations.test.js: -------------------------------------------------------------------------------- 1 | import reservationCounter from '../modules/reservationCounter.js'; 2 | 3 | describe('Test Display Reservation counter', () => { 4 | document.body.innerHTML = ` 5 |

      reservations (0)

      6 |
        7 |
      • Reservation 1
      • 8 |
      • Reservation 2
      • 9 |
      • Reservation 3
      • 10 |
      • Reservation 4
      • 11 |
      • Reservation 5
      • 12 |
      `; 13 | 14 | test('Reservation count should be 5', () => { 15 | const reservationContainer = document.querySelector( 16 | '.reservation-item-group', 17 | ); 18 | const reservationCountContainer = document.getElementById('reservation_count'); 19 | 20 | const count = reservationCounter( 21 | reservationCountContainer, 22 | reservationContainer, 23 | ); 24 | expect(count).toBe(5); 25 | }); 26 | 27 | test('Reservation count innerText should be equal to reservation container chlild count', () => { 28 | const reservationContainer = document.querySelector( 29 | '.reservation-item-group', 30 | ); 31 | const reservationCountContainer = document.getElementById('reservation_count'); 32 | 33 | const count = reservationCounter( 34 | reservationCountContainer, 35 | reservationContainer, 36 | ); 37 | expect(reservationContainer.childElementCount).toBe(count); 38 | }); 39 | }); 40 | -------------------------------------------------------------------------------- /src/assets/img/comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/ef4f1f486f31741823e225f95aa58aa338f56e9c/src/assets/img/comment.png -------------------------------------------------------------------------------- /src/assets/img/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/ef4f1f486f31741823e225f95aa58aa338f56e9c/src/assets/img/home.png -------------------------------------------------------------------------------- /src/assets/img/icons8-menu-rounded-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/ef4f1f486f31741823e225f95aa58aa338f56e9c/src/assets/img/icons8-menu-rounded-24.png -------------------------------------------------------------------------------- /src/assets/img/icons8-multiply-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/ef4f1f486f31741823e225f95aa58aa338f56e9c/src/assets/img/icons8-multiply-24.png -------------------------------------------------------------------------------- /src/assets/img/reservation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/ef4f1f486f31741823e225f95aa58aa338f56e9c/src/assets/img/reservation.png -------------------------------------------------------------------------------- /src/assets/img/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/ef4f1f486f31741823e225f95aa58aa338f56e9c/src/assets/img/user.png -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | RSL Media 8 | 9 | 10 |
      11 | 30 |
      31 |
      32 | 35 |
      36 |

      37 | Favorite Tv Shows (0) 38 |

      39 |
        40 | 41 |
      42 |
      43 |
      44 |
      ©2023 RSL Media, Inc. All Rights Reserved.
      45 | 46 | 47 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | // import static files 2 | import './style.css'; 3 | import './assets/img/icons8-menu-rounded-24.png'; 4 | import './assets/img/icons8-multiply-24.png'; 5 | import './assets/img/user.png'; 6 | 7 | import fetchTvShow from './modules/displayItems.js'; 8 | import { 9 | closeBtn, 10 | menuBtn, 11 | mobNavGroup, 12 | mobileNavlinks, 13 | } from './modules/domSelector.js'; 14 | 15 | // toggle the menu 16 | menuBtn.addEventListener('click', () => { 17 | mobNavGroup.classList.toggle('display-flex'); 18 | }); 19 | 20 | closeBtn.addEventListener('click', () => { 21 | mobNavGroup.classList.remove('display-flex'); 22 | }); 23 | 24 | mobileNavlinks.forEach((item) => { 25 | item.addEventListener('click', () => { 26 | mobNavGroup.classList.remove('display-flex'); 27 | }); 28 | }); 29 | 30 | // load the item list on the fly. 31 | window.onload = () => { 32 | fetchTvShow(); 33 | }; 34 | -------------------------------------------------------------------------------- /src/modules/apiUrls.js: -------------------------------------------------------------------------------- 1 | export const BASE_URL = 'https://us-central1-involvement-api.cloudfunctions.net/capstoneApi/apps/Y1Ocl2k5LoJdVEhHia5O'; 2 | export const MOVIE_API = 'https://api.tvmaze.com/seasons/1/episodes'; 3 | -------------------------------------------------------------------------------- /src/modules/commentCounter.js: -------------------------------------------------------------------------------- 1 | const commentCounter = (countContainer, commentContainer) => { 2 | const count = commentContainer.childElementCount; 3 | countContainer.innerText = `(${count})`; 4 | return count; 5 | }; 6 | 7 | export default commentCounter; 8 | -------------------------------------------------------------------------------- /src/modules/displayItems.js: -------------------------------------------------------------------------------- 1 | import { itemCountContainer, listItemsContainer } from './domSelector.js'; 2 | import fetchSingleShowComment from './popupComment.js'; 3 | import fetchSingleShow from './popupReservation.js'; 4 | import { BASE_URL, MOVIE_API } from './apiUrls.js'; 5 | import itemCounter from './itemCounter.js'; 6 | 7 | // createNew like 8 | const createNewLike = async (id, likeCount, btnLike) => { 9 | btnLike.setAttribute('disabled', ''); 10 | const response = await fetch(`${BASE_URL}/likes`, { 11 | method: 'POST', 12 | headers: { 13 | 'Content-Type': 'application/json', 14 | }, 15 | body: JSON.stringify({ item_id: id }), 16 | }); 17 | 18 | if (!response.ok && response.status !== 201) { 19 | return; 20 | } 21 | 22 | const responseLikes = await fetch(`${BASE_URL}/likes`); 23 | const result = await responseLikes.json(); 24 | const likeData = result.find((item) => item.item_id === id); 25 | if (likeData) { 26 | likeCount.innerText = likeData.likes > 1 ? `${likeData.likes} likes` : `${likeData.likes} like`; 27 | btnLike.innerHTML = ` 28 | 29 | 31 | 35 | `; 36 | } 37 | }; 38 | 39 | // render the item list 40 | const render = (data) => { 41 | if (data.length > 0) { 42 | listItemsContainer.innerHTML = ''; 43 | 44 | data.forEach((i) => { 45 | const item = document.createElement('li'); 46 | item.id = i.id; 47 | item.className = 'show-item'; 48 | 49 | // create sho Img element 50 | const showImg = document.createElement('div'); 51 | showImg.className = 'show-item-img'; 52 | showImg.innerHTML = ``; 53 | 54 | // create show info 55 | const showInfo = document.createElement('div'); 56 | showInfo.className = 'show-info'; 57 | 58 | // create tile for show info 59 | const title = document.createElement('h3'); 60 | title.className = 'show-title'; 61 | title.innerText = i.name; 62 | 63 | // like action 64 | const showLikeAction = document.createElement('div'); 65 | showLikeAction.className = 'shwo-like-action'; 66 | 67 | // like button 68 | const btnLike = document.createElement('button'); 69 | btnLike.className = 'btn-like'; 70 | btnLike.innerHTML = ` 71 | 72 | 74 | 81 | `; 82 | 83 | // like count 84 | const likeCount = document.createElement('span'); 85 | if (i.likes > 1) { 86 | likeCount.innerText = `${i.likes} likes`; 87 | } else { 88 | likeCount.innerHTML = `${i.likes} like`; 89 | } 90 | 91 | // btn like event to create new like 92 | btnLike.addEventListener('click', () => { 93 | createNewLike(i.id, likeCount, btnLike); 94 | }); 95 | 96 | showLikeAction.append(btnLike, likeCount); // append like actions child element. 97 | 98 | showInfo.append(title, showLikeAction); // append in showInfo 99 | 100 | // show action 101 | const showActions = document.createElement('div'); 102 | showActions.className = 'show-actions'; 103 | 104 | // create child btn 105 | const commentBtn = document.createElement('button'); 106 | commentBtn.className = 'btn-action btn-comment'; 107 | commentBtn.innerText = 'Comments'; 108 | commentBtn.addEventListener('click', (e) => { 109 | fetchSingleShowComment(e); 110 | }); 111 | 112 | const reservationBtn = document.createElement('button'); 113 | reservationBtn.className = 'btn-action btn-reservation'; 114 | reservationBtn.innerText = 'Reservations'; 115 | reservationBtn.addEventListener('click', (e) => { 116 | fetchSingleShow(e); 117 | }); 118 | 119 | showActions.append(commentBtn, reservationBtn); // append child action buttons in showActions 120 | 121 | item.append(showImg, showInfo, showActions); // append clild all the elements in item. 122 | 123 | listItemsContainer.appendChild(item); 124 | }); 125 | itemCounter(itemCountContainer, listItemsContainer); 126 | } else { 127 | listItemsContainer.innerHTML = '

      No Data Found

      '; 128 | } 129 | }; 130 | 131 | const fetchTvShows = async () => { 132 | const response = await fetch(MOVIE_API); 133 | const result = await response.json(); 134 | 135 | // call the Involment api to get likes 136 | const responseInvolvement = await fetch(`${BASE_URL}/likes/`); 137 | const likesResult = await responseInvolvement.json(); 138 | 139 | // Distribute likes with correct array. 140 | let joinArr = []; 141 | if (!(likesResult.length <= 0)) { 142 | joinArr = result.map((movieItem) => { 143 | let likes = 0; 144 | const findLikes = likesResult.find((likeItem) => likeItem.item_id === movieItem.id); 145 | if (findLikes) { 146 | likes = findLikes.likes; 147 | } 148 | return { ...movieItem, likes }; 149 | }); 150 | } 151 | 152 | // call render function to display the item list 153 | render(joinArr); 154 | }; 155 | 156 | export default fetchTvShows; 157 | -------------------------------------------------------------------------------- /src/modules/domSelector.js: -------------------------------------------------------------------------------- 1 | export const menuBtn = document.getElementById('mobile-menu'); 2 | export const closeBtn = document.getElementById('cross-menu'); 3 | export const mobileNavlinks = document.querySelectorAll( 4 | '.mobile-nav-group .nav-link', 5 | ); 6 | export const mobNavGroup = document.querySelector('.mobile-nav-group'); 7 | export const modalContainer = document.querySelector('.popup-modal'); 8 | export const listItemsContainer = document.querySelector('.show-group'); 9 | export const itemCountContainer = document.getElementById('count_item'); 10 | -------------------------------------------------------------------------------- /src/modules/itemCounter.js: -------------------------------------------------------------------------------- 1 | const itemCounter = (countContainer, itemContainer) => { 2 | const count = itemContainer.childElementCount; 3 | countContainer.innerText = `(${count})`; 4 | return count; 5 | }; 6 | 7 | export default itemCounter; 8 | -------------------------------------------------------------------------------- /src/modules/popupComment.js: -------------------------------------------------------------------------------- 1 | import { BASE_URL } from './apiUrls.js'; 2 | import commentCounter from './commentCounter.js'; 3 | import { modalContainer } from './domSelector.js'; 4 | 5 | const createNewComment = async (url, data, commentsContainer, Form) => { 6 | const response = await fetch(url, { 7 | method: 'POST', 8 | headers: { 9 | 'Content-Type': 'application/json', 10 | }, 11 | body: JSON.stringify(data), 12 | }); 13 | 14 | if (!response.ok && response.status !== 201) { 15 | return; 16 | } 17 | 18 | const fetchComUrl = `${BASE_URL}/comments?item_id=${data.item_id}`; 19 | 20 | const commentResponse = await fetch(fetchComUrl); 21 | 22 | const result = await commentResponse.json(); 23 | 24 | // manupulate the dom 25 | const commentTite = document.createElement('div'); 26 | commentTite.className = 'comment-title'; 27 | const commentHeader = document.createElement('h3'); 28 | commentHeader.className = 'comment-header'; 29 | commentHeader.innerHTML = 'Comments'; 30 | const commentCount = document.createElement('p'); 31 | commentCount.id = 'show_comment_count'; 32 | commentCount.innerText = 0; 33 | 34 | commentTite.append(commentHeader, commentCount); 35 | 36 | const commentGroup = document.createElement('ul'); 37 | commentGroup.className = 'comment-goup'; 38 | 39 | let commentItems = ''; 40 | 41 | if (result.length > 0) { 42 | result.forEach((item) => { 43 | commentItems += `
    • 44 | 51 |

      ${item.comment}

      52 |
    • `; 53 | }); 54 | } 55 | 56 | commentGroup.innerHTML = commentItems; // append comment list 57 | commentsContainer.innerHTML = ''; 58 | 59 | commentCounter(commentCount, commentGroup); 60 | 61 | commentsContainer.append(commentTite, commentGroup); 62 | 63 | Form.elements.name.value = ''; 64 | Form.elements.insight.value = ''; 65 | }; 66 | 67 | const render = (data) => { 68 | // modal card 69 | const modalCard = document.createElement('div'); 70 | modalCard.className = 'modal-card'; 71 | 72 | // button 73 | const btnCross = document.createElement('button'); 74 | btnCross.className = 'btn-cross'; 75 | btnCross.innerHTML = 'X'; 76 | btnCross.addEventListener('click', () => { 77 | modalContainer.classList.remove('show'); 78 | }); 79 | 80 | // card img 81 | const cardImg = document.createElement('div'); 82 | cardImg.className = 'card-img'; 83 | cardImg.innerHTML = `${data.name}`; 87 | 88 | // card title 89 | const title = document.createElement('h2'); 90 | title.className = 'card-title'; 91 | title.innerText = data.name; 92 | // card des 93 | const des = document.createElement('div'); 94 | des.className = 'card-des'; 95 | des.innerHTML = data.summary; 96 | 97 | // card spec group 98 | const cardSpec = document.createElement('div'); 99 | cardSpec.className = 'card-spec-group'; 100 | cardSpec.innerHTML = `
        101 |
      • Season: ${data.season}
      • 102 |
      • Duration: ${data.runtime}
      • 103 |
      104 |
        105 |
      • airdate: ${data.airdate}
      • 106 |
      • Rating: ${data.rating.average}
      • 107 |
      `; 108 | 109 | const commentSection = document.createElement('div'); 110 | commentSection.className = 'comment-section'; 111 | 112 | const commentTite = document.createElement('div'); 113 | commentTite.className = 'comment-title'; 114 | const commentHeader = document.createElement('h3'); 115 | commentHeader.className = 'comment-header'; 116 | commentHeader.innerHTML = 'Comments'; 117 | const commentCount = document.createElement('p'); 118 | commentCount.id = 'show_comment_count'; 119 | commentCount.innerText = 0; 120 | 121 | commentTite.append(commentHeader, commentCount); 122 | 123 | const commentGroup = document.createElement('ul'); 124 | commentGroup.className = 'comment-goup'; 125 | 126 | let commentItems = ''; 127 | 128 | if (data.comments.length > 0) { 129 | data.comments.forEach((item) => { 130 | commentItems += `
    • 131 | 138 |

      ${item.comment}

      139 |
    • `; 140 | }); 141 | } 142 | 143 | commentGroup.innerHTML = commentItems; // append comment list 144 | 145 | commentCounter(commentCount, commentGroup); 146 | 147 | commentSection.append(commentTite, commentGroup); 148 | 149 | // Add comment 150 | const commentForm = document.createElement('div'); 151 | commentForm.className = 'comment-form'; 152 | const addComment = document.createElement('h3'); 153 | addComment.className = 'comment-title'; 154 | addComment.innerText = 'Add a comment'; 155 | const Form = document.createElement('form'); 156 | Form.innerHTML = ` 157 | 158 | 159 | `; 160 | 161 | commentForm.append(addComment, Form); 162 | 163 | Form.addEventListener('submit', async (e) => { 164 | e.preventDefault(); 165 | const name = Form.elements.name.value; 166 | const insight = Form.elements.insight.value; 167 | const commentData = { 168 | item_id: data.id, 169 | username: name, 170 | comment: insight, 171 | }; 172 | const url = `${BASE_URL}/comments`; 173 | createNewComment(url, commentData, commentSection, Form); 174 | }); 175 | // append child elements in cardModal 176 | modalCard.append( 177 | btnCross, 178 | cardImg, 179 | title, 180 | des, 181 | cardSpec, 182 | commentSection, 183 | commentForm, 184 | ); 185 | 186 | modalContainer.innerHTML = ''; 187 | modalContainer.append(modalCard); // append cardModal 188 | }; 189 | 190 | const fetchSingleShowComment = async (e) => { 191 | modalContainer.classList.add('show'); 192 | const { id } = e.target.parentElement.parentElement; 193 | const url = `https://api.tvmaze.com/episodes/${id}`; 194 | const response = await fetch(url); 195 | const result = await response.json(); 196 | 197 | const commentResponse = await fetch(`${BASE_URL}/comments?item_id=${id}`); 198 | 199 | let filterResult = { ...result }; 200 | 201 | const commentResult = await commentResponse.json(); 202 | if (commentResult && !commentResult.error) { 203 | filterResult = { ...filterResult, comments: commentResult }; 204 | } else { 205 | filterResult = { ...filterResult, comments: [] }; 206 | } 207 | 208 | render(filterResult); 209 | }; 210 | 211 | export default fetchSingleShowComment; 212 | -------------------------------------------------------------------------------- /src/modules/popupReservation.js: -------------------------------------------------------------------------------- 1 | import { BASE_URL } from './apiUrls.js'; 2 | import { modalContainer } from './domSelector.js'; 3 | import reservationCounter from './reservationCounter.js'; 4 | 5 | const createNewReservation = async (url, data, reservationContainer, Form) => { 6 | const response = await fetch(url, { 7 | method: 'POST', 8 | headers: { 9 | 'Content-Type': 'application/json', 10 | }, 11 | body: JSON.stringify(data), 12 | }); 13 | 14 | if (!response.ok && response.status !== 201) { 15 | return; 16 | } 17 | 18 | const fetchComUrl = `${BASE_URL}/reservations?item_id=${data.item_id}`; 19 | 20 | const reservationResponse = await fetch(fetchComUrl); 21 | 22 | const result = await reservationResponse.json(); 23 | 24 | // manupulate the dom 25 | const reservationHeader = document.createElement('h3'); 26 | reservationHeader.className = 'reservation-title'; 27 | reservationHeader.innerHTML = "Reservations (0)"; 28 | 29 | const reservationGroup = document.createElement('ul'); 30 | reservationGroup.className = 'reservation-group'; 31 | 32 | let reservationItems = ''; 33 | 34 | if (result.length > 0) { 35 | result.forEach((item) => { 36 | reservationItems += `
    • 37 | 44 |
    • `; 45 | }); 46 | } 47 | 48 | reservationGroup.innerHTML = reservationItems; // append reservation list 49 | reservationContainer.innerHTML = ''; 50 | 51 | reservationCounter(reservationHeader.children[0], reservationGroup); 52 | 53 | reservationContainer.append(reservationHeader, reservationGroup); 54 | 55 | Form.elements.name.value = ''; 56 | Form.elements.start_date.value = ''; 57 | Form.elements.end_date.value = ''; 58 | }; 59 | 60 | const render = (data) => { 61 | // modal card 62 | const modalCard = document.createElement('div'); 63 | modalCard.className = 'modal-card'; 64 | 65 | // button 66 | const btnCross = document.createElement('button'); 67 | btnCross.className = 'btn-cross'; 68 | btnCross.innerHTML = 'X'; 69 | btnCross.addEventListener('click', () => { 70 | modalContainer.classList.remove('show'); 71 | }); 72 | 73 | // card img 74 | const cardImg = document.createElement('div'); 75 | cardImg.className = 'card-img'; 76 | cardImg.innerHTML = `${data.name}`; 80 | 81 | // card title 82 | const title = document.createElement('h2'); 83 | title.className = 'card-title'; 84 | title.innerText = data.name; 85 | 86 | // card des 87 | const des = document.createElement('div'); 88 | des.className = 'card-des'; 89 | des.innerHTML = data.summary; 90 | 91 | // card spec group 92 | const cardSpec = document.createElement('div'); 93 | cardSpec.className = 'card-spec-group'; 94 | cardSpec.innerHTML = `
        95 |
      • Season: ${data.season}
      • 96 |
      • Duration: ${data.runtime}
      • 97 |
      98 |
        99 |
      • airdate: ${data.airdate}
      • 100 |
      • Rating: ${data.rating.average}
      • 101 |
      `; 102 | 103 | const reservationSection = document.createElement('div'); 104 | reservationSection.className = 'reservation-section'; 105 | 106 | const reservationHeader = document.createElement('h3'); 107 | reservationHeader.className = 'reservation-title'; 108 | reservationHeader.innerHTML = "Reservations (0)"; 109 | 110 | const reservationGroup = document.createElement('ul'); 111 | reservationGroup.className = 'reservation-group'; 112 | 113 | let reservationItems = ''; 114 | 115 | if (data.reservations.length > 0) { 116 | data.reservations.forEach((item) => { 117 | reservationItems += `
    • 118 | 125 |
    • `; 126 | }); 127 | } 128 | 129 | reservationGroup.innerHTML = reservationItems; // append reservation list 130 | 131 | reservationCounter(reservationHeader.children[0], reservationGroup); 132 | 133 | reservationSection.append(reservationHeader, reservationGroup); 134 | 135 | // Add comment 136 | const reservationForm = document.createElement('div'); 137 | reservationForm.className = 'reservation-form'; 138 | const addReservation = document.createElement('h3'); 139 | addReservation.className = 'reservation-title'; 140 | addReservation.innerText = 'Add a Reservation'; 141 | const Form = document.createElement('form'); 142 | Form.innerHTML = ` 143 | 144 | 145 | 146 | 147 | 148 | `; 149 | 150 | reservationForm.append(addReservation, Form); 151 | 152 | Form.addEventListener('submit', async (e) => { 153 | e.preventDefault(); 154 | const name = Form.elements.name.value; 155 | const startDate = Form.elements.start_date.value; 156 | const endDate = Form.elements.end_date.value; 157 | const reserveData = { 158 | item_id: data.id, 159 | username: name, 160 | date_start: startDate, 161 | date_end: endDate, 162 | }; 163 | const url = `${BASE_URL}/reservations/`; 164 | createNewReservation(url, reserveData, reservationSection, Form); 165 | }); 166 | 167 | // append child elements in cardModal 168 | // eslint-disable-next-line max-len 169 | modalCard.append( 170 | btnCross, 171 | cardImg, 172 | title, 173 | des, 174 | cardSpec, 175 | reservationSection, 176 | reservationForm, 177 | ); 178 | 179 | modalContainer.innerHTML = ''; 180 | modalContainer.append(modalCard); // append cardModal 181 | }; 182 | 183 | const fetchSingleShow = async (e) => { 184 | modalContainer.classList.add('show'); 185 | const { id } = e.target.parentElement.parentElement; 186 | const url = `https://api.tvmaze.com/episodes/${id}`; 187 | const response = await fetch(url); 188 | const result = await response.json(); 189 | 190 | const reservationResponse = await fetch( 191 | `${BASE_URL}/reservations?item_id=${id}`, 192 | ); 193 | 194 | let filterResult = { ...result }; 195 | 196 | const reservationResult = await reservationResponse.json(); 197 | if (reservationResult && !reservationResult.error) { 198 | filterResult = { ...filterResult, reservations: reservationResult }; 199 | } else { 200 | filterResult = { ...filterResult, reservations: [] }; 201 | } 202 | 203 | render(filterResult); 204 | }; 205 | 206 | export default fetchSingleShow; 207 | -------------------------------------------------------------------------------- /src/modules/reservationCounter.js: -------------------------------------------------------------------------------- 1 | const reservationCounter = (countContainer, reservationContainer) => { 2 | const count = reservationContainer.childElementCount; 3 | countContainer.innerText = `(${count})`; 4 | return count; 5 | }; 6 | 7 | export default reservationCounter; 8 | -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | 5 | html, 6 | body { 7 | font-family: sans-serif; 8 | padding: 0; 9 | margin: 0; 10 | background: #0d1117; 11 | color: #fff; 12 | } 13 | 14 | a { 15 | text-decoration: none; 16 | } 17 | 18 | .display-flex { 19 | display: flex !important; 20 | } 21 | 22 | .display-none { 23 | display: none !important; 24 | } 25 | 26 | .header { 27 | padding: 3%; 28 | height: 70px; 29 | display: flex; 30 | justify-content: center; 31 | align-items: center; 32 | background: #161b22; 33 | } 34 | 35 | .logo { 36 | font-size: 1.6rem; 37 | font-weight: bold; 38 | color: #ff7b00; 39 | } 40 | 41 | .nav-menu { 42 | display: block; 43 | background: transparent; 44 | border: 1px solid #333; 45 | padding: 3px 5px; 46 | align-self: center; 47 | } 48 | 49 | .nav-menu:active { 50 | background: #333; 51 | } 52 | 53 | .navbar { 54 | display: flex; 55 | width: 100%; 56 | max-width: 1000px; 57 | justify-content: space-between; 58 | align-items: center; 59 | } 60 | 61 | .mobile-nav-group { 62 | display: none; 63 | position: fixed; 64 | left: 0; 65 | right: 0; 66 | bottom: 0; 67 | top: 0; 68 | list-style: none; 69 | flex-direction: column; 70 | margin: 0; 71 | padding: 50px 0; 72 | gap: 20px; 73 | background: #161b22; 74 | } 75 | 76 | .desktop-nav-group { 77 | display: none; 78 | } 79 | 80 | .nav-link { 81 | color: #fff; 82 | color: #ff7b00; 83 | padding: 8px 10px; 84 | text-decoration: none; 85 | transition: all 0.2s ease-in-out; 86 | } 87 | 88 | .mobile-nav-group .nav-link { 89 | display: block; 90 | padding: 15px 20px; 91 | margin-bottom: 5px; 92 | background: #0d1117; 93 | } 94 | 95 | .nav-link:hover { 96 | color: #fff; 97 | background: #ff7b00; 98 | } 99 | 100 | .footer { 101 | left: 0; 102 | right: 0; 103 | bottom: 0; 104 | z-index: 10; 105 | position: relative; 106 | text-align: center; 107 | padding: 20px 25px; 108 | background: #161b22; 109 | border-top: 1px solid #333; 110 | } 111 | 112 | /* Main content css start form here */ 113 | .main-container { 114 | display: flex; 115 | margin: 70px 0; 116 | flex-direction: column; 117 | } 118 | 119 | .tv-shows { 120 | display: flex; 121 | flex-direction: column; 122 | align-items: center; 123 | } 124 | 125 | .show-title { 126 | text-align: center; 127 | } 128 | 129 | .show-group { 130 | display: flex; 131 | list-style: none; 132 | flex-direction: column; 133 | margin: 0; 134 | padding: 0; 135 | align-items: center; 136 | justify-content: center; 137 | width: 100%; 138 | max-width: 1000px; 139 | gap: 20px; 140 | } 141 | 142 | .show-item { 143 | padding: 20px; 144 | background: #161b22; 145 | border: 1px solid #333; 146 | } 147 | 148 | .show-item-img { 149 | display: block; 150 | max-width: 100%; 151 | } 152 | 153 | .show-item-img img { 154 | max-width: 100%; 155 | } 156 | 157 | .show-info { 158 | display: flex; 159 | align-items: center; 160 | justify-content: space-between; 161 | } 162 | 163 | .btn-like { 164 | background: transparent; 165 | border: none; 166 | color: #fff; 167 | margin-left: 10px; 168 | cursor: pointer; 169 | transition: all 0.2s ease-in-out; 170 | } 171 | 172 | .btn-like:active { 173 | transform: translateY(-2px); 174 | } 175 | 176 | .btn-like img { 177 | width: 22px; 178 | max-width: 100%; 179 | filter: invert(54%) sepia(62%) saturate(3447%) hue-rotate(0deg) brightness(102%) contrast(103%); 180 | } 181 | 182 | .btn-like:disabled { 183 | cursor: not-allowed; 184 | } 185 | 186 | .show-actions { 187 | display: flex; 188 | flex-direction: column; 189 | gap: 15px; 190 | } 191 | 192 | .btn-action { 193 | padding: 10px 15px; 194 | background: #ff7b00; 195 | color: #fff; 196 | border: none; 197 | } 198 | 199 | .btn-action:active { 200 | transform: translateY(-2px); 201 | } 202 | 203 | /* Article modal css styles will start from here */ 204 | .popup-modal { 205 | display: none; 206 | width: 100%; 207 | height: 100%; 208 | position: fixed; 209 | z-index: 2000; 210 | left: 0; 211 | top: 0; 212 | bottom: 0; 213 | backdrop-filter: blur(7px); 214 | -webkit-backdrop-filter: blur(10px); 215 | background: rgba(8, 19, 43, 0.4); 216 | box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); 217 | justify-content: center; 218 | } 219 | 220 | .modal-card { 221 | border-radius: 20px; 222 | display: flex; 223 | flex-direction: column; 224 | background: #161b22; 225 | width: 100%; 226 | height: 100%; 227 | overflow: scroll; 228 | gap: 10px; 229 | padding: 24px; 230 | max-width: 1156px; 231 | margin: 25px 15px; 232 | position: relative; 233 | color: #fff; 234 | } 235 | 236 | .btn-cross { 237 | background: transparent; 238 | border: none; 239 | position: absolute; 240 | right: 10px; 241 | top: 10px; 242 | } 243 | 244 | .btn-cross:active { 245 | transform: translateY(-2px); 246 | } 247 | 248 | .card-img { 249 | display: flex; 250 | justify-content: center; 251 | align-items: center; 252 | margin-top: 15px; 253 | } 254 | 255 | .card-img img { 256 | max-width: 100%; 257 | } 258 | 259 | .card-title { 260 | text-align: center; 261 | font-size: 2rem; 262 | font-weight: normal; 263 | } 264 | 265 | .card-spec-group { 266 | display: flex; 267 | flex-direction: column; 268 | align-items: center; 269 | border: 1px solid #333; 270 | } 271 | 272 | .card-spec { 273 | display: flex; 274 | list-style: none; 275 | justify-content: space-between; 276 | margin: 0; 277 | padding: 0; 278 | width: 100%; 279 | flex-wrap: wrap; 280 | align-items: center; 281 | margin-bottom: 25px; 282 | max-width: 600px; 283 | } 284 | 285 | .spec-item { 286 | padding: 15px; 287 | text-align: justify; 288 | } 289 | 290 | .show { 291 | display: flex; 292 | } 293 | 294 | .comment-section { 295 | display: flex; 296 | flex-direction: column; 297 | align-items: center; 298 | } 299 | 300 | .comment-title { 301 | display: flex; 302 | align-items: center; 303 | text-align: center; 304 | margin: 10px 0; 305 | font-weight: normal; 306 | } 307 | 308 | .comment-header { 309 | margin-right: 10px; 310 | } 311 | 312 | #show_comment_count { 313 | font-size: 1.2rem; 314 | } 315 | 316 | .comment-goup { 317 | width: 100%; 318 | max-width: 600px; 319 | display: flex; 320 | align-items: center; 321 | flex-direction: column; 322 | list-style: none; 323 | padding: 0; 324 | margin: 0; 325 | gap: 15px; 326 | } 327 | 328 | .comment-item { 329 | width: 100%; 330 | margin: 5px; 331 | border: 1px solid #333; 332 | } 333 | 334 | .user-info { 335 | background: #0d1117; 336 | display: flex; 337 | align-items: center; 338 | border-bottom: 1px solid #333; 339 | padding: 0 15px; 340 | } 341 | 342 | .user-avatar { 343 | margin-right: 10px; 344 | } 345 | 346 | .user-name { 347 | margin-right: 10px; 348 | } 349 | 350 | .submit-date { 351 | margin-left: auto; 352 | } 353 | 354 | .user-data { 355 | padding: 15px; 356 | } 357 | 358 | .comment-form { 359 | width: 100%; 360 | display: flex; 361 | flex-direction: column; 362 | align-items: center; 363 | margin-bottom: 20px; 364 | } 365 | 366 | form { 367 | width: 100%; 368 | max-width: 600px; 369 | display: flex; 370 | flex-direction: column; 371 | gap: 15px; 372 | } 373 | 374 | input, 375 | #submitBtn { 376 | border: 2px solid #333; 377 | text-align: justify; 378 | border-radius: 5px; 379 | font-size: 1.2rem; 380 | color: #fff; 381 | background: #010409; 382 | padding: 8px 15px; 383 | /* stylelint-disable-next-line */ 384 | color-scheme: dark; 385 | } 386 | 387 | #submitBtn { 388 | width: fit-content; 389 | padding: 10px 20px; 390 | background: #ff7b00; 391 | color: #fff; 392 | border: none; 393 | } 394 | 395 | textarea { 396 | resize: none; 397 | height: 100px; 398 | padding: 10px 20px; 399 | border: 2px solid #333; 400 | border-radius: 5px; 401 | font-size: 1.2rem; 402 | background: #010409; 403 | color: #fff; 404 | } 405 | 406 | button { 407 | cursor: pointer; 408 | } 409 | 410 | .reservation-section { 411 | display: flex; 412 | flex-direction: column; 413 | align-items: center; 414 | } 415 | 416 | .reservation-title { 417 | text-align: center; 418 | margin: 10px 0; 419 | font-weight: normal; 420 | } 421 | 422 | .reservation-group { 423 | width: 100%; 424 | max-width: 600px; 425 | display: flex; 426 | align-items: center; 427 | flex-direction: column; 428 | list-style: none; 429 | padding: 0; 430 | margin: 0; 431 | gap: 15px; 432 | } 433 | 434 | .reservation-item { 435 | width: 100%; 436 | margin: 5px; 437 | border: 1px solid #333; 438 | } 439 | 440 | .reservation-form { 441 | width: 100%; 442 | display: flex; 443 | flex-direction: column; 444 | align-items: center; 445 | margin-bottom: 25px; 446 | } 447 | 448 | @media screen and (min-width: 768px) { 449 | .mobile-nav-group { 450 | display: none; 451 | } 452 | 453 | .desktop-nav-group { 454 | display: flex; 455 | list-style: none; 456 | gap: 10px; 457 | } 458 | 459 | .nav-menu { 460 | display: none; 461 | } 462 | 463 | /* Main content css start from here */ 464 | .show-group { 465 | flex-direction: row; 466 | flex-wrap: wrap; 467 | } 468 | 469 | .show-item { 470 | width: 31%; 471 | } 472 | 473 | /* popup modal css */ 474 | .card-des { 475 | padding: 0 5%; 476 | } 477 | } 478 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 2 | const MiniCssExtractPlugin = require('mini-css-extract-plugin'); 3 | const path = require('path'); 4 | 5 | module.exports = { 6 | mode: 'development', 7 | entry: { 8 | index: './src/index.js', 9 | }, 10 | devServer: { 11 | static: './dist', 12 | }, 13 | output: { 14 | filename: '[name].bundle.js', 15 | path: path.resolve(__dirname, 'dist'), 16 | clean: true, 17 | assetModuleFilename: 'assets/img/[name][ext]', 18 | }, 19 | 20 | module: { 21 | rules: [ 22 | { 23 | test: /\.(s[ac]|c)ss$/i, 24 | use: [MiniCssExtractPlugin.loader, 'css-loader'], 25 | }, 26 | { 27 | test: /\.js$/i, 28 | exclude: /node_modules/, 29 | use: { 30 | loader: 'babel-loader', 31 | options: { 32 | presets: ['@babel/preset-env'], 33 | }, 34 | }, 35 | }, 36 | { 37 | test: /\.(png|svg|jpg|jpeg|gif)$/i, 38 | type: 'asset/resource', 39 | }, 40 | ], 41 | }, 42 | 43 | plugins: [ 44 | new HtmlWebpackPlugin({ 45 | title: 'Webpack Setup', 46 | template: path.resolve(__dirname, 'src', 'index.html'), 47 | }), 48 | new MiniCssExtractPlugin(), 49 | ], 50 | devtool: 'inline-source-map', 51 | 52 | optimization: { 53 | runtimeChunk: 'single', 54 | }, 55 | }; --------------------------------------------------------------------------------