{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./cartridges/app_galderma/cartridge/client/default/js/pdpBuyNow.js","webpack:///./cartridges/app_galderma/cartridge/client/default/js/product/base.js","webpack:///./cartridges/app_galderma/cartridge/client/default/js/product/detail.js","webpack:///./cartridges/app_galderma/cartridge/client/default/js/productDetail.js","webpack:///./cartridges/app_galderma/cartridge/client/default/js/utils.js","webpack:///./sfra/cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js","webpack:///./sfra/cartridges/app_storefront_base/cartridge/client/default/js/util.js","webpack:///./vendor/app_storefront_core/cartridge/client/default/js/thirdParty/glide.js","webpack:///./vendor/int_custom_channelsight/cartridge/client/default/js/csPdp.js","webpack:///./vendor/int_custom_channelsight/cartridge/client/default/js/csPdpExternalUrls.js"],"names":[],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;;AClFa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,E;;;;;;;;;;;;ACxBa;;AAEb;;AAEA,kBAAkB,mBAAO,CAAC,oHAAuB;AACjD,YAAY,mBAAO,CAAC,2GAAuB;;AAE3C;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc,qBAAqB;AACnC;;AAEA;AACA;AACA;AACA,WAAW,wBAAwB;AACnC,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB;AACA;;AAEA;AACA;AACA,WAAW,kBAAkB;AAC7B,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA,YAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;;;;;;;;;;;;;ACxlCa;;AAEb,OAAO,gBAAgB,GAAG,mBAAO,CAAC,gFAAU;AAC5C,WAAW,mBAAO,CAAC,qFAAQ;;AAE3B;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,4CAA4C,kCAAkC,EAAE;;AAEhF;AACA,4CAA4C,uCAAuC,EAAE;;AAErF;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;;AAEA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;;;;;;;;;;;;;AC7Pa;;AAEb,qBAAqB,mBAAO,CAAC,4FAAW;;AAExC;AACA,mBAAmB,mBAAO,CAAC,qGAAsB;AACjD;AACA;AACA;AACA;AACA,uBAAuB,mBAAO,CAAC,2FAAiB;AAChD;AACA;AACA,uBAAuB,mBAAO,CAAC,iGAAoB;AACnD;AACA;AACA,uBAAuB,mBAAO,CAAC,yHAAgC;AAC/D;AACA,CAAC;;;;;;;;;;;;;AClBY;;AAEb;AACA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;ACvBa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AClCa;;AAEb;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE,KAA4D;AAC9D,EAAE,SACoG;AACtG,CAAC,sBAAsB;;AAEvB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,mBAAmB,sBAAsB;AACzC;;AAEA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,kFAAkF;AAClF;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,yBAAyB;AACjC;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA,2EAA2E,2BAA2B;AACtG,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,EAAE;AAChB,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,EAAE;AAChB,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA,cAAc,EAAE;AAChB,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,EAAE;AAChB,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,EAAE;AAChB,cAAc;AACd;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB;AACA,eAAe;AACf;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA,KAAK,IAAI;AACT;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc;AACd;;AAEA;AACA,kCAAkC,sBAAsB;AACxD;AACA;AACA;AACA;;AAEA;AACA,wCAAwC;AACxC;AACA;AACA;AACA,sEAAsE;AACtE;AACA,OAAO;AACP;;AAEA;AACA,4CAA4C;AAC5C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,aAAa;AAC5B,eAAe,SAAS;AACxB;;;AAGA;AACA;AACA;AACA;AACA,yBAAyB,kBAAkB;AAC3C;AACA;;AAEA;AACA,SAAS;;;AAGT;AACA;AACA,SAAS;;;AAGT,yDAAyD;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,aAAa;AAC9B,iBAAiB,QAAQ;AACzB;;AAEA,KAAK;AACL;AACA;AACA;AACA,yBAAyB,kBAAkB;AAC3C;AACA;;AAEA;AACA,SAAS;;;AAGT;AACA;AACA,SAAS;;;AAGT;AACA,4BAA4B;AAC5B,SAAS;AACT;AACA,KAAK;;AAEL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB;AAChB;;;AAGA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,MAAM;AACxB,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,EAAE,WAAW,EAAE;AAC3B;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,eAAe;AAChC,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,aAAa;AAC/B,kBAAkB,SAAS;AAC3B,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,uCAAuC;;AAEvC,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;;;AAGA;AACA;AACA;AACA,SAAS;AACT;;;AAGA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA,SAAS;;;AAGT;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;;AAGT;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;;AAGT;AACA;AACA,SAAS;;;AAGT;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;;AAGA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,mDAAmD;AACnD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,eAAe;AAChC,kBAAkB;AAClB;AACA;AACA,4CAA4C,SAAS;AACrD;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,eAAe;AAChC,mBAAmB;AACnB;AACA;AACA,4CAA4C,SAAS;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA,YAAY,GAAG;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc;AACd;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,cAAc;AACd;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,cAAc;AAC/B,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB,OAAO;AACzB,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA,uBAAuB,mBAAmB;AAC1C;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;AAEA,uBAAuB,mBAAmB;AAC1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB,iEAAiE;AAC1F,2BAA2B,mBAAmB;AAC9C;AACA;AACA;AACA;;AAEA,4BAA4B,qBAAqB;AACjD;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB,mBAAmB;AAC1C;AACA;;AAEA,yBAAyB,sBAAsB;AAC/C;AACA;;AAEA,yBAAyB,oBAAoB;AAC7C;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,aAAa;AAC7B,gBAAgB,wBAAwB;AACxC,gBAAgB,SAAS;AACzB,gBAAgB,eAAe;AAC/B,gBAAgB;AAChB;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,aAAa;AAC/B,kBAAkB,wBAAwB;AAC1C,kBAAkB,eAAe;AACjC,kBAAkB;AAClB;;AAEA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,kBAAkB;AAClB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB,kBAAkB;AAClB;AACA;AACA,uBAAuB,yBAAyB;AAChD;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,kBAAkB;AAClB;AACA;AACA;AACA;AACA,iEAAiE;;AAEjE,oEAAoE;;AAEpE;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;;AAGT;AACA,OAAO;;AAEP;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB;AAClB;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B,kBAAkB;AAClB;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uCAAuC;AACvC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB,OAAO;AACzB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA,yBAAyB,uBAAuB;AAChD;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA,yBAAyB,uBAAuB;AAChD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B,kBAAkB;AAClB;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;;AAEA,4EAA4E,aAAa;AACzF;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;;AAEA,+EAA+E,eAAe;AAC9F;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,eAAe;AAChC,kBAAkB;AAClB;AACA;AACA,uBAAuB,qBAAqB;AAC5C;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,eAAe;AAChC,kBAAkB;AAClB;AACA;AACA,uBAAuB,qBAAqB;AAC5C;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB,OAAO;AACzB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,iBAAiB,eAAe;AAChC,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,aAAa;AACb;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;;AAEP;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB,eAAe;AACf;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;;AAEA,mCAAmC;AACnC;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC;AACjC,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gGAAgG;AAChG;AACA,KAAK;;AAEL;AACA,GAAG;;AAEH;;AAEA,CAAC;;;;;;;;;;;;;AC70HY;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,E;;;;;;;;;;;;ACxBa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA,E","file":"default/js/productDetail.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./cartridges/app_galderma/cartridge/client/default/js/productDetail.js\");\n","'use strict';\n// the include for this file should be surrounded by a site preference check\nfunction updateBuyNowButton() {\n    $('body').on('product:afterAttributeSelect', function (e, response) {\n        if ($('.cswidget-external-js').length) {\n            var widgets = $('.cswidget-external-js').toArray();\n            widgets.forEach(function (item) {\n                var currentProductId = $(item).data('pid');\n                if (currentProductId && (currentProductId.toString() === response.data.product.id)) {\n                    $(item).addClass('show');\n                    $(item).removeClass('hide');\n                } else if(!$(item).hasClass('hide') || $(item).hasClass('show')){\n                    $(item).removeClass('show');\n                    $(item).addClass('hide');\n                }\n            });\n        }\n    });\n}\nmodule.exports = function () {\n    let features = JSON.parse(document.querySelector('body').dataset.features);\n    if (features && features.enableOverrideBuyNowURL && features.enableOverrideBuyNowURL) {\n        updateBuyNowButton();\n    }\n};","'use strict';\n\n/* eslint-disable no-use-before-define, valid-jsdoc, no-unused-vars, no-prototype-builtins, no-restricted-globals */\n\nvar focusHelper = require('base/components/focus');\nvar Glide = require('core/thirdParty/glide');\n\n// Not required here, already loaded in main.js. Warning: This will also include jquery!\n// var processInclude = require('base/util');\n// processInclude(require('core/thirdParty/slick'));\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n    var pid;\n\n    if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n        pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n    } else if ($('.product-set-detail').length || $('.product-set').length) {\n        pid = $($el).closest('.product-detail').find('.product-id').text();\n    } else {\n        pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n    }\n\n    return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n    var quantitySelected;\n    if ($el && $('.set-items').length) {\n        quantitySelected = $($el).closest('.product-detail').find('.quantity-select');\n    } else if ($el && $('.product-bundle').length) {\n        var quantitySelectedModal = $($el).closest('.modal-footer').find('.quantity-select');\n        var quantitySelectedPDP = $($el).closest('.bundle-footer').find('.quantity-select');\n        if (quantitySelectedModal.val() === undefined) {\n            quantitySelected = quantitySelectedPDP;\n        } else {\n            quantitySelected = quantitySelectedModal;\n        }\n    } else {\n        quantitySelected = $('.quantity-select');\n    }\n    return quantitySelected;\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n    return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n *     selected.  If there is no variant that corresponds to a specific combination of attribute\n *     values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs) {\n    attr.values.forEach(function (attrValue) {\n        var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"'\n            + attrValue.value + '\"]');\n        var $swatchButton = $attrValue.parent();\n\n        if (attrValue.selected) {\n            $attrValue.addClass('selected');\n            $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n        } else {\n            $attrValue.removeClass('selected');\n            $attrValue.siblings('.selected-assistive-text').empty();\n        }\n\n        if (attrValue.url) {\n            $swatchButton.attr('data-url', attrValue.url);\n        } else {\n            $swatchButton.removeAttr('data-url');\n        }\n\n        // Disable if not selectable\n        $attrValue.removeClass('selectable unselectable');\n\n        $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\n    });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n *     selected.  If there is no variant that corresponds to a specific combination of attribute\n *     values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n    var $attr = '[data-attr=\"' + attr.id + '\"]';\n    var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n    $defaultOption.attr('value', attr.resetUrl);\n\n    attr.values.forEach(function (attrValue) {\n        var $attrValue = $productContainer\n            .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\n        $attrValue.attr('value', attrValue.url)\n            .removeAttr('disabled');\n\n        if (!attrValue.selectable) {\n            $attrValue.attr('disabled', true);\n        }\n    });\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n *     swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs) {\n    // Currently, the only attribute type that has image swatches is Color.\n    var attrsWithSwatches = ['color'];\n\n    attrs.forEach(function (attr) {\n        if (attrsWithSwatches.indexOf(attr.id) > -1) {\n            processSwatchValues(attr, $productContainer, msgs);\n        } else {\n            processNonSwatchValues(attr, $productContainer);\n        }\n    });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n *                            attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n    var availabilityValue = '';\n    var availabilityMessages = response.product.availability.messages;\n    if (!response.product.readyToOrder) {\n        availabilityValue = '<li><div>' + response.resources.info_selectforstock + '</div></li>';\n    } else {\n        availabilityMessages.forEach(function (message) {\n            availabilityValue += '<li><div>' + message + '</div></li>';\n        });\n    }\n\n    $($productContainer).trigger('product:updateAvailability', {\n        product: response.product,\n        $productContainer: $productContainer,\n        message: availabilityValue,\n        resources: response.resources\n    });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n    if (!attributes) {\n        return '';\n    }\n\n    var html = '';\n\n    attributes.forEach(function (attributeGroup) {\n        if (attributeGroup.ID === 'mainAttributes') {\n            attributeGroup.attributes.forEach(function (attribute) {\n                html += '<div class=\"attribute-values\">' + attribute.label + ': '\n                    + attribute.value + '</div>';\n            });\n        }\n    });\n\n    return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n    // Update options\n    $productContainer.find('.product-options').empty().html(optionsHtml);\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n *     attributes have been selected.  Used partially to\n *     determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n    var isChoiceOfBonusProducts = $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n    var isVaraint;\n    if (response.product.variationAttributes) {\n        updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n        isVaraint = response.product.productType === 'variant';\n        if (isChoiceOfBonusProducts && isVaraint) {\n            $productContainer.parent('.bonus-product-item')\n                .data('pid', response.product.id);\n\n            $productContainer.parent('.bonus-product-item')\n                .data('ready-to-order', response.product.readyToOrder);\n        }\n    }\n\n    deinitSliders($productContainer);\n\n    // Update primary images\n    $productContainer.find('.primary-images .carousel .glide__slides').empty();\n    $productContainer.find('.primary-images .carousel .glide__slides').addClass('ajax-hide');\n    var primaryImages = response.product.images;\n    primaryImages.large.forEach(function (image, idx) {\n        var $slide = $('<div class=\"glide-slide\"></div>');\n        var $productBadge = $('.primary-images .main-carousel-container + .product-badge.custom').length;\n        if ($productBadge === 1) {\n            var badgeText = $('.primary-images .main-carousel-container + .product-badge.custom .badge-text').text();\n            if (idx === 0) {\n                $('<div>', {\n                    class: `product-badge custom`\n                }).append(\n                    $('<span>', {\n                        class: 'badge-text',\n                        text: badgeText\n                    })\n                ).appendTo($slide);\n            }\n        }\n        $slide.append(\n            $('<img class=\"carousel-img\"/>')\n                .attr('src', image.url)\n                .attr('alt', image.alt)\n                .attr('data-glide-slide-index', idx)\n        );\n        $slide.appendTo($productContainer.find('.main-carousel-container .carousel .glide__slides'));\n        if (primaryImages.hasOwnProperty('zoom')) {\n            var zoomImage = primaryImages.zoom[idx];\n            if (zoomImage) {\n                $(image).data('zoom', zoomImage.url);\n            }\n        }\n    });\n\n    primaryImages.small.forEach(function (image, idx) {\n        $('<div class=\"glide-slide\"></div>')\n            .appendTo(\n                $productContainer.find('.thumbnail-carousel-container .carousel .glide__slides')\n            )\n            .append(\n                $('<img/>')\n                    .attr('src', image.url)\n                    .attr('alt', image.alt)\n            );\n    });\n\n    /**\n     *  As Slider/select not working for single image. This Login works same as multiple images\n     *  When Selected the product size from PDP, it changes thumbnail and main image\n     *  with both same images.\n     */\n\n    var smallImages = primaryImages.small.length;\n    var largeImages = primaryImages.large.length;\n    if (largeImages === 1 && smallImages === 1) {\n        var $mainCarouselContainer = $productContainer.find('.primary-images .main-carousel-container');\n        $mainCarouselContainer.find('.glide-placeholder-image.carousel').addClass('hide');\n        $mainCarouselContainer.find('.carousel.pdp-slider-glide-init.glide')\n            .addClass('glide--ltr glide--carousel glide--swipeable glide-loaded')\n            .removeClass('invisible');\n        $mainCarouselContainer.find('.carousel.pdp-slider-glide-init .glide__arrows').addClass('d-none');\n    }\n\n    // waiting for images to load and have width before we initialize sliders\n    var images = $productContainer.find('.main-carousel-container .carousel .glide__slides img');\n    var intervalId = setInterval(function () {\n        for (var i = 0; i < images.length; i += 1) {\n            if (images[i].width > 0) {\n                clearInterval(intervalId);\n                initSliders($productContainer);\n                break;\n            }\n        }\n    }, 100);\n\n    updateZoomImage($productContainer);\n\n    // Update pricing\n    if (!isChoiceOfBonusProducts) {\n        var $priceSelector = $('.prices .price', $productContainer).length\n            ? $('.prices .price', $productContainer)\n            : $('.prices .price');\n        $priceSelector.replaceWith(response.product.price.html);\n    }\n\n    // Update promotions\n    $productContainer.find('.promotions').empty().html(response.product.promotionsHtml);\n\n    updateAvailability(response, $productContainer);\n\n    if (isChoiceOfBonusProducts) {\n        var $selectButton = $productContainer.find('.select-bonus-product');\n        $selectButton.trigger('bonusproduct:updateSelectButton', {\n            product: response.product,\n            $productContainer: $productContainer\n        });\n    } else {\n        // Enable \"Add to Cart\" button if all required attributes have been selected\n        $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n            product: response.product,\n            $productContainer: $productContainer\n        }).trigger('product:statusUpdate', response.product);\n    }\n\n    // Update attributes\n    $productContainer.find('.main-attributes').empty()\n        .html(getAttributesHtml(response.product.attributes));\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n *     etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n    if ($productContainer.parent('.bonus-product-item').length <= 0) {\n        var optionsHtml = quantities.map(function (quantity) {\n            var selected = quantity.selected ? ' selected ' : '';\n            return '<option value=\"' + quantity.value + '\"  data-url=\"' + quantity.url + '\"'\n                + selected + '>' + quantity.value + '</option>';\n        }).join('');\n        getQuantitySelector($productContainer).empty().html(optionsHtml);\n    }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n *         changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction attributeSelect(selectedValueUrl, $productContainer) {\n    window.dataLayer = window.dataLayer || [];\n\n    if (selectedValueUrl) {\n        $('body').trigger('product:beforeAttributeSelect', {\n            url: selectedValueUrl,\n            container: $productContainer\n        });\n\n        $.ajax({\n            url: selectedValueUrl,\n            method: 'GET',\n            success: function (data) {\n                handleVariantResponse(data, $productContainer);\n                updateOptions(data.product.optionsHtml, $productContainer);\n                updateQuantities(data.product.quantities, $productContainer);\n                $('body').trigger('product:afterAttributeSelect', {\n                    data: data,\n                    container: $productContainer\n                });\n\n                var deviceType = 'Desktop';\n                var ua = navigator.userAgent;\n\n                if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(ua)) {\n                    deviceType = 'Tablet';\n                }\n\n                if (/Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(ua)) {\n                    deviceType = 'Mobile';\n                }\n\n                window.dataLayer.push({\n                    event: 'customEvent',\n                    category: 'Product pages',\n                    deviceType: deviceType,\n                    pageType: 'Product',\n                    action: 'Product size',\n                    label: ($('.custom-select.form-control.select-size option:selected').text()).replace(/\\n/g, ''),\n                    productID: data.product.id,\n                    productName: data.product.productName,\n                    catalogCategoryTitle: 'Product Categories'\n                });\n\n                $.spinner().stop();\n            },\n            error: function () {\n                $.spinner().stop();\n            }\n        });\n    }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n    return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n    var $html = $('<div>').append($.parseHTML(html));\n\n    var body = $html.find('.choice-of-bonus-product');\n    var footer = $html.find('.modal-footer').children();\n\n    return {\n        body: body,\n        footer: footer\n    };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n    $.spinner().start();\n\n    if ($('#chooseBonusProductModal').length !== 0) {\n        $('#chooseBonusProductModal').remove();\n    }\n    var bonusUrl;\n    if (data.bonusChoiceRuleBased) {\n        bonusUrl = data.showProductsUrlRuleBased;\n    } else {\n        bonusUrl = data.showProductsUrlListBased;\n    }\n\n    var htmlString = '<!-- Modal -->'\n        + '<div class=\"modal fade\" id=\"chooseBonusProductModal\" tabindex=\"-1\" role=\"dialog\">'\n        + '<span class=\"enter-message sr-only\" ></span>'\n        + '<div class=\"modal-dialog choose-bonus-product-dialog\" '\n        + 'data-total-qty=\"' + data.maxBonusItems + '\"'\n        + 'data-UUID=\"' + data.uuid + '\"'\n        + 'data-pliUUID=\"' + data.pliUUID + '\"'\n        + 'data-addToCartUrl=\"' + data.addToCartUrl + '\"'\n        + 'data-pageStart=\"0\"'\n        + 'data-pageSize=\"' + data.pageSize + '\"'\n        + 'data-moreURL=\"' + data.showProductsUrlRuleBased + '\"'\n        + 'data-bonusChoiceRuleBased=\"' + data.bonusChoiceRuleBased + '\">'\n        + '<!-- Modal content-->'\n        + '<div class=\"modal-content\">'\n        + '<div class=\"modal-header\">'\n        + '    <span class=\"\">' + data.labels.selectprods + '</span>'\n        + '    <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">'\n        + '        <span aria-hidden=\"true\">&times;</span>'\n        + '        <span class=\"sr-only\"> </span>'\n        + '    </button>'\n        + '</div>'\n        + '<div class=\"modal-body\"></div>'\n        + '<div class=\"modal-footer\"></div>'\n        + '</div>'\n        + '</div>'\n        + '</div>';\n    $('body').append(htmlString);\n\n    $.ajax({\n        url: bonusUrl,\n        method: 'GET',\n        dataType: 'json',\n        success: function (response) {\n            var parsedHtml = parseHtml(response.renderedTemplate);\n            $('#chooseBonusProductModal .modal-body').empty();\n            $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\n            $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\n            $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n            $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n            $('#chooseBonusProductModal').modal('show');\n            $('#chooseBonusProductModal').on('shown.bs.modal', function () {\n                initImageGalleries();\n            });\n            $.spinner().stop();\n        },\n        error: function () {\n            $.spinner().stop();\n        }\n    });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n    $('.minicart').trigger('count:update', response);\n    var messageType = response.error ? 'alert-danger' : 'alert-success';\n    // show add to cart toast\n    if (response.newBonusDiscountLineItem\n        && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n        chooseBonusProducts(response.newBonusDiscountLineItem);\n    } else {\n        if ($('.add-to-cart-messages').length === 0) {\n            $('body').append(\n                '<div class=\"add-to-cart-messages\"></div>'\n            );\n        }\n\n        $('.add-to-cart-messages').append(\n            '<div class=\"alert ' + messageType + ' add-to-basket-alert text-center\" role=\"alert\">'\n            + response.message\n            + '</div>'\n        );\n\n        setTimeout(function () {\n            $('.add-to-basket-alert').remove();\n            $('.minicart').trigger('focusout');\n        }, 5000);\n    }\n}\n/**\n * product image slider initialization\n */\nfunction initSliders($productContainer) {\n    const glideOptions = {\n        type: 'carousel',\n        perView: 1,\n        perSwipe: ''\n    };\n    window.pdpImageGlide = new Glide($productContainer.find('.pdp-slider-glide-init')[0], glideOptions);\n    window.pdpImageGlide.on('mount.after', function () {\n        // cloned slides shouldn't have youtube data\n        $('.glide__slide--clone .youtube').each(function () {\n            $(this).removeAttr('data-embed');\n            $(this).removeAttr('id');\n        });\n        swapPlaceholderImageForSlider();\n    });\n\n    var intervalId = setInterval(function () {\n        if ($(window.pdpImageGlide.selector).find('picture[data-glide-slide-index=\"1\"] img.lazyload').length === 0) {\n            clearInterval(intervalId);\n            if ($(window.pdpImageGlide.selector).find('.glide__slides').children().length > 1) {\n                window.pdpImageGlide.mount();\n                initGlideThumbnails($productContainer);\n            }\n        }\n    }, 100);\n\n    setTimeout(function () {\n        clearInterval(intervalId);\n    }, 10000);\n\n    if ($productContainer.find('.pdp-slider-glide-init .glide__slides').hasClass('ajax-hide')) {\n        $productContainer.find('.pdp-slider-glide-init .glide__slides').removeClass('ajax-hide');\n    }\n    if ($productContainer.find('.pdp-thumb-slider-glide-init .glide__slides').hasClass('ajax-hide')) {\n        $productContainer.find('.pdp-thumb-slider-glide-init .glide__slides').removeClass('ajax-hide');\n    }\n}\n/**\n * Initialize glide thumbnails\n * @param {Object} $productContainer jquery element\n */\nfunction initGlideThumbnails($productContainer) {\n    const glideThumbOptions = {\n        type: 'carousel',\n        gap: 8,\n        perView: 4,\n        perSwipe: ''\n    };\n    if ($productContainer.find('.pdp-thumb-slider-glide-init .glide__slides').children().length > 1) {\n        window.pdpImageThumbnailGlide = new Glide($productContainer.find('.pdp-thumb-slider-glide-init')[0], glideThumbOptions).mount();\n        window.pdpImageThumbnailGlide.selector.classList.remove('invisible');\n        window.pdpImageGlide.on('run', function () {\n            window.pdpImageThumbnailGlide.go('=' + window.pdpImageGlide.index);\n        });\n        window.pdpImageThumbnailGlide.on('run', function () {\n            window.pdpImageGlide.go('=' + window.pdpImageThumbnailGlide.index);\n        });\n        $('.pdp-thumb-slider-glide-init .glide-slide').on('click', function () {\n            var $this = $(this);\n            var slidesParent = $(this).closest('.glide__slides');\n            var realSlides = slidesParent.find('.glide-slide:not(.glide__slide--clone)');\n            var trueIndexOfSlide = realSlides.index($this);\n            window.pdpImageThumbnailGlide.go('=' + trueIndexOfSlide);\n        });\n    }\n}\n\n/**\n * swap placeholder image for slider once the imgaes have loaded and we can rely on their width\n */\nfunction swapPlaceholderImageForSlider() {\n    window.pdpImageGlide.selector.classList.add('glide-loaded');\n    window.pdpImageGlide.selector.classList.remove('invisible');\n    $(window.pdpImageGlide.selector).closest('.main-carousel-container').find('.glide-placeholder-image').addClass('hide');\n}\n\n/**\n * deinitialize image slider\n */\nfunction deinitSliders($productContainer) {\n    if (window.pdpImageThumbnailGlide) {\n        window.pdpImageThumbnailGlide.destroy();\n    }\n    if (window.pdpImageGlide) {\n        window.pdpImageGlide.destroy();\n    }\n}\n/**\n * product image zoom initialization\n */\nfunction initZoom($productContainer) {\n    $productContainer.on('mouseenter', '.main-carousel-container .carousel', function (e) {\n        $(this).closest('.main-carousel-container').addClass('zoom-active');\n    }).on('mouseleave', '.main-carousel-container .carousel', function (e) {\n        $(this).closest('.main-carousel-container').removeClass('zoom-active');\n    });\n\n    // stop propagation to the slick arrows, and prevent zoom activating on arrows\n    $('.main-carousel-container .carousel .glide__arrows').on('mouseover', function (e) {\n        e.preventDefault();\n        e.stopPropagation();\n    });\n\n    $productContainer.on('mousemove', '.main-carousel-container .carousel', function (e) {\n        var zoomContainer = $(this).closest('.main-carousel-container').find('.zoom-container');\n        if (!zoomContainer.is(':empty')) {\n            var image = zoomContainer.find('img');\n            var offset = $(this).offset();\n            var width = $(this).width();\n            var height = $(this).height();\n            var left = e.pageX - offset.left;\n            var top = e.pageY - offset.top;\n            image.css('margin-left', -(image.width() - width) * (left / width));\n            image.css('margin-top', -(image.height() - height) * (top / height));\n        }\n    });\n}\n/**\n * update product zoom image url\n */\nfunction updateZoomImage($productContainer) {\n    var imageURL = $productContainer.find('.main-carousel-container .glide__slide--active img').data('zoom');\n    var zoomContainer = $productContainer.find('.main-carousel-container .zoom-container');\n    var fallbackImgName = '_default.png';\n\n    if (imageURL && imageURL.indexOf(fallbackImgName) === -1) {\n        var img;\n        if (zoomContainer.is(':empty')) {\n            img = $('<img/>').appendTo(zoomContainer);\n            img.attr('src', imageURL);\n        } else {\n            img = zoomContainer.find('img').attr('src', imageURL);\n        }\n        var container = img.closest('.main-carousel-container');\n        container.addClass('loading-zoom').spinner().start();\n        img.on('load', function () {\n            container.removeClass('loading-zoom').spinner().stop();\n        });\n    } else {\n        zoomContainer.empty();\n    }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n    var childProducts = [];\n    $('.bundle-item').each(function () {\n        childProducts.push({\n            pid: $(this).find('.product-id').text(),\n            quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n        });\n    });\n\n    return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n    var options = $productContainer\n        .find('.product-option')\n        .map(function () {\n            var $elOption = $(this).find('.options-select');\n            var urlValue = $elOption.val();\n            var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n                .data('value-id');\n            return {\n                optionId: $(this).data('option-id'),\n                selectedValueId: selectedValueId\n            };\n        }).toArray();\n\n    return JSON.stringify(options);\n}\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n    if (url) {\n        $.ajax({\n            url: url,\n            method: 'GET',\n            success: function () {\n                // reporting urls hit on the server\n            },\n            error: function () {\n                // no reporting urls hit on the server\n            }\n        });\n    }\n}\n\n/**\n * Initialize all the image galleries\n */\nfunction initImageGalleries() {\n    var productContainers = $('.set-item');\n    if (!productContainers.length) {\n        productContainers = $('.bundle-item, .product-bundle.row, .product-bundle .row:first-child');\n    }\n    if (!productContainers.length) {\n        productContainers = $('.bonus-product-item');\n    }\n    if (!productContainers.length) {\n        productContainers = $('.product-detail');\n    }\n    productContainers.each(function () {\n        initSliders($(this));\n        updateZoomImage($(this));\n        initZoom($(this));\n    });\n}\n\nmodule.exports = {\n    attributeSelect: attributeSelect,\n    images: function () {\n        initImageGalleries();\n    },\n    methods: {\n        editBonusProducts: function (data) {\n            chooseBonusProducts(data);\n        }\n    },\n\n    focusChooseBonusProductModal: function () {\n        $('body').on('shown.bs.modal', '#chooseBonusProductModal', function () {\n            $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'true');\n            $('#chooseBonusProductModal .close').focus();\n        });\n    },\n\n    onClosingChooseBonusProductModal: function () {\n        $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\n            $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'false');\n        });\n    },\n\n    trapChooseBonusProductModalFocus: function () {\n        $('body').on('keydown', '#chooseBonusProductModal', function (e) {\n            var focusParams = {\n                event: e,\n                containerSelector: '#chooseBonusProductModal',\n                firstElementSelector: '.close',\n                lastElementSelector: '.add-bonus-products'\n            };\n            focusHelper.setTabNextFocus(focusParams);\n        });\n    },\n\n    colorAttribute: function () {\n        $(document).on('click', '[data-attr=\"color\"] button', function (e) {\n            e.preventDefault();\n\n            if ($(this).attr('disabled')) {\n                return;\n            }\n            var $productContainer = $(this).closest('.set-item');\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest('.product-detail');\n            }\n\n            attributeSelect($(this).attr('data-url'), $productContainer);\n        });\n    },\n\n    selectAttribute: function () {\n        $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n            e.preventDefault();\n\n            var $productContainer = $(this).closest('.set-item');\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest('.product-detail');\n            }\n            attributeSelect(e.currentTarget.value, $productContainer);\n        });\n    },\n\n    availability: function () {\n        $(document).on('change', '.quantity-select', function (e) {\n            e.preventDefault();\n\n            var $productContainer = $(this).closest('.product-detail');\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n            }\n\n            if ($('.bundle-items', $productContainer).length === 0) {\n                attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n                    $productContainer);\n            }\n        });\n    },\n\n    addToCart: function () {\n        $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n            var addToCartUrl;\n            var pid;\n            var pidsObj;\n            var setPids;\n\n            $('body').trigger('product:beforeAddToCart', this);\n\n            if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n                setPids = [];\n\n                $('.product-detail').each(function () {\n                    if (!$(this).hasClass('product-set-detail')) {\n                        setPids.push({\n                            pid: $(this).find('.product-id').text(),\n                            qty: $(this).find('.quantity-select').val(),\n                            options: getOptions($(this))\n                        });\n                    }\n                });\n                pidsObj = JSON.stringify(setPids);\n            }\n\n            pid = getPidValue($(this));\n\n            var $productContainer = $(this).closest('.product-detail');\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n            }\n\n            addToCartUrl = getAddToCartUrl();\n\n            var form = {\n                pid: pid,\n                pidsObj: pidsObj,\n                childProducts: getChildProducts(),\n                quantity: getQuantitySelected($(this))\n            };\n\n            if (!$('.bundle-item').length) {\n                form.options = getOptions($productContainer);\n            }\n\n            $(this).trigger('updateAddToCartFormData', form);\n            if (addToCartUrl) {\n                $.ajax({\n                    url: addToCartUrl,\n                    method: 'POST',\n                    data: form,\n                    success: function (data) {\n                        handlePostCartAdd(data);\n                        $('body').trigger('product:afterAddToCart', data);\n                        $.spinner().stop();\n                        miniCartReportingUrl(data.reportingURL);\n                    },\n                    error: function () {\n                        $.spinner().stop();\n                    }\n                });\n            }\n        });\n    },\n    selectBonusProduct: function () {\n        $(document).on('click', '.select-bonus-product', function () {\n            var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\n            var pid = $(this).data('pid');\n            var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\n            var submittedQty = parseInt($choiceOfBonusProduct.find('.bonus-quantity-select').val(), 10);\n            var totalQty = 0;\n            $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\n                totalQty += $(this).data('qty');\n            });\n            totalQty += submittedQty;\n            var optionID = $choiceOfBonusProduct.find('.product-option').data('option-id');\n            var valueId = $choiceOfBonusProduct.find('.options-select option:selected').data('valueId');\n            if (totalQty <= maxPids) {\n                var selectedBonusProductHtml = ''\n                    + '<div class=\"selected-pid row\" '\n                    + 'data-pid=\"' + pid + '\"'\n                    + 'data-qty=\"' + submittedQty + '\"'\n                    + 'data-optionID=\"' + (optionID || '') + '\"'\n                    + 'data-option-selected-value=\"' + (valueId || '') + '\"'\n                    + '>'\n                    + '<div class=\"col-sm-11 col-9 bonus-product-name\" >'\n                    + $choiceOfBonusProduct.find('.product-name').html()\n                    + '</div>'\n                    + '<div class=\"col-1\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></div>'\n                    + '</div>';\n                $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n                $('.pre-cart-products').html(totalQty);\n                $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n            } else {\n                $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n            }\n        });\n    },\n    removeBonusProduct: function () {\n        $(document).on('click', '.selected-pid', function () {\n            $(this).remove();\n            var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\n            var count = 0;\n            if ($selected.length) {\n                $selected.each(function () {\n                    count += parseInt($(this).data('qty'), 10);\n                });\n            }\n\n            $('.pre-cart-products').html(count);\n            $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n        });\n    },\n    enableBonusProductSelection: function () {\n        $('body').on('bonusproduct:updateSelectButton', function (e, response) {\n            $('button.select-bonus-product', response.$productContainer).attr('disabled',\n                (!response.product.readyToOrder || !response.product.available));\n            var pid = response.product.id;\n            $('button.select-bonus-product', response.$productContainer).data('pid', pid);\n        });\n    },\n    showMoreBonusProducts: function () {\n        $(document).on('click', '.show-more-bonus-products', function () {\n            var url = $(this).data('url');\n            $('.modal-content').spinner().start();\n            $.ajax({\n                url: url,\n                method: 'GET',\n                success: function (html) {\n                    var parsedHtml = parseHtml(html);\n                    $('.modal-body').append(parsedHtml.body);\n                    $('.show-more-bonus-products:first').remove();\n                    $('.modal-content').spinner().stop();\n                },\n                error: function () {\n                    $('.modal-content').spinner().stop();\n                }\n            });\n        });\n    },\n    addBonusProductsToCart: function () {\n        $(document).on('click', '.add-bonus-products', function () {\n            var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\n            var queryString = '?pids=';\n            var url = $('.choose-bonus-product-dialog').data('addtocarturl');\n            var pidsObject = {\n                bonusProducts: []\n            };\n\n            $.each($readyToOrderBonusProducts, function () {\n                var qtyOption = parseInt($(this)\n                    .data('qty'), 10);\n\n                var option = null;\n                if (qtyOption > 0) {\n                    if ($(this).data('optionid') && $(this).data('option-selected-value')) {\n                        option = {};\n                        option.optionId = $(this).data('optionid');\n                        option.productId = $(this).data('pid');\n                        option.selectedValueId = $(this).data('option-selected-value');\n                    }\n                    pidsObject.bonusProducts.push({\n                        pid: $(this).data('pid'),\n                        qty: qtyOption,\n                        options: [option]\n                    });\n                    pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\n                }\n            });\n            queryString += JSON.stringify(pidsObject);\n            queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\n            queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\n            $.spinner().start();\n            $.ajax({\n                url: url + queryString,\n                method: 'POST',\n                success: function (data) {\n                    $.spinner().stop();\n                    if (data.error) {\n                        $('#chooseBonusProductModal').modal('hide');\n                        if ($('.add-to-cart-messages').length === 0) {\n                            $('body').append('<div class=\"add-to-cart-messages\"></div>');\n                        }\n                        $('.add-to-cart-messages').append(\n                            '<div class=\"alert alert-danger add-to-basket-alert text-center\"'\n                            + ' role=\"alert\">'\n                            + data.errorMessage + '</div>'\n                        );\n                        setTimeout(function () {\n                            $('.add-to-basket-alert').remove();\n                        }, 3000);\n                    } else {\n                        $('.configure-bonus-product-attributes').html(data);\n                        $('.bonus-products-step2').removeClass('hidden-xl-down');\n                        $('#chooseBonusProductModal').modal('hide');\n\n                        if ($('.add-to-cart-messages').length === 0) {\n                            $('body').append('<div class=\"add-to-cart-messages\"></div>');\n                        }\n                        $('.minicart-quantity').html(data.totalQty);\n                        $('.add-to-cart-messages').append(\n                            '<div class=\"alert alert-success add-to-basket-alert text-center\"'\n                            + ' role=\"alert\">'\n                            + data.msgSuccess + '</div>'\n                        );\n                        setTimeout(function () {\n                            $('.add-to-basket-alert').remove();\n                            if ($('.cart-page').length) {\n                                location.reload();\n                            }\n                        }, 1500);\n                    }\n                },\n                error: function () {\n                    $.spinner().stop();\n                }\n            });\n        });\n    },\n\n    getPidValue: getPidValue,\n    getQuantitySelected: getQuantitySelected,\n    miniCartReportingUrl: miniCartReportingUrl\n};\n","'use strict';\n\nconst { getDeviceType } = require('../utils');\nvar base = require('./base');\n\n/**\n * Enable/disable UI elements\n * @param {boolean} enableOrDisable - true or false\n */\nfunction updateAddToCartEnableDisableOtherElements(enableOrDisable) {\n    $('button.add-to-cart-global').attr('disabled', enableOrDisable);\n}\n\nmodule.exports = {\n    methods: {\n        updateAddToCartEnableDisableOtherElements: updateAddToCartEnableDisableOtherElements\n    },\n\n    availability: base.availability,\n    // addToCart: base.addToCart,\n    images: base.images,\n\n    updateAttributesAndDetails: function () {\n        $('body').on('product:statusUpdate', function (e, data) {\n            var $productContainer = $('.product-detail[data-pid=\"' + data.id + '\"]');\n\n            $productContainer.find('.description-and-detail .product-attributes')\n                .empty()\n                .html(data.attributesHtml);\n\n            if (data.shortDescription) {\n                $productContainer.find('.description-and-detail .description')\n                    .removeClass('hidden-xl-down');\n                $productContainer.find('.description-and-detail .description .content')\n                    .empty()\n                    .html(data.shortDescription);\n            } else {\n                $productContainer.find('.description-and-detail .description')\n                    .addClass('hidden-xl-down');\n            }\n\n            if (data.longDescription) {\n                $productContainer.find('.description-and-detail .details')\n                    .removeClass('hidden-xl-down');\n                $productContainer.find('.description-and-detail .details .content')\n                    .empty()\n                    .html(data.longDescription);\n            } else {\n                $productContainer.find('.description-and-detail .details')\n                    .addClass('hidden-xl-down');\n            }\n        });\n    },\n\n    showSpinner: function () {\n        $('body').on('product:beforeAddToCart product:beforeAttributeSelect', function () {\n            $.spinner().start();\n        });\n    },\n    updateAttribute: function () {\n        $('body').on('product:afterAttributeSelect', function (e, response) {\n            if ($('.product-detail>.bundle-items').length) {\n                response.container.data('pid', response.data.product.id);\n                response.container.find('.product-id').text(response.data.product.id);\n            } else if ($('.product-set-detail').eq(0)) {\n                response.container.data('pid', response.data.product.id);\n                response.container.find('.product-id').text(response.data.product.id);\n            } else {\n                $('.product-id').text(response.data.product.id);\n                $('.product-detail:not(\".bundle-item\")').data('pid', response.data.product.id);\n            }\n        });\n    },\n    updateAddToCart: function () {\n        $('body').on('product:updateAddToCart', function (e, response) {\n            // update local add to cart (for sets)\n            $('button.add-to-cart', response.$productContainer).attr('disabled',\n                (!response.product.readyToOrder || !response.product.available));\n\n            var enable = $('.product-availability').toArray().every(function (item) {\n                return $(item).data('available') && $(item).data('ready-to-order');\n            });\n            module.exports.methods.updateAddToCartEnableDisableOtherElements(!enable);\n        });\n    },\n    updateAvailability: function () {\n        $('body').on('product:updateAvailability', function (e, response) {\n            $('div.availability', response.$productContainer)\n                .data('ready-to-order', response.product.readyToOrder)\n                .data('available', response.product.available);\n\n            $('.availability-msg', response.$productContainer)\n                .empty().html(response.message);\n\n            if ($('.global-availability').length) {\n                var allAvailable = $('.product-availability').toArray()\n                    .every(function (item) { return $(item).data('available'); });\n\n                var allReady = $('.product-availability').toArray()\n                    .every(function (item) { return $(item).data('ready-to-order'); });\n\n                $('.global-availability')\n                    .data('ready-to-order', allReady)\n                    .data('available', allAvailable);\n\n                $('.global-availability .availability-msg').empty()\n                    .html(allReady ? response.message : response.resources.info_selectforstock);\n            }\n        });\n    },\n    sizeChart: function () {\n        $('.size-chart a').on('click', function (e) {\n            e.preventDefault();\n            var url = $(this).attr('href');\n            var $prodSizeChart = $(this).closest('.size-chart').find('.size-chart-collapsible');\n            if ($prodSizeChart.is(':empty')) {\n                $.ajax({\n                    url: url,\n                    type: 'get',\n                    dataType: 'json',\n                    success: function (data) {\n                        $prodSizeChart.append(data.content);\n                    }\n                });\n            }\n            $prodSizeChart.toggleClass('active');\n        });\n\n        var $sizeChart = $('.size-chart-collapsible');\n        $('body').on('click touchstart', function (e) {\n            if ($('.size-chart').has(e.target).length <= 0) {\n                $sizeChart.removeClass('active');\n            }\n        });\n    },\n    copyProductLink: function () {\n        $('body').on('click', '#fa-link', function (event) {\n            event.preventDefault();\n            var $temp = $('<input>');\n            $('body').append($temp);\n            $temp.val($('#shareUrl').val()).select();\n            document.execCommand('copy');\n            $temp.remove();\n            $('.copy-link-message').attr('role', 'alert');\n            $('.copy-link-message').removeClass('d-none');\n            setTimeout(function () {\n                $('.copy-link-message').addClass('d-none');\n            }, 3000);\n        });\n    },\n    initStickyNav: function () {\n        var $navElement = $('#pdp-product-nav');\n        var $navElementLength = $navElement.find('.nav-link').length;\n        if ($navElement.hasClass('init-sticky-nav')) {\n            $navElement.closest('.experience-dynamic-productNav').addClass('sticky-top');\n            if (getDeviceType() === 'Mobile' && $navElementLength > 3) {\n                $navElement.slick();\n                $navElement.css('overflow-x', 'hidden');\n            }\n        }\n\n        // pdp how to use nav sticky feature\n        \n        if ($('body').find('.page-redesign').length > 0){\n            window.addEventListener(\"scroll\", function() {\n                var stickytopPdpTop = $('.experience-region.experience-productDetailBottom').offset().top\n                var footerTop = $('footer').offset().top;\n                var currentScrollTop = window.scrollY;\n                var headerHeight = 136 + 100;\n                var stickyTopExpected = stickytopPdpTop - headerHeight;\n                if ((currentScrollTop >= (stickyTopExpected)) && currentScrollTop < (footerTop - 200)){\n                    $('.experience-component.experience-dynamic-productNav.sticky-top').addClass('fixedTopNav');\n                } else {\n                    $('.experience-component.experience-dynamic-productNav.sticky-top').removeClass('fixedTopNav');\n                }\n            });\n            $('.pdp-product-nav.init-sticky-nav .btn.nav-link').on('click', function(event){\n                event.preventDefault();\n                var targetElement = $(this.getAttribute('href'));\n                var targetPosition = targetElement.offset().top - 180;\n                $('html, body').animate({\n                    scrollTop: targetPosition\n                }, 500);\n            });\n        }\n        \n    },\n    navigateToNavItem: function () {\n        $(window).on('activate.bs.scrollspy', function () {\n            var $activeNavItem = $('.nav-link.active');\n            var index = $activeNavItem.closest('.slick-slide').data('slick-index');\n            if (index >= 0) {\n                $activeNavItem.closest('.pdp-product-nav').slick('slickGoTo', index);\n            }\n        });\n    },\n    hideEmptyCarousels: function () {\n        var $carouselElement = $('.hide-carousel-and-nav');\n        $carouselElement.each(function () {\n            // hide the link to the carousel in the nav\n            $('[data-linked-element=' + $(this).attr('id') + ']').addClass('found-and-hid');\n            // it's not enough to hide the carousel, since there can be a background image component around it,\n            // we need to hide the ancestor that is a direct child of the \"experience-productDetailBottom\" element\n            var $carouselElementToHide = $(this);\n            // get direct children of the experience-productDetailBottom element, hide the one that contains the empty carousel\n            $('.experience-productDetailBottom').children().each(function () {\n                var $directChildOfProductDetailBottom = $(this);\n                if ($directChildOfProductDetailBottom.has($carouselElementToHide).length) {\n                    $directChildOfProductDetailBottom.addClass('hide-highest-level-component');\n                }\n            });\n        });\n    },\n    removeEmptySlide: function () {\n        if ($('.experience-commerce_layouts-ingredientsCarousel .pd-slider').length) {\n            var self = $('.experience-commerce_layouts-ingredientsCarousel .pd-slider');\n            var slides = self.find('.slick-slide');\n\n            slides.each(function () {\n                var currentSlide = $(this);\n\n                if (currentSlide.find('.ingredient-thumbnail-container').length === 0) {\n                    // currentSlide.remove();\n                    self.slick('slickRemove', currentSlide.index());\n                }\n            });\n\n            self.closest('.pd-slider').slick('unslick');\n            document.querySelectorAll('.product.pd-slide').forEach(slide => {\n                if (!slide.querySelector('.ingredient-thumbnail-container')) {\n                    slide.remove();\n                }\n            });\n            self.closest('.pd-slider').slick();\n        }\n    },\n    updateAponowButton: function () {\n        $('body').on('product:afterAttributeSelect', function (e, response) {\n            if (response && response.data && response.data.aponowButton) {\n                // aponowButton is an html string created by a template rendering of aponowBuyNowButton.isml\n                $('.find-in-store-container').html(response.data.aponowButton);\n            }\n        });\n    },\n    jsGaldermaME: function () {\n        $('.Galderma-ME .pdp-main .short-desc p').each(function (idx, attr) {\n            if ($(attr).text().indexOf('•') !== -1) {\n                var updatedText = $(attr).text().replace('•', '-');\n                $(attr).text(updatedText);\n            }\n        });\n    },\n    focusChooseBonusProductModal: base.focusChooseBonusProductModal()\n};\n","'use strict';\n\nvar processInclude = require('base/util');\n\n$(document).ready(function () {\n    processInclude(require('store/product/detail'));\n    // removed for GALSUP-182\n    // processInclude(require('core/product/wishlist'));\n    let features = JSON.parse(document.querySelector('body').dataset.features);\n    if (features && features.enableOverrideBuyNowURL && features.enableOverrideBuyNowURL) {\n        processInclude(require('store/pdpBuyNow'));\n    }\n    if (features && features.enableChannelSite && features.enablePdpBuyNow) {\n        processInclude(require('channelsight/csPdp'));\n    }\n    if (features && features.overridePdpCsModalWithExternalUrl) {\n        processInclude(require('channelsight/csPdpExternalUrls'));\n    }\n});\n","'use strict';\n\n/**\n * Retrieve contextual quantity selector\n * @return {string} - device type\n */\nfunction getDeviceType() {\n    var deviceType = 'Desktop';\n    var ua = navigator.userAgent;\n\n    if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(ua)) {\n        deviceType = 'Tablet';\n    }\n\n    if (/Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(ua)) {\n        deviceType = 'Mobile';\n    }\n\n    return deviceType;\n}\n\nmodule.exports = {\n    getDeviceType: getDeviceType\n};\n","'use strict';\n\nmodule.exports = {\n    setTabNextFocus: function (focusParams) {\n        var KEYCODE_TAB = 9;\n        var isTabPressed = (focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB);\n\n        if (!isTabPressed) {\n            return;\n        }\n\n        var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\n        var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\n\n        if ($(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled')) {\n            lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\n            if ($('.product-quickview.product-set').length > 0) {\n                var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\n                lastFocusableEl = linkElements[linkElements.length - 1];\n            }\n        }\n\n        if (focusParams.event.shiftKey) /* shift + tab */ {\n            if ($(':focus').is(firstFocusableEl)) {\n                lastFocusableEl.focus();\n                focusParams.event.preventDefault();\n            }\n        } else /* tab */ {\n            if ($(':focus').is(lastFocusableEl)) { // eslint-disable-line\n                firstFocusableEl.focus();\n                focusParams.event.preventDefault();\n            }\n        }\n    }\n};\n","'use strict';\n\nmodule.exports = function (include) {\n    if (typeof include === 'function') {\n        include();\n    } else if (typeof include === 'object') {\n        Object.keys(include).forEach(function (key) {\n            if (typeof include[key] === 'function') {\n                include[key]();\n            }\n        });\n    }\n};\n","/*!\n * Glide.js v3.6.1\n * (c) 2013-2023 Jędrzej Chałubek (https://github.com/jedrzejchalubek/)\n * Released under the MIT License.\n */\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Glide = factory());\n})(this, (function () { 'use strict';\n\n  function ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n\n    if (Object.getOwnPropertySymbols) {\n      var symbols = Object.getOwnPropertySymbols(object);\n\n      if (enumerableOnly) {\n        symbols = symbols.filter(function (sym) {\n          return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n      }\n\n      keys.push.apply(keys, symbols);\n    }\n\n    return keys;\n  }\n\n  function _objectSpread2(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i] != null ? arguments[i] : {};\n\n      if (i % 2) {\n        ownKeys(Object(source), true).forEach(function (key) {\n          _defineProperty(target, key, source[key]);\n        });\n      } else if (Object.getOwnPropertyDescriptors) {\n        Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n      } else {\n        ownKeys(Object(source)).forEach(function (key) {\n          Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n      }\n    }\n\n    return target;\n  }\n\n  function _typeof(obj) {\n    \"@babel/helpers - typeof\";\n\n    if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n      _typeof = function (obj) {\n        return typeof obj;\n      };\n    } else {\n      _typeof = function (obj) {\n        return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n      };\n    }\n\n    return _typeof(obj);\n  }\n\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  function _inherits(subClass, superClass) {\n    if (typeof superClass !== \"function\" && superClass !== null) {\n      throw new TypeError(\"Super expression must either be null or a function\");\n    }\n\n    subClass.prototype = Object.create(superClass && superClass.prototype, {\n      constructor: {\n        value: subClass,\n        writable: true,\n        configurable: true\n      }\n    });\n    if (superClass) _setPrototypeOf(subClass, superClass);\n  }\n\n  function _getPrototypeOf(o) {\n    _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n      return o.__proto__ || Object.getPrototypeOf(o);\n    };\n    return _getPrototypeOf(o);\n  }\n\n  function _setPrototypeOf(o, p) {\n    _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n      o.__proto__ = p;\n      return o;\n    };\n\n    return _setPrototypeOf(o, p);\n  }\n\n  function _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n\n    try {\n      Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  function _assertThisInitialized(self) {\n    if (self === void 0) {\n      throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n    }\n\n    return self;\n  }\n\n  function _possibleConstructorReturn(self, call) {\n    if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n      return call;\n    } else if (call !== void 0) {\n      throw new TypeError(\"Derived constructors may only return object or undefined\");\n    }\n\n    return _assertThisInitialized(self);\n  }\n\n  function _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n    return function _createSuperInternal() {\n      var Super = _getPrototypeOf(Derived),\n          result;\n\n      if (hasNativeReflectConstruct) {\n        var NewTarget = _getPrototypeOf(this).constructor;\n\n        result = Reflect.construct(Super, arguments, NewTarget);\n      } else {\n        result = Super.apply(this, arguments);\n      }\n\n      return _possibleConstructorReturn(this, result);\n    };\n  }\n\n  function _superPropBase(object, property) {\n    while (!Object.prototype.hasOwnProperty.call(object, property)) {\n      object = _getPrototypeOf(object);\n      if (object === null) break;\n    }\n\n    return object;\n  }\n\n  function _get() {\n    if (typeof Reflect !== \"undefined\" && Reflect.get) {\n      _get = Reflect.get;\n    } else {\n      _get = function _get(target, property, receiver) {\n        var base = _superPropBase(target, property);\n\n        if (!base) return;\n        var desc = Object.getOwnPropertyDescriptor(base, property);\n\n        if (desc.get) {\n          return desc.get.call(arguments.length < 3 ? target : receiver);\n        }\n\n        return desc.value;\n      };\n    }\n\n    return _get.apply(this, arguments);\n  }\n\n  var defaults = {\n    /**\n     * Type of the movement.\n     *\n     * Available types:\n     * `slider` - Rewinds slider to the start/end when it reaches the first or last slide.\n     * `carousel` - Changes slides without starting over when it reaches the first or last slide.\n     *\n     * @type {String}\n     */\n    type: 'slider',\n\n    /**\n     * Start at specific slide number defined with zero-based index.\n     *\n     * @type {Number}\n     */\n    startAt: 0,\n\n    /**\n     * A number of slides visible on the single viewport.\n     *\n     * @type {Number}\n     */\n    perView: 1,\n\n    /**\n     * Focus currently active slide at a specified position in the track.\n     *\n     * Available inputs:\n     * `center` - Current slide will be always focused at the center of a track.\n     * `0,1,2,3...` - Current slide will be focused on the specified zero-based index.\n     *\n     * @type {String|Number}\n     */\n    focusAt: 0,\n\n    /**\n     * A size of the gap added between slides.\n     *\n     * @type {Number}\n     */\n    gap: 10,\n\n    /**\n     * Change slides after a specified interval. Use `false` for turning off autoplay.\n     *\n     * @type {Number|Boolean}\n     */\n    autoplay: false,\n\n    /**\n     * Stop autoplay on mouseover event.\n     *\n     * @type {Boolean}\n     */\n    hoverpause: true,\n\n    /**\n     * Allow for changing slides with left and right keyboard arrows.\n     *\n     * @type {Boolean}\n     */\n    keyboard: true,\n\n    /**\n     * Stop running `perView` number of slides from the end. Use this\n     * option if you don't want to have an empty space after\n     * a slider. Works only with `slider` type and a\n     * non-centered `focusAt` setting.\n     *\n     * @type {Boolean}\n     */\n    bound: false,\n\n    /**\n     * Minimal swipe distance needed to change the slide. Use `false` for turning off a swiping.\n     *\n     * @type {Number|Boolean}\n     */\n    swipeThreshold: 80,\n\n    /**\n     * Minimal mouse drag distance needed to change the slide. Use `false` for turning off a dragging.\n     *\n     * @type {Number|Boolean}\n     */\n    dragThreshold: 120,\n\n    /**\n     * A number of slides moved on single swipe.\n     *\n     * Available types:\n     * `` - Moves slider by one slide per swipe\n     * `|` - Moves slider between views per swipe (number of slides defined in `perView` options)\n     *\n     * @type {String}\n     */\n    perSwipe: '',\n\n    /**\n     * Moving distance ratio of the slides on a swiping and dragging.\n     *\n     * @type {Number}\n     */\n    touchRatio: 0.5,\n\n    /**\n     * Angle required to activate slides moving on swiping or dragging.\n     *\n     * @type {Number}\n     */\n    touchAngle: 45,\n\n    /**\n     * Duration of the animation in milliseconds.\n     *\n     * @type {Number}\n     */\n    animationDuration: 400,\n\n    /**\n     * Allows looping the `slider` type. Slider will rewind to the first/last slide when it's at the start/end.\n     *\n     * @type {Boolean}\n     */\n    rewind: true,\n\n    /**\n     * Duration of the rewinding animation of the `slider` type in milliseconds.\n     *\n     * @type {Number}\n     */\n    rewindDuration: 800,\n\n    /**\n     * Easing function for the animation.\n     *\n     * @type {String}\n     */\n    animationTimingFunc: 'cubic-bezier(.165, .840, .440, 1)',\n\n    /**\n     * Wait for the animation to finish until the next user input can be processed\n     *\n     * @type {boolean}\n     */\n    waitForTransition: true,\n\n    /**\n     * Throttle costly events at most once per every wait milliseconds.\n     *\n     * @type {Number}\n     */\n    throttle: 10,\n\n    /**\n     * Moving direction mode.\n     *\n     * Available inputs:\n     * - 'ltr' - left to right movement,\n     * - 'rtl' - right to left movement.\n     *\n     * @type {String}\n     */\n    direction: 'ltr',\n\n    /**\n     * The distance value of the next and previous viewports which\n     * have to peek in the current view. Accepts number and\n     * pixels as a string. Left and right peeking can be\n     * set up separately with a directions object.\n     *\n     * For example:\n     * `100` - Peek 100px on the both sides.\n     * { before: 100, after: 50 }` - Peek 100px on the left side and 50px on the right side.\n     *\n     * @type {Number|String|Object}\n     */\n    peek: 0,\n\n    /**\n     * Defines how many clones of current viewport will be generated.\n     *\n     * @type {Number}\n     */\n    cloningRatio: 1,\n\n    /**\n     * Collection of options applied at specified media breakpoints.\n     * For example: display two slides per view under 800px.\n     * `{\n     *   '800px': {\n     *     perView: 2\n     *   }\n     * }`\n     */\n    breakpoints: {},\n\n    /**\n     * Collection of internally used HTML classes.\n     *\n     * @todo Refactor `slider` and `carousel` properties to single `type: { slider: '', carousel: '' }` object\n     * @type {Object}\n     */\n    classes: {\n      swipeable: 'glide--swipeable',\n      dragging: 'glide--dragging',\n      direction: {\n        ltr: 'glide--ltr',\n        rtl: 'glide--rtl'\n      },\n      type: {\n        slider: 'glide--slider',\n        carousel: 'glide--carousel'\n      },\n      slide: {\n        clone: 'glide__slide--clone',\n        active: 'glide__slide--active'\n      },\n      arrow: {\n        disabled: 'glide__arrow--disabled'\n      },\n      nav: {\n        active: 'glide__bullet--active'\n      }\n    }\n  };\n\n  /**\n   * Outputs warning message to the bowser console.\n   *\n   * @param  {String} msg\n   * @return {Void}\n   */\n  function warn(msg) {\n    console.error(\"[Glide warn]: \".concat(msg));\n  }\n\n  /**\n   * Converts value entered as number\n   * or string to integer value.\n   *\n   * @param {String} value\n   * @returns {Number}\n   */\n  function toInt(value) {\n    return parseInt(value);\n  }\n  /**\n   * Converts value entered as number\n   * or string to flat value.\n   *\n   * @param {String} value\n   * @returns {Number}\n   */\n\n  function toFloat(value) {\n    return parseFloat(value);\n  }\n  /**\n   * Indicates whether the specified value is a string.\n   *\n   * @param  {*}   value\n   * @return {Boolean}\n   */\n\n  function isString(value) {\n    return typeof value === 'string';\n  }\n  /**\n   * Indicates whether the specified value is an object.\n   *\n   * @param  {*} value\n   * @return {Boolean}\n   *\n   * @see https://github.com/jashkenas/underscore\n   */\n\n  function isObject(value) {\n    var type = _typeof(value);\n\n    return type === 'function' || type === 'object' && !!value; // eslint-disable-line no-mixed-operators\n  }\n  /**\n   * Indicates whether the specified value is a function.\n   *\n   * @param  {*} value\n   * @return {Boolean}\n   */\n\n  function isFunction(value) {\n    return typeof value === 'function';\n  }\n  /**\n   * Indicates whether the specified value is undefined.\n   *\n   * @param  {*} value\n   * @return {Boolean}\n   */\n\n  function isUndefined(value) {\n    return typeof value === 'undefined';\n  }\n  /**\n   * Indicates whether the specified value is an array.\n   *\n   * @param  {*} value\n   * @return {Boolean}\n   */\n\n  function isArray(value) {\n    return value.constructor === Array;\n  }\n\n  /**\n   * Creates and initializes specified collection of extensions.\n   * Each extension receives access to instance of glide and rest of components.\n   *\n   * @param {Object} glide\n   * @param {Object} extensions\n   *\n   * @returns {Object}\n   */\n\n  function mount(glide, extensions, events) {\n    var components = {};\n\n    for (var name in extensions) {\n      if (isFunction(extensions[name])) {\n        components[name] = extensions[name](glide, components, events);\n      } else {\n        warn('Extension must be a function');\n      }\n    }\n\n    for (var _name in components) {\n      if (isFunction(components[_name].mount)) {\n        components[_name].mount();\n      }\n    }\n\n    return components;\n  }\n\n  /**\n   * Defines getter and setter property on the specified object.\n   *\n   * @param  {Object} obj         Object where property has to be defined.\n   * @param  {String} prop        Name of the defined property.\n   * @param  {Object} definition  Get and set definitions for the property.\n   * @return {Void}\n   */\n  function define(obj, prop, definition) {\n    Object.defineProperty(obj, prop, definition);\n  }\n  /**\n   * Sorts aphabetically object keys.\n   *\n   * @param  {Object} obj\n   * @return {Object}\n   */\n\n  function sortKeys(obj) {\n    return Object.keys(obj).sort().reduce(function (r, k) {\n      r[k] = obj[k];\n      return r[k], r;\n    }, {});\n  }\n  /**\n   * Merges passed settings object with default options.\n   *\n   * @param  {Object} defaults\n   * @param  {Object} settings\n   * @return {Object}\n   */\n\n  function mergeOptions(defaults, settings) {\n    var options = Object.assign({}, defaults, settings); // `Object.assign` do not deeply merge objects, so we\n    // have to do it manually for every nested object\n    // in options. Although it does not look smart,\n    // it's smaller and faster than some fancy\n    // merging deep-merge algorithm script.\n\n    if (settings.hasOwnProperty('classes')) {\n      options.classes = Object.assign({}, defaults.classes, settings.classes);\n      var properties = ['direction', 'type', 'slide', 'arrow', 'nav'];\n      properties.forEach(function (property) {\n        if (settings.classes.hasOwnProperty(property)) {\n          options.classes[property] = _objectSpread2(_objectSpread2({}, defaults.classes[property]), settings.classes[property]);\n        }\n      });\n    }\n\n    if (settings.hasOwnProperty('breakpoints')) {\n      options.breakpoints = Object.assign({}, defaults.breakpoints, settings.breakpoints);\n    }\n\n    return options;\n  }\n\n  var EventsBus = /*#__PURE__*/function () {\n    /**\n     * Construct a EventBus instance.\n     *\n     * @param {Object} events\n     */\n    function EventsBus() {\n      var events = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      _classCallCheck(this, EventsBus);\n\n      this.events = events;\n      this.hop = events.hasOwnProperty;\n    }\n    /**\n     * Adds listener to the specifed event.\n     *\n     * @param {String|Array} event\n     * @param {Function} handler\n     */\n\n\n    _createClass(EventsBus, [{\n      key: \"on\",\n      value: function on(event, handler) {\n        if (isArray(event)) {\n          for (var i = 0; i < event.length; i++) {\n            this.on(event[i], handler);\n          }\n\n          return;\n        } // Create the event's object if not yet created\n\n\n        if (!this.hop.call(this.events, event)) {\n          this.events[event] = [];\n        } // Add the handler to queue\n\n\n        var index = this.events[event].push(handler) - 1; // Provide handle back for removal of event\n\n        return {\n          remove: function remove() {\n            delete this.events[event][index];\n          }\n        };\n      }\n      /**\n       * Runs registered handlers for specified event.\n       *\n       * @param {String|Array} event\n       * @param {Object=} context\n       */\n\n    }, {\n      key: \"emit\",\n      value: function emit(event, context) {\n        if (isArray(event)) {\n          for (var i = 0; i < event.length; i++) {\n            this.emit(event[i], context);\n          }\n\n          return;\n        } // If the event doesn't exist, or there's no handlers in queue, just leave\n\n\n        if (!this.hop.call(this.events, event)) {\n          return;\n        } // Cycle through events queue, fire!\n\n\n        this.events[event].forEach(function (item) {\n          item(context || {});\n        });\n      }\n    }]);\n\n    return EventsBus;\n  }();\n\n  var Glide$1 = /*#__PURE__*/function () {\n    /**\r\n     * Construct glide.\r\n     *\r\n     * @param  {String} selector\r\n     * @param  {Object} options\r\n     */\n    function Glide(selector) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      _classCallCheck(this, Glide);\n\n      this._c = {};\n      this._t = [];\n      this._e = new EventsBus();\n      this.disabled = false;\n      this.selector = selector;\n      this.settings = mergeOptions(defaults, options);\n      this.index = this.settings.startAt;\n    }\n    /**\r\n     * Initializes glide.\r\n     *\r\n     * @param {Object} extensions Collection of extensions to initialize.\r\n     * @return {Glide}\r\n     */\n\n\n    _createClass(Glide, [{\n      key: \"mount\",\n      value: function mount$1() {\n        var extensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n        this._e.emit('mount.before');\n\n        if (isObject(extensions)) {\n          this._c = mount(this, extensions, this._e);\n        } else {\n          warn('You need to provide a object on `mount()`');\n        }\n\n        this._e.emit('mount.after');\n\n        return this;\n      }\n      /**\r\n       * Collects an instance `translate` transformers.\r\n       *\r\n       * @param  {Array} transformers Collection of transformers.\r\n       * @return {Void}\r\n       */\n\n    }, {\n      key: \"mutate\",\n      value: function mutate() {\n        var transformers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n        if (isArray(transformers)) {\n          this._t = transformers;\n        } else {\n          warn('You need to provide a array on `mutate()`');\n        }\n\n        return this;\n      }\n      /**\r\n       * Updates glide with specified settings.\r\n       *\r\n       * @param {Object} settings\r\n       * @return {Glide}\r\n       */\n\n    }, {\n      key: \"update\",\n      value: function update() {\n        var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        this.settings = mergeOptions(this.settings, settings);\n\n        if (settings.hasOwnProperty('startAt')) {\n          this.index = settings.startAt;\n        }\n\n        this._e.emit('update');\n\n        return this;\n      }\n      /**\r\n       * Change slide with specified pattern. A pattern must be in the special format:\r\n       * `>` - Move one forward\r\n       * `<` - Move one backward\r\n       * `={i}` - Go to {i} zero-based slide (eq. '=1', will go to second slide)\r\n       * `>>` - Rewinds to end (last slide)\r\n       * `<<` - Rewinds to start (first slide)\r\n       * `|>` - Move one viewport forward\r\n       * `|<` - Move one viewport backward\r\n       *\r\n       * @param {String} pattern\r\n       * @return {Glide}\r\n       */\n\n    }, {\n      key: \"go\",\n      value: function go(pattern) {\n        this._c.Run.make(pattern);\n\n        return this;\n      }\n      /**\r\n       * Move track by specified distance.\r\n       *\r\n       * @param {String} distance\r\n       * @return {Glide}\r\n       */\n\n    }, {\n      key: \"move\",\n      value: function move(distance) {\n        this._c.Transition.disable();\n\n        this._c.Move.make(distance);\n\n        return this;\n      }\n      /**\r\n       * Destroy instance and revert all changes done by this._c.\r\n       *\r\n       * @return {Glide}\r\n       */\n\n    }, {\n      key: \"destroy\",\n      value: function destroy() {\n        this._e.emit('destroy');\n\n        return this;\n      }\n      /**\r\n       * Start instance autoplaying.\r\n       *\r\n       * @param {Boolean|Number} interval Run autoplaying with passed interval regardless of `autoplay` settings\r\n       * @return {Glide}\r\n       */\n\n    }, {\n      key: \"play\",\n      value: function play() {\n        var interval = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n        if (interval) {\n          this.settings.autoplay = interval;\n        }\n\n        this._e.emit('play');\n\n        return this;\n      }\n      /**\r\n       * Stop instance autoplaying.\r\n       *\r\n       * @return {Glide}\r\n       */\n\n    }, {\n      key: \"pause\",\n      value: function pause() {\n        this._e.emit('pause');\n\n        return this;\n      }\n      /**\r\n       * Sets glide into a idle status.\r\n       *\r\n       * @return {Glide}\r\n       */\n\n    }, {\n      key: \"disable\",\n      value: function disable() {\n        this.disabled = true;\n        return this;\n      }\n      /**\r\n       * Sets glide into a active status.\r\n       *\r\n       * @return {Glide}\r\n       */\n\n    }, {\n      key: \"enable\",\n      value: function enable() {\n        this.disabled = false;\n        return this;\n      }\n      /**\r\n       * Adds cuutom event listener with handler.\r\n       *\r\n       * @param  {String|Array} event\r\n       * @param  {Function} handler\r\n       * @return {Glide}\r\n       */\n\n    }, {\n      key: \"on\",\n      value: function on(event, handler) {\n        this._e.on(event, handler);\n\n        return this;\n      }\n      /**\r\n       * Checks if glide is a precised type.\r\n       *\r\n       * @param  {String} name\r\n       * @return {Boolean}\r\n       */\n\n    }, {\n      key: \"isType\",\n      value: function isType(name) {\n        return this.settings.type === name;\n      }\n      /**\r\n       * Gets value of the core options.\r\n       *\r\n       * @return {Object}\r\n       */\n\n    }, {\n      key: \"settings\",\n      get: function get() {\n        return this._o;\n      }\n      /**\r\n       * Sets value of the core options.\r\n       *\r\n       * @param  {Object} o\r\n       * @return {Void}\r\n       */\n      ,\n      set: function set(o) {\n        if (isObject(o)) {\n          this._o = o;\n        } else {\n          warn('Options must be an `object` instance.');\n        }\n      }\n      /**\r\n       * Gets current index of the slider.\r\n       *\r\n       * @return {Object}\r\n       */\n\n    }, {\n      key: \"index\",\n      get: function get() {\n        return this._i;\n      }\n      /**\r\n       * Sets current index a slider.\r\n       *\r\n       * @return {Object}\r\n       */\n      ,\n      set: function set(i) {\n        this._i = toInt(i);\n      }\n      /**\r\n       * Gets type name of the slider.\r\n       *\r\n       * @return {String}\r\n       */\n\n    }, {\n      key: \"type\",\n      get: function get() {\n        return this.settings.type;\n      }\n      /**\r\n       * Gets value of the idle status.\r\n       *\r\n       * @return {Boolean}\r\n       */\n\n    }, {\n      key: \"disabled\",\n      get: function get() {\n        return this._d;\n      }\n      /**\r\n       * Sets value of the idle status.\r\n       *\r\n       * @return {Boolean}\r\n       */\n      ,\n      set: function set(status) {\n        this._d = !!status;\n      }\n    }]);\n\n    return Glide;\n  }();\n\n  function Run (Glide, Components, Events) {\n    var Run = {\n      /**\n       * Initializes autorunning of the glide.\n       *\n       * @return {Void}\n       */\n      mount: function mount() {\n        this._o = false;\n      },\n\n      /**\n       * Makes glides running based on the passed moving schema.\n       *\n       * @param {String} move\n       */\n      make: function make(move) {\n        var _this = this;\n\n        if (!Glide.disabled) {\n          !Glide.settings.waitForTransition || Glide.disable();\n          this.move = move;\n          Events.emit('run.before', this.move);\n          this.calculate();\n          Events.emit('run', this.move);\n          Components.Transition.after(function () {\n            if (_this.isStart()) {\n              Events.emit('run.start', _this.move);\n            }\n\n            if (_this.isEnd()) {\n              Events.emit('run.end', _this.move);\n            }\n\n            if (_this.isOffset()) {\n              _this._o = false;\n              Events.emit('run.offset', _this.move);\n            }\n\n            Events.emit('run.after', _this.move);\n            Glide.enable();\n          });\n        }\n      },\n\n      /**\n       * Calculates current index based on defined move.\n       *\n       * @return {Number|Undefined}\n       */\n      calculate: function calculate() {\n        var move = this.move,\n            length = this.length;\n        var steps = move.steps,\n            direction = move.direction; // By default assume that size of view is equal to one slide\n\n        var viewSize = 1; // While direction is `=` we want jump to\n        // a specified index described in steps.\n\n        if (direction === '=') {\n          // Check if bound is true, \n          // as we want to avoid whitespaces.\n          if (Glide.settings.bound && toInt(steps) > length) {\n            Glide.index = length;\n            return;\n          }\n\n          Glide.index = steps;\n          return;\n        } // When pattern is equal to `>>` we want\n        // fast forward to the last slide.\n\n\n        if (direction === '>' && steps === '>') {\n          Glide.index = length;\n          return;\n        } // When pattern is equal to `<<` we want\n        // fast forward to the first slide.\n\n\n        if (direction === '<' && steps === '<') {\n          Glide.index = 0;\n          return;\n        } // pagination movement\n\n\n        if (direction === '|') {\n          viewSize = Glide.settings.perView || 1;\n        } // we are moving forward\n\n\n        if (direction === '>' || direction === '|' && steps === '>') {\n          var index = calculateForwardIndex(viewSize);\n\n          if (index > length) {\n            this._o = true;\n          }\n\n          Glide.index = normalizeForwardIndex(index, viewSize);\n          return;\n        } // we are moving backward\n\n\n        if (direction === '<' || direction === '|' && steps === '<') {\n          var _index = calculateBackwardIndex(viewSize);\n\n          if (_index < 0) {\n            this._o = true;\n          }\n\n          Glide.index = normalizeBackwardIndex(_index, viewSize);\n          return;\n        }\n\n        warn(\"Invalid direction pattern [\".concat(direction).concat(steps, \"] has been used\"));\n      },\n\n      /**\n       * Checks if we are on the first slide.\n       *\n       * @return {Boolean}\n       */\n      isStart: function isStart() {\n        return Glide.index <= 0;\n      },\n\n      /**\n       * Checks if we are on the last slide.\n       *\n       * @return {Boolean}\n       */\n      isEnd: function isEnd() {\n        return Glide.index >= this.length;\n      },\n\n      /**\n       * Checks if we are making a offset run.\n       *\n       * @param {String} direction\n       * @return {Boolean}\n       */\n      isOffset: function isOffset() {\n        var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;\n\n        if (!direction) {\n          return this._o;\n        }\n\n        if (!this._o) {\n          return false;\n        } // did we view to the right?\n\n\n        if (direction === '|>') {\n          return this.move.direction === '|' && this.move.steps === '>';\n        } // did we view to the left?\n\n\n        if (direction === '|<') {\n          return this.move.direction === '|' && this.move.steps === '<';\n        }\n\n        return this.move.direction === direction;\n      },\n\n      /**\n       * Checks if bound mode is active\n       *\n       * @return {Boolean}\n       */\n      isBound: function isBound() {\n        return Glide.isType('slider') && Glide.settings.focusAt !== 'center' && Glide.settings.bound;\n      }\n    };\n    /**\n     * Returns index value to move forward/to the right\n     *\n     * @param viewSize\n     * @returns {Number}\n     */\n\n    function calculateForwardIndex(viewSize) {\n      var index = Glide.index;\n\n      if (Glide.isType('carousel')) {\n        return index + viewSize;\n      }\n\n      return index + (viewSize - index % viewSize);\n    }\n    /**\n     * Normalizes the given forward index based on glide settings, preventing it to exceed certain boundaries\n     *\n     * @param index\n     * @param length\n     * @param viewSize\n     * @returns {Number}\n     */\n\n\n    function normalizeForwardIndex(index, viewSize) {\n      var length = Run.length;\n\n      if (index <= length) {\n        return index;\n      }\n\n      if (Glide.isType('carousel')) {\n        return index - (length + 1);\n      }\n\n      if (Glide.settings.rewind) {\n        // bound does funny things with the length, therefor we have to be certain\n        // that we are on the last possible index value given by bound\n        if (Run.isBound() && !Run.isEnd()) {\n          return length;\n        }\n\n        return 0;\n      }\n\n      if (Run.isBound()) {\n        return length;\n      }\n\n      return Math.floor(length / viewSize) * viewSize;\n    }\n    /**\n     * Calculates index value to move backward/to the left\n     *\n     * @param viewSize\n     * @returns {Number}\n     */\n\n\n    function calculateBackwardIndex(viewSize) {\n      var index = Glide.index;\n\n      if (Glide.isType('carousel')) {\n        return index - viewSize;\n      } // ensure our back navigation results in the same index as a forward navigation\n      // to experience a homogeneous paging\n\n\n      var view = Math.ceil(index / viewSize);\n      return (view - 1) * viewSize;\n    }\n    /**\n     * Normalizes the given backward index based on glide settings, preventing it to exceed certain boundaries\n     *\n     * @param index\n     * @param length\n     * @param viewSize\n     * @returns {*}\n     */\n\n\n    function normalizeBackwardIndex(index, viewSize) {\n      var length = Run.length;\n\n      if (index >= 0) {\n        return index;\n      }\n\n      if (Glide.isType('carousel')) {\n        return index + (length + 1);\n      }\n\n      if (Glide.settings.rewind) {\n        // bound does funny things with the length, therefor we have to be certain\n        // that we are on first possible index value before we to rewind to the length given by bound\n        if (Run.isBound() && Run.isStart()) {\n          return length;\n        }\n\n        return Math.floor(length / viewSize) * viewSize;\n      }\n\n      return 0;\n    }\n\n    define(Run, 'move', {\n      /**\n       * Gets value of the move schema.\n       *\n       * @returns {Object}\n       */\n      get: function get() {\n        return this._m;\n      },\n\n      /**\n       * Sets value of the move schema.\n       *\n       * @returns {Object}\n       */\n      set: function set(value) {\n        var step = value.substr(1);\n        this._m = {\n          direction: value.substr(0, 1),\n          steps: step ? toInt(step) ? toInt(step) : step : 0\n        };\n      }\n    });\n    define(Run, 'length', {\n      /**\n       * Gets value of the running distance based\n       * on zero-indexing number of slides.\n       *\n       * @return {Number}\n       */\n      get: function get() {\n        var settings = Glide.settings;\n        var length = Components.Html.slides.length; // If the `bound` option is active, a maximum running distance should be\n        // reduced by `perView` and `focusAt` settings. Running distance\n        // should end before creating an empty space after instance.\n\n        if (this.isBound()) {\n          return length - 1 - (toInt(settings.perView) - 1) + toInt(settings.focusAt);\n        }\n\n        return length - 1;\n      }\n    });\n    define(Run, 'offset', {\n      /**\n       * Gets status of the offsetting flag.\n       *\n       * @return {Boolean}\n       */\n      get: function get() {\n        return this._o;\n      }\n    });\n    return Run;\n  }\n\n  /**\n   * Returns a current time.\n   *\n   * @return {Number}\n   */\n  function now() {\n    return new Date().getTime();\n  }\n\n  /**\n   * Returns a function, that, when invoked, will only be triggered\n   * at most once during a given window of time.\n   *\n   * @param {Function} func\n   * @param {Number} wait\n   * @param {Object=} options\n   * @return {Function}\n   *\n   * @see https://github.com/jashkenas/underscore\n   */\n\n  function throttle(func, wait) {\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    var timeout, context, args, result;\n    var previous = 0;\n\n    var later = function later() {\n      previous = options.leading === false ? 0 : now();\n      timeout = null;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    };\n\n    var throttled = function throttled() {\n      var at = now();\n      if (!previous && options.leading === false) previous = at;\n      var remaining = wait - (at - previous);\n      context = this;\n      args = arguments;\n\n      if (remaining <= 0 || remaining > wait) {\n        if (timeout) {\n          clearTimeout(timeout);\n          timeout = null;\n        }\n\n        previous = at;\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      } else if (!timeout && options.trailing !== false) {\n        timeout = setTimeout(later, remaining);\n      }\n\n      return result;\n    };\n\n    throttled.cancel = function () {\n      clearTimeout(timeout);\n      previous = 0;\n      timeout = context = args = null;\n    };\n\n    return throttled;\n  }\n\n  var MARGIN_TYPE = {\n    ltr: ['marginLeft', 'marginRight'],\n    rtl: ['marginRight', 'marginLeft']\n  };\n  function Gaps (Glide, Components, Events) {\n    var Gaps = {\n      /**\n       * Applies gaps between slides. First and last\n       * slides do not receive it's edge margins.\n       *\n       * @param {HTMLCollection} slides\n       * @return {Void}\n       */\n      apply: function apply(slides) {\n        for (var i = 0, len = slides.length; i < len; i++) {\n          var style = slides[i].style;\n          var direction = Components.Direction.value;\n\n          if (i !== 0) {\n            style[MARGIN_TYPE[direction][0]] = \"\".concat(this.value / 2, \"px\");\n          } else {\n            style[MARGIN_TYPE[direction][0]] = '';\n          }\n\n          if (i !== slides.length - 1) {\n            style[MARGIN_TYPE[direction][1]] = \"\".concat(this.value / 2, \"px\");\n          } else {\n            style[MARGIN_TYPE[direction][1]] = '';\n          }\n        }\n      },\n\n      /**\n       * Removes gaps from the slides.\n       *\n       * @param {HTMLCollection} slides\n       * @returns {Void}\n      */\n      remove: function remove(slides) {\n        for (var i = 0, len = slides.length; i < len; i++) {\n          var style = slides[i].style;\n          style.marginLeft = '';\n          style.marginRight = '';\n        }\n      }\n    };\n    define(Gaps, 'value', {\n      /**\n       * Gets value of the gap.\n       *\n       * @returns {Number}\n       */\n      get: function get() {\n        return toInt(Glide.settings.gap);\n      }\n    });\n    define(Gaps, 'grow', {\n      /**\n       * Gets additional dimensions value caused by gaps.\n       * Used to increase width of the slides wrapper.\n       *\n       * @returns {Number}\n       */\n      get: function get() {\n        return Gaps.value * Components.Sizes.length;\n      }\n    });\n    define(Gaps, 'reductor', {\n      /**\n       * Gets reduction value caused by gaps.\n       * Used to subtract width of the slides.\n       *\n       * @returns {Number}\n       */\n      get: function get() {\n        var perView = Glide.settings.perView;\n        return Gaps.value * (perView - 1) / perView;\n      }\n    });\n    /**\n     * Apply calculated gaps:\n     * - after building, so slides (including clones) will receive proper margins\n     * - on updating via API, to recalculate gaps with new options\n     */\n\n    Events.on(['build.after', 'update'], throttle(function () {\n      Gaps.apply(Components.Html.wrapper.children);\n    }, 30));\n    /**\n     * Remove gaps:\n     * - on destroying to bring markup to its inital state\n     */\n\n    Events.on('destroy', function () {\n      Gaps.remove(Components.Html.wrapper.children);\n    });\n    return Gaps;\n  }\n\n  /**\n   * Finds siblings nodes of the passed node.\n   *\n   * @param  {Element} node\n   * @return {Array}\n   */\n  function siblings(node) {\n    if (node && node.parentNode) {\n      var n = node.parentNode.firstChild;\n      var matched = [];\n\n      for (; n; n = n.nextSibling) {\n        if (n.nodeType === 1 && n !== node) {\n          matched.push(n);\n        }\n      }\n\n      return matched;\n    }\n\n    return [];\n  }\n  /**\n   * Checks if passed node exist and is a valid element.\n   *\n   * @param  {Element} node\n   * @return {Boolean}\n   */\n\n  function exist(node) {\n    if (node && node instanceof window.HTMLElement) {\n      return true;\n    }\n\n    return false;\n  }\n  /**\n   * Coerces a NodeList to an Array.\n   *\n   * @param  {NodeList} nodeList\n   * @return {Array}\n   */\n\n  function toArray(nodeList) {\n    return Array.prototype.slice.call(nodeList);\n  }\n\n  var TRACK_SELECTOR = '[data-glide-el=\"track\"]';\n  function Html (Glide, Components, Events) {\n    var Html = {\n      /**\n       * Setup slider HTML nodes.\n       *\n       * @param {Glide} glide\n       */\n      mount: function mount() {\n        this.root = Glide.selector;\n        this.track = this.root.querySelector(TRACK_SELECTOR);\n        this.collectSlides();\n      },\n\n      /**\n       * Collect slides\n       */\n      collectSlides: function collectSlides() {\n        this.slides = toArray(this.wrapper.children).filter(function (slide) {\n          return !slide.classList.contains(Glide.settings.classes.slide.clone);\n        });\n      }\n    };\n    define(Html, 'root', {\n      /**\n       * Gets node of the glide main element.\n       *\n       * @return {Object}\n       */\n      get: function get() {\n        return Html._r;\n      },\n\n      /**\n       * Sets node of the glide main element.\n       *\n       * @return {Object}\n       */\n      set: function set(r) {\n        if (isString(r)) {\n          r = document.querySelector(r);\n        }\n\n        if (r !== null) {\n          Html._r = r;\n        } else {\n          warn('Root element must be a existing Html node');\n        }\n      }\n    });\n    define(Html, 'track', {\n      /**\n       * Gets node of the glide track with slides.\n       *\n       * @return {Object}\n       */\n      get: function get() {\n        return Html._t;\n      },\n\n      /**\n       * Sets node of the glide track with slides.\n       *\n       * @return {Object}\n       */\n      set: function set(t) {\n        if (exist(t)) {\n          Html._t = t;\n        } else {\n          warn(\"Could not find track element. Please use \".concat(TRACK_SELECTOR, \" attribute.\"));\n        }\n      }\n    });\n    define(Html, 'wrapper', {\n      /**\n       * Gets node of the slides wrapper.\n       *\n       * @return {Object}\n       */\n      get: function get() {\n        return Html.track.children[0];\n      }\n    });\n    /**\n     * Add/remove/reorder dynamic slides\n     */\n\n    Events.on('update', function () {\n      Html.collectSlides();\n    });\n    return Html;\n  }\n\n  function Peek (Glide, Components, Events) {\n    var Peek = {\n      /**\n       * Setups how much to peek based on settings.\n       *\n       * @return {Void}\n       */\n      mount: function mount() {\n        this.value = Glide.settings.peek;\n      }\n    };\n    define(Peek, 'value', {\n      /**\n       * Gets value of the peek.\n       *\n       * @returns {Number|Object}\n       */\n      get: function get() {\n        return Peek._v;\n      },\n\n      /**\n       * Sets value of the peek.\n       *\n       * @param {Number|Object} value\n       * @return {Void}\n       */\n      set: function set(value) {\n        if (isObject(value)) {\n          value.before = toInt(value.before);\n          value.after = toInt(value.after);\n        } else {\n          value = toInt(value);\n        }\n\n        Peek._v = value;\n      }\n    });\n    define(Peek, 'reductor', {\n      /**\n       * Gets reduction value caused by peek.\n       *\n       * @returns {Number}\n       */\n      get: function get() {\n        var value = Peek.value;\n        var perView = Glide.settings.perView;\n\n        if (isObject(value)) {\n          return value.before / perView + value.after / perView;\n        }\n\n        return value * 2 / perView;\n      }\n    });\n    /**\n     * Recalculate peeking sizes on:\n     * - when resizing window to update to proper percents\n     */\n\n    Events.on(['resize', 'update'], function () {\n      Peek.mount();\n    });\n    return Peek;\n  }\n\n  function Move (Glide, Components, Events) {\n    var Move = {\n      /**\n       * Constructs move component.\n       *\n       * @returns {Void}\n       */\n      mount: function mount() {\n        this._o = 0;\n      },\n\n      /**\n       * Calculates a movement value based on passed offset and currently active index.\n       *\n       * @param  {Number} offset\n       * @return {Void}\n       */\n      make: function make() {\n        var _this = this;\n\n        var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n        this.offset = offset;\n        Events.emit('move', {\n          movement: this.value\n        });\n        Components.Transition.after(function () {\n          Events.emit('move.after', {\n            movement: _this.value\n          });\n        });\n      }\n    };\n    define(Move, 'offset', {\n      /**\n       * Gets an offset value used to modify current translate.\n       *\n       * @return {Object}\n       */\n      get: function get() {\n        return Move._o;\n      },\n\n      /**\n       * Sets an offset value used to modify current translate.\n       *\n       * @return {Object}\n       */\n      set: function set(value) {\n        Move._o = !isUndefined(value) ? toInt(value) : 0;\n      }\n    });\n    define(Move, 'translate', {\n      /**\n       * Gets a raw movement value.\n       *\n       * @return {Number}\n       */\n      get: function get() {\n        return Components.Sizes.slideWidth * Glide.index;\n      }\n    });\n    define(Move, 'value', {\n      /**\n       * Gets an actual movement value corrected by offset.\n       *\n       * @return {Number}\n       */\n      get: function get() {\n        var offset = this.offset;\n        var translate = this.translate;\n\n        if (Components.Direction.is('rtl')) {\n          return translate + offset;\n        }\n\n        return translate - offset;\n      }\n    });\n    /**\n     * Make movement to proper slide on:\n     * - before build, so glide will start at `startAt` index\n     * - on each standard run to move to newly calculated index\n     */\n\n    Events.on(['build.before', 'run'], function () {\n      Move.make();\n    });\n    return Move;\n  }\n\n  function Sizes (Glide, Components, Events) {\n    var Sizes = {\n      /**\n       * Setups dimensions of slides.\n       *\n       * @return {Void}\n       */\n      setupSlides: function setupSlides() {\n        var width = \"\".concat(this.slideWidth, \"px\");\n        var slides = Components.Html.slides;\n\n        for (var i = 0; i < slides.length; i++) {\n          slides[i].style.width = width;\n        }\n      },\n\n      /**\n       * Setups dimensions of slides wrapper.\n       *\n       * @return {Void}\n       */\n      setupWrapper: function setupWrapper() {\n        Components.Html.wrapper.style.width = \"\".concat(this.wrapperSize, \"px\");\n      },\n\n      /**\n       * Removes applied styles from HTML elements.\n       *\n       * @returns {Void}\n       */\n      remove: function remove() {\n        var slides = Components.Html.slides;\n\n        for (var i = 0; i < slides.length; i++) {\n          slides[i].style.width = '';\n        }\n\n        Components.Html.wrapper.style.width = '';\n      }\n    };\n    define(Sizes, 'length', {\n      /**\n       * Gets count number of the slides.\n       *\n       * @return {Number}\n       */\n      get: function get() {\n        return Components.Html.slides.length;\n      }\n    });\n    define(Sizes, 'width', {\n      /**\n       * Gets width value of the slider (visible area).\n       *\n       * @return {Number}\n       */\n      get: function get() {\n        return Components.Html.track.offsetWidth;\n      }\n    });\n    define(Sizes, 'wrapperSize', {\n      /**\n       * Gets size of the slides wrapper.\n       *\n       * @return {Number}\n       */\n      get: function get() {\n        return Sizes.slideWidth * Sizes.length + Components.Gaps.grow + Components.Clones.grow;\n      }\n    });\n    define(Sizes, 'slideWidth', {\n      /**\n       * Gets width value of a single slide.\n       *\n       * @return {Number}\n       */\n      get: function get() {\n        return Sizes.width / Glide.settings.perView - Components.Peek.reductor - Components.Gaps.reductor;\n      }\n    });\n    /**\n     * Apply calculated glide's dimensions:\n     * - before building, so other dimensions (e.g. translate) will be calculated propertly\n     * - when resizing window to recalculate sildes dimensions\n     * - on updating via API, to calculate dimensions based on new options\n     */\n\n    Events.on(['build.before', 'resize', 'update'], function () {\n      Sizes.setupSlides();\n      Sizes.setupWrapper();\n    });\n    /**\n     * Remove calculated glide's dimensions:\n     * - on destoting to bring markup to its inital state\n     */\n\n    Events.on('destroy', function () {\n      Sizes.remove();\n    });\n    return Sizes;\n  }\n\n  function Build (Glide, Components, Events) {\n    var Build = {\n      /**\n       * Init glide building. Adds classes, sets\n       * dimensions and setups initial state.\n       *\n       * @return {Void}\n       */\n      mount: function mount() {\n        Events.emit('build.before');\n        this.typeClass();\n        this.activeClass();\n        Events.emit('build.after');\n      },\n\n      /**\n       * Adds `type` class to the glide element.\n       *\n       * @return {Void}\n       */\n      typeClass: function typeClass() {\n        Components.Html.root.classList.add(Glide.settings.classes.type[Glide.settings.type]);\n      },\n\n      /**\n       * Sets active class to current slide.\n       *\n       * @return {Void}\n       */\n      activeClass: function activeClass() {\n        var classes = Glide.settings.classes;\n        var slide = Components.Html.slides[Glide.index];\n\n        if (slide) {\n          slide.classList.add(classes.slide.active);\n          siblings(slide).forEach(function (sibling) {\n            sibling.classList.remove(classes.slide.active);\n          });\n        }\n      },\n\n      /**\n       * Removes HTML classes applied at building.\n       *\n       * @return {Void}\n       */\n      removeClasses: function removeClasses() {\n        var _Glide$settings$class = Glide.settings.classes,\n            type = _Glide$settings$class.type,\n            slide = _Glide$settings$class.slide;\n        Components.Html.root.classList.remove(type[Glide.settings.type]);\n        Components.Html.slides.forEach(function (sibling) {\n          sibling.classList.remove(slide.active);\n        });\n      }\n    };\n    /**\n     * Clear building classes:\n     * - on destroying to bring HTML to its initial state\n     * - on updating to remove classes before remounting component\n     */\n\n    Events.on(['destroy', 'update'], function () {\n      Build.removeClasses();\n    });\n    /**\n     * Remount component:\n     * - on resizing of the window to calculate new dimensions\n     * - on updating settings via API\n     */\n\n    Events.on(['resize', 'update'], function () {\n      Build.mount();\n    });\n    /**\n     * Swap active class of current slide:\n     * - after each move to the new index\n     */\n\n    Events.on('move.after', function () {\n      Build.activeClass();\n    });\n    return Build;\n  }\n\n  function Clones (Glide, Components, Events) {\n    var Clones = {\n      /**\n       * Create pattern map and collect slides to be cloned.\n       */\n      mount: function mount() {\n        this.items = [];\n\n        if (Glide.isType('carousel')) {\n          this.items = this.collect();\n        }\n      },\n\n      /**\n       * Collect clones with pattern.\n       *\n       * @return {[]}\n       */\n      collect: function collect() {\n        var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n        var slides = Components.Html.slides;\n        var _Glide$settings = Glide.settings,\n            perView = _Glide$settings.perView,\n            classes = _Glide$settings.classes,\n            cloningRatio = _Glide$settings.cloningRatio;\n\n        if (slides.length > 0) {\n          var peekIncrementer = +!!Glide.settings.peek;\n          var cloneCount = perView + peekIncrementer + Math.round(perView / 2);\n          var append = slides.slice(0, cloneCount).reverse();\n          var prepend = slides.slice(cloneCount * -1);\n\n          for (var r = 0; r < Math.max(cloningRatio, Math.floor(perView / slides.length)); r++) {\n            for (var i = 0; i < append.length; i++) {\n              var clone = append[i].cloneNode(true);\n              clone.classList.add(classes.slide.clone);\n              items.push(clone);\n            }\n\n            for (var _i = 0; _i < prepend.length; _i++) {\n              var _clone = prepend[_i].cloneNode(true);\n\n              _clone.classList.add(classes.slide.clone);\n\n              items.unshift(_clone);\n            }\n          }\n        }\n\n        return items;\n      },\n\n      /**\n       * Append cloned slides with generated pattern.\n       *\n       * @return {Void}\n       */\n      append: function append() {\n        var items = this.items;\n        var _Components$Html = Components.Html,\n            wrapper = _Components$Html.wrapper,\n            slides = _Components$Html.slides;\n        var half = Math.floor(items.length / 2);\n        var prepend = items.slice(0, half).reverse();\n        var append = items.slice(half * -1).reverse();\n        var width = \"\".concat(Components.Sizes.slideWidth, \"px\");\n\n        for (var i = 0; i < append.length; i++) {\n          wrapper.appendChild(append[i]);\n        }\n\n        for (var _i2 = 0; _i2 < prepend.length; _i2++) {\n          wrapper.insertBefore(prepend[_i2], slides[0]);\n        }\n\n        for (var _i3 = 0; _i3 < items.length; _i3++) {\n          items[_i3].style.width = width;\n        }\n      },\n\n      /**\n       * Remove all cloned slides.\n       *\n       * @return {Void}\n       */\n      remove: function remove() {\n        var items = this.items;\n\n        for (var i = 0; i < items.length; i++) {\n          Components.Html.wrapper.removeChild(items[i]);\n        }\n      }\n    };\n    define(Clones, 'grow', {\n      /**\n       * Gets additional dimensions value caused by clones.\n       *\n       * @return {Number}\n       */\n      get: function get() {\n        return (Components.Sizes.slideWidth + Components.Gaps.value) * Clones.items.length;\n      }\n    });\n    /**\n     * Append additional slide's clones:\n     * - while glide's type is `carousel`\n     */\n\n    Events.on('update', function () {\n      Clones.remove();\n      Clones.mount();\n      Clones.append();\n    });\n    /**\n     * Append additional slide's clones:\n     * - while glide's type is `carousel`\n     */\n\n    Events.on('build.before', function () {\n      if (Glide.isType('carousel')) {\n        Clones.append();\n      }\n    });\n    /**\n     * Remove clones HTMLElements:\n     * - on destroying, to bring HTML to its initial state\n     */\n\n    Events.on('destroy', function () {\n      Clones.remove();\n    });\n    return Clones;\n  }\n\n  var EventsBinder = /*#__PURE__*/function () {\n    /**\n     * Construct a EventsBinder instance.\n     */\n    function EventsBinder() {\n      var listeners = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      _classCallCheck(this, EventsBinder);\n\n      this.listeners = listeners;\n    }\n    /**\n     * Adds events listeners to arrows HTML elements.\n     *\n     * @param  {String|Array} events\n     * @param  {Element|Window|Document} el\n     * @param  {Function} closure\n     * @param  {Boolean|Object} capture\n     * @return {Void}\n     */\n\n\n    _createClass(EventsBinder, [{\n      key: \"on\",\n      value: function on(events, el, closure) {\n        var capture = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n        if (isString(events)) {\n          events = [events];\n        }\n\n        for (var i = 0; i < events.length; i++) {\n          this.listeners[events[i]] = closure;\n          el.addEventListener(events[i], this.listeners[events[i]], capture);\n        }\n      }\n      /**\n       * Removes event listeners from arrows HTML elements.\n       *\n       * @param  {String|Array} events\n       * @param  {Element|Window|Document} el\n       * @param  {Boolean|Object} capture\n       * @return {Void}\n       */\n\n    }, {\n      key: \"off\",\n      value: function off(events, el) {\n        var capture = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n        if (isString(events)) {\n          events = [events];\n        }\n\n        for (var i = 0; i < events.length; i++) {\n          el.removeEventListener(events[i], this.listeners[events[i]], capture);\n        }\n      }\n      /**\n       * Destroy collected listeners.\n       *\n       * @returns {Void}\n       */\n\n    }, {\n      key: \"destroy\",\n      value: function destroy() {\n        delete this.listeners;\n      }\n    }]);\n\n    return EventsBinder;\n  }();\n\n  function Resize (Glide, Components, Events) {\n    /**\n     * Instance of the binder for DOM Events.\n     *\n     * @type {EventsBinder}\n     */\n    var Binder = new EventsBinder();\n    var Resize = {\n      /**\n       * Initializes window bindings.\n       */\n      mount: function mount() {\n        this.bind();\n      },\n\n      /**\n       * Binds `rezsize` listener to the window.\n       * It's a costly event, so we are debouncing it.\n       *\n       * @return {Void}\n       */\n      bind: function bind() {\n        Binder.on('resize', window, throttle(function () {\n          Events.emit('resize');\n        }, Glide.settings.throttle));\n      },\n\n      /**\n       * Unbinds listeners from the window.\n       *\n       * @return {Void}\n       */\n      unbind: function unbind() {\n        Binder.off('resize', window);\n      }\n    };\n    /**\n     * Remove bindings from window:\n     * - on destroying, to remove added EventListener\n     */\n\n    Events.on('destroy', function () {\n      Resize.unbind();\n      Binder.destroy();\n    });\n    return Resize;\n  }\n\n  var VALID_DIRECTIONS = ['ltr', 'rtl'];\n  var FLIPED_MOVEMENTS = {\n    '>': '<',\n    '<': '>',\n    '=': '='\n  };\n  function Direction (Glide, Components, Events) {\n    var Direction = {\n      /**\n       * Setups gap value based on settings.\n       *\n       * @return {Void}\n       */\n      mount: function mount() {\n        this.value = Glide.settings.direction;\n      },\n\n      /**\n       * Resolves pattern based on direction value\n       *\n       * @param {String} pattern\n       * @returns {String}\n       */\n      resolve: function resolve(pattern) {\n        var token = pattern.slice(0, 1);\n\n        if (this.is('rtl')) {\n          return pattern.split(token).join(FLIPED_MOVEMENTS[token]);\n        }\n\n        return pattern;\n      },\n\n      /**\n       * Checks value of direction mode.\n       *\n       * @param {String} direction\n       * @returns {Boolean}\n       */\n      is: function is(direction) {\n        return this.value === direction;\n      },\n\n      /**\n       * Applies direction class to the root HTML element.\n       *\n       * @return {Void}\n       */\n      addClass: function addClass() {\n        Components.Html.root.classList.add(Glide.settings.classes.direction[this.value]);\n      },\n\n      /**\n       * Removes direction class from the root HTML element.\n       *\n       * @return {Void}\n       */\n      removeClass: function removeClass() {\n        Components.Html.root.classList.remove(Glide.settings.classes.direction[this.value]);\n      }\n    };\n    define(Direction, 'value', {\n      /**\n       * Gets value of the direction.\n       *\n       * @returns {Number}\n       */\n      get: function get() {\n        return Direction._v;\n      },\n\n      /**\n       * Sets value of the direction.\n       *\n       * @param {String} value\n       * @return {Void}\n       */\n      set: function set(value) {\n        if (VALID_DIRECTIONS.indexOf(value) > -1) {\n          Direction._v = value;\n        } else {\n          warn('Direction value must be `ltr` or `rtl`');\n        }\n      }\n    });\n    /**\n     * Clear direction class:\n     * - on destroy to bring HTML to its initial state\n     * - on update to remove class before reappling bellow\n     */\n\n    Events.on(['destroy', 'update'], function () {\n      Direction.removeClass();\n    });\n    /**\n     * Remount component:\n     * - on update to reflect changes in direction value\n     */\n\n    Events.on('update', function () {\n      Direction.mount();\n    });\n    /**\n     * Apply direction class:\n     * - before building to apply class for the first time\n     * - on updating to reapply direction class that may changed\n     */\n\n    Events.on(['build.before', 'update'], function () {\n      Direction.addClass();\n    });\n    return Direction;\n  }\n\n  /**\n   * Reflects value of glide movement.\n   *\n   * @param  {Object} Glide\n   * @param  {Object} Components\n   * @return {Object}\n   */\n  function Rtl (Glide, Components) {\n    return {\n      /**\n       * Negates the passed translate if glide is in RTL option.\n       *\n       * @param  {Number} translate\n       * @return {Number}\n       */\n      modify: function modify(translate) {\n        if (Components.Direction.is('rtl')) {\n          return -translate;\n        }\n\n        return translate;\n      }\n    };\n  }\n\n  /**\n   * Updates glide movement with a `gap` settings.\n   *\n   * @param  {Object} Glide\n   * @param  {Object} Components\n   * @return {Object}\n   */\n  function Gap (Glide, Components) {\n    return {\n      /**\n       * Modifies passed translate value with number in the `gap` settings.\n       *\n       * @param  {Number} translate\n       * @return {Number}\n       */\n      modify: function modify(translate) {\n        var multiplier = Math.floor(translate / Components.Sizes.slideWidth);\n        return translate + Components.Gaps.value * multiplier;\n      }\n    };\n  }\n\n  /**\n   * Updates glide movement with width of additional clones width.\n   *\n   * @param  {Object} Glide\n   * @param  {Object} Components\n   * @return {Object}\n   */\n  function Grow (Glide, Components) {\n    return {\n      /**\n       * Adds to the passed translate width of the half of clones.\n       *\n       * @param  {Number} translate\n       * @return {Number}\n       */\n      modify: function modify(translate) {\n        return translate + Components.Clones.grow / 2;\n      }\n    };\n  }\n\n  /**\n   * Updates glide movement with a `peek` settings.\n   *\n   * @param  {Object} Glide\n   * @param  {Object} Components\n   * @return {Object}\n   */\n\n  function Peeking (Glide, Components) {\n    return {\n      /**\n       * Modifies passed translate value with a `peek` setting.\n       *\n       * @param  {Number} translate\n       * @return {Number}\n       */\n      modify: function modify(translate) {\n        if (Glide.settings.focusAt >= 0) {\n          var peek = Components.Peek.value;\n\n          if (isObject(peek)) {\n            return translate - peek.before;\n          }\n\n          return translate - peek;\n        }\n\n        return translate;\n      }\n    };\n  }\n\n  /**\n   * Updates glide movement with a `focusAt` settings.\n   *\n   * @param  {Object} Glide\n   * @param  {Object} Components\n   * @return {Object}\n   */\n  function Focusing (Glide, Components) {\n    return {\n      /**\n       * Modifies passed translate value with index in the `focusAt` setting.\n       *\n       * @param  {Number} translate\n       * @return {Number}\n       */\n      modify: function modify(translate) {\n        var gap = Components.Gaps.value;\n        var width = Components.Sizes.width;\n        var focusAt = Glide.settings.focusAt;\n        var slideWidth = Components.Sizes.slideWidth;\n\n        if (focusAt === 'center') {\n          return translate - (width / 2 - slideWidth / 2);\n        }\n\n        return translate - slideWidth * focusAt - gap * focusAt;\n      }\n    };\n  }\n\n  /**\n   * Applies diffrent transformers on translate value.\n   *\n   * @param  {Object} Glide\n   * @param  {Object} Components\n   * @return {Object}\n   */\n\n  function mutator (Glide, Components, Events) {\n    /**\n     * Merge instance transformers with collection of default transformers.\n     * It's important that the Rtl component be last on the list,\n     * so it reflects all previous transformations.\n     *\n     * @type {Array}\n     */\n    var TRANSFORMERS = [Gap, Grow, Peeking, Focusing].concat(Glide._t, [Rtl]);\n    return {\n      /**\n       * Piplines translate value with registered transformers.\n       *\n       * @param  {Number} translate\n       * @return {Number}\n       */\n      mutate: function mutate(translate) {\n        for (var i = 0; i < TRANSFORMERS.length; i++) {\n          var transformer = TRANSFORMERS[i];\n\n          if (isFunction(transformer) && isFunction(transformer().modify)) {\n            translate = transformer(Glide, Components, Events).modify(translate);\n          } else {\n            warn('Transformer should be a function that returns an object with `modify()` method');\n          }\n        }\n\n        return translate;\n      }\n    };\n  }\n\n  function Translate (Glide, Components, Events) {\n    var Translate = {\n      /**\n       * Sets value of translate on HTML element.\n       *\n       * @param {Number} value\n       * @return {Void}\n       */\n      set: function set(value) {\n        var transform = mutator(Glide, Components).mutate(value);\n        var translate3d = \"translate3d(\".concat(-1 * transform, \"px, 0px, 0px)\");\n        Components.Html.wrapper.style.mozTransform = translate3d; // needed for supported Firefox 10-15\n\n        Components.Html.wrapper.style.webkitTransform = translate3d; // needed for supported Chrome 10-35, Safari 5.1-8, and Opera 15-22\n\n        Components.Html.wrapper.style.transform = translate3d;\n      },\n\n      /**\n       * Removes value of translate from HTML element.\n       *\n       * @return {Void}\n       */\n      remove: function remove() {\n        Components.Html.wrapper.style.transform = '';\n      },\n\n      /**\n       * @return {number}\n       */\n      getStartIndex: function getStartIndex() {\n        var length = Components.Sizes.length;\n        var index = Glide.index;\n        var perView = Glide.settings.perView;\n\n        if (Components.Run.isOffset('>') || Components.Run.isOffset('|>')) {\n          return length + (index - perView);\n        } // \"modulo length\" converts an index that equals length to zero\n\n\n        return (index + perView) % length;\n      },\n\n      /**\n       * @return {number}\n       */\n      getTravelDistance: function getTravelDistance() {\n        var travelDistance = Components.Sizes.slideWidth * Glide.settings.perView;\n\n        if (Components.Run.isOffset('>') || Components.Run.isOffset('|>')) {\n          // reverse travel distance so that we don't have to change subtract operations\n          return travelDistance * -1;\n        }\n\n        return travelDistance;\n      }\n    };\n    /**\n     * Set new translate value:\n     * - on move to reflect index change\n     * - on updating via API to reflect possible changes in options\n     */\n\n    Events.on('move', function (context) {\n      if (!Glide.isType('carousel') || !Components.Run.isOffset()) {\n        return Translate.set(context.movement);\n      }\n\n      Components.Transition.after(function () {\n        Events.emit('translate.jump');\n        Translate.set(Components.Sizes.slideWidth * Glide.index);\n      });\n      var startWidth = Components.Sizes.slideWidth * Components.Translate.getStartIndex();\n      return Translate.set(startWidth - Components.Translate.getTravelDistance());\n    });\n    /**\n     * Remove translate:\n     * - on destroying to bring markup to its inital state\n     */\n\n    Events.on('destroy', function () {\n      Translate.remove();\n    });\n    return Translate;\n  }\n\n  function Transition (Glide, Components, Events) {\n    /**\n     * Holds inactivity status of transition.\n     * When true transition is not applied.\n     *\n     * @type {Boolean}\n     */\n    var disabled = false;\n    var Transition = {\n      /**\n       * Composes string of the CSS transition.\n       *\n       * @param {String} property\n       * @return {String}\n       */\n      compose: function compose(property) {\n        var settings = Glide.settings;\n\n        if (disabled) {\n          return \"\".concat(property, \" 0ms \").concat(settings.animationTimingFunc);\n        }\n\n        return \"\".concat(property, \" \").concat(this.duration, \"ms \").concat(settings.animationTimingFunc);\n      },\n\n      /**\n       * Sets value of transition on HTML element.\n       *\n       * @param {String=} property\n       * @return {Void}\n       */\n      set: function set() {\n        var property = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'transform';\n        Components.Html.wrapper.style.transition = this.compose(property);\n      },\n\n      /**\n       * Removes value of transition from HTML element.\n       *\n       * @return {Void}\n       */\n      remove: function remove() {\n        Components.Html.wrapper.style.transition = '';\n      },\n\n      /**\n       * Runs callback after animation.\n       *\n       * @param  {Function} callback\n       * @return {Void}\n       */\n      after: function after(callback) {\n        setTimeout(function () {\n          callback();\n        }, this.duration);\n      },\n\n      /**\n       * Enable transition.\n       *\n       * @return {Void}\n       */\n      enable: function enable() {\n        disabled = false;\n        this.set();\n      },\n\n      /**\n       * Disable transition.\n       *\n       * @return {Void}\n       */\n      disable: function disable() {\n        disabled = true;\n        this.set();\n      }\n    };\n    define(Transition, 'duration', {\n      /**\n       * Gets duration of the transition based\n       * on currently running animation type.\n       *\n       * @return {Number}\n       */\n      get: function get() {\n        var settings = Glide.settings;\n\n        if (Glide.isType('slider') && Components.Run.offset) {\n          return settings.rewindDuration;\n        }\n\n        return settings.animationDuration;\n      }\n    });\n    /**\n     * Set transition `style` value:\n     * - on each moving, because it may be cleared by offset move\n     */\n\n    Events.on('move', function () {\n      Transition.set();\n    });\n    /**\n     * Disable transition:\n     * - before initial build to avoid transitioning from `0` to `startAt` index\n     * - while resizing window and recalculating dimensions\n     * - on jumping from offset transition at start and end edges in `carousel` type\n     */\n\n    Events.on(['build.before', 'resize', 'translate.jump'], function () {\n      Transition.disable();\n    });\n    /**\n     * Enable transition:\n     * - on each running, because it may be disabled by offset move\n     */\n\n    Events.on('run', function () {\n      Transition.enable();\n    });\n    /**\n     * Remove transition:\n     * - on destroying to bring markup to its inital state\n     */\n\n    Events.on('destroy', function () {\n      Transition.remove();\n    });\n    return Transition;\n  }\n\n  /**\n   * Test via a getter in the options object to see\n   * if the passive property is accessed.\n   *\n   * @see https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection\n   */\n  var supportsPassive = false;\n\n  try {\n    var opts = Object.defineProperty({}, 'passive', {\n      get: function get() {\n        supportsPassive = true;\n      }\n    });\n    window.addEventListener('testPassive', null, opts);\n    window.removeEventListener('testPassive', null, opts);\n  } catch (e) {}\n\n  var supportsPassive$1 = supportsPassive;\n\n  var START_EVENTS = ['touchstart', 'mousedown'];\n  var MOVE_EVENTS = ['touchmove', 'mousemove'];\n  var END_EVENTS = ['touchend', 'touchcancel', 'mouseup', 'mouseleave'];\n  var MOUSE_EVENTS = ['mousedown', 'mousemove', 'mouseup', 'mouseleave'];\n  function Swipe (Glide, Components, Events) {\n    /**\n     * Instance of the binder for DOM Events.\n     *\n     * @type {EventsBinder}\n     */\n    var Binder = new EventsBinder();\n    var swipeSin = 0;\n    var swipeStartX = 0;\n    var swipeStartY = 0;\n    var disabled = false;\n    var capture = supportsPassive$1 ? {\n      passive: true\n    } : false;\n    var Swipe = {\n      /**\n       * Initializes swipe bindings.\n       *\n       * @return {Void}\n       */\n      mount: function mount() {\n        this.bindSwipeStart();\n      },\n\n      /**\n       * Handler for `swipestart` event. Calculates entry points of the user's tap.\n       *\n       * @param {Object} event\n       * @return {Void}\n       */\n      start: function start(event) {\n        if (!disabled && !Glide.disabled) {\n          this.disable();\n          var swipe = this.touches(event);\n          swipeSin = null;\n          swipeStartX = toInt(swipe.pageX);\n          swipeStartY = toInt(swipe.pageY);\n          this.bindSwipeMove();\n          this.bindSwipeEnd();\n          Events.emit('swipe.start');\n        }\n      },\n\n      /**\n       * Handler for `swipemove` event. Calculates user's tap angle and distance.\n       *\n       * @param {Object} event\n       */\n      move: function move(event) {\n        if (!Glide.disabled) {\n          var _Glide$settings = Glide.settings,\n              touchAngle = _Glide$settings.touchAngle,\n              touchRatio = _Glide$settings.touchRatio,\n              classes = _Glide$settings.classes;\n          var swipe = this.touches(event);\n          var subExSx = toInt(swipe.pageX) - swipeStartX;\n          var subEySy = toInt(swipe.pageY) - swipeStartY;\n          var powEX = Math.abs(subExSx << 2);\n          var powEY = Math.abs(subEySy << 2);\n          var swipeHypotenuse = Math.sqrt(powEX + powEY);\n          var swipeCathetus = Math.sqrt(powEY);\n          swipeSin = Math.asin(swipeCathetus / swipeHypotenuse);\n\n          if (swipeSin * 180 / Math.PI < touchAngle) {\n            event.stopPropagation();\n            Components.Move.make(subExSx * toFloat(touchRatio));\n            Components.Html.root.classList.add(classes.dragging);\n            Events.emit('swipe.move');\n          } else {\n            return false;\n          }\n        }\n      },\n\n      /**\n       * Handler for `swipeend` event. Finitializes user's tap and decides about glide move.\n       *\n       * @param {Object} event\n       * @return {Void}\n       */\n      end: function end(event) {\n        if (!Glide.disabled) {\n          var _Glide$settings2 = Glide.settings,\n              perSwipe = _Glide$settings2.perSwipe,\n              touchAngle = _Glide$settings2.touchAngle,\n              classes = _Glide$settings2.classes;\n          var swipe = this.touches(event);\n          var threshold = this.threshold(event);\n          var swipeDistance = swipe.pageX - swipeStartX;\n          var swipeDeg = swipeSin * 180 / Math.PI;\n          this.enable();\n\n          if (swipeDistance > threshold && swipeDeg < touchAngle) {\n            Components.Run.make(Components.Direction.resolve(\"\".concat(perSwipe, \"<\")));\n          } else if (swipeDistance < -threshold && swipeDeg < touchAngle) {\n            Components.Run.make(Components.Direction.resolve(\"\".concat(perSwipe, \">\")));\n          } else {\n            // While swipe don't reach distance apply previous transform.\n            Components.Move.make();\n          }\n\n          Components.Html.root.classList.remove(classes.dragging);\n          this.unbindSwipeMove();\n          this.unbindSwipeEnd();\n          Events.emit('swipe.end');\n        }\n      },\n\n      /**\n       * Binds swipe's starting event.\n       *\n       * @return {Void}\n       */\n      bindSwipeStart: function bindSwipeStart() {\n        var _this = this;\n\n        var _Glide$settings3 = Glide.settings,\n            swipeThreshold = _Glide$settings3.swipeThreshold,\n            dragThreshold = _Glide$settings3.dragThreshold;\n\n        if (swipeThreshold) {\n          Binder.on(START_EVENTS[0], Components.Html.wrapper, function (event) {\n            _this.start(event);\n          }, capture);\n        }\n\n        if (dragThreshold) {\n          Binder.on(START_EVENTS[1], Components.Html.wrapper, function (event) {\n            _this.start(event);\n          }, capture);\n        }\n      },\n\n      /**\n       * Unbinds swipe's starting event.\n       *\n       * @return {Void}\n       */\n      unbindSwipeStart: function unbindSwipeStart() {\n        Binder.off(START_EVENTS[0], Components.Html.wrapper, capture);\n        Binder.off(START_EVENTS[1], Components.Html.wrapper, capture);\n      },\n\n      /**\n       * Binds swipe's moving event.\n       *\n       * @return {Void}\n       */\n      bindSwipeMove: function bindSwipeMove() {\n        var _this2 = this;\n\n        Binder.on(MOVE_EVENTS, Components.Html.wrapper, throttle(function (event) {\n          _this2.move(event);\n        }, Glide.settings.throttle), capture);\n      },\n\n      /**\n       * Unbinds swipe's moving event.\n       *\n       * @return {Void}\n       */\n      unbindSwipeMove: function unbindSwipeMove() {\n        Binder.off(MOVE_EVENTS, Components.Html.wrapper, capture);\n      },\n\n      /**\n       * Binds swipe's ending event.\n       *\n       * @return {Void}\n       */\n      bindSwipeEnd: function bindSwipeEnd() {\n        var _this3 = this;\n\n        Binder.on(END_EVENTS, Components.Html.wrapper, function (event) {\n          _this3.end(event);\n        });\n      },\n\n      /**\n       * Unbinds swipe's ending event.\n       *\n       * @return {Void}\n       */\n      unbindSwipeEnd: function unbindSwipeEnd() {\n        Binder.off(END_EVENTS, Components.Html.wrapper);\n      },\n\n      /**\n       * Normalizes event touches points accorting to different types.\n       *\n       * @param {Object} event\n       */\n      touches: function touches(event) {\n        if (MOUSE_EVENTS.indexOf(event.type) > -1) {\n          return event;\n        }\n\n        return event.touches[0] || event.changedTouches[0];\n      },\n\n      /**\n       * Gets value of minimum swipe distance settings based on event type.\n       *\n       * @return {Number}\n       */\n      threshold: function threshold(event) {\n        var settings = Glide.settings;\n\n        if (MOUSE_EVENTS.indexOf(event.type) > -1) {\n          return settings.dragThreshold;\n        }\n\n        return settings.swipeThreshold;\n      },\n\n      /**\n       * Enables swipe event.\n       *\n       * @return {self}\n       */\n      enable: function enable() {\n        disabled = false;\n        Components.Transition.enable();\n        return this;\n      },\n\n      /**\n       * Disables swipe event.\n       *\n       * @return {self}\n       */\n      disable: function disable() {\n        disabled = true;\n        Components.Transition.disable();\n        return this;\n      }\n    };\n    /**\n     * Add component class:\n     * - after initial building\n     */\n\n    Events.on('build.after', function () {\n      Components.Html.root.classList.add(Glide.settings.classes.swipeable);\n    });\n    /**\n     * Remove swiping bindings:\n     * - on destroying, to remove added EventListeners\n     */\n\n    Events.on('destroy', function () {\n      Swipe.unbindSwipeStart();\n      Swipe.unbindSwipeMove();\n      Swipe.unbindSwipeEnd();\n      Binder.destroy();\n    });\n    return Swipe;\n  }\n\n  function Images (Glide, Components, Events) {\n    /**\n     * Instance of the binder for DOM Events.\n     *\n     * @type {EventsBinder}\n     */\n    var Binder = new EventsBinder();\n    var Images = {\n      /**\n       * Binds listener to glide wrapper.\n       *\n       * @return {Void}\n       */\n      mount: function mount() {\n        this.bind();\n      },\n\n      /**\n       * Binds `dragstart` event on wrapper to prevent dragging images.\n       *\n       * @return {Void}\n       */\n      bind: function bind() {\n        Binder.on('dragstart', Components.Html.wrapper, this.dragstart);\n      },\n\n      /**\n       * Unbinds `dragstart` event on wrapper.\n       *\n       * @return {Void}\n       */\n      unbind: function unbind() {\n        Binder.off('dragstart', Components.Html.wrapper);\n      },\n\n      /**\n       * Event handler. Prevents dragging.\n       *\n       * @return {Void}\n       */\n      dragstart: function dragstart(event) {\n        event.preventDefault();\n      }\n    };\n    /**\n     * Remove bindings from images:\n     * - on destroying, to remove added EventListeners\n     */\n\n    Events.on('destroy', function () {\n      Images.unbind();\n      Binder.destroy();\n    });\n    return Images;\n  }\n\n  function Anchors (Glide, Components, Events) {\n    /**\n     * Instance of the binder for DOM Events.\n     *\n     * @type {EventsBinder}\n     */\n    var Binder = new EventsBinder();\n    /**\n     * Holds detaching status of anchors.\n     * Prevents detaching of already detached anchors.\n     *\n     * @private\n     * @type {Boolean}\n     */\n\n    var detached = false;\n    /**\n     * Holds preventing status of anchors.\n     * If `true` redirection after click will be disabled.\n     *\n     * @private\n     * @type {Boolean}\n     */\n\n    var prevented = false;\n    var Anchors = {\n      /**\n       * Setups a initial state of anchors component.\n       *\n       * @returns {Void}\n       */\n      mount: function mount() {\n        /**\n         * Holds collection of anchors elements.\n         *\n         * @private\n         * @type {HTMLCollection}\n         */\n        this._a = Components.Html.wrapper.querySelectorAll('a');\n        this.bind();\n      },\n\n      /**\n       * Binds events to anchors inside a track.\n       *\n       * @return {Void}\n       */\n      bind: function bind() {\n        Binder.on('click', Components.Html.wrapper, this.click);\n      },\n\n      /**\n       * Unbinds events attached to anchors inside a track.\n       *\n       * @return {Void}\n       */\n      unbind: function unbind() {\n        Binder.off('click', Components.Html.wrapper);\n      },\n\n      /**\n       * Handler for click event. Prevents clicks when glide is in `prevent` status.\n       *\n       * @param  {Object} event\n       * @return {Void}\n       */\n      click: function click(event) {\n        if (prevented) {\n          event.stopPropagation();\n          event.preventDefault();\n        }\n      },\n\n      /**\n       * Detaches anchors click event inside glide.\n       *\n       * @return {self}\n       */\n      detach: function detach() {\n        prevented = true;\n\n        if (!detached) {\n          for (var i = 0; i < this.items.length; i++) {\n            this.items[i].draggable = false;\n          }\n\n          detached = true;\n        }\n\n        return this;\n      },\n\n      /**\n       * Attaches anchors click events inside glide.\n       *\n       * @return {self}\n       */\n      attach: function attach() {\n        prevented = false;\n\n        if (detached) {\n          for (var i = 0; i < this.items.length; i++) {\n            this.items[i].draggable = true;\n          }\n\n          detached = false;\n        }\n\n        return this;\n      }\n    };\n    define(Anchors, 'items', {\n      /**\n       * Gets collection of the arrows HTML elements.\n       *\n       * @return {HTMLElement[]}\n       */\n      get: function get() {\n        return Anchors._a;\n      }\n    });\n    /**\n     * Detach anchors inside slides:\n     * - on swiping, so they won't redirect to its `href` attributes\n     */\n\n    Events.on('swipe.move', function () {\n      Anchors.detach();\n    });\n    /**\n     * Attach anchors inside slides:\n     * - after swiping and transitions ends, so they can redirect after click again\n     */\n\n    Events.on('swipe.end', function () {\n      Components.Transition.after(function () {\n        Anchors.attach();\n      });\n    });\n    /**\n     * Unbind anchors inside slides:\n     * - on destroying, to bring anchors to its initial state\n     */\n\n    Events.on('destroy', function () {\n      Anchors.attach();\n      Anchors.unbind();\n      Binder.destroy();\n    });\n    return Anchors;\n  }\n\n  var NAV_SELECTOR = '[data-glide-el=\"controls[nav]\"]';\n  var CONTROLS_SELECTOR = '[data-glide-el^=\"controls\"]';\n  var PREVIOUS_CONTROLS_SELECTOR = \"\".concat(CONTROLS_SELECTOR, \" [data-glide-dir*=\\\"<\\\"]\");\n  var NEXT_CONTROLS_SELECTOR = \"\".concat(CONTROLS_SELECTOR, \" [data-glide-dir*=\\\">\\\"]\");\n  function Controls (Glide, Components, Events) {\n    /**\n     * Instance of the binder for DOM Events.\n     *\n     * @type {EventsBinder}\n     */\n    var Binder = new EventsBinder();\n    var capture = supportsPassive$1 ? {\n      passive: true\n    } : false;\n    var Controls = {\n      /**\n       * Inits arrows. Binds events listeners\n       * to the arrows HTML elements.\n       *\n       * @return {Void}\n       */\n      mount: function mount() {\n        /**\n         * Collection of navigation HTML elements.\n         *\n         * @private\n         * @type {HTMLCollection}\n         */\n        this._n = Components.Html.root.querySelectorAll(NAV_SELECTOR);\n        /**\n         * Collection of controls HTML elements.\n         *\n         * @private\n         * @type {HTMLCollection}\n         */\n\n        this._c = Components.Html.root.querySelectorAll(CONTROLS_SELECTOR);\n        /**\n         * Collection of arrow control HTML elements.\n         *\n         * @private\n         * @type {Object}\n         */\n\n        this._arrowControls = {\n          previous: Components.Html.root.querySelectorAll(PREVIOUS_CONTROLS_SELECTOR),\n          next: Components.Html.root.querySelectorAll(NEXT_CONTROLS_SELECTOR)\n        };\n        this.addBindings();\n      },\n\n      /**\n       * Sets active class to current slide.\n       *\n       * @return {Void}\n       */\n      setActive: function setActive() {\n        for (var i = 0; i < this._n.length; i++) {\n          this.addClass(this._n[i].children);\n        }\n      },\n\n      /**\n       * Removes active class to current slide.\n       *\n       * @return {Void}\n       */\n      removeActive: function removeActive() {\n        for (var i = 0; i < this._n.length; i++) {\n          this.removeClass(this._n[i].children);\n        }\n      },\n\n      /**\n       * Toggles active class on items inside navigation.\n       *\n       * @param  {HTMLElement} controls\n       * @return {Void}\n       */\n      addClass: function addClass(controls) {\n        var settings = Glide.settings;\n        var item = controls[Glide.index];\n\n        if (!item) {\n          return;\n        }\n\n        item.classList.add(settings.classes.nav.active);\n        siblings(item).forEach(function (sibling) {\n          sibling.classList.remove(settings.classes.nav.active);\n        });\n      },\n\n      /**\n       * Removes active class from active control.\n       *\n       * @param  {HTMLElement} controls\n       * @return {Void}\n       */\n      removeClass: function removeClass(controls) {\n        var item = controls[Glide.index];\n        item === null || item === void 0 ? void 0 : item.classList.remove(Glide.settings.classes.nav.active);\n      },\n\n      /**\n       * Calculates, removes or adds `Glide.settings.classes.disabledArrow` class on the control arrows\n       */\n      setArrowState: function setArrowState() {\n        if (Glide.settings.rewind) {\n          return;\n        }\n\n        var next = Controls._arrowControls.next;\n        var previous = Controls._arrowControls.previous;\n        this.resetArrowState(next, previous);\n\n        if (Glide.index === 0) {\n          this.disableArrow(previous);\n        }\n\n        if (Glide.index === Components.Run.length) {\n          this.disableArrow(next);\n        }\n      },\n\n      /**\n       * Removes `Glide.settings.classes.disabledArrow` from given NodeList elements\n       *\n       * @param {NodeList[]} lists\n       */\n      resetArrowState: function resetArrowState() {\n        var settings = Glide.settings;\n\n        for (var _len = arguments.length, lists = new Array(_len), _key = 0; _key < _len; _key++) {\n          lists[_key] = arguments[_key];\n        }\n\n        lists.forEach(function (list) {\n          toArray(list).forEach(function (element) {\n            element.classList.remove(settings.classes.arrow.disabled);\n          });\n        });\n      },\n\n      /**\n       * Adds `Glide.settings.classes.disabledArrow` to given NodeList elements\n       *\n       * @param {NodeList[]} lists\n       */\n      disableArrow: function disableArrow() {\n        var settings = Glide.settings;\n\n        for (var _len2 = arguments.length, lists = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n          lists[_key2] = arguments[_key2];\n        }\n\n        lists.forEach(function (list) {\n          toArray(list).forEach(function (element) {\n            element.classList.add(settings.classes.arrow.disabled);\n          });\n        });\n      },\n\n      /**\n       * Adds handles to the each group of controls.\n       *\n       * @return {Void}\n       */\n      addBindings: function addBindings() {\n        for (var i = 0; i < this._c.length; i++) {\n          this.bind(this._c[i].children);\n        }\n      },\n\n      /**\n       * Removes handles from the each group of controls.\n       *\n       * @return {Void}\n       */\n      removeBindings: function removeBindings() {\n        for (var i = 0; i < this._c.length; i++) {\n          this.unbind(this._c[i].children);\n        }\n      },\n\n      /**\n       * Binds events to arrows HTML elements.\n       *\n       * @param {HTMLCollection} elements\n       * @return {Void}\n       */\n      bind: function bind(elements) {\n        for (var i = 0; i < elements.length; i++) {\n          Binder.on('click', elements[i], this.click);\n          Binder.on('touchstart', elements[i], this.click, capture);\n        }\n      },\n\n      /**\n       * Unbinds events binded to the arrows HTML elements.\n       *\n       * @param {HTMLCollection} elements\n       * @return {Void}\n       */\n      unbind: function unbind(elements) {\n        for (var i = 0; i < elements.length; i++) {\n          Binder.off(['click', 'touchstart'], elements[i]);\n        }\n      },\n\n      /**\n       * Handles `click` event on the arrows HTML elements.\n       * Moves slider in direction given via the\n       * `data-glide-dir` attribute.\n       *\n       * @param {Object} event\n       * @return {void}\n       */\n      click: function click(event) {\n        if (!supportsPassive$1 && event.type === 'touchstart') {\n          event.preventDefault();\n        }\n\n        var direction = event.currentTarget.getAttribute('data-glide-dir');\n        Components.Run.make(Components.Direction.resolve(direction));\n      }\n    };\n    define(Controls, 'items', {\n      /**\n       * Gets collection of the controls HTML elements.\n       *\n       * @return {HTMLElement[]}\n       */\n      get: function get() {\n        return Controls._c;\n      }\n    });\n    /**\n     * Swap active class of current navigation item:\n     * - after mounting to set it to initial index\n     * - after each move to the new index\n     */\n\n    Events.on(['mount.after', 'move.after'], function () {\n      Controls.setActive();\n    });\n    /**\n     * Add or remove disabled class of arrow elements\n     */\n\n    Events.on(['mount.after', 'run'], function () {\n      Controls.setArrowState();\n    });\n    /**\n     * Remove bindings and HTML Classes:\n     * - on destroying, to bring markup to its initial state\n     */\n\n    Events.on('destroy', function () {\n      Controls.removeBindings();\n      Controls.removeActive();\n      Binder.destroy();\n    });\n    return Controls;\n  }\n\n  function Keyboard (Glide, Components, Events) {\n    /**\n     * Instance of the binder for DOM Events.\n     *\n     * @type {EventsBinder}\n     */\n    var Binder = new EventsBinder();\n    var Keyboard = {\n      /**\n       * Binds keyboard events on component mount.\n       *\n       * @return {Void}\n       */\n      mount: function mount() {\n        if (Glide.settings.keyboard) {\n          this.bind();\n        }\n      },\n\n      /**\n       * Adds keyboard press events.\n       *\n       * @return {Void}\n       */\n      bind: function bind() {\n        Binder.on('keyup', document, this.press);\n      },\n\n      /**\n       * Removes keyboard press events.\n       *\n       * @return {Void}\n       */\n      unbind: function unbind() {\n        Binder.off('keyup', document);\n      },\n\n      /**\n       * Handles keyboard's arrows press and moving glide foward and backward.\n       *\n       * @param  {Object} event\n       * @return {Void}\n       */\n      press: function press(event) {\n        var perSwipe = Glide.settings.perSwipe;\n        var arrowSymbols = {\n          ArrowRight: '>',\n          ArrowLeft: '<'\n        };\n\n        if (['ArrowRight', 'ArrowLeft'].includes(event.code)) {\n          Components.Run.make(Components.Direction.resolve(\"\".concat(perSwipe).concat(arrowSymbols[event.code])));\n        }\n      }\n    };\n    /**\n     * Remove bindings from keyboard:\n     * - on destroying to remove added events\n     * - on updating to remove events before remounting\n     */\n\n    Events.on(['destroy', 'update'], function () {\n      Keyboard.unbind();\n    });\n    /**\n     * Remount component\n     * - on updating to reflect potential changes in settings\n     */\n\n    Events.on('update', function () {\n      Keyboard.mount();\n    });\n    /**\n     * Destroy binder:\n     * - on destroying to remove listeners\n     */\n\n    Events.on('destroy', function () {\n      Binder.destroy();\n    });\n    return Keyboard;\n  }\n\n  function Autoplay (Glide, Components, Events) {\n    /**\n     * Instance of the binder for DOM Events.\n     *\n     * @type {EventsBinder}\n     */\n    var Binder = new EventsBinder();\n    var Autoplay = {\n      /**\n       * Initializes autoplaying and events.\n       *\n       * @return {Void}\n       */\n      mount: function mount() {\n        this.enable();\n        this.start();\n\n        if (Glide.settings.hoverpause) {\n          this.bind();\n        }\n      },\n\n      /**\n       * Enables autoplaying\n       *\n       * @returns {Void}\n       */\n      enable: function enable() {\n        this._e = true;\n      },\n\n      /**\n       * Disables autoplaying.\n       *\n       * @returns {Void}\n       */\n      disable: function disable() {\n        this._e = false;\n      },\n\n      /**\n       * Starts autoplaying in configured interval.\n       *\n       * @param {Boolean|Number} force Run autoplaying with passed interval regardless of `autoplay` settings\n       * @return {Void}\n       */\n      start: function start() {\n        var _this = this;\n\n        if (!this._e) {\n          return;\n        }\n\n        this.enable();\n\n        if (Glide.settings.autoplay) {\n          if (isUndefined(this._i)) {\n            this._i = setInterval(function () {\n              _this.stop();\n\n              Components.Run.make('>');\n\n              _this.start();\n\n              Events.emit('autoplay');\n            }, this.time);\n          }\n        }\n      },\n\n      /**\n       * Stops autorunning of the glide.\n       *\n       * @return {Void}\n       */\n      stop: function stop() {\n        this._i = clearInterval(this._i);\n      },\n\n      /**\n       * Stops autoplaying while mouse is over glide's area.\n       *\n       * @return {Void}\n       */\n      bind: function bind() {\n        var _this2 = this;\n\n        Binder.on('mouseover', Components.Html.root, function () {\n          if (_this2._e) {\n            _this2.stop();\n          }\n        });\n        Binder.on('mouseout', Components.Html.root, function () {\n          if (_this2._e) {\n            _this2.start();\n          }\n        });\n      },\n\n      /**\n       * Unbind mouseover events.\n       *\n       * @returns {Void}\n       */\n      unbind: function unbind() {\n        Binder.off(['mouseover', 'mouseout'], Components.Html.root);\n      }\n    };\n    define(Autoplay, 'time', {\n      /**\n       * Gets time period value for the autoplay interval. Prioritizes\n       * times in `data-glide-autoplay` attrubutes over options.\n       *\n       * @return {Number}\n       */\n      get: function get() {\n        var autoplay = Components.Html.slides[Glide.index].getAttribute('data-glide-autoplay');\n\n        if (autoplay) {\n          return toInt(autoplay);\n        }\n\n        return toInt(Glide.settings.autoplay);\n      }\n    });\n    /**\n     * Stop autoplaying and unbind events:\n     * - on destroying, to clear defined interval\n     * - on updating via API to reset interval that may changed\n     */\n\n    Events.on(['destroy', 'update'], function () {\n      Autoplay.unbind();\n    });\n    /**\n     * Stop autoplaying:\n     * - before each run, to restart autoplaying\n     * - on pausing via API\n     * - on destroying, to clear defined interval\n     * - while starting a swipe\n     * - on updating via API to reset interval that may changed\n     */\n\n    Events.on(['run.before', 'swipe.start', 'update'], function () {\n      Autoplay.stop();\n    });\n    Events.on(['pause', 'destroy'], function () {\n      Autoplay.disable();\n      Autoplay.stop();\n    });\n    /**\n     * Start autoplaying:\n     * - after each run, to restart autoplaying\n     * - on playing via API\n     * - while ending a swipe\n     */\n\n    Events.on(['run.after', 'swipe.end'], function () {\n      Autoplay.start();\n    });\n    /**\n     * Start autoplaying:\n     * - after each run, to restart autoplaying\n     * - on playing via API\n     * - while ending a swipe\n     */\n\n    Events.on(['play'], function () {\n      Autoplay.enable();\n      Autoplay.start();\n    });\n    /**\n     * Remount autoplaying:\n     * - on updating via API to reset interval that may changed\n     */\n\n    Events.on('update', function () {\n      Autoplay.mount();\n    });\n    /**\n     * Destroy a binder:\n     * - on destroying glide instance to clearup listeners\n     */\n\n    Events.on('destroy', function () {\n      Binder.destroy();\n    });\n    return Autoplay;\n  }\n\n  /**\n   * Sorts keys of breakpoint object so they will be ordered from lower to bigger.\n   *\n   * @param {Object} points\n   * @returns {Object}\n   */\n\n  function sortBreakpoints(points) {\n    if (isObject(points)) {\n      return sortKeys(points);\n    } else {\n      warn(\"Breakpoints option must be an object\");\n    }\n\n    return {};\n  }\n\n  function Breakpoints (Glide, Components, Events) {\n    /**\n     * Instance of the binder for DOM Events.\n     *\n     * @type {EventsBinder}\n     */\n    var Binder = new EventsBinder();\n    /**\n     * Holds reference to settings.\n     *\n     * @type {Object}\n     */\n\n    var settings = Glide.settings;\n    /**\n     * Holds reference to breakpoints object in settings. Sorts breakpoints\n     * from smaller to larger. It is required in order to proper\n     * matching currently active breakpoint settings.\n     *\n     * @type {Object}\n     */\n\n    var points = sortBreakpoints(settings.breakpoints);\n    /**\n     * Cache initial settings before overwritting.\n     *\n     * @type {Object}\n     */\n\n    var defaults = Object.assign({}, settings);\n    var Breakpoints = {\n      /**\n       * Matches settings for currectly matching media breakpoint.\n       *\n       * @param {Object} points\n       * @returns {Object}\n       */\n      match: function match(points) {\n        if (typeof window.matchMedia !== 'undefined') {\n          for (var point in points) {\n            if (points.hasOwnProperty(point)) {\n              if (window.matchMedia(\"(max-width: \".concat(point, \"px)\")).matches) {\n                return points[point];\n              }\n            }\n          }\n        }\n\n        return defaults;\n      }\n    };\n    /**\n     * Overwrite instance settings with currently matching breakpoint settings.\n     * This happens right after component initialization.\n     */\n\n    Object.assign(settings, Breakpoints.match(points));\n    /**\n     * Update glide with settings of matched brekpoint:\n     * - window resize to update slider\n     */\n\n    Binder.on('resize', window, throttle(function () {\n      Glide.settings = mergeOptions(settings, Breakpoints.match(points));\n    }, Glide.settings.throttle));\n    /**\n     * Resort and update default settings:\n     * - on reinit via API, so breakpoint matching will be performed with options\n     */\n\n    Events.on('update', function () {\n      points = sortBreakpoints(points);\n      defaults = Object.assign({}, settings);\n    });\n    /**\n     * Unbind resize listener:\n     * - on destroying, to bring markup to its initial state\n     */\n\n    Events.on('destroy', function () {\n      Binder.off('resize', window);\n    });\n    return Breakpoints;\n  }\n\n  var COMPONENTS = {\n    // Required\n    Html: Html,\n    Translate: Translate,\n    Transition: Transition,\n    Direction: Direction,\n    Peek: Peek,\n    Sizes: Sizes,\n    Gaps: Gaps,\n    Move: Move,\n    Clones: Clones,\n    Resize: Resize,\n    Build: Build,\n    Run: Run,\n    // Optional\n    Swipe: Swipe,\n    Images: Images,\n    Anchors: Anchors,\n    Controls: Controls,\n    Keyboard: Keyboard,\n    Autoplay: Autoplay,\n    Breakpoints: Breakpoints\n  };\n\n  var Glide = /*#__PURE__*/function (_Core) {\n    _inherits(Glide, _Core);\n\n    var _super = _createSuper(Glide);\n\n    function Glide() {\n      _classCallCheck(this, Glide);\n\n      return _super.apply(this, arguments);\n    }\n\n    _createClass(Glide, [{\n      key: \"mount\",\n      value: function mount() {\n        var extensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        return _get(_getPrototypeOf(Glide.prototype), \"mount\", this).call(this, Object.assign({}, COMPONENTS, extensions));\n      }\n    }]);\n\n    return Glide;\n  }(Glide$1);\n\n  return Glide;\n\n}));\n","'use strict';\r\n// the include for this file should be surrounded by a site preference check\r\nfunction updateBuyNowButton() {\r\n    $('body').on('product:afterAttributeSelect', function (e, response) {\r\n        if ($('.cswidget-js').length) {\r\n            var widgets = $('.cswidget-js').toArray();\r\n            widgets.forEach(function (item) {\r\n                var currentProductId = $(item).data('csProductId');\r\n                if (currentProductId && (currentProductId.toString() === response.data.product.id)) {\r\n                    $(item).addClass('show');\r\n                    $(item).removeClass('hide');\r\n                } else if(!$(item).hasClass('hide') || $(item).hasClass('show')){\r\n                    $(item).removeClass('show');\r\n                    $(item).addClass('hide');\r\n                }\r\n            });\r\n        }\r\n    });\r\n}\r\nmodule.exports = function () {\r\n    let features = JSON.parse(document.querySelector('body').dataset.features);\r\n    if (features && features.enableChannelSite && features.enablePdpBuyNow) {\r\n        updateBuyNowButton();\r\n    }\r\n};","'use strict';\r\n// the include for this file should be surrounded by a site preference check\r\nfunction updateExternalUrlBuyNowButton() {\r\n    $('body').on('product:afterAttributeSelect', function (e, response) {\r\n        if ($('.cswidget-external-js').length) {\r\n            var widgets = $('.cswidget-external-js').toArray();\r\n            widgets.forEach(function (item) {\r\n                var currentProductId = $(item).data('pid');\r\n                if (currentProductId && (currentProductId.toString() === response.data.product.id)) {\r\n                    $(item).addClass('show');\r\n                    $(item).removeClass('hide');\r\n                } else if(!$(item).hasClass('hide') || $(item).hasClass('show')){\r\n                    $(item).removeClass('show');\r\n                    $(item).addClass('hide');\r\n                }\r\n            });\r\n        }\r\n    });\r\n}\r\nmodule.exports = function () {\r\n    updateExternalUrlBuyNowButton()\r\n};"],"sourceRoot":""}