{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/get-size/get-size.js","webpack:///./node_modules/packery/js/rect.js","webpack:///./node_modules/outlayer/outlayer.js","webpack:///./node_modules/ev-emitter/ev-emitter.js","webpack:///./node_modules/muicss/lib/js/lib/jqLite.js","webpack:///./src/index.ts","webpack:///./node_modules/packery/js/packery.js","webpack:///./node_modules/fizzy-ui-utils/utils.js","webpack:///./node_modules/desandro-matches-selector/matches-selector.js","webpack:///./node_modules/outlayer/item.js","webpack:///./node_modules/packery/js/packer.js","webpack:///./node_modules/packery/js/item.js","webpack:///./node_modules/imagesLoaded/imagesloaded.js","webpack:///./node_modules/imagesLoaded/node_modules/ev-emitter/ev-emitter.js","webpack:///./node_modules/muicss/lib/js/overlay.js","webpack:///./node_modules/muicss/lib/js/lib/util.js","webpack:///./node_modules/muicss/lib/js/config.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;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,oCAAQ,OAAO;AAAA;AAAA;AAAA;AAAA,oGAAE;AACrB,GAAG,MAAM,EAMN;;AAEH,CAAC;AACD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,CAAC;;;;;;;AC9MD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,oCAAQ,OAAO;AAAA;AAAA;AAAA;AAAA,oGAAE;AACrB,GAAG,MAAM,EAON;;AAEH,CAAC;AACD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,KAAK;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,KAAK;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,KAAK;AAChB,aAAa,MAAM;AACnB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,CAAC;;;;;;;ACvJD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,QAAQ,sBAAuB;AAC/B,QAAQ,sBAAmB;AAC3B,QAAQ,sBAAsB;AAC9B,QAAQ,sBAAQ;AAChB,OAAO,mCACD;AACN;AACA,OAAO;AAAA,oGACF;AACL,GAAG,MAAM,EAkBN;;AAEH,CAAC;AACD;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA,WAAW,gBAAgB;AAC3B,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC;AACjC;;AAEA;AACA;AACA,iCAAiC;AACjC,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,WAAW,iCAAiC;AAC5C,aAAa,MAAM;AACnB;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,iCAAiC;AAC5C,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB;AACA;;AAEA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,oCAAoC;AAC/C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA,WAAW,oCAAoC;AAC/C,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,QAAQ;AACnB;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,6BAA6B;AACxC,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,6BAA6B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,6BAA6B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,wBAAwB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA,WAAW,wBAAwB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA,WAAW,MAAM,GAAG,QAAQ,GAAG,SAAS;AACxC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,MAAM,GAAG,QAAQ,GAAG,SAAS;AACxC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,cAAc;AAC3B;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA,WAAW,6BAA6B;AACxC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,yCAAyC;;AAEzC;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,CAAC;;;;;;;AC16BD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,oCAAQ,OAAO;AAAA;AAAA;AAAA;AAAA,oGAAE;AACrB,GAAG,MAAM,EAMN;;AAEH,CAAC;;AAED;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,CAAC;;;;;;;;AC/GD;AACA;AACA;AACA;;AAEa;;;AAGb;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA;AACA;;AAEA,eAAe,yBAAyB;AACxC;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,iBAAiB;AACjB;;AAEA,eAAe,iBAAiB;AAChC;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,G;AACA;;;AAGA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA,oE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;;;AAGA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA,mEAAmE;AACnE;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;;AAGA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL,GAAG;AACH;;;AAGA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,SAAS,uBAAuB,EAAE,WAAW,sBAAsB,QAAQ;AAC3E;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA,WAAW,yBAAyB,EAAE,WAAW;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB;AACA;AACA;;AAE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ACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,UAAU;AAC5B;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,aAAa;AACvC;;AAEA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,YAAY;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,CAAC;;;;;;;AC3pBD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,MAAM,sBAA4C;AAClD,KAAK,mCAAE;AACP;AACA,KAAK;AAAA,oGAAC;AACN,GAAG,MAAM,EAYN;;AAEH,CAAC;;AAED;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,uBAAuB;AACzC;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,GAAG;AACH;;AAEA;;AAEA;;AAEA,CAAC;;;;;;;AChPD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,oCAAQ,OAAO;AAAA;AAAA;AAAA;AAAA,oGAAE;AACrB,GAAG,MAAM,EAMN;;AAEH,CAAC;AACD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA,CAAC;;;;;;;ACpDD;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,QAAQ,sBAAuB;AAC/B,QAAQ,sBAAmB;AAC3B,OAAO,oCACD,OAAO;AAAA;AAAA;AAAA,oGACR;AACL,GAAG,MAAM,EAaN;;AAEH,CAAC;AACD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB;AACrB,aAAa;AACb;AACA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;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;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;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;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAY,cAAc;AAC1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,YAAY,cAAc;;AAE1B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,cAAc;;AAE1B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA,CAAC;;;;;;;ACziBD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ,EAAE,sBAAQ,EAAE,oCAAE,OAAO;AAAA;AAAA;AAAA,oGAAE;AACnC,GAAG,MAAM,gBASN;;AAEH,CAAC;AACD;;AAEA;;AAEA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ,OAAO;AACP;AACA;AACA,wBAAwB;AACxB,0BAA0B;AAC1B,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;;AAEA,CAAC;;;;;;;ACpMD;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,QAAQ,sBAAmB;AAC3B,QAAQ,sBAAQ;AAChB,OAAO,oCACD,OAAO;AAAA;AAAA;AAAA,oGAAE;AACf,GAAG,MAAM,EAYN;;AAEH,CAAC;AACD;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,CAAC;;;;;;;ACpID;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,sCAAsC,mBAAO,CAAC,EAAY;AAC1D,GAAG;AACH;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,mCAAmC;AAC9C,WAAW,mBAAmB;AAC9B,WAAW,SAAS;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,kBAAkB;AACpE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,KAAK;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,WAAW;AAClB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,aAAa;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,CAAC;;;;;;;AC9UD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,CAAC;;;;;;;;ACnGD;AACA;AACA;AACA;;AAEa;;;AAGb,WAAW,mBAAO,CAAC,EAAY;AAC/B,aAAa,mBAAO,CAAC,CAAc;AACnC;AACA;AACA;AACA;;;AAGA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,SAAS;AACrB,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oCAAoC,OAAO;AAC3C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,GAAG;AACH;;AAEA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA;;;AAGA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,GAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;;;;;;;AC3MA;AACA;AACA;AACA;;AAEa;;;AAGb,aAAa,mBAAO,CAAC,EAAW;AAChC,aAAa,mBAAO,CAAC,CAAU;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;;AAGA;AACA;AACA;AACA,YAAY,OAAO;AACnB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA,qBAAqB;AACrB;;;AAGA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC;AACrC,yCAAyC,mBAAmB;AAC5D;;AAEA;AACA;;AAEA;AACA,qBAAqB;AACrB;AACA;AACA;;;AAGA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,0D;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yCAAyC,YAAY,kBAAkB;AACvE,gBAAgB,UAAU,cAAc,wBAAwB;AAChE,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;ACrSA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA","file":"bundle.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 = 5);\n","/*!\n * getSize v2.0.3\n * measure size of elements\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n/* globals console: false */\n\n( function( window, factory ) {\n /* jshint strict: false */ /* globals define, module */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n var num = parseFloat( value );\n // not a percent like '100%', and a number\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n var size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n };\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n size[ measurement ] = 0;\n }\n return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n logError( 'Style returned ' + style +\n '. Are you running this code in a hidden iframe on Firefox? ' +\n 'See https://bit.ly/getsizebug1' );\n }\n return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n // setup once\n if ( isSetup ) {\n return;\n }\n isSetup = true;\n\n // -------------------------- box sizing -------------------------- //\n\n /**\n * Chrome & Safari measure the outer-width on style.width on border-box elems\n * IE11 & Firefox<29 measures the inner-width\n */\n var div = document.createElement('div');\n div.style.width = '200px';\n div.style.padding = '1px 2px 3px 4px';\n div.style.borderStyle = 'solid';\n div.style.borderWidth = '1px 2px 3px 4px';\n div.style.boxSizing = 'border-box';\n\n var body = document.body || document.documentElement;\n body.appendChild( div );\n var style = getStyle( div );\n // round value for browser zoom. desandro/masonry#928\n isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n getSize.isBoxSizeOuter = isBoxSizeOuter;\n\n body.removeChild( div );\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n setup();\n\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) {\n elem = document.querySelector( elem );\n }\n\n // do not proceed on non-objects\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n return;\n }\n\n var style = getStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) {\n return getZeroSize();\n }\n\n var size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n var value = style[ measurement ];\n var num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n }\n\n var paddingWidth = size.paddingLeft + size.paddingRight;\n var paddingHeight = size.paddingTop + size.paddingBottom;\n var marginWidth = size.marginLeft + size.marginRight;\n var marginHeight = size.marginTop + size.marginBottom;\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n var styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n }\n\n var styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n});\n","/**\n * Rect\n * low-level utility class for basic geometry\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.Packery = window.Packery || {};\n window.Packery.Rect = factory();\n }\n\n}( window, function factory() {\n'use strict';\n\n// -------------------------- Rect -------------------------- //\n\nfunction Rect( props ) {\n // extend properties from defaults\n for ( var prop in Rect.defaults ) {\n this[ prop ] = Rect.defaults[ prop ];\n }\n\n for ( prop in props ) {\n this[ prop ] = props[ prop ];\n }\n\n}\n\nRect.defaults = {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n};\n\nvar proto = Rect.prototype;\n\n/**\n * Determines whether or not this rectangle wholly encloses another rectangle or point.\n * @param {Rect} rect\n * @returns {Boolean}\n**/\nproto.contains = function( rect ) {\n // points don't have width or height\n var otherWidth = rect.width || 0;\n var otherHeight = rect.height || 0;\n return this.x <= rect.x &&\n this.y <= rect.y &&\n this.x + this.width >= rect.x + otherWidth &&\n this.y + this.height >= rect.y + otherHeight;\n};\n\n/**\n * Determines whether or not the rectangle intersects with another.\n * @param {Rect} rect\n * @returns {Boolean}\n**/\nproto.overlaps = function( rect ) {\n var thisRight = this.x + this.width;\n var thisBottom = this.y + this.height;\n var rectRight = rect.x + rect.width;\n var rectBottom = rect.y + rect.height;\n\n // http://stackoverflow.com/a/306332\n return this.x < rectRight &&\n thisRight > rect.x &&\n this.y < rectBottom &&\n thisBottom > rect.y;\n};\n\n/**\n * @param {Rect} rect - the overlapping rect\n * @returns {Array} freeRects - rects representing the area around the rect\n**/\nproto.getMaximalFreeRects = function( rect ) {\n\n // if no intersection, return false\n if ( !this.overlaps( rect ) ) {\n return false;\n }\n\n var freeRects = [];\n var freeRect;\n\n var thisRight = this.x + this.width;\n var thisBottom = this.y + this.height;\n var rectRight = rect.x + rect.width;\n var rectBottom = rect.y + rect.height;\n\n // top\n if ( this.y < rect.y ) {\n freeRect = new Rect({\n x: this.x,\n y: this.y,\n width: this.width,\n height: rect.y - this.y\n });\n freeRects.push( freeRect );\n }\n\n // right\n if ( thisRight > rectRight ) {\n freeRect = new Rect({\n x: rectRight,\n y: this.y,\n width: thisRight - rectRight,\n height: this.height\n });\n freeRects.push( freeRect );\n }\n\n // bottom\n if ( thisBottom > rectBottom ) {\n freeRect = new Rect({\n x: this.x,\n y: rectBottom,\n width: this.width,\n height: thisBottom - rectBottom\n });\n freeRects.push( freeRect );\n }\n\n // left\n if ( this.x < rect.x ) {\n freeRect = new Rect({\n x: this.x,\n y: this.y,\n width: rect.x - this.x,\n height: this.height\n });\n freeRects.push( freeRect );\n }\n\n return freeRects;\n};\n\nproto.canFit = function( rect ) {\n return this.width >= rect.width && this.height >= rect.height;\n};\n\nreturn Rect;\n\n}));\n","/*!\n * Outlayer v2.1.1\n * the brains and guts of a layout library\n * MIT license\n */\n\n( function( window, factory ) {\n 'use strict';\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( [\n 'ev-emitter/ev-emitter',\n 'get-size/get-size',\n 'fizzy-ui-utils/utils',\n './item'\n ],\n function( EvEmitter, getSize, utils, Item ) {\n return factory( window, EvEmitter, getSize, utils, Item);\n }\n );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory(\n window,\n require('ev-emitter'),\n require('get-size'),\n require('fizzy-ui-utils'),\n require('./item')\n );\n } else {\n // browser global\n window.Outlayer = factory(\n window,\n window.EvEmitter,\n window.getSize,\n window.fizzyUIUtils,\n window.Outlayer.Item\n );\n }\n\n}( window, function factory( window, EvEmitter, getSize, utils, Item ) {\n'use strict';\n\n// ----- vars ----- //\n\nvar console = window.console;\nvar jQuery = window.jQuery;\nvar noop = function() {};\n\n// -------------------------- Outlayer -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Outlayer intances\nvar instances = {};\n\n\n/**\n * @param {Element, String} element\n * @param {Object} options\n * @constructor\n */\nfunction Outlayer( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for ' + this.constructor.namespace +\n ': ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n\n // add id for Outlayer.getFromElement\n var id = ++GUID;\n this.element.outlayerGUID = id; // expando\n instances[ id ] = this; // associate via id\n\n // kick it off\n this._create();\n\n var isInitLayout = this._getOption('initLayout');\n if ( isInitLayout ) {\n this.layout();\n }\n}\n\n// settings are for internal use only\nOutlayer.namespace = 'outlayer';\nOutlayer.Item = Item;\n\n// default options\nOutlayer.defaults = {\n containerStyle: {\n position: 'relative'\n },\n initLayout: true,\n originLeft: true,\n originTop: true,\n resize: true,\n resizeContainer: true,\n // item options\n transitionDuration: '0.4s',\n hiddenStyle: {\n opacity: 0,\n transform: 'scale(0.001)'\n },\n visibleStyle: {\n opacity: 1,\n transform: 'scale(1)'\n }\n};\n\nvar proto = Outlayer.prototype;\n// inherit EvEmitter\nutils.extend( proto, EvEmitter.prototype );\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\n/**\n * get backwards compatible option value, check old name\n */\nproto._getOption = function( option ) {\n var oldOption = this.constructor.compatOptions[ option ];\n return oldOption && this.options[ oldOption ] !== undefined ?\n this.options[ oldOption ] : this.options[ option ];\n};\n\nOutlayer.compatOptions = {\n // currentName: oldName\n initLayout: 'isInitLayout',\n horizontal: 'isHorizontal',\n layoutInstant: 'isLayoutInstant',\n originLeft: 'isOriginLeft',\n originTop: 'isOriginTop',\n resize: 'isResizeBound',\n resizeContainer: 'isResizingContainer'\n};\n\nproto._create = function() {\n // get items from children\n this.reloadItems();\n // elements that affect layout, but are not laid out\n this.stamps = [];\n this.stamp( this.options.stamp );\n // set container style\n utils.extend( this.element.style, this.options.containerStyle );\n\n // bind resize method\n var canBindResize = this._getOption('resize');\n if ( canBindResize ) {\n this.bindResize();\n }\n};\n\n// goes through all children again and gets bricks in proper order\nproto.reloadItems = function() {\n // collection of item elements\n this.items = this._itemize( this.element.children );\n};\n\n\n/**\n * turn elements into Outlayer.Items to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Outlayer Items\n */\nproto._itemize = function( elems ) {\n\n var itemElems = this._filterFindItemElements( elems );\n var Item = this.constructor.Item;\n\n // create new Outlayer Items for collection\n var items = [];\n for ( var i=0; i < itemElems.length; i++ ) {\n var elem = itemElems[i];\n var item = new Item( elem, this );\n items.push( item );\n }\n\n return items;\n};\n\n/**\n * get item elements to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - item elements\n */\nproto._filterFindItemElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.itemSelector );\n};\n\n/**\n * getter method for getting item elements\n * @returns {Array} elems - collection of item elements\n */\nproto.getItemElements = function() {\n return this.items.map( function( item ) {\n return item.element;\n });\n};\n\n// ----- init & layout ----- //\n\n/**\n * lays out all items\n */\nproto.layout = function() {\n this._resetLayout();\n this._manageStamps();\n\n // don't animate first layout\n var layoutInstant = this._getOption('layoutInstant');\n var isInstant = layoutInstant !== undefined ?\n layoutInstant : !this._isLayoutInited;\n this.layoutItems( this.items, isInstant );\n\n // flag for initalized\n this._isLayoutInited = true;\n};\n\n// _init is alias for layout\nproto._init = proto.layout;\n\n/**\n * logic before any new layout\n */\nproto._resetLayout = function() {\n this.getSize();\n};\n\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\n/**\n * get measurement from option, for columnWidth, rowHeight, gutter\n * if option is String -> get element from selector string, & get size of element\n * if option is Element -> get size of element\n * else use option as a number\n *\n * @param {String} measurement\n * @param {String} size - width or height\n * @private\n */\nproto._getMeasurement = function( measurement, size ) {\n var option = this.options[ measurement ];\n var elem;\n if ( !option ) {\n // default to 0\n this[ measurement ] = 0;\n } else {\n // use option as an element\n if ( typeof option == 'string' ) {\n elem = this.element.querySelector( option );\n } else if ( option instanceof HTMLElement ) {\n elem = option;\n }\n // use size of element, if element\n this[ measurement ] = elem ? getSize( elem )[ size ] : option;\n }\n};\n\n/**\n * layout a collection of item elements\n * @api public\n */\nproto.layoutItems = function( items, isInstant ) {\n items = this._getItemsForLayout( items );\n\n this._layoutItems( items, isInstant );\n\n this._postLayout();\n};\n\n/**\n * get the items to be laid out\n * you may want to skip over some items\n * @param {Array} items\n * @returns {Array} items\n */\nproto._getItemsForLayout = function( items ) {\n return items.filter( function( item ) {\n return !item.isIgnored;\n });\n};\n\n/**\n * layout items\n * @param {Array} items\n * @param {Boolean} isInstant\n */\nproto._layoutItems = function( items, isInstant ) {\n this._emitCompleteOnItems( 'layout', items );\n\n if ( !items || !items.length ) {\n // no items, emit event with empty array\n return;\n }\n\n var queue = [];\n\n items.forEach( function( item ) {\n // get x/y object from method\n var position = this._getItemLayoutPosition( item );\n // enqueue\n position.item = item;\n position.isInstant = isInstant || item.isLayoutInstant;\n queue.push( position );\n }, this );\n\n this._processLayoutQueue( queue );\n};\n\n/**\n * get item layout position\n * @param {Outlayer.Item} item\n * @returns {Object} x and y position\n */\nproto._getItemLayoutPosition = function( /* item */ ) {\n return {\n x: 0,\n y: 0\n };\n};\n\n/**\n * iterate over array and position each item\n * Reason being - separating this logic prevents 'layout invalidation'\n * thx @paul_irish\n * @param {Array} queue\n */\nproto._processLayoutQueue = function( queue ) {\n this.updateStagger();\n queue.forEach( function( obj, i ) {\n this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );\n }, this );\n};\n\n// set stagger from option in milliseconds number\nproto.updateStagger = function() {\n var stagger = this.options.stagger;\n if ( stagger === null || stagger === undefined ) {\n this.stagger = 0;\n return;\n }\n this.stagger = getMilliseconds( stagger );\n return this.stagger;\n};\n\n/**\n * Sets position of item in DOM\n * @param {Outlayer.Item} item\n * @param {Number} x - horizontal position\n * @param {Number} y - vertical position\n * @param {Boolean} isInstant - disables transitions\n */\nproto._positionItem = function( item, x, y, isInstant, i ) {\n if ( isInstant ) {\n // if not transition, just set CSS\n item.goTo( x, y );\n } else {\n item.stagger( i * this.stagger );\n item.moveTo( x, y );\n }\n};\n\n/**\n * Any logic you want to do after each layout,\n * i.e. size the container\n */\nproto._postLayout = function() {\n this.resizeContainer();\n};\n\nproto.resizeContainer = function() {\n var isResizingContainer = this._getOption('resizeContainer');\n if ( !isResizingContainer ) {\n return;\n }\n var size = this._getContainerSize();\n if ( size ) {\n this._setContainerMeasure( size.width, true );\n this._setContainerMeasure( size.height, false );\n }\n};\n\n/**\n * Sets width or height of container if returned\n * @returns {Object} size\n * @param {Number} width\n * @param {Number} height\n */\nproto._getContainerSize = noop;\n\n/**\n * @param {Number} measure - size of width or height\n * @param {Boolean} isWidth\n */\nproto._setContainerMeasure = function( measure, isWidth ) {\n if ( measure === undefined ) {\n return;\n }\n\n var elemSize = this.size;\n // add padding and border width if border box\n if ( elemSize.isBorderBox ) {\n measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +\n elemSize.borderLeftWidth + elemSize.borderRightWidth :\n elemSize.paddingBottom + elemSize.paddingTop +\n elemSize.borderTopWidth + elemSize.borderBottomWidth;\n }\n\n measure = Math.max( measure, 0 );\n this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';\n};\n\n/**\n * emit eventComplete on a collection of items events\n * @param {String} eventName\n * @param {Array} items - Outlayer.Items\n */\nproto._emitCompleteOnItems = function( eventName, items ) {\n var _this = this;\n function onComplete() {\n _this.dispatchEvent( eventName + 'Complete', null, [ items ] );\n }\n\n var count = items.length;\n if ( !items || !count ) {\n onComplete();\n return;\n }\n\n var doneCount = 0;\n function tick() {\n doneCount++;\n if ( doneCount == count ) {\n onComplete();\n }\n }\n\n // bind callback\n items.forEach( function( item ) {\n item.once( eventName, tick );\n });\n};\n\n/**\n * emits events via EvEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n // add original event to arguments\n var emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery ) {\n // set this.$element\n this.$element = this.$element || jQuery( this.element );\n if ( event ) {\n // create jQuery event\n var $event = jQuery.Event( event );\n $event.type = type;\n this.$element.trigger( $event, args );\n } else {\n // just trigger with type if no event available\n this.$element.trigger( type, args );\n }\n }\n};\n\n// -------------------------- ignore & stamps -------------------------- //\n\n\n/**\n * keep item in collection, but do not lay it out\n * ignored items do not get skipped in layout\n * @param {Element} elem\n */\nproto.ignore = function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n item.isIgnored = true;\n }\n};\n\n/**\n * return item to layout collection\n * @param {Element} elem\n */\nproto.unignore = function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n delete item.isIgnored;\n }\n};\n\n/**\n * adds elements to stamps\n * @param {NodeList, Array, Element, or String} elems\n */\nproto.stamp = function( elems ) {\n elems = this._find( elems );\n if ( !elems ) {\n return;\n }\n\n this.stamps = this.stamps.concat( elems );\n // ignore\n elems.forEach( this.ignore, this );\n};\n\n/**\n * removes elements to stamps\n * @param {NodeList, Array, or Element} elems\n */\nproto.unstamp = function( elems ) {\n elems = this._find( elems );\n if ( !elems ){\n return;\n }\n\n elems.forEach( function( elem ) {\n // filter out removed stamp elements\n utils.removeFrom( this.stamps, elem );\n this.unignore( elem );\n }, this );\n};\n\n/**\n * finds child elements\n * @param {NodeList, Array, Element, or String} elems\n * @returns {Array} elems\n */\nproto._find = function( elems ) {\n if ( !elems ) {\n return;\n }\n // if string, use argument as selector string\n if ( typeof elems == 'string' ) {\n elems = this.element.querySelectorAll( elems );\n }\n elems = utils.makeArray( elems );\n return elems;\n};\n\nproto._manageStamps = function() {\n if ( !this.stamps || !this.stamps.length ) {\n return;\n }\n\n this._getBoundingRect();\n\n this.stamps.forEach( this._manageStamp, this );\n};\n\n// update boundingLeft / Top\nproto._getBoundingRect = function() {\n // get bounding rect for container element\n var boundingRect = this.element.getBoundingClientRect();\n var size = this.size;\n this._boundingRect = {\n left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,\n top: boundingRect.top + size.paddingTop + size.borderTopWidth,\n right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),\n bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )\n };\n};\n\n/**\n * @param {Element} stamp\n**/\nproto._manageStamp = noop;\n\n/**\n * get x/y position of element relative to container element\n * @param {Element} elem\n * @returns {Object} offset - has left, top, right, bottom\n */\nproto._getElementOffset = function( elem ) {\n var boundingRect = elem.getBoundingClientRect();\n var thisRect = this._boundingRect;\n var size = getSize( elem );\n var offset = {\n left: boundingRect.left - thisRect.left - size.marginLeft,\n top: boundingRect.top - thisRect.top - size.marginTop,\n right: thisRect.right - boundingRect.right - size.marginRight,\n bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom\n };\n return offset;\n};\n\n// -------------------------- resize -------------------------- //\n\n// enable event handlers for listeners\n// i.e. resize -> onresize\nproto.handleEvent = utils.handleEvent;\n\n/**\n * Bind layout to window resizing\n */\nproto.bindResize = function() {\n window.addEventListener( 'resize', this );\n this.isResizeBound = true;\n};\n\n/**\n * Unbind layout to window resizing\n */\nproto.unbindResize = function() {\n window.removeEventListener( 'resize', this );\n this.isResizeBound = false;\n};\n\nproto.onresize = function() {\n this.resize();\n};\n\nutils.debounceMethod( Outlayer, 'onresize', 100 );\n\nproto.resize = function() {\n // don't trigger if size did not change\n // or if resize was unbound. See #9\n if ( !this.isResizeBound || !this.needsResizeLayout() ) {\n return;\n }\n\n this.layout();\n};\n\n/**\n * check if layout is needed post layout\n * @returns Boolean\n */\nproto.needsResizeLayout = function() {\n var size = getSize( this.element );\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var hasSizes = this.size && size;\n return hasSizes && size.innerWidth !== this.size.innerWidth;\n};\n\n// -------------------------- methods -------------------------- //\n\n/**\n * add items to Outlayer instance\n * @param {Array or NodeList or Element} elems\n * @returns {Array} items - Outlayer.Items\n**/\nproto.addItems = function( elems ) {\n var items = this._itemize( elems );\n // add items to collection\n if ( items.length ) {\n this.items = this.items.concat( items );\n }\n return items;\n};\n\n/**\n * Layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\nproto.appended = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // layout and reveal just the new items\n this.layoutItems( items, true );\n this.reveal( items );\n};\n\n/**\n * Layout prepended elements\n * @param {Array or NodeList or Element} elems\n */\nproto.prepended = function( elems ) {\n var items = this._itemize( elems );\n if ( !items.length ) {\n return;\n }\n // add items to beginning of collection\n var previousItems = this.items.slice(0);\n this.items = items.concat( previousItems );\n // start new layout\n this._resetLayout();\n this._manageStamps();\n // layout new stuff without transition\n this.layoutItems( items, true );\n this.reveal( items );\n // layout previous items\n this.layoutItems( previousItems );\n};\n\n/**\n * reveal a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.reveal = function( items ) {\n this._emitCompleteOnItems( 'reveal', items );\n if ( !items || !items.length ) {\n return;\n }\n var stagger = this.updateStagger();\n items.forEach( function( item, i ) {\n item.stagger( i * stagger );\n item.reveal();\n });\n};\n\n/**\n * hide a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.hide = function( items ) {\n this._emitCompleteOnItems( 'hide', items );\n if ( !items || !items.length ) {\n return;\n }\n var stagger = this.updateStagger();\n items.forEach( function( item, i ) {\n item.stagger( i * stagger );\n item.hide();\n });\n};\n\n/**\n * reveal item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.revealItemElements = function( elems ) {\n var items = this.getItems( elems );\n this.reveal( items );\n};\n\n/**\n * hide item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.hideItemElements = function( elems ) {\n var items = this.getItems( elems );\n this.hide( items );\n};\n\n/**\n * get Outlayer.Item, given an Element\n * @param {Element} elem\n * @param {Function} callback\n * @returns {Outlayer.Item} item\n */\nproto.getItem = function( elem ) {\n // loop through items to get the one that matches\n for ( var i=0; i < this.items.length; i++ ) {\n var item = this.items[i];\n if ( item.element == elem ) {\n // return item\n return item;\n }\n }\n};\n\n/**\n * get collection of Outlayer.Items, given Elements\n * @param {Array} elems\n * @returns {Array} items - Outlayer.Items\n */\nproto.getItems = function( elems ) {\n elems = utils.makeArray( elems );\n var items = [];\n elems.forEach( function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n items.push( item );\n }\n }, this );\n\n return items;\n};\n\n/**\n * remove element(s) from instance and DOM\n * @param {Array or NodeList or Element} elems\n */\nproto.remove = function( elems ) {\n var removeItems = this.getItems( elems );\n\n this._emitCompleteOnItems( 'remove', removeItems );\n\n // bail if no items to remove\n if ( !removeItems || !removeItems.length ) {\n return;\n }\n\n removeItems.forEach( function( item ) {\n item.remove();\n // remove item from collection\n utils.removeFrom( this.items, item );\n }, this );\n};\n\n// ----- destroy ----- //\n\n// remove and disable Outlayer instance\nproto.destroy = function() {\n // clean up dynamic styles\n var style = this.element.style;\n style.height = '';\n style.position = '';\n style.width = '';\n // destroy items\n this.items.forEach( function( item ) {\n item.destroy();\n });\n\n this.unbindResize();\n\n var id = this.element.outlayerGUID;\n delete instances[ id ]; // remove reference to instance by id\n delete this.element.outlayerGUID;\n // remove data for jQuery\n if ( jQuery ) {\n jQuery.removeData( this.element, this.constructor.namespace );\n }\n\n};\n\n// -------------------------- data -------------------------- //\n\n/**\n * get Outlayer instance from element\n * @param {Element} elem\n * @returns {Outlayer}\n */\nOutlayer.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.outlayerGUID;\n return id && instances[ id ];\n};\n\n\n// -------------------------- create Outlayer class -------------------------- //\n\n/**\n * create a layout class\n * @param {String} namespace\n */\nOutlayer.create = function( namespace, options ) {\n // sub-class Outlayer\n var Layout = subclass( Outlayer );\n // apply new options and compatOptions\n Layout.defaults = utils.extend( {}, Outlayer.defaults );\n utils.extend( Layout.defaults, options );\n Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions );\n\n Layout.namespace = namespace;\n\n Layout.data = Outlayer.data;\n\n // sub-class Item\n Layout.Item = subclass( Item );\n\n // -------------------------- declarative -------------------------- //\n\n utils.htmlInit( Layout, namespace );\n\n // -------------------------- jQuery bridge -------------------------- //\n\n // make into jQuery plugin\n if ( jQuery && jQuery.bridget ) {\n jQuery.bridget( namespace, Layout );\n }\n\n return Layout;\n};\n\nfunction subclass( Parent ) {\n function SubClass() {\n Parent.apply( this, arguments );\n }\n\n SubClass.prototype = Object.create( Parent.prototype );\n SubClass.prototype.constructor = SubClass;\n\n return SubClass;\n}\n\n// ----- helpers ----- //\n\n// how many milliseconds are in each unit\nvar msUnits = {\n ms: 1,\n s: 1000\n};\n\n// munge time-like parameter into millisecond number\n// '0.4s' -> 40\nfunction getMilliseconds( time ) {\n if ( typeof time == 'number' ) {\n return time;\n }\n var matches = time.match( /(^\\d*\\.?\\d*)(\\w*)/ );\n var num = matches && matches[1];\n var unit = matches && matches[2];\n if ( !num.length ) {\n return 0;\n }\n num = parseFloat( num );\n var mult = msUnits[ unit ] || 1;\n return num * mult;\n}\n\n// ----- fin ----- //\n\n// back in global\nOutlayer.Item = Item;\n\nreturn Outlayer;\n\n}));\n","/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, window */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\"use strict\";\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // set events hash\n var events = this._events = this._events || {};\n // set listeners array\n var listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( listeners.indexOf( listener ) == -1 ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n var onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n // copy over to avoid interference if .off() in listener\n listeners = listeners.slice(0);\n args = args || [];\n // once stuff\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n for ( var i=0; i < listeners.length; i++ ) {\n var listener = listeners[i]\n var isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n }\n\n return this;\n};\n\nproto.allOff = function() {\n delete this._events;\n delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n","/**\n * MUI CSS/JS jqLite module\n * @module lib/jqLite\n */\n\n'use strict';\n\n\n/**\n * Add a class to an element.\n * @param {Element} element - The DOM element.\n * @param {string} cssClasses - Space separated list of class names.\n */\nfunction jqLiteAddClass(element, cssClasses) {\n if (!cssClasses || !element.setAttribute) return;\n\n var existingClasses = _getExistingClasses(element),\n splitClasses = cssClasses.split(' '),\n cssClass;\n\n for (var i=0; i < splitClasses.length; i++) {\n cssClass = splitClasses[i].trim();\n if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {\n existingClasses += cssClass + ' ';\n }\n }\n \n element.setAttribute('class', existingClasses.trim());\n}\n\n\n/**\n * Get or set CSS properties.\n * @param {Element} element - The DOM element.\n * @param {string} [name] - The property name.\n * @param {string} [value] - The property value.\n */\nfunction jqLiteCss(element, name, value) {\n // Return full style object\n if (name === undefined) {\n return getComputedStyle(element);\n }\n\n var nameType = jqLiteType(name);\n\n // Set multiple values\n if (nameType === 'object') {\n for (var key in name) element.style[_camelCase(key)] = name[key];\n return;\n }\n\n // Set a single value\n if (nameType === 'string' && value !== undefined) {\n element.style[_camelCase(name)] = value;\n }\n\n var styleObj = getComputedStyle(element),\n isArray = (jqLiteType(name) === 'array');\n\n // Read single value\n if (!isArray) return _getCurrCssProp(element, name, styleObj);\n\n // Read multiple values\n var outObj = {},\n key;\n\n for (var i=0; i < name.length; i++) {\n key = name[i];\n outObj[key] = _getCurrCssProp(element, key, styleObj);\n }\n\n return outObj;\n}\n\n\n/**\n * Check if element has class.\n * @param {Element} element - The DOM element.\n * @param {string} cls - The class name string.\n */\nfunction jqLiteHasClass(element, cls) {\n if (!cls || !element.getAttribute) return false;\n return (_getExistingClasses(element).indexOf(' ' + cls + ' ') > -1);\n}\n\n\n/**\n * Return the type of a variable.\n * @param {} somevar - The JavaScript variable.\n */\nfunction jqLiteType(somevar) {\n // handle undefined\n if (somevar === undefined) return 'undefined';\n\n // handle others (of type [object ])\n var typeStr = Object.prototype.toString.call(somevar);\n if (typeStr.indexOf('[object ') === 0) {\n return typeStr.slice(8, -1).toLowerCase();\n } else {\n throw new Error(\"MUI: Could not understand type: \" + typeStr);\n } \n}\n\n\n/**\n * Attach an event handler to a DOM element\n * @param {Element} element - The DOM element.\n * @param {string} events - Space separated event names.\n * @param {Function} callback - The callback function.\n * @param {Boolean} useCapture - Use capture flag.\n */\nfunction jqLiteOn(element, events, callback, useCapture) {\n useCapture = (useCapture === undefined) ? false : useCapture;\n\n var cache = element._muiEventCache = element._muiEventCache || {}; \n\n events.split(' ').map(function(event) {\n // add to DOM\n element.addEventListener(event, callback, useCapture);\n\n // add to cache\n cache[event] = cache[event] || [];\n cache[event].push([callback, useCapture]);\n });\n}\n\n\n/**\n * Remove an event handler from a DOM element\n * @param {Element} element - The DOM element.\n * @param {string} events - Space separated event names.\n * @param {Function} callback - The callback function.\n * @param {Boolean} useCapture - Use capture flag.\n */\nfunction jqLiteOff(element, events, callback, useCapture) {\n useCapture = (useCapture === undefined) ? false : useCapture;\n\n // remove from cache\n var cache = element._muiEventCache = element._muiEventCache || {},\n argsList,\n args,\n i;\n\n events.split(' ').map(function(event) {\n argsList = cache[event] || [];\n\n i = argsList.length;\n while (i--) {\n args = argsList[i];\n\n // remove all events if callback is undefined\n if (callback === undefined ||\n (args[0] === callback && args[1] === useCapture)) {\n\n // remove from cache\n argsList.splice(i, 1);\n \n // remove from DOM\n element.removeEventListener(event, args[0], args[1]);\n }\n }\n });\n}\n\n\n/**\n * Attach an event hander which will only execute once per element per event\n * @param {Element} element - The DOM element.\n * @param {string} events - Space separated event names.\n * @param {Function} callback - The callback function.\n * @param {Boolean} useCapture - Use capture flag.\n */\nfunction jqLiteOne(element, events, callback, useCapture) {\n events.split(' ').map(function(event) {\n jqLiteOn(element, event, function onFn(ev) {\n // execute callback\n if (callback) callback.apply(this, arguments);\n\n // remove wrapper\n jqLiteOff(element, event, onFn, useCapture);\n }, useCapture);\n });\n}\n\n\n/**\n * Get or set horizontal scroll position\n * @param {Element} element - The DOM element\n * @param {number} [value] - The scroll position\n */\nfunction jqLiteScrollLeft(element, value) {\n var win = window;\n\n // get\n if (value === undefined) {\n if (element === win) {\n var docEl = document.documentElement;\n return (win.pageXOffset || docEl.scrollLeft) - (docEl.clientLeft || 0);\n } else {\n return element.scrollLeft;\n }\n }\n\n // set\n if (element === win) win.scrollTo(value, jqLiteScrollTop(win));\n else element.scrollLeft = value;\n}\n\n\n/**\n * Get or set vertical scroll position\n * @param {Element} element - The DOM element\n * @param {number} value - The scroll position\n */\nfunction jqLiteScrollTop(element, value) {\n var win = window;\n\n // get\n if (value === undefined) {\n if (element === win) {\n var docEl = document.documentElement;\n return (win.pageYOffset || docEl.scrollTop) - (docEl.clientTop || 0);\n } else {\n return element.scrollTop;\n }\n }\n\n // set\n if (element === win) win.scrollTo(jqLiteScrollLeft(win), value);\n else element.scrollTop = value;\n}\n\n\n/**\n * Return object representing top/left offset and element height/width.\n * @param {Element} element - The DOM element.\n */\nfunction jqLiteOffset(element) {\n var win = window,\n rect = element.getBoundingClientRect(),\n scrollTop = jqLiteScrollTop(win),\n scrollLeft = jqLiteScrollLeft(win);\n\n return {\n top: rect.top + scrollTop,\n left: rect.left + scrollLeft,\n height: rect.height,\n width: rect.width\n };\n}\n\n\n/**\n * Attach a callback to the DOM ready event listener\n * @param {Function} fn - The callback function.\n */\nfunction jqLiteReady(fn) {\n var done = false,\n top = true,\n doc = document,\n win = doc.defaultView,\n root = doc.documentElement,\n add = doc.addEventListener ? 'addEventListener' : 'attachEvent',\n rem = doc.addEventListener ? 'removeEventListener' : 'detachEvent',\n pre = doc.addEventListener ? '' : 'on';\n\n var init = function(e) {\n if (e.type == 'readystatechange' && doc.readyState != 'complete') {\n return;\n }\n\n (e.type == 'load' ? win : doc)[rem](pre + e.type, init, false);\n if (!done && (done = true)) fn.call(win, e.type || e);\n };\n\n var poll = function() {\n try { root.doScroll('left'); } catch(e) { setTimeout(poll, 50); return; }\n init('poll');\n };\n\n if (doc.readyState == 'complete') {\n fn.call(win, 'lazy');\n } else {\n if (doc.createEventObject && root.doScroll) {\n try { top = !win.frameElement; } catch(e) { }\n if (top) poll();\n }\n doc[add](pre + 'DOMContentLoaded', init, false);\n doc[add](pre + 'readystatechange', init, false);\n win[add](pre + 'load', init, false);\n }\n}\n\n\n/**\n * Remove classes from a DOM element\n * @param {Element} element - The DOM element.\n * @param {string} cssClasses - Space separated list of class names.\n */\nfunction jqLiteRemoveClass(element, cssClasses) {\n if (!cssClasses || !element.setAttribute) return;\n\n var existingClasses = _getExistingClasses(element),\n splitClasses = cssClasses.split(' '),\n cssClass;\n \n for (var i=0; i < splitClasses.length; i++) {\n cssClass = splitClasses[i].trim();\n while (existingClasses.indexOf(' ' + cssClass + ' ') >= 0) {\n existingClasses = existingClasses.replace(' ' + cssClass + ' ', ' ');\n }\n }\n\n element.setAttribute('class', existingClasses.trim());\n}\n\n\n// ------------------------------\n// Utilities\n// ------------------------------\nvar SPECIAL_CHARS_REGEXP = /([\\:\\-\\_]+(.))/g,\n MOZ_HACK_REGEXP = /^moz([A-Z])/,\n ESCAPE_REGEXP = /([.*+?^=!:${}()|\\[\\]\\/\\\\])/g;\n\n\nfunction _getExistingClasses(element) {\n var classes = (element.getAttribute('class') || '').replace(/[\\n\\t]/g, '');\n return ' ' + classes + ' ';\n}\n\n\nfunction _camelCase(name) {\n return name.\n replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {\n return offset ? letter.toUpperCase() : letter;\n }).\n replace(MOZ_HACK_REGEXP, 'Moz$1');\n}\n\n\nfunction _escapeRegExp(string) {\n return string.replace(ESCAPE_REGEXP, \"\\\\$1\");\n}\n\n\nfunction _getCurrCssProp(elem, name, computed) {\n var ret;\n\n // try computed style\n ret = computed.getPropertyValue(name);\n\n // try style attribute (if element is not attached to document)\n if (ret === '' && !elem.ownerDocument) ret = elem.style[_camelCase(name)];\n\n return ret;\n}\n\n\n/**\n * Module API\n */\nmodule.exports = {\n /** Add classes */\n addClass: jqLiteAddClass,\n\n /** Get or set CSS properties */\n css: jqLiteCss,\n\n /** Check for class */\n hasClass: jqLiteHasClass,\n\n /** Remove event handlers */\n off: jqLiteOff,\n\n /** Return offset values */\n offset: jqLiteOffset,\n\n /** Add event handlers */\n on: jqLiteOn,\n\n /** Add an execute-once event handler */\n one: jqLiteOne,\n\n /** DOM ready event handler */\n ready: jqLiteReady,\n\n /** Remove classes */\n removeClass: jqLiteRemoveClass,\n\n /** Check JavaScript variable instance type */\n type: jqLiteType,\n\n /** Get or set horizontal scroll position */\n scrollLeft: jqLiteScrollLeft,\n\n /** Get or set vertical scroll position */\n scrollTop: jqLiteScrollTop\n};\n","// e669-neo\n// © 2023 Cameron Seid\n\nlet defaultCorsProxy = \"https://cors.e669.fun/\";\n\n// Reads a cookie from the browser\nlet readCookie = function (key: string): string | null {\n\n if (\n document.cookie.split(\";\").some((item) => item.trim().startsWith(key + \"=\"))\n ) {\n // cookie exists, return text\n return document.cookie.substring(document.cookie.indexOf(key) + key.length + 1).split(\";\")[0];\n } else {\n // cookie does not exist, return null\n return null\n }\n\n}\n\n// TODO: GDPR notice about this\n// Writes a cookie to the browser\nlet writeCookie = function (key: string, value: string) {\n document.cookie = key + \"=\" + value + \"; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/\";\n}\n\n// this generic post object allows us to interface with posts regardless of which API they came from\n// TODO: tags should be its own object (interface?) with some per-tag metadata (category, button color)\nclass Post {\n constructor(\n public fileUrl: string, // direct link to file\n public pageUrl: string, // page URL on original site\n public previewUrl: string, // smallest preview\n public sampleUrl: string, // middle preview\n public hasSample: boolean, // does it have a sample? fallback to preview if not\n public fileType: string, // file extension\n public width: number, // width\n public height: number, // height\n ) { }\n}\n\n// init user settings, reading from cookies if they exist\nlet userSettings = new Map([\n // Results per page\n [\"pageSize\", readCookie('pageSize') || \"30\"],\n // Grid size on small screens\n [\"gridSizeSmall\", readCookie('gridSizeSmall') || \"49\"],\n // Grid size on large screens\n [\"gridSizeLarge\", readCookie('gridSizeLarge') || \"23.5\"],\n // Allow 18+ results\n [\"disableAgeRestrict\", readCookie('disableAgeRestrict') || \"false\"],\n // URL of cors proxy (https://github.com/Rob--W/cors-anywhere)\n // PORT=8765 CORSANYWHERE_WHITELIST=\"https://e669.fun\" node server.js\n [\"corsProxy\", readCookie('corsProxy') || defaultCorsProxy],\n // will the grid show full res or preview?\n [\"previewSize\", readCookie('previewSize') || \"full\"],\n // Derpibooru API key\n [\"derpiApiKey\", readCookie('derpiApiKey') || \"\"],\n]);\n\nconsole.log(userSettings);\n\n// for each value in userSettings, write a cookie\nlet writeSettingsToCookies = function () {\n console.log(\"Writing settings to cookies\", userSettings);\n userSettings.forEach(function (value, key, map) {\n writeCookie(key, value);\n })\n}\n\n// Maps the number of columns to the grid size value necessary to achieve it\nlet gridSizeReference = new Map([\n [1, \"100\"],\n [2, \"49\"],\n [3, \"32\"],\n [4, \"23.5\"],\n [5, \"18.4\"],\n]);\n\nconst Packery = require('packery');\nconst imagesLoaded = require('imagesLoaded');\nconst overlay = require('muicss/lib/js/overlay');\n\n// global variables\n// i have no fucking idea why but if i try to remove the 'export' on this,\n// imagesLoaded fails to load. \nexport let currentQuery = new URLSearchParams(window.location.search); // use .get(), .has()\nlet currentPage: number = parseInt(currentQuery.get(\"page\") || \"1\"); // default to 1\ncurrentQuery.set(\"page\", currentPage.toString());\n\nlet searchBox: HTMLInputElement;\nlet errorBox: HTMLElement = document.getElementById(\"errorbox\") as HTMLElement;\nlet selectorE621: HTMLElement;\nlet selectorDerpibooru: HTMLElement;\nlet selectorSettings: HTMLElement;\nlet websiteDropdownImg: HTMLElement;\nlet settingsModal: HTMLElement;\n\nlet imageDiv: HTMLElement = document.getElementById(\"images\") as HTMLElement;\n\nlet pageSwitcher: HTMLElement = document.getElementById(\"pageSwitcher\") as HTMLElement;\nlet pageSwitcherBottom: HTMLElement = document.getElementById(\"pageSwitcherBottom\") as HTMLElement;\nlet pageNumberDisplay: HTMLElement = document.getElementById(\"pageNumberDisplay\") as HTMLElement;\n\n// these will be defined later because of how we copy the div\nlet pageNext: NodeListOf;\nlet pagePrevious: NodeListOf;\n\nlet hithere: HTMLElement = document.getElementById(\"hithere\") as HTMLElement;\n\n// results\nlet resultsE621;\n\nenum API {\n E621,\n DERPIBOORU,\n}\n\nlet currentApi: API = API.E621;\n\n// reload page with new parameters\nlet reloadPage = function () {\n\n let newLocation = window.location.toString();\n newLocation = newLocation.replace('/#', '/'); // sometimes we get a # at the end that fucks things up\n\n location.href =\n newLocation.split(\"?\")[0] +\n \"?\" +\n currentQuery.toString();\n}\n\n// check if viewport dimensions are mobile-sized\nlet isMobile = function () {\n return window.innerWidth < 768;\n}\n\n// show an error in the errorBox\nlet showError = function (err: Error) {\n errorBox.innerHTML +=\n \"\" + err + \"
\";\n}\n\n// resize the grid of images\nlet resizeGrid = function (size: string) {\n const gridsizers = document.querySelectorAll(\".grid-sizer\");\n const griditems = document.querySelectorAll(\".grid-item\");\n // combine all of them together since we're doing the same thing to all of them\n const elements = Array.from(gridsizers).concat(Array.from(griditems));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i] as HTMLElement;\n // set 'width' to the given size\n element.style.width = size;\n }\n}\n\n// keep currentApi variable in sync with URL parameters\nlet updateApiFromQuery = function () {\n if (currentQuery.has(\"api\")) {\n let currentQueryString: string = currentQuery.get(\"api\") as string;\n switch (currentQueryString.toUpperCase()) {\n case \"DERPIBOORU\":\n currentApi = API.DERPIBOORU;\n break;\n case \"E621\":\n currentApi = API.E621;\n break;\n default:\n currentApi = API.E621;\n break;\n }\n } else {\n currentQuery.set(\"api\", \"E621\");\n currentApi = API.E621;\n }\n}\n\nupdateApiFromQuery();\n\n// grab header.html and insert to div\nfetch(\"header.html\")\n .then((data) => data.text()) // parse text\n .then(function (text) {\n\n // redunantly run this again because async bullshit \n updateApiFromQuery();\n\n // add header contents to page\n let header: HTMLElement = document.getElementById(\"header\") as HTMLElement;\n header.innerHTML = text\n\n // set up our dom elements\n selectorE621 = document.getElementById(\"selectorE621\") as HTMLElement;\n selectorDerpibooru = document.getElementById(\"selectorDerpibooru\") as HTMLElement;\n selectorSettings = document.getElementById(\"selectorSettings\") as HTMLElement;\n websiteDropdownImg = document.getElementById(\"websiteDropdown\") as HTMLElement;\n searchBox = document.getElementById(\"searchBox\") as HTMLInputElement;\n settingsModal = document.getElementById(\"settingsModal\") as HTMLElement;\n\n // funny secret message\n hithere.innerHTML = \"hi there ;)\";\n\n // init searchbox\n searchBox.addEventListener(\"keydown\", function (event) {\n // enter was pressed\n if (event.keyCode == 13) {\n currentQuery.set(\"search\", searchBox.value)\n currentQuery.set(\"page\", \"1\");\n reloadPage();\n }\n });\n\n // set the image in the corner to the respective site icon\n switch (currentApi) {\n case API.DERPIBOORU:\n websiteDropdownImg.setAttribute(\"src\", \"assets/derpi-icon.png\");\n break;\n case API.E621:\n websiteDropdownImg.setAttribute(\"src\", \"assets/e621-icon.png\");\n break;\n }\n\n // switch to e621 api when clicked\n selectorE621.onclick = function () {\n currentQuery.set(\"api\", \"E621\");\n currentQuery.set(\"search\", searchBox.value)\n\n reloadPage();\n };\n\n // switch to derpi api when clicked\n selectorDerpibooru.onclick = function () {\n currentQuery.set(\"api\", \"derpibooru\");\n currentQuery.set(\"search\", searchBox.value)\n\n reloadPage();\n };\n\n // show settings modal when we click this\n selectorSettings.onclick = function () {\n // TODO: reset to defaults button\n\n // clone the settings modal to a temporary copy\n // we have to do this because mui deletes it when we close the modal\n let settingsActive = settingsModal.cloneNode(true) as HTMLElement;\n document.body.appendChild(settingsActive);\n settingsActive.hidden = false;\n\n // grab the fields from the copy\n let pageSizeInput = settingsActive.querySelector(\"#pageSizeInput\") as HTMLInputElement;\n let saveSettingsButton = settingsActive.querySelector(\"#saveSettings\") as HTMLButtonElement;\n let ageRestrictSettingInput = settingsActive.querySelector(\"#ageRestrictSettingInput\") as HTMLInputElement;\n let corsProxyInput = settingsActive.querySelector(\"#corsProxyInput\") as HTMLInputElement;\n let largeDisplayButtons = Array.from(settingsActive.querySelectorAll(\"input[name='largeDisplayColumns']\")) as HTMLInputElement[];\n let smallDisplayButtons = Array.from(settingsActive.querySelectorAll(\"input[name='smallDisplayColumns']\")) as HTMLInputElement[];\n let imageSizeButtons = Array.from(settingsActive.querySelectorAll(\"input[name='imageSize']\")) as HTMLInputElement[];\n let derpiApiKeyInput = settingsActive.querySelector(\"#derpiApiKeyInput\") as HTMLInputElement;\n\n // populate the inputs with the existing settings\n pageSizeInput.value = userSettings.get(\"pageSize\") || \"30\";\n corsProxyInput.value = userSettings.get(\"corsProxy\") || defaultCorsProxy;\n derpiApiKeyInput.value = userSettings.get(\"derpiApiKey\") || \"\";\n\n let ageRestrictSetting = false;\n if (userSettings.get(\"disableAgeRestrict\") === 'true') {\n ageRestrictSetting = true;\n }\n\n ageRestrictSettingInput.checked = ageRestrictSetting;\n\n // do this when we close the settings\n let closeSettings = function () {\n\n // check pageSize and make sure it's within a valid range\n let pageSizeValue = parseInt(pageSizeInput.value);\n if (pageSizeValue < 0) pageSizeValue = 0;\n if (pageSizeValue > 320) pageSizeValue = 320; // this is e621's upper limit\n // TODO: check this while doing the search\n // TODO: check this against derpi's limit\n\n // check the large display columns buttons\n let largeDisplayValue: number = 0;\n for (const radioButton of largeDisplayButtons) {\n if (radioButton.checked) {\n largeDisplayValue = parseInt(radioButton.value);\n break;\n }\n }\n\n // check the small display columns buttons\n let smallDisplayValue: number = 0;\n for (const radioButton of smallDisplayButtons) {\n if (radioButton.checked) {\n smallDisplayValue = parseInt(radioButton.value);\n break;\n }\n }\n\n // check the preview size buttons\n let imageSizeValue: string = \"full\";\n for (const radioButton of imageSizeButtons) {\n if (radioButton.checked) {\n imageSizeValue = radioButton.value;\n break;\n }\n }\n\n // make sure the CORS proxy URL has a slash at the end\n let corsProxyValue = corsProxyInput.value;\n if (!corsProxyValue.endsWith('/')) corsProxyValue += '/';\n\n // update settings object\n userSettings.set(\"pageSize\", pageSizeValue.toString());\n userSettings.set(\"disableAgeRestrict\", ageRestrictSettingInput.checked.toString());\n userSettings.set(\"corsProxy\", corsProxyValue);\n userSettings.set(\"gridSizeLarge\", gridSizeReference.get(largeDisplayValue) || \"23.5\");\n userSettings.set(\"gridSizeSmall\", gridSizeReference.get(smallDisplayValue) || \"49\");\n userSettings.set(\"previewSize\", imageSizeValue);\n userSettings.set(\"derpiApiKey\", derpiApiKeyInput.value);\n\n // write these into the cookies\n writeSettingsToCookies();\n\n }\n\n // overlay('off') will call closeSettings()\n saveSettingsButton.onclick = function () { overlay('off'); };\n\n // show the modal\n overlay('on', {\n 'onclose': closeSettings,\n }, settingsActive);\n }\n\n // put the search query into the searchbox\n if (currentQuery.has(\"search\")) {\n searchBox.value = currentQuery.get(\"search\") as string;\n }\n\n })\n\n// automatically populate results if there is a search query\nlet search: string = currentQuery.get(\"search\") || \"\";\nif (search != \"\") {\n\n console.log(\"Search query found: \" + search);\n\n // this will be an e6 search\n if (currentApi == API.E621) {\n // TODO: separate common tasks into functions for easy porting to other APIs\n\n // TODO: use user's API key from settings\n let url =\n \"https://e621.net/posts.json?page=\" + currentPage\n + \"&limit=\" + userSettings.get(\"pageSize\")\n + \"&tags=\" + search.replace(/ /g, '%20')\n\n // add the rating:safe tag if the user hasn't allowed 18+ results\n if (!(userSettings.get(\"disableAgeRestrict\") === 'true')) {\n console.log(\"User has not enabled 18+ content. Adding safe tag...\");\n url += \"%20rating:safe\";\n }\n\n console.log(\"Request URL: \" + url);\n\n // TODO: detect when this finishes so a loading wheel can be displayed\n // display the wheel as soon as we detect a search, hide it once packery is populated\n\n // send the request\n fetch(userSettings.get(\"corsProxy\") + url)\n .then(function (response) {\n return response.json();\n })\n .then(function (results) {\n resultsE621 = results.posts;\n\n if (resultsE621.length < 1) showError(new Error(\"No results received.\"));\n\n // cycle through each result\n for (let i = 0; i < resultsE621.length; i++) {\n\n let currentPost = new Post(\n resultsE621[i].file.url,\n \"https://e621.net/posts/\" + resultsE621[i].id,\n resultsE621[i].preview.url,\n resultsE621[i].sample.url,\n resultsE621[i].sample.has,\n resultsE621[i].file.ext,\n resultsE621[i].file.width,\n resultsE621[i].file.height\n )\n\n const imgElement = document.createElement(\"img\");\n imgElement.classList.add(\"outline\", \"drophover\", \"grid-item\");\n\n // SWFs and webms don't show in tags, so we handle those separately\n switch (currentPost.fileType) {\n case \"swf\":\n case \"webm\":\n // TODO: overlay to indicate this is a webm\n if (currentPost.hasSample) {\n imgElement.setAttribute(\"src\", currentPost.sampleUrl);\n } else {\n // SWF files will display \"Flash\"\n imgElement.setAttribute(\"src\", currentPost.previewUrl);\n }\n break;\n default:\n // check user setting for image size\n if (userSettings.get(\"previewSize\") == \"full\") {\n imgElement.setAttribute(\"src\", currentPost.fileUrl);\n } else {\n imgElement.setAttribute(\"src\", currentPost.sampleUrl);\n }\n break;\n }\n\n // set up the post view modal\n imgElement.onclick = function () {\n console.log(currentPost);\n\n // TODO: construct the HTML elements with a method of the Post class\n }\n\n // add to grid\n imageDiv.appendChild(imgElement);\n }\n\n // TODO: move everything below here into a generic function that can be called from the other API handlers\n\n // prepare the page switchers\n pageSwitcher.style.display = \"flex\";\n pageSwitcherBottom.style.display = \"flex\";\n pageNumberDisplay.innerHTML = currentPage.toString();\n\n // copy the page switcher below the image grid\n pageSwitcherBottom.innerHTML = pageSwitcher.innerHTML;\n\n // gather all of the page switcher buttons\n pageNext = document.getElementsByName(\"pageNext\");\n pagePrevious = document.getElementsByName(\"pagePrevious\");\n\n // make the page buttons work\n for (let i = 0; i < pageNext.length; i++) {\n pageNext[i].onclick = function (event) {\n currentQuery.set(\"page\", (++currentPage).toString());\n reloadPage();\n }\n }\n\n for (let i = 0; i < pagePrevious.length; i++) {\n pagePrevious[i].onclick = function (event) {\n currentQuery.set(\"page\", (--currentPage).toString());\n reloadPage();\n }\n }\n\n initPackery();\n\n })\n .catch(function (err) {\n showError(err);\n throw err;\n });\n\n }\n\n}\n\n// This is all wrapped in a function so we can initiate it after the images have been retrieved\nlet initPackery = function () {\n\n // initialize the Packery grid\n var grid = document.querySelector('.grid');\n var pckry = new Packery(grid, {\n itemSelector: '.grid-item',\n gutter: '.gutter-sizer',\n columnWidth: '.grid-sizer',\n percentPosition: true,\n transitionDuration: '0.1s',\n });\n\n // layout Packery after each image loads\n imagesLoaded(grid).on('progress', function () {\n pckry.layout();\n });\n\n // make the images larger if we have a mobile-sized window\n if (isMobile()) {\n resizeGrid(userSettings.get(\"gridSizeSmall\") + \"%\");\n } else {\n resizeGrid(userSettings.get(\"gridSizeLarge\") + \"%\");\n }\n\n // Add an event listener for the resize event\n window.addEventListener('resize', function (event) {\n\n if (!isMobile()) {\n resizeGrid(userSettings.get(\"gridSizeLarge\") + \"%\");\n } else {\n resizeGrid(userSettings.get(\"gridSizeSmall\") + \"%\");\n }\n\n pckry.layout();\n });\n\n}\n","/*!\n * Packery v2.1.2\n * Gapless, draggable grid layouts\n *\n * Licensed GPLv3 for open source use\n * or Packery Commercial License for commercial use\n *\n * http://packery.metafizzy.co\n * Copyright 2013-2018 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'get-size/get-size',\n 'outlayer/outlayer',\n './rect',\n './packer',\n './item'\n ],\n factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('get-size'),\n require('outlayer'),\n require('./rect'),\n require('./packer'),\n require('./item')\n );\n } else {\n // browser global\n window.Packery = factory(\n window.getSize,\n window.Outlayer,\n window.Packery.Rect,\n window.Packery.Packer,\n window.Packery.Item\n );\n }\n\n}( window, function factory( getSize, Outlayer, Rect, Packer, Item ) {\n'use strict';\n\n// ----- Rect ----- //\n\n// allow for pixel rounding errors IE8-IE11 & Firefox; #227\nRect.prototype.canFit = function( rect ) {\n return this.width >= rect.width - 1 && this.height >= rect.height - 1;\n};\n\n// -------------------------- Packery -------------------------- //\n\n// create an Outlayer layout class\nvar Packery = Outlayer.create('packery');\nPackery.Item = Item;\n\nvar proto = Packery.prototype;\n\nproto._create = function() {\n // call super\n Outlayer.prototype._create.call( this );\n\n // initial properties\n this.packer = new Packer();\n // packer for drop targets\n this.shiftPacker = new Packer();\n this.isEnabled = true;\n\n this.dragItemCount = 0;\n\n // create drag handlers\n var _this = this;\n this.handleDraggabilly = {\n dragStart: function() {\n _this.itemDragStart( this.element );\n },\n dragMove: function() {\n _this.itemDragMove( this.element, this.position.x, this.position.y );\n },\n dragEnd: function() {\n _this.itemDragEnd( this.element );\n }\n };\n\n this.handleUIDraggable = {\n start: function handleUIDraggableStart( event, ui ) {\n // HTML5 may trigger dragstart, dismiss HTML5 dragging\n if ( !ui ) {\n return;\n }\n _this.itemDragStart( event.currentTarget );\n },\n drag: function handleUIDraggableDrag( event, ui ) {\n if ( !ui ) {\n return;\n }\n _this.itemDragMove( event.currentTarget, ui.position.left, ui.position.top );\n },\n stop: function handleUIDraggableStop( event, ui ) {\n if ( !ui ) {\n return;\n }\n _this.itemDragEnd( event.currentTarget );\n }\n };\n\n};\n\n\n// ----- init & layout ----- //\n\n/**\n * logic before any new layout\n */\nproto._resetLayout = function() {\n this.getSize();\n\n this._getMeasurements();\n\n // reset packer\n var width, height, sortDirection;\n // packer settings, if horizontal or vertical\n if ( this._getOption('horizontal') ) {\n width = Infinity;\n height = this.size.innerHeight + this.gutter;\n sortDirection = 'rightwardTopToBottom';\n } else {\n width = this.size.innerWidth + this.gutter;\n height = Infinity;\n sortDirection = 'downwardLeftToRight';\n }\n\n this.packer.width = this.shiftPacker.width = width;\n this.packer.height = this.shiftPacker.height = height;\n this.packer.sortDirection = this.shiftPacker.sortDirection = sortDirection;\n\n this.packer.reset();\n\n // layout\n this.maxY = 0;\n this.maxX = 0;\n};\n\n/**\n * update columnWidth, rowHeight, & gutter\n * @private\n */\nproto._getMeasurements = function() {\n this._getMeasurement( 'columnWidth', 'width' );\n this._getMeasurement( 'rowHeight', 'height' );\n this._getMeasurement( 'gutter', 'width' );\n};\n\nproto._getItemLayoutPosition = function( item ) {\n this._setRectSize( item.element, item.rect );\n if ( this.isShifting || this.dragItemCount > 0 ) {\n var packMethod = this._getPackMethod();\n this.packer[ packMethod ]( item.rect );\n } else {\n this.packer.pack( item.rect );\n }\n\n this._setMaxXY( item.rect );\n return item.rect;\n};\n\nproto.shiftLayout = function() {\n this.isShifting = true;\n this.layout();\n delete this.isShifting;\n};\n\nproto._getPackMethod = function() {\n return this._getOption('horizontal') ? 'rowPack' : 'columnPack';\n};\n\n\n/**\n * set max X and Y value, for size of container\n * @param {Packery.Rect} rect\n * @private\n */\nproto._setMaxXY = function( rect ) {\n this.maxX = Math.max( rect.x + rect.width, this.maxX );\n this.maxY = Math.max( rect.y + rect.height, this.maxY );\n};\n\n/**\n * set the width and height of a rect, applying columnWidth and rowHeight\n * @param {Element} elem\n * @param {Packery.Rect} rect\n */\nproto._setRectSize = function( elem, rect ) {\n var size = getSize( elem );\n var w = size.outerWidth;\n var h = size.outerHeight;\n // size for columnWidth and rowHeight, if available\n // only check if size is non-zero, #177\n if ( w || h ) {\n w = this._applyGridGutter( w, this.columnWidth );\n h = this._applyGridGutter( h, this.rowHeight );\n }\n // rect must fit in packer\n rect.width = Math.min( w, this.packer.width );\n rect.height = Math.min( h, this.packer.height );\n};\n\n/**\n * fits item to columnWidth/rowHeight and adds gutter\n * @param {Number} measurement - item width or height\n * @param {Number} gridSize - columnWidth or rowHeight\n * @returns measurement\n */\nproto._applyGridGutter = function( measurement, gridSize ) {\n // just add gutter if no gridSize\n if ( !gridSize ) {\n return measurement + this.gutter;\n }\n gridSize += this.gutter;\n // fit item to columnWidth/rowHeight\n var remainder = measurement % gridSize;\n var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';\n measurement = Math[ mathMethod ]( measurement / gridSize ) * gridSize;\n return measurement;\n};\n\nproto._getContainerSize = function() {\n if ( this._getOption('horizontal') ) {\n return {\n width: this.maxX - this.gutter\n };\n } else {\n return {\n height: this.maxY - this.gutter\n };\n }\n};\n\n\n// -------------------------- stamp -------------------------- //\n\n/**\n * makes space for element\n * @param {Element} elem\n */\nproto._manageStamp = function( elem ) {\n\n var item = this.getItem( elem );\n var rect;\n if ( item && item.isPlacing ) {\n rect = item.rect;\n } else {\n var offset = this._getElementOffset( elem );\n rect = new Rect({\n x: this._getOption('originLeft') ? offset.left : offset.right,\n y: this._getOption('originTop') ? offset.top : offset.bottom\n });\n }\n\n this._setRectSize( elem, rect );\n // save its space in the packer\n this.packer.placed( rect );\n this._setMaxXY( rect );\n};\n\n// -------------------------- methods -------------------------- //\n\nfunction verticalSorter( a, b ) {\n return a.position.y - b.position.y || a.position.x - b.position.x;\n}\n\nfunction horizontalSorter( a, b ) {\n return a.position.x - b.position.x || a.position.y - b.position.y;\n}\n\nproto.sortItemsByPosition = function() {\n var sorter = this._getOption('horizontal') ? horizontalSorter : verticalSorter;\n this.items.sort( sorter );\n};\n\n/**\n * Fit item element in its current position\n * Packery will position elements around it\n * useful for expanding elements\n *\n * @param {Element} elem\n * @param {Number} x - horizontal destination position, optional\n * @param {Number} y - vertical destination position, optional\n */\nproto.fit = function( elem, x, y ) {\n var item = this.getItem( elem );\n if ( !item ) {\n return;\n }\n\n // stamp item to get it out of layout\n this.stamp( item.element );\n // set placing flag\n item.enablePlacing();\n this.updateShiftTargets( item );\n // fall back to current position for fitting\n x = x === undefined ? item.rect.x: x;\n y = y === undefined ? item.rect.y: y;\n // position it best at its destination\n this.shift( item, x, y );\n this._bindFitEvents( item );\n item.moveTo( item.rect.x, item.rect.y );\n // layout everything else\n this.shiftLayout();\n // return back to regularly scheduled programming\n this.unstamp( item.element );\n this.sortItemsByPosition();\n item.disablePlacing();\n};\n\n/**\n * emit event when item is fit and other items are laid out\n * @param {Packery.Item} item\n * @private\n */\nproto._bindFitEvents = function( item ) {\n var _this = this;\n var ticks = 0;\n function onLayout() {\n ticks++;\n if ( ticks != 2 ) {\n return;\n }\n _this.dispatchEvent( 'fitComplete', null, [ item ] );\n }\n // when item is laid out\n item.once( 'layout', onLayout );\n // when all items are laid out\n this.once( 'layoutComplete', onLayout );\n};\n\n// -------------------------- resize -------------------------- //\n\n// debounced, layout on resize\nproto.resize = function() {\n // don't trigger if size did not change\n // or if resize was unbound. See #285, outlayer#9\n if ( !this.isResizeBound || !this.needsResizeLayout() ) {\n return;\n }\n\n if ( this.options.shiftPercentResize ) {\n this.resizeShiftPercentLayout();\n } else {\n this.layout();\n }\n};\n\n/**\n * check if layout is needed post layout\n * @returns Boolean\n */\nproto.needsResizeLayout = function() {\n var size = getSize( this.element );\n var innerSize = this._getOption('horizontal') ? 'innerHeight' : 'innerWidth';\n return size[ innerSize ] != this.size[ innerSize ];\n};\n\nproto.resizeShiftPercentLayout = function() {\n var items = this._getItemsForLayout( this.items );\n\n var isHorizontal = this._getOption('horizontal');\n var coord = isHorizontal ? 'y' : 'x';\n var measure = isHorizontal ? 'height' : 'width';\n var segmentName = isHorizontal ? 'rowHeight' : 'columnWidth';\n var innerSize = isHorizontal ? 'innerHeight' : 'innerWidth';\n\n // proportional re-align items\n var previousSegment = this[ segmentName ];\n previousSegment = previousSegment && previousSegment + this.gutter;\n\n if ( previousSegment ) {\n this._getMeasurements();\n var currentSegment = this[ segmentName ] + this.gutter;\n items.forEach( function( item ) {\n var seg = Math.round( item.rect[ coord ] / previousSegment );\n item.rect[ coord ] = seg * currentSegment;\n });\n } else {\n var currentSize = getSize( this.element )[ innerSize ] + this.gutter;\n var previousSize = this.packer[ measure ];\n items.forEach( function( item ) {\n item.rect[ coord ] = ( item.rect[ coord ] / previousSize ) * currentSize;\n });\n }\n\n this.shiftLayout();\n};\n\n// -------------------------- drag -------------------------- //\n\n/**\n * handle an item drag start event\n * @param {Element} elem\n */\nproto.itemDragStart = function( elem ) {\n if ( !this.isEnabled ) {\n return;\n }\n this.stamp( elem );\n // this.ignore( elem );\n var item = this.getItem( elem );\n if ( !item ) {\n return;\n }\n\n item.enablePlacing();\n item.showDropPlaceholder();\n this.dragItemCount++;\n this.updateShiftTargets( item );\n};\n\nproto.updateShiftTargets = function( dropItem ) {\n this.shiftPacker.reset();\n\n // pack stamps\n this._getBoundingRect();\n var isOriginLeft = this._getOption('originLeft');\n var isOriginTop = this._getOption('originTop');\n this.stamps.forEach( function( stamp ) {\n // ignore dragged item\n var item = this.getItem( stamp );\n if ( item && item.isPlacing ) {\n return;\n }\n var offset = this._getElementOffset( stamp );\n var rect = new Rect({\n x: isOriginLeft ? offset.left : offset.right,\n y: isOriginTop ? offset.top : offset.bottom\n });\n this._setRectSize( stamp, rect );\n // save its space in the packer\n this.shiftPacker.placed( rect );\n }, this );\n\n // reset shiftTargets\n var isHorizontal = this._getOption('horizontal');\n var segmentName = isHorizontal ? 'rowHeight' : 'columnWidth';\n var measure = isHorizontal ? 'height' : 'width';\n\n this.shiftTargetKeys = [];\n this.shiftTargets = [];\n var boundsSize;\n var segment = this[ segmentName ];\n segment = segment && segment + this.gutter;\n\n if ( segment ) {\n var segmentSpan = Math.ceil( dropItem.rect[ measure ] / segment );\n var segs = Math.floor( ( this.shiftPacker[ measure ] + this.gutter ) / segment );\n boundsSize = ( segs - segmentSpan ) * segment;\n // add targets on top\n for ( var i=0; i < segs; i++ ) {\n var initialX = isHorizontal ? 0 : i * segment;\n var initialY = isHorizontal ? i * segment : 0;\n this._addShiftTarget( initialX, initialY, boundsSize );\n }\n } else {\n boundsSize = ( this.shiftPacker[ measure ] + this.gutter ) - dropItem.rect[ measure ];\n this._addShiftTarget( 0, 0, boundsSize );\n }\n\n // pack each item to measure where shiftTargets are\n var items = this._getItemsForLayout( this.items );\n var packMethod = this._getPackMethod();\n items.forEach( function( item ) {\n var rect = item.rect;\n this._setRectSize( item.element, rect );\n this.shiftPacker[ packMethod ]( rect );\n\n // add top left corner\n this._addShiftTarget( rect.x, rect.y, boundsSize );\n // add bottom left / top right corner\n var cornerX = isHorizontal ? rect.x + rect.width : rect.x;\n var cornerY = isHorizontal ? rect.y : rect.y + rect.height;\n this._addShiftTarget( cornerX, cornerY, boundsSize );\n\n if ( segment ) {\n // add targets for each column on bottom / row on right\n var segSpan = Math.round( rect[ measure ] / segment );\n for ( var i=1; i < segSpan; i++ ) {\n var segX = isHorizontal ? cornerX : rect.x + segment * i;\n var segY = isHorizontal ? rect.y + segment * i : cornerY;\n this._addShiftTarget( segX, segY, boundsSize );\n }\n }\n }, this );\n\n};\n\nproto._addShiftTarget = function( x, y, boundsSize ) {\n var checkCoord = this._getOption('horizontal') ? y : x;\n if ( checkCoord !== 0 && checkCoord > boundsSize ) {\n return;\n }\n // create string for a key, easier to keep track of what targets\n var key = x + ',' + y;\n var hasKey = this.shiftTargetKeys.indexOf( key ) != -1;\n if ( hasKey ) {\n return;\n }\n this.shiftTargetKeys.push( key );\n this.shiftTargets.push({ x: x, y: y });\n};\n\n// -------------------------- drop -------------------------- //\n\nproto.shift = function( item, x, y ) {\n var shiftPosition;\n var minDistance = Infinity;\n var position = { x: x, y: y };\n this.shiftTargets.forEach( function( target ) {\n var distance = getDistance( target, position );\n if ( distance < minDistance ) {\n shiftPosition = target;\n minDistance = distance;\n }\n });\n item.rect.x = shiftPosition.x;\n item.rect.y = shiftPosition.y;\n};\n\nfunction getDistance( a, b ) {\n var dx = b.x - a.x;\n var dy = b.y - a.y;\n return Math.sqrt( dx * dx + dy * dy );\n}\n\n// -------------------------- drag move -------------------------- //\n\nvar DRAG_THROTTLE_TIME = 120;\n\n/**\n * handle an item drag move event\n * @param {Element} elem\n * @param {Number} x - horizontal change in position\n * @param {Number} y - vertical change in position\n */\nproto.itemDragMove = function( elem, x, y ) {\n var item = this.isEnabled && this.getItem( elem );\n if ( !item ) {\n return;\n }\n\n x -= this.size.paddingLeft;\n y -= this.size.paddingTop;\n\n var _this = this;\n function onDrag() {\n _this.shift( item, x, y );\n item.positionDropPlaceholder();\n _this.layout();\n }\n\n // throttle\n var now = new Date();\n var isThrottled = this._itemDragTime && now - this._itemDragTime < DRAG_THROTTLE_TIME;\n if ( isThrottled ) {\n clearTimeout( this.dragTimeout );\n this.dragTimeout = setTimeout( onDrag, DRAG_THROTTLE_TIME );\n } else {\n onDrag();\n this._itemDragTime = now;\n }\n};\n\n// -------------------------- drag end -------------------------- //\n\n/**\n * handle an item drag end event\n * @param {Element} elem\n */\nproto.itemDragEnd = function( elem ) {\n var item = this.isEnabled && this.getItem( elem );\n if ( !item ) {\n return;\n }\n\n clearTimeout( this.dragTimeout );\n item.element.classList.add('is-positioning-post-drag');\n\n var completeCount = 0;\n var _this = this;\n function onDragEndLayoutComplete() {\n completeCount++;\n if ( completeCount != 2 ) {\n return;\n }\n // reset drag item\n item.element.classList.remove('is-positioning-post-drag');\n item.hideDropPlaceholder();\n _this.dispatchEvent( 'dragItemPositioned', null, [ item ] );\n }\n\n item.once( 'layout', onDragEndLayoutComplete );\n this.once( 'layoutComplete', onDragEndLayoutComplete );\n item.moveTo( item.rect.x, item.rect.y );\n this.layout();\n this.dragItemCount = Math.max( 0, this.dragItemCount - 1 );\n this.sortItemsByPosition();\n item.disablePlacing();\n this.unstamp( item.element );\n};\n\n/**\n * binds Draggabilly events\n * @param {Draggabilly} draggie\n */\nproto.bindDraggabillyEvents = function( draggie ) {\n this._bindDraggabillyEvents( draggie, 'on' );\n};\n\nproto.unbindDraggabillyEvents = function( draggie ) {\n this._bindDraggabillyEvents( draggie, 'off' );\n};\n\nproto._bindDraggabillyEvents = function( draggie, method ) {\n var handlers = this.handleDraggabilly;\n draggie[ method ]( 'dragStart', handlers.dragStart );\n draggie[ method ]( 'dragMove', handlers.dragMove );\n draggie[ method ]( 'dragEnd', handlers.dragEnd );\n};\n\n/**\n * binds jQuery UI Draggable events\n * @param {jQuery} $elems\n */\nproto.bindUIDraggableEvents = function( $elems ) {\n this._bindUIDraggableEvents( $elems, 'on' );\n};\n\nproto.unbindUIDraggableEvents = function( $elems ) {\n this._bindUIDraggableEvents( $elems, 'off' );\n};\n\nproto._bindUIDraggableEvents = function( $elems, method ) {\n var handlers = this.handleUIDraggable;\n $elems\n [ method ]( 'dragstart', handlers.start )\n [ method ]( 'drag', handlers.drag )\n [ method ]( 'dragstop', handlers.stop );\n};\n\n// ----- destroy ----- //\n\nvar _destroy = proto.destroy;\nproto.destroy = function() {\n _destroy.apply( this, arguments );\n // disable flag; prevent drag events from triggering. #72\n this.isEnabled = false;\n};\n\n// ----- ----- //\n\nPackery.Rect = Rect;\nPackery.Packer = Packer;\n\nreturn Packery;\n\n}));\n","/**\n * Fizzy UI utils v2.0.7\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'desandro-matches-selector/matches-selector'\n ], function( matchesSelector ) {\n return factory( window, matchesSelector );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('desandro-matches-selector')\n );\n } else {\n // browser global\n window.fizzyUIUtils = factory(\n window,\n window.matchesSelector\n );\n }\n\n}( window, function factory( window, matchesSelector ) {\n\n'use strict';\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n return obj;\n }\n // return empty array if undefined or null. #6\n if ( obj === null || obj === undefined ) {\n return [];\n }\n\n var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n if ( isArrayLike ) {\n // convert nodeList to array\n return arraySlice.call( obj );\n }\n\n // array of single index\n return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n var index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( matchesSelector( elem, selector ) ) {\n return elem;\n }\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n var ffElems = [];\n\n elems.forEach( function( elem ) {\n // check that elem is an actual element\n if ( !( elem instanceof HTMLElement ) ) {\n return;\n }\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return;\n }\n // filter & find items if we have a selector\n // filter\n if ( matchesSelector( elem, selector ) ) {\n ffElems.push( elem );\n }\n // find children\n var childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n for ( var i=0; i < childElems.length; i++ ) {\n ffElems.push( childElems[i] );\n }\n });\n\n return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n threshold = threshold || 100;\n // original method\n var method = _class.prototype[ methodName ];\n var timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n var timeout = this[ timeoutName ];\n clearTimeout( timeout );\n\n var args = arguments;\n var _this = this;\n this[ timeoutName ] = setTimeout( function() {\n method.apply( _this, args );\n delete _this[ timeoutName ];\n }, threshold );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n var readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( callback );\n } else {\n document.addEventListener( 'DOMContentLoaded', callback );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n var dashedNamespace = utils.toDashed( namespace );\n var dataAttr = 'data-' + dashedNamespace;\n var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n var elems = utils.makeArray( dataAttrElems )\n .concat( utils.makeArray( jsDashElems ) );\n var dataOptionsAttr = dataAttr + '-options';\n var jQuery = window.jQuery;\n\n elems.forEach( function( elem ) {\n var attr = elem.getAttribute( dataAttr ) ||\n elem.getAttribute( dataOptionsAttr );\n var options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n ': ' + error );\n }\n return;\n }\n // initialize\n var instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n });\n\n });\n};\n\n// ----- ----- //\n\nreturn utils;\n\n}));\n","/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n /*global define: false, module: false */\n 'use strict';\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.matchesSelector = factory();\n }\n\n}( window, function factory() {\n 'use strict';\n\n var matchesMethod = ( function() {\n var ElemProto = window.Element.prototype;\n // check for the standard method name first\n if ( ElemProto.matches ) {\n return 'matches';\n }\n // check un-prefixed\n if ( ElemProto.matchesSelector ) {\n return 'matchesSelector';\n }\n // check vendor prefixes\n var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n for ( var i=0; i < prefixes.length; i++ ) {\n var prefix = prefixes[i];\n var method = prefix + 'MatchesSelector';\n if ( ElemProto[ method ] ) {\n return method;\n }\n }\n })();\n\n return function matchesSelector( elem, selector ) {\n return elem[ matchesMethod ]( selector );\n };\n\n}));\n","/**\n * Outlayer Item\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( [\n 'ev-emitter/ev-emitter',\n 'get-size/get-size'\n ],\n factory\n );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory(\n require('ev-emitter'),\n require('get-size')\n );\n } else {\n // browser global\n window.Outlayer = {};\n window.Outlayer.Item = factory(\n window.EvEmitter,\n window.getSize\n );\n }\n\n}( window, function factory( EvEmitter, getSize ) {\n'use strict';\n\n// ----- helpers ----- //\n\nfunction isEmptyObj( obj ) {\n for ( var prop in obj ) {\n return false;\n }\n prop = null;\n return true;\n}\n\n// -------------------------- CSS3 support -------------------------- //\n\n\nvar docElemStyle = document.documentElement.style;\n\nvar transitionProperty = typeof docElemStyle.transition == 'string' ?\n 'transition' : 'WebkitTransition';\nvar transformProperty = typeof docElemStyle.transform == 'string' ?\n 'transform' : 'WebkitTransform';\n\nvar transitionEndEvent = {\n WebkitTransition: 'webkitTransitionEnd',\n transition: 'transitionend'\n}[ transitionProperty ];\n\n// cache all vendor properties that could have vendor prefix\nvar vendorProperties = {\n transform: transformProperty,\n transition: transitionProperty,\n transitionDuration: transitionProperty + 'Duration',\n transitionProperty: transitionProperty + 'Property',\n transitionDelay: transitionProperty + 'Delay'\n};\n\n// -------------------------- Item -------------------------- //\n\nfunction Item( element, layout ) {\n if ( !element ) {\n return;\n }\n\n this.element = element;\n // parent layout class, i.e. Masonry, Isotope, or Packery\n this.layout = layout;\n this.position = {\n x: 0,\n y: 0\n };\n\n this._create();\n}\n\n// inherit EvEmitter\nvar proto = Item.prototype = Object.create( EvEmitter.prototype );\nproto.constructor = Item;\n\nproto._create = function() {\n // transition objects\n this._transn = {\n ingProperties: {},\n clean: {},\n onEnd: {}\n };\n\n this.css({\n position: 'absolute'\n });\n};\n\n// trigger specified handler for event type\nproto.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\n/**\n * apply CSS styles to element\n * @param {Object} style\n */\nproto.css = function( style ) {\n var elemStyle = this.element.style;\n\n for ( var prop in style ) {\n // use vendor property if available\n var supportedProp = vendorProperties[ prop ] || prop;\n elemStyle[ supportedProp ] = style[ prop ];\n }\n};\n\n // measure position, and sets it\nproto.getPosition = function() {\n var style = getComputedStyle( this.element );\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n var xValue = style[ isOriginLeft ? 'left' : 'right' ];\n var yValue = style[ isOriginTop ? 'top' : 'bottom' ];\n var x = parseFloat( xValue );\n var y = parseFloat( yValue );\n // convert percent to pixels\n var layoutSize = this.layout.size;\n if ( xValue.indexOf('%') != -1 ) {\n x = ( x / 100 ) * layoutSize.width;\n }\n if ( yValue.indexOf('%') != -1 ) {\n y = ( y / 100 ) * layoutSize.height;\n }\n // clean up 'auto' or other non-integer values\n x = isNaN( x ) ? 0 : x;\n y = isNaN( y ) ? 0 : y;\n // remove padding from measurement\n x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;\n y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;\n\n this.position.x = x;\n this.position.y = y;\n};\n\n// set settled position, apply padding\nproto.layoutPosition = function() {\n var layoutSize = this.layout.size;\n var style = {};\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n\n // x\n var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';\n var xProperty = isOriginLeft ? 'left' : 'right';\n var xResetProperty = isOriginLeft ? 'right' : 'left';\n\n var x = this.position.x + layoutSize[ xPadding ];\n // set in percentage or pixels\n style[ xProperty ] = this.getXValue( x );\n // reset other property\n style[ xResetProperty ] = '';\n\n // y\n var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';\n var yProperty = isOriginTop ? 'top' : 'bottom';\n var yResetProperty = isOriginTop ? 'bottom' : 'top';\n\n var y = this.position.y + layoutSize[ yPadding ];\n // set in percentage or pixels\n style[ yProperty ] = this.getYValue( y );\n // reset other property\n style[ yResetProperty ] = '';\n\n this.css( style );\n this.emitEvent( 'layout', [ this ] );\n};\n\nproto.getXValue = function( x ) {\n var isHorizontal = this.layout._getOption('horizontal');\n return this.layout.options.percentPosition && !isHorizontal ?\n ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';\n};\n\nproto.getYValue = function( y ) {\n var isHorizontal = this.layout._getOption('horizontal');\n return this.layout.options.percentPosition && isHorizontal ?\n ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';\n};\n\nproto._transitionTo = function( x, y ) {\n this.getPosition();\n // get current x & y from top/left\n var curX = this.position.x;\n var curY = this.position.y;\n\n var didNotMove = x == this.position.x && y == this.position.y;\n\n // save end position\n this.setPosition( x, y );\n\n // if did not move and not transitioning, just go to layout\n if ( didNotMove && !this.isTransitioning ) {\n this.layoutPosition();\n return;\n }\n\n var transX = x - curX;\n var transY = y - curY;\n var transitionStyle = {};\n transitionStyle.transform = this.getTranslate( transX, transY );\n\n this.transition({\n to: transitionStyle,\n onTransitionEnd: {\n transform: this.layoutPosition\n },\n isCleaning: true\n });\n};\n\nproto.getTranslate = function( x, y ) {\n // flip cooridinates if origin on right or bottom\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n x = isOriginLeft ? x : -x;\n y = isOriginTop ? y : -y;\n return 'translate3d(' + x + 'px, ' + y + 'px, 0)';\n};\n\n// non transition + transform support\nproto.goTo = function( x, y ) {\n this.setPosition( x, y );\n this.layoutPosition();\n};\n\nproto.moveTo = proto._transitionTo;\n\nproto.setPosition = function( x, y ) {\n this.position.x = parseFloat( x );\n this.position.y = parseFloat( y );\n};\n\n// ----- transition ----- //\n\n/**\n * @param {Object} style - CSS\n * @param {Function} onTransitionEnd\n */\n\n// non transition, just trigger callback\nproto._nonTransition = function( args ) {\n this.css( args.to );\n if ( args.isCleaning ) {\n this._removeStyles( args.to );\n }\n for ( var prop in args.onTransitionEnd ) {\n args.onTransitionEnd[ prop ].call( this );\n }\n};\n\n/**\n * proper transition\n * @param {Object} args - arguments\n * @param {Object} to - style to transition to\n * @param {Object} from - style to start transition from\n * @param {Boolean} isCleaning - removes transition styles after transition\n * @param {Function} onTransitionEnd - callback\n */\nproto.transition = function( args ) {\n // redirect to nonTransition if no transition duration\n if ( !parseFloat( this.layout.options.transitionDuration ) ) {\n this._nonTransition( args );\n return;\n }\n\n var _transition = this._transn;\n // keep track of onTransitionEnd callback by css property\n for ( var prop in args.onTransitionEnd ) {\n _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];\n }\n // keep track of properties that are transitioning\n for ( prop in args.to ) {\n _transition.ingProperties[ prop ] = true;\n // keep track of properties to clean up when transition is done\n if ( args.isCleaning ) {\n _transition.clean[ prop ] = true;\n }\n }\n\n // set from styles\n if ( args.from ) {\n this.css( args.from );\n // force redraw. http://blog.alexmaccaw.com/css-transitions\n var h = this.element.offsetHeight;\n // hack for JSHint to hush about unused var\n h = null;\n }\n // enable transition\n this.enableTransition( args.to );\n // set styles that are transitioning\n this.css( args.to );\n\n this.isTransitioning = true;\n\n};\n\n// dash before all cap letters, including first for\n// WebkitTransform => -webkit-transform\nfunction toDashedAll( str ) {\n return str.replace( /([A-Z])/g, function( $1 ) {\n return '-' + $1.toLowerCase();\n });\n}\n\nvar transitionProps = 'opacity,' + toDashedAll( transformProperty );\n\nproto.enableTransition = function(/* style */) {\n // HACK changing transitionProperty during a transition\n // will cause transition to jump\n if ( this.isTransitioning ) {\n return;\n }\n\n // make `transition: foo, bar, baz` from style object\n // HACK un-comment this when enableTransition can work\n // while a transition is happening\n // var transitionValues = [];\n // for ( var prop in style ) {\n // // dash-ify camelCased properties like WebkitTransition\n // prop = vendorProperties[ prop ] || prop;\n // transitionValues.push( toDashedAll( prop ) );\n // }\n // munge number to millisecond, to match stagger\n var duration = this.layout.options.transitionDuration;\n duration = typeof duration == 'number' ? duration + 'ms' : duration;\n // enable transition styles\n this.css({\n transitionProperty: transitionProps,\n transitionDuration: duration,\n transitionDelay: this.staggerDelay || 0\n });\n // listen for transition end event\n this.element.addEventListener( transitionEndEvent, this, false );\n};\n\n// ----- events ----- //\n\nproto.onwebkitTransitionEnd = function( event ) {\n this.ontransitionend( event );\n};\n\nproto.onotransitionend = function( event ) {\n this.ontransitionend( event );\n};\n\n// properties that I munge to make my life easier\nvar dashedVendorProperties = {\n '-webkit-transform': 'transform'\n};\n\nproto.ontransitionend = function( event ) {\n // disregard bubbled events from children\n if ( event.target !== this.element ) {\n return;\n }\n var _transition = this._transn;\n // get property name of transitioned property, convert to prefix-free\n var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;\n\n // remove property that has completed transitioning\n delete _transition.ingProperties[ propertyName ];\n // check if any properties are still transitioning\n if ( isEmptyObj( _transition.ingProperties ) ) {\n // all properties have completed transitioning\n this.disableTransition();\n }\n // clean style\n if ( propertyName in _transition.clean ) {\n // clean up style\n this.element.style[ event.propertyName ] = '';\n delete _transition.clean[ propertyName ];\n }\n // trigger onTransitionEnd callback\n if ( propertyName in _transition.onEnd ) {\n var onTransitionEnd = _transition.onEnd[ propertyName ];\n onTransitionEnd.call( this );\n delete _transition.onEnd[ propertyName ];\n }\n\n this.emitEvent( 'transitionEnd', [ this ] );\n};\n\nproto.disableTransition = function() {\n this.removeTransitionStyles();\n this.element.removeEventListener( transitionEndEvent, this, false );\n this.isTransitioning = false;\n};\n\n/**\n * removes style property from element\n * @param {Object} style\n**/\nproto._removeStyles = function( style ) {\n // clean up transition styles\n var cleanStyle = {};\n for ( var prop in style ) {\n cleanStyle[ prop ] = '';\n }\n this.css( cleanStyle );\n};\n\nvar cleanTransitionStyle = {\n transitionProperty: '',\n transitionDuration: '',\n transitionDelay: ''\n};\n\nproto.removeTransitionStyles = function() {\n // remove transition\n this.css( cleanTransitionStyle );\n};\n\n// ----- stagger ----- //\n\nproto.stagger = function( delay ) {\n delay = isNaN( delay ) ? 0 : delay;\n this.staggerDelay = delay + 'ms';\n};\n\n// ----- show/hide/remove ----- //\n\n// remove element from DOM\nproto.removeElem = function() {\n this.element.parentNode.removeChild( this.element );\n // remove display: none\n this.css({ display: '' });\n this.emitEvent( 'remove', [ this ] );\n};\n\nproto.remove = function() {\n // just remove element if no transition support or no transition\n if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {\n this.removeElem();\n return;\n }\n\n // start transition\n this.once( 'transitionEnd', function() {\n this.removeElem();\n });\n this.hide();\n};\n\nproto.reveal = function() {\n delete this.isHidden;\n // remove display: none\n this.css({ display: '' });\n\n var options = this.layout.options;\n\n var onTransitionEnd = {};\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');\n onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;\n\n this.transition({\n from: options.hiddenStyle,\n to: options.visibleStyle,\n isCleaning: true,\n onTransitionEnd: onTransitionEnd\n });\n};\n\nproto.onRevealTransitionEnd = function() {\n // check if still visible\n // during transition, item may have been hidden\n if ( !this.isHidden ) {\n this.emitEvent('reveal');\n }\n};\n\n/**\n * get style property use for hide/reveal transition end\n * @param {String} styleProperty - hiddenStyle/visibleStyle\n * @returns {String}\n */\nproto.getHideRevealTransitionEndProperty = function( styleProperty ) {\n var optionStyle = this.layout.options[ styleProperty ];\n // use opacity\n if ( optionStyle.opacity ) {\n return 'opacity';\n }\n // get first property\n for ( var prop in optionStyle ) {\n return prop;\n }\n};\n\nproto.hide = function() {\n // set flag\n this.isHidden = true;\n // remove display: none\n this.css({ display: '' });\n\n var options = this.layout.options;\n\n var onTransitionEnd = {};\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');\n onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;\n\n this.transition({\n from: options.visibleStyle,\n to: options.hiddenStyle,\n // keep hidden stuff hidden\n isCleaning: true,\n onTransitionEnd: onTransitionEnd\n });\n};\n\nproto.onHideTransitionEnd = function() {\n // check if still hidden\n // during transition, item may have been un-hidden\n if ( this.isHidden ) {\n this.css({ display: 'none' });\n this.emitEvent('hide');\n }\n};\n\nproto.destroy = function() {\n this.css({\n position: '',\n left: '',\n right: '',\n top: '',\n bottom: '',\n transition: '',\n transform: ''\n });\n};\n\nreturn Item;\n\n}));\n","/**\n * Packer\n * bin-packing algorithm\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [ './rect' ], factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./rect')\n );\n } else {\n // browser global\n var Packery = window.Packery = window.Packery || {};\n Packery.Packer = factory( Packery.Rect );\n }\n\n}( window, function factory( Rect ) {\n'use strict';\n\n// -------------------------- Packer -------------------------- //\n\n/**\n * @param {Number} width\n * @param {Number} height\n * @param {String} sortDirection\n * topLeft for vertical, leftTop for horizontal\n */\nfunction Packer( width, height, sortDirection ) {\n this.width = width || 0;\n this.height = height || 0;\n this.sortDirection = sortDirection || 'downwardLeftToRight';\n\n this.reset();\n}\n\nvar proto = Packer.prototype;\n\nproto.reset = function() {\n this.spaces = [];\n\n var initialSpace = new Rect({\n x: 0,\n y: 0,\n width: this.width,\n height: this.height\n });\n\n this.spaces.push( initialSpace );\n // set sorter\n this.sorter = sorters[ this.sortDirection ] || sorters.downwardLeftToRight;\n};\n\n// change x and y of rect to fit with in Packer's available spaces\nproto.pack = function( rect ) {\n for ( var i=0; i < this.spaces.length; i++ ) {\n var space = this.spaces[i];\n if ( space.canFit( rect ) ) {\n this.placeInSpace( rect, space );\n break;\n }\n }\n};\n\nproto.columnPack = function( rect ) {\n for ( var i=0; i < this.spaces.length; i++ ) {\n var space = this.spaces[i];\n var canFitInSpaceColumn = space.x <= rect.x &&\n space.x + space.width >= rect.x + rect.width &&\n space.height >= rect.height - 0.01; // fudge number for rounding error\n if ( canFitInSpaceColumn ) {\n rect.y = space.y;\n this.placed( rect );\n break;\n }\n }\n};\n\nproto.rowPack = function( rect ) {\n for ( var i=0; i < this.spaces.length; i++ ) {\n var space = this.spaces[i];\n var canFitInSpaceRow = space.y <= rect.y &&\n space.y + space.height >= rect.y + rect.height &&\n space.width >= rect.width - 0.01; // fudge number for rounding error\n if ( canFitInSpaceRow ) {\n rect.x = space.x;\n this.placed( rect );\n break;\n }\n }\n};\n\nproto.placeInSpace = function( rect, space ) {\n // place rect in space\n rect.x = space.x;\n rect.y = space.y;\n\n this.placed( rect );\n};\n\n// update spaces with placed rect\nproto.placed = function( rect ) {\n // update spaces\n var revisedSpaces = [];\n for ( var i=0; i < this.spaces.length; i++ ) {\n var space = this.spaces[i];\n var newSpaces = space.getMaximalFreeRects( rect );\n // add either the original space or the new spaces to the revised spaces\n if ( newSpaces ) {\n revisedSpaces.push.apply( revisedSpaces, newSpaces );\n } else {\n revisedSpaces.push( space );\n }\n }\n\n this.spaces = revisedSpaces;\n\n this.mergeSortSpaces();\n};\n\nproto.mergeSortSpaces = function() {\n // remove redundant spaces\n Packer.mergeRects( this.spaces );\n this.spaces.sort( this.sorter );\n};\n\n// add a space back\nproto.addSpace = function( rect ) {\n this.spaces.push( rect );\n this.mergeSortSpaces();\n};\n\n// -------------------------- utility functions -------------------------- //\n\n/**\n * Remove redundant rectangle from array of rectangles\n * @param {Array} rects: an array of Rects\n * @returns {Array} rects: an array of Rects\n**/\nPacker.mergeRects = function( rects ) {\n var i = 0;\n var rect = rects[i];\n\n rectLoop:\n while ( rect ) {\n var j = 0;\n var compareRect = rects[ i + j ];\n\n while ( compareRect ) {\n if ( compareRect == rect ) {\n j++; // next\n } else if ( compareRect.contains( rect ) ) {\n // remove rect\n rects.splice( i, 1 );\n rect = rects[i]; // set next rect\n continue rectLoop; // bail on compareLoop\n } else if ( rect.contains( compareRect ) ) {\n // remove compareRect\n rects.splice( i + j, 1 );\n } else {\n j++;\n }\n compareRect = rects[ i + j ]; // set next compareRect\n }\n i++;\n rect = rects[i];\n }\n\n return rects;\n};\n\n\n// -------------------------- sorters -------------------------- //\n\n// functions for sorting rects in order\nvar sorters = {\n // top down, then left to right\n downwardLeftToRight: function( a, b ) {\n return a.y - b.y || a.x - b.x;\n },\n // left to right, then top down\n rightwardTopToBottom: function( a, b ) {\n return a.x - b.x || a.y - b.y;\n }\n};\n\n\n// -------------------------- -------------------------- //\n\nreturn Packer;\n\n}));\n","/**\n * Packery Item Element\n**/\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'outlayer/outlayer',\n './rect'\n ],\n factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('outlayer'),\n require('./rect')\n );\n } else {\n // browser global\n window.Packery.Item = factory(\n window.Outlayer,\n window.Packery.Rect\n );\n }\n\n}( window, function factory( Outlayer, Rect ) {\n'use strict';\n\n// -------------------------- Item -------------------------- //\n\nvar docElemStyle = document.documentElement.style;\n\nvar transformProperty = typeof docElemStyle.transform == 'string' ?\n 'transform' : 'WebkitTransform';\n\n// sub-class Item\nvar Item = function PackeryItem() {\n Outlayer.Item.apply( this, arguments );\n};\n\nvar proto = Item.prototype = Object.create( Outlayer.Item.prototype );\n\nvar __create = proto._create;\nproto._create = function() {\n // call default _create logic\n __create.call( this );\n this.rect = new Rect();\n};\n\nvar _moveTo = proto.moveTo;\nproto.moveTo = function( x, y ) {\n // don't shift 1px while dragging\n var dx = Math.abs( this.position.x - x );\n var dy = Math.abs( this.position.y - y );\n\n var canHackGoTo = this.layout.dragItemCount && !this.isPlacing &&\n !this.isTransitioning && dx < 1 && dy < 1;\n if ( canHackGoTo ) {\n this.goTo( x, y );\n return;\n }\n _moveTo.apply( this, arguments );\n};\n\n// -------------------------- placing -------------------------- //\n\nproto.enablePlacing = function() {\n this.removeTransitionStyles();\n // remove transform property from transition\n if ( this.isTransitioning && transformProperty ) {\n this.element.style[ transformProperty ] = 'none';\n }\n this.isTransitioning = false;\n this.getSize();\n this.layout._setRectSize( this.element, this.rect );\n this.isPlacing = true;\n};\n\nproto.disablePlacing = function() {\n this.isPlacing = false;\n};\n\n// ----- ----- //\n\n// remove element from DOM\nproto.removeElem = function() {\n var parent = this.element.parentNode;\n if ( parent ) {\n parent.removeChild( this.element );\n }\n // add space back to packer\n this.layout.packer.addSpace( this.rect );\n this.emitEvent( 'remove', [ this ] );\n};\n\n// ----- dropPlaceholder ----- //\n\nproto.showDropPlaceholder = function() {\n var dropPlaceholder = this.dropPlaceholder;\n if ( !dropPlaceholder ) {\n // create dropPlaceholder\n dropPlaceholder = this.dropPlaceholder = document.createElement('div');\n dropPlaceholder.className = 'packery-drop-placeholder';\n dropPlaceholder.style.position = 'absolute';\n }\n\n dropPlaceholder.style.width = this.size.width + 'px';\n dropPlaceholder.style.height = this.size.height + 'px';\n this.positionDropPlaceholder();\n this.layout.element.appendChild( dropPlaceholder );\n};\n\nproto.positionDropPlaceholder = function() {\n this.dropPlaceholder.style[ transformProperty ] = 'translate(' +\n this.rect.x + 'px, ' + this.rect.y + 'px)';\n};\n\nproto.hideDropPlaceholder = function() {\n // only remove once, #333\n var parent = this.dropPlaceholder.parentNode;\n if ( parent ) {\n parent.removeChild( this.dropPlaceholder );\n }\n};\n\n// ----- ----- //\n\nreturn Item;\n\n}));\n","/*!\n * imagesLoaded v5.0.0\n * JavaScript is all like \"You images are done yet or what?\"\n * MIT License\n */\n\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory( window, require('ev-emitter') );\n } else {\n // browser global\n window.imagesLoaded = factory( window, window.EvEmitter );\n }\n\n} )( typeof window !== 'undefined' ? window : this,\n function factory( window, EvEmitter ) {\n\nlet $ = window.jQuery;\nlet console = window.console;\n\n// -------------------------- helpers -------------------------- //\n\n// turn element or nodeList into an array\nfunction makeArray( obj ) {\n // use object if already an array\n if ( Array.isArray( obj ) ) return obj;\n\n let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n // convert nodeList to array\n if ( isArrayLike ) return [ ...obj ];\n\n // array of single index\n return [ obj ];\n}\n\n// -------------------------- imagesLoaded -------------------------- //\n\n/**\n * @param {[Array, Element, NodeList, String]} elem\n * @param {[Object, Function]} options - if function, use as callback\n * @param {Function} onAlways - callback function\n * @returns {ImagesLoaded}\n */\nfunction ImagesLoaded( elem, options, onAlways ) {\n // coerce ImagesLoaded() without new, to be new ImagesLoaded()\n if ( !( this instanceof ImagesLoaded ) ) {\n return new ImagesLoaded( elem, options, onAlways );\n }\n // use elem as selector string\n let queryElem = elem;\n if ( typeof elem == 'string' ) {\n queryElem = document.querySelectorAll( elem );\n }\n // bail if bad element\n if ( !queryElem ) {\n console.error(`Bad element for imagesLoaded ${queryElem || elem}`);\n return;\n }\n\n this.elements = makeArray( queryElem );\n this.options = {};\n // shift arguments if no options set\n if ( typeof options == 'function' ) {\n onAlways = options;\n } else {\n Object.assign( this.options, options );\n }\n\n if ( onAlways ) this.on( 'always', onAlways );\n\n this.getImages();\n // add jQuery Deferred object\n if ( $ ) this.jqDeferred = new $.Deferred();\n\n // HACK check async to allow time to bind listeners\n setTimeout( this.check.bind( this ) );\n}\n\nImagesLoaded.prototype = Object.create( EvEmitter.prototype );\n\nImagesLoaded.prototype.getImages = function() {\n this.images = [];\n\n // filter & find items if we have an item selector\n this.elements.forEach( this.addElementImages, this );\n};\n\nconst elementNodeTypes = [ 1, 9, 11 ];\n\n/**\n * @param {Node} elem\n */\nImagesLoaded.prototype.addElementImages = function( elem ) {\n // filter siblings\n if ( elem.nodeName === 'IMG' ) {\n this.addImage( elem );\n }\n // get background image on element\n if ( this.options.background === true ) {\n this.addElementBackgroundImages( elem );\n }\n\n // find children\n // no non-element nodes, #143\n let { nodeType } = elem;\n if ( !nodeType || !elementNodeTypes.includes( nodeType ) ) return;\n\n let childImgs = elem.querySelectorAll('img');\n // concat childElems to filterFound array\n for ( let img of childImgs ) {\n this.addImage( img );\n }\n\n // get child background images\n if ( typeof this.options.background == 'string' ) {\n let children = elem.querySelectorAll( this.options.background );\n for ( let child of children ) {\n this.addElementBackgroundImages( child );\n }\n }\n};\n\nconst reURL = /url\\((['\"])?(.*?)\\1\\)/gi;\n\nImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {\n let style = getComputedStyle( elem );\n // Firefox returns null if in a hidden iframe https://bugzil.la/548397\n if ( !style ) return;\n\n // get url inside url(\"...\")\n let matches = reURL.exec( style.backgroundImage );\n while ( matches !== null ) {\n let url = matches && matches[2];\n if ( url ) {\n this.addBackground( url, elem );\n }\n matches = reURL.exec( style.backgroundImage );\n }\n};\n\n/**\n * @param {Image} img\n */\nImagesLoaded.prototype.addImage = function( img ) {\n let loadingImage = new LoadingImage( img );\n this.images.push( loadingImage );\n};\n\nImagesLoaded.prototype.addBackground = function( url, elem ) {\n let background = new Background( url, elem );\n this.images.push( background );\n};\n\nImagesLoaded.prototype.check = function() {\n this.progressedCount = 0;\n this.hasAnyBroken = false;\n // complete if no images\n if ( !this.images.length ) {\n this.complete();\n return;\n }\n\n /* eslint-disable-next-line func-style */\n let onProgress = ( image, elem, message ) => {\n // HACK - Chrome triggers event before object properties have changed. #83\n setTimeout( () => {\n this.progress( image, elem, message );\n } );\n };\n\n this.images.forEach( function( loadingImage ) {\n loadingImage.once( 'progress', onProgress );\n loadingImage.check();\n } );\n};\n\nImagesLoaded.prototype.progress = function( image, elem, message ) {\n this.progressedCount++;\n this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;\n // progress event\n this.emitEvent( 'progress', [ this, image, elem ] );\n if ( this.jqDeferred && this.jqDeferred.notify ) {\n this.jqDeferred.notify( this, image );\n }\n // check if completed\n if ( this.progressedCount === this.images.length ) {\n this.complete();\n }\n\n if ( this.options.debug && console ) {\n console.log( `progress: ${message}`, image, elem );\n }\n};\n\nImagesLoaded.prototype.complete = function() {\n let eventName = this.hasAnyBroken ? 'fail' : 'done';\n this.isComplete = true;\n this.emitEvent( eventName, [ this ] );\n this.emitEvent( 'always', [ this ] );\n if ( this.jqDeferred ) {\n let jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';\n this.jqDeferred[ jqMethod ]( this );\n }\n};\n\n// -------------------------- -------------------------- //\n\nfunction LoadingImage( img ) {\n this.img = img;\n}\n\nLoadingImage.prototype = Object.create( EvEmitter.prototype );\n\nLoadingImage.prototype.check = function() {\n // If complete is true and browser supports natural sizes,\n // try to check for image status manually.\n let isComplete = this.getIsImageComplete();\n if ( isComplete ) {\n // report based on naturalWidth\n this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n return;\n }\n\n // If none of the checks above matched, simulate loading on detached element.\n this.proxyImage = new Image();\n // add crossOrigin attribute. #204\n if ( this.img.crossOrigin ) {\n this.proxyImage.crossOrigin = this.img.crossOrigin;\n }\n this.proxyImage.addEventListener( 'load', this );\n this.proxyImage.addEventListener( 'error', this );\n // bind to image as well for Firefox. #191\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n this.proxyImage.src = this.img.currentSrc || this.img.src;\n};\n\nLoadingImage.prototype.getIsImageComplete = function() {\n // check for non-zero, non-undefined naturalWidth\n // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671\n return this.img.complete && this.img.naturalWidth;\n};\n\nLoadingImage.prototype.confirm = function( isLoaded, message ) {\n this.isLoaded = isLoaded;\n let { parentNode } = this.img;\n // emit progress with parent or self \n let elem = parentNode.nodeName === 'PICTURE' ? parentNode : this.img;\n this.emitEvent( 'progress', [ this, elem, message ] );\n};\n\n// ----- events ----- //\n\n// trigger specified handler for event type\nLoadingImage.prototype.handleEvent = function( event ) {\n let method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\nLoadingImage.prototype.onload = function() {\n this.confirm( true, 'onload' );\n this.unbindEvents();\n};\n\nLoadingImage.prototype.onerror = function() {\n this.confirm( false, 'onerror' );\n this.unbindEvents();\n};\n\nLoadingImage.prototype.unbindEvents = function() {\n this.proxyImage.removeEventListener( 'load', this );\n this.proxyImage.removeEventListener( 'error', this );\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n};\n\n// -------------------------- Background -------------------------- //\n\nfunction Background( url, element ) {\n this.url = url;\n this.element = element;\n this.img = new Image();\n}\n\n// inherit LoadingImage prototype\nBackground.prototype = Object.create( LoadingImage.prototype );\n\nBackground.prototype.check = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n this.img.src = this.url;\n // check if image is already complete\n let isComplete = this.getIsImageComplete();\n if ( isComplete ) {\n this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n this.unbindEvents();\n }\n};\n\nBackground.prototype.unbindEvents = function() {\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n};\n\nBackground.prototype.confirm = function( isLoaded, message ) {\n this.isLoaded = isLoaded;\n this.emitEvent( 'progress', [ this, this.element, message ] );\n};\n\n// -------------------------- jQuery -------------------------- //\n\nImagesLoaded.makeJQueryPlugin = function( jQuery ) {\n jQuery = jQuery || window.jQuery;\n if ( !jQuery ) return;\n\n // set local variable\n $ = jQuery;\n // $().imagesLoaded()\n $.fn.imagesLoaded = function( options, onAlways ) {\n let instance = new ImagesLoaded( this, options, onAlways );\n return instance.jqDeferred.promise( $( this ) );\n };\n};\n// try making plugin\nImagesLoaded.makeJQueryPlugin();\n\n// -------------------------- -------------------------- //\n\nreturn ImagesLoaded;\n\n} );\n","/**\n * EvEmitter v2.1.1\n * Lil' event emitter\n * MIT License\n */\n\n( function( global, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\nfunction EvEmitter() {}\n\nlet proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) return this;\n\n // set events hash\n let events = this._events = this._events || {};\n // set listeners array\n let listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( !listeners.includes( listener ) ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) return this;\n\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n let onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n let listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) return this;\n\n let index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n let listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) return this;\n\n // copy over to avoid interference if .off() in listener\n listeners = listeners.slice( 0 );\n args = args || [];\n // once stuff\n let onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n for ( let listener of listeners ) {\n let isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n }\n\n return this;\n};\n\nproto.allOff = function() {\n delete this._events;\n delete this._onceEvents;\n return this;\n};\n\nreturn EvEmitter;\n\n} ) );\n","/**\n * MUI CSS/JS overlay module\n * @module overlay\n */\n\n'use strict';\n\n\nvar util = require('./lib/util'),\n jqLite = require('./lib/jqLite'),\n overlayId = 'mui-overlay',\n bodyClass = 'mui--overflow-hidden',\n iosRegex = /(iPad|iPhone|iPod)/g,\n activeElement;\n\n\n/**\n * Turn overlay on/off.\n * @param {string} action - Turn overlay \"on\"/\"off\".\n * @param {object} [options]\n * @config {boolean} [keyboard] - If true, close when escape key is pressed.\n * @config {boolean} [static] - If false, close when backdrop is clicked.\n * @config {Function} [onclose] - Callback function to execute on close\n * @param {Element} [childElement] - Child element to add to overlay.\n */\nfunction overlayFn(action) {\n var overlayEl;\n \n if (action === 'on') {\n // extract arguments\n var arg, options, childElement;\n \n // pull options and childElement from arguments\n for (var i=arguments.length - 1; i > 0; i--) {\n arg = arguments[i];\n\n if (jqLite.type(arg) === 'object') options = arg;\n if (arg instanceof Element && arg.nodeType === 1) childElement = arg;\n }\n\n // option defaults\n options = options || {};\n if (options.keyboard === undefined) options.keyboard = true;\n if (options.static === undefined) options.static = false;\n \n // execute method\n overlayEl = overlayOn(options, childElement);\n \n } else if (action === 'off') {\n overlayEl = overlayOff();\n\n } else {\n // raise error\n util.raiseError(\"Expecting 'on' or 'off'\");\n\n }\n\n return overlayEl;\n}\n\n\n/**\n * Turn on overlay.\n * @param {object} options - Overlay options.\n * @param {Element} childElement - The child element.\n */\nfunction overlayOn(options, childElement) {\n var doc = document,\n bodyEl = doc.body,\n overlayEl = doc.getElementById(overlayId);\n\n // cache activeElement\n if (doc.activeElement) activeElement = doc.activeElement;\n\n // add overlay\n util.enableScrollLock();\n\n if (!overlayEl) {\n // create overlayEl\n overlayEl = doc.createElement('div');\n overlayEl.setAttribute('id', overlayId);\n overlayEl.setAttribute('tabindex', '-1');\n \n // add child element\n if (childElement) overlayEl.appendChild(childElement);\n\n bodyEl.appendChild(overlayEl);\n \n } else {\n // remove existing children\n while (overlayEl.firstChild) overlayEl.removeChild(overlayEl.firstChild);\n \n // add child element\n if (childElement) overlayEl.appendChild(childElement);\n }\n\n // iOS bugfix\n if (iosRegex.test(navigator.userAgent)) {\n jqLite.css(overlayEl, 'cursor', 'pointer');\n }\n\n // handle options\n if (options.keyboard) addKeyupHandler();\n else removeKeyupHandler();\n\n if (options.static) removeClickHandler(overlayEl);\n else addClickHandler(overlayEl);\n\n // attach options\n overlayEl.muiOptions = options;\n\n // focus overlay element\n overlayEl.focus();\n\n return overlayEl;\n}\n\n\n/**\n * Turn off overlay.\n */\nfunction overlayOff() {\n var overlayEl = document.getElementById(overlayId),\n callbackFn;\n\n if (overlayEl) {\n // remove children\n while (overlayEl.firstChild) overlayEl.removeChild(overlayEl.firstChild);\n\n // remove overlay element\n overlayEl.parentNode.removeChild(overlayEl);\n\n // callback reference\n callbackFn = overlayEl.muiOptions.onclose;\n\n // remove click handler\n removeClickHandler(overlayEl);\n }\n\n util.disableScrollLock();\n\n // remove keyup handler\n removeKeyupHandler();\n\n // return focus to activeElement\n if (activeElement) activeElement.focus();\n\n // execute callback\n if (callbackFn) callbackFn();\n\n return overlayEl;\n}\n\n\n/**\n * Add keyup handler.\n */\nfunction addKeyupHandler() {\n jqLite.on(document, 'keyup', onKeyup);\n}\n\n\n/**\n * Remove keyup handler.\n */\nfunction removeKeyupHandler() {\n jqLite.off(document, 'keyup', onKeyup);\n}\n\n\n/**\n * Teardown overlay when escape key is pressed.\n */\nfunction onKeyup(ev) {\n if (ev.keyCode === 27) overlayOff();\n}\n\n\n/**\n * Add click handler.\n */\nfunction addClickHandler(overlayEl) {\n jqLite.on(overlayEl, 'click', onClick);\n}\n\n\n/**\n * Remove click handler.\n */\nfunction removeClickHandler(overlayEl) {\n jqLite.off(overlayEl, 'click', onClick);\n}\n\n\n/**\n * Teardown overlay when backdrop is clicked.\n */\nfunction onClick(ev) {\n if (ev.target.id === overlayId) overlayOff();\n}\n\n\n/** Define module API */\nmodule.exports = overlayFn;\n","/**\n * MUI CSS/JS utilities module\n * @module lib/util\n */\n\n'use strict';\n\n\nvar config = require('../config'),\n jqLite = require('./jqLite'),\n scrollLock = 0,\n scrollLockCls = 'mui-scroll-lock',\n scrollLockPos,\n scrollStyleEl,\n scrollEventHandler,\n _scrollBarWidth,\n _supportsPointerEvents;\n\n\nscrollEventHandler = function(ev) {\n // stop propagation on window scroll events\n if (!ev.target.tagName) ev.stopImmediatePropagation();\n}\n\n\n/**\n * Logging function\n */\nfunction logFn() {\n var win = window;\n \n if (config.debug && typeof win.console !== \"undefined\") {\n try {\n win.console.log.apply(win.console, arguments);\n } catch (a) {\n var e = Array.prototype.slice.call(arguments);\n win.console.log(e.join(\"\\n\"));\n }\n }\n}\n\n\n/**\n * Load CSS text in new stylesheet\n * @param {string} cssText - The css text.\n */\nfunction loadStyleFn(cssText) {\n var doc = document,\n head;\n \n // copied from jQuery \n head = doc.head ||\n doc.getElementsByTagName('head')[0] ||\n doc.documentElement;\n \n var e = doc.createElement('style');\n e.type = 'text/css';\n \n if (e.styleSheet) e.styleSheet.cssText = cssText;\n else e.appendChild(doc.createTextNode(cssText));\n \n // add to document\n head.insertBefore(e, head.firstChild);\n \n return e;\n}\n\n\n/**\n * Raise an error\n * @param {string} msg - The error message.\n */\nfunction raiseErrorFn(msg, useConsole) {\n if (useConsole) {\n if (typeof console !== 'undefined') console.warn('MUI Warning: ' + msg);\n } else {\n throw new Error('MUI: ' + msg);\n }\n}\n\n\n/**\n * Convert Classname object, with class as key and true/false as value, to an\n * class string.\n * @param {Object} classes The classes\n * @return {String} class string\n */\nfunction classNamesFn(classes) {\n var cs = '';\n for (var i in classes) {\n cs += (classes[i]) ? i + ' ' : '';\n }\n return cs.trim();\n}\n\n\n/**\n * Check if client supports pointer events.\n */\nfunction supportsPointerEventsFn() {\n // check cache\n if (_supportsPointerEvents !== undefined) return _supportsPointerEvents;\n \n var element = document.createElement('x');\n element.style.cssText = 'pointer-events:auto';\n _supportsPointerEvents = (element.style.pointerEvents === 'auto');\n return _supportsPointerEvents;\n}\n\n\n/**\n * Create callback closure.\n * @param {Object} instance - The object instance.\n * @param {String} funcName - The name of the callback function.\n */\nfunction callbackFn(instance, funcName) {\n return function() {instance[funcName].apply(instance, arguments);};\n}\n\n\n/**\n * Dispatch event.\n * @param {Element} element - The DOM element.\n * @param {String} eventType - The event type.\n * @param {Boolean} bubbles=true - If true, event bubbles.\n * @param {Boolean} cancelable=true = If true, event is cancelable\n * @param {Object} [data] - Data to add to event object\n */\nfunction dispatchEventFn(element, eventType, bubbles, cancelable, data) {\n var ev = document.createEvent('HTMLEvents'),\n bubbles = (bubbles !== undefined) ? bubbles : true,\n cancelable = (cancelable !== undefined) ? cancelable : true,\n k;\n\n ev.initEvent(eventType, bubbles, cancelable);\n \n // add data to event object\n if (data) for (k in data) ev[k] = data[k];\n \n // dispatch\n if (element) element.dispatchEvent(ev);\n \n return ev;\n}\n\n\n/**\n * Turn on window scroll lock.\n */\nfunction enableScrollLockFn() {\n // increment counter\n scrollLock += 1;\n \n // add lock\n if (scrollLock === 1) {\n var doc = document,\n win = window,\n htmlEl = doc.documentElement,\n bodyEl = doc.body,\n scrollBarWidth = getScrollBarWidth(),\n cssProps,\n cssStr,\n x;\n\n // define scroll lock class dynamically\n cssProps = ['overflow:hidden'];\n\n if (scrollBarWidth) {\n // scrollbar-y\n if (htmlEl.scrollHeight > htmlEl.clientHeight) {\n x = parseInt(jqLite.css(bodyEl, 'padding-right')) + scrollBarWidth;\n cssProps.push('padding-right:' + x + 'px');\n }\n \n // scrollbar-x\n if (htmlEl.scrollWidth > htmlEl.clientWidth) {\n x = parseInt(jqLite.css(bodyEl, 'padding-bottom')) + scrollBarWidth;\n cssProps.push('padding-bottom:' + x + 'px');\n }\n }\n\n // define css class dynamically\n cssStr = '.' + scrollLockCls + '{';\n cssStr += cssProps.join(' !important;') + ' !important;}';\n scrollStyleEl = loadStyleFn(cssStr);\n\n // cancel 'scroll' event listener callbacks\n jqLite.on(win, 'scroll', scrollEventHandler, true);\n\n // add scroll lock\n scrollLockPos = {left: jqLite.scrollLeft(win), top: jqLite.scrollTop(win)};\n jqLite.addClass(bodyEl, scrollLockCls);\n }\n}\n\n\n/**\n * Turn off window scroll lock.\n * @param {Boolean} resetPos - Reset scroll position to original value.\n */\nfunction disableScrollLockFn(resetPos) {\n // ignore\n if (scrollLock === 0) return;\n\n // decrement counter\n scrollLock -= 1;\n\n // remove lock \n if (scrollLock === 0) {\n // remove scroll lock and delete style element\n jqLite.removeClass(document.body, scrollLockCls);\n\n // restore scroll position\n if (resetPos) window.scrollTo(scrollLockPos.left, scrollLockPos.top);\n\n // restore scroll event listeners\n jqLite.off(window, 'scroll', scrollEventHandler, true);\n\n // delete style element (deferred for Firefox Quantum bugfix)\n setTimeout(function() {\n scrollStyleEl.parentNode.removeChild(scrollStyleEl); \n }, 0);\n }\n}\n\n/**\n * Return scroll bar width.\n */\nvar getScrollBarWidth = function() {\n // check cache\n if (_scrollBarWidth !== undefined) return _scrollBarWidth;\n \n // calculate scroll bar width\n var doc = document,\n bodyEl = doc.body,\n el = doc.createElement('div');\n\n el.innerHTML = '
';\n el = el.firstChild;\n bodyEl.appendChild(el);\n _scrollBarWidth = el.offsetWidth - el.clientWidth;\n bodyEl.removeChild(el);\n\n return _scrollBarWidth;\n}\n\n\n/**\n * requestAnimationFrame polyfilled\n * @param {Function} callback - The callback function\n */\nfunction requestAnimationFrameFn(callback) {\n var fn = window.requestAnimationFrame;\n if (fn) fn(callback);\n else setTimeout(callback, 0);\n}\n\n\n/**\n * Define the module API\n */\nmodule.exports = {\n /** Create callback closures */\n callback: callbackFn,\n \n /** Classnames object to string */\n classNames: classNamesFn,\n\n /** Disable scroll lock */\n disableScrollLock: disableScrollLockFn,\n\n /** Dispatch event */\n dispatchEvent: dispatchEventFn,\n \n /** Enable scroll lock */\n enableScrollLock: enableScrollLockFn,\n\n /** Log messages to the console when debug is turned on */\n log: logFn,\n\n /** Load CSS text as new stylesheet */\n loadStyle: loadStyleFn,\n\n /** Raise MUI error */\n raiseError: raiseErrorFn,\n\n /** Request animation frame */\n requestAnimationFrame: requestAnimationFrameFn,\n\n /** Support Pointer Events check */\n supportsPointerEvents: supportsPointerEventsFn\n};\n","/**\n * MUI config module\n * @module config\n */\n\n/** Define module API */\nmodule.exports = {\n /** Use debug mode */\n debug: true\n};\n"],"sourceRoot":""}