{"version":3,"file":"infrastructure.js","mappings":";;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACrIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC3JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACzjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC16BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACvPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACZA;AAEA;AACA;AACA;AACA;AACA;AAMA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAEA;AACA;AAEA;AAEA;AACA;AAAA;AAEA;AACA;AAEA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpVA;AAGA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAMA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAKA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAAA;AACA;AAIA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;;;;;;;;;;AAUA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAIA;AAIA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAlIA;AAoIA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxIA;AAEA;;;;;;;AAOA;AACA;AAAA;AAWA;AAAA;AAVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAKA;;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAMA;AAEA;AACA;AAEA;AAEA;AACA;AAAA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAMA;AAEA;AACA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAIA;AACA;AAEA;AACA;AACA;AAMA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAjIA;AAmIA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9IA;AAEA;;AAEA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAjBA;AAmBA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzBA;;;;AAIA;AACA;AASA;AARA;AACA;AAQA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAKA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAAA;AAvDA;AAyDA;;;;AAIA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AARA;AAUA;AAAA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/EA;AACA;;;;;AAKA;AACA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAMA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AA/CA;AAiDA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzDA;AAKA;AAAA;AAIA;AAAA;AAHA;AACA;AACA;;AAGA;AAEA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAzBA;AA2BA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjCA;AAEA;AACA;AACA;AAFA;AAIA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAIA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAMA;AAEA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AAKA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAIA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAIA;AACA;AAIA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AAAA;AAtLA;AAwLA;AAAA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AChMA;AACA;;AAEA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAjBA;AAmBA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxBA;AACA;;;;;;;;;;;;;;AAcA;AACA;AAAA;AAoCA;AAAA;AAnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAAA;AA9EA;AAgFA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjGA;AACA;;;;AAIA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAjCA;AAmCA;AAAA;AACA;;;;;;;;AC1CA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AAEA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAIA;AACA;AAIA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAIA;AACA;AAIA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAGA;AACA;AAGA;AAEA;AAEA;AAEA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAMA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5JA;AACA;;;;;AAKA;AACA;AAAA;AAGA;AAAA;AAFA;;AAIA;AAEA;AACA;AACA;AAEA;AACA;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAlDA;AAoDA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5DA;AACA;;;;AAIA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAlBA;AAoBA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3BA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAIA;AAEA;AAEA;AACA;AAEA;AAEA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AAIA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAIA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAGA;AACA;AACA;AAEA;AACA;AAKA;AACA;AACA;AACA;AAEA;AAIA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAIA;AAEA;AACA;AAEA;AACA;AAEA;AAKA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AAEA;AAAA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAlOA;AAoOA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtOA;AACA;AAAA;AAwCA;AAvCA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAEA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;;;;;;;;AAQA;AACA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAAA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AA7FA;AA+FA;;;AAGA;AACA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAAA;AApDA;AAsDA;AAAA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9MA;AACA;;;AAGA;AACA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AACA;AAOA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAAA;AAEA;AACA;AAAA;AAGA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAMA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAhIA;AAkIA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxIA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAGA;AAIA;AAIA;AAIA;AAIA;AAKA;AACA;AACA;AACA;AAAA;AAvCA;AAyCA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3CA;AACA;;;AAGA;AACA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AACA;AAMA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAxCA;AA0CA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AChDA;AACA;;AAEA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAdA;AAgBA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrBA;AACA;AACA;;AAEA;AACA;AAAA;AACA;AACA;AACA;AAEA;;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAAA;AA1EA;AA4EA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AClFA;AAMA;;AAEA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAZA;AAcA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxBA;AACA;;;;AAIA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAVA;AAYA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnBA;AACA;;;;;;AAMA;AACA;AAAA;AAGA;AAAA;AAFA;;AAIA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AAEA;AAIA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAGA;AAEA;AACA;AACA;AAEA;AAGA;AACA;AAEA;AAGA;AAGA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAlFA;AAoFA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7FA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAZA;AAcA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AClBA;AACA;;;;;;;;;;;;;AAaA;AACA;AAAA;AAaA;AAAA;AAZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAAA;AACA;AAMA;AACA;AAMA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAAA;AA1DA;AA6DA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7EA;AAIA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAIA;AAIA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAAA;AACA;AAEA;AACA;AACA;AACA;AAGA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;AAKA;AAIA;AAIA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAIA;AACA;AAIA;AACA;AAIA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAIA;AACA;AAIA;AACA;AAIA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAGA;AACA;AACA;AACA;AAGA;AACA;AAEA;AAGA;AACA;AACA;AACA;AACA;AAAA;AAnRA;AAqRA;AAAA;AACA;;;;;;;;;;;ACtRA;AACA;AACA;AAaA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AAAA;AAEA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvLA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;;;;;;;;ACvEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;AC5BA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;ACpHA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAAA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1IA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7DA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAAA;AACA;AACA;AAAA;AAEA;AACA;AAEA;AAAA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjHA;AACA;AAKA;AACA;AACA;AACA;AAEA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AACA;AAEA;AAKA;AAEA;AAAA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AAEA;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AAKA;AAEA;AAAA;AACA;AACA;AAKA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;AAKA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AACA;AAAA;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AAEA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AAEA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AAEA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AAEA;AAGA;AAEA;AAAA;AAEA;AACA;AACA;AACA;AAKA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AAEA;AAGA;AAEA;AAAA;AAEA;AACA;AACA;AACA;AAIA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AAAA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAIA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChhBA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACvGA;AAOA;AANA;AACA;AACA;AACA;AAIA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAxBA;AA0BA;;;;;;;;AC1BA;AACA;AACA;AACA;AAMA;AAIA;AACA;AAEA;AAEA;AAEA;AAGA;AAGA;AAEA;AAIA;AAEA;AAEA;AACA;AAEA;AAGA;AAGA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AAEA;AAEA;AAGA;AACA;AACA;AAMA;AAIA;AAEA;AAEA;AAEA;AAGA;AAGA;AAUA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;AC9JA;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAAA;AACA;AACA;;AAEA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AAAA;;AAEA;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;AAGA;AACA;;AAEA;AACA;AACA;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAKA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;;AAEA;AACA;AAEA;AACA;AACA;;AAEA;AACA;;AAGA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAIA;AAIA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAIA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AAEA;AAEA;AAEA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAIA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;;AAIA;AACA;AACA;AAEA;AAEA;AAEA;AAGA;AACA;AACA;AACA;AAEA;AACA;AAGA;;AAEA;AACA;AACA;AACA;AAGA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;;AAGA;AACA;AAAA;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAAA;;AAEA;AACA;AAGA;;AAEA;AACA;;AAGA;AACA;AACA;;AAKA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;;AAGA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;;AAGA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAEA;;;;;;;;AChnBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAIA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;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;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAGA;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AAEA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAQA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAGA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AAAA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAAA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAGA;AACA;AACA;AAAA;AACA;AAGA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;AACA;AACA;AACA;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;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAIA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAKA;AACA;AACA;AACA;AACA;AAAA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAiBA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9lDA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;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;;;;;;;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAOA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAIA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;;AAEA;AACA;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;AACA;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;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAOA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;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;AAEA;AACA;AACA;AACA;AACA;AAGA;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;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;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;AAAA;AACA;AACA;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;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;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAMA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAIA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;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;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;AC10CA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AAEA;AAEA;AAEA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;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;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;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;;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AACA;AAEA;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;AACA;AACA;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;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AACA;AAMA;AAEA;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AAAA;AAAA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AAGA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;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;AAEA;AACA;AACA;AAEA;AACA;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;AAEA;AACA;AACA;AAEA;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;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAaA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAAA;AACA;AACA;AAEA;AAAA;AACA;AACA;AAEA;AAAA;AACA;AAAA;AACA;AACA;;AAEA;AACA;AACA;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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;;AAEA;AACA;AACA;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;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;;;;;;;;AC9uEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAKA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAIA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;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;AACA;AACA;AACA;AACA;AAEA;;AASA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;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;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAOA;AACA;AAAA;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;;AAIA;AAAA;AAEA;;AAEA;AAAA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AAKA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAIA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;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;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AACA;;AAEA;AACA;AACA;AAEA;AACA;;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AAEA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAMA;AAEA;AAEA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAEA;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;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;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;AC5/CA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAGA;AAIA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAEA;AAAA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAMA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;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;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;;;;;;ACraA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAcA;AAaA;AASA;AASA;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;;;;;;;;AC5EA;AACA;AACA;AACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;;;;;AC5BA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACVA;AAAA;AAAA;ACCA;ACAA;AACA;AAEA;AAAA;AAAA;AAEA;AAAA;ACNA;AACA;AACA;AACA;AAGA;AADA;AACA;AACA;ACPA;AAAA;ACEA;AACA;AAAA;AAEA;AAAA;AAAA;ACGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACFA;AAaA;AAAA;AAAA;AACA;AACA;AAMA;AAAA;AAAA;AAAA;AAAA;AArBA;AAkCA;AAAA;AAAA;AAAA;AACA;AACA;AAKA;AAAA;AAAA;AAAA;AAAA;AAhBA;AA6BA;AAAA;AAAA;AAAA;AACA;AACA;AAKA;AAAA;AAAA;AAAA;AAAA;AAhBA;AAqCA;AAAA;AAAA;AACA;AACA;AAOA;AAAA;AAAA;AAAA;AAAA;AAzBA;AA8CA;AAAA;AAAA;AACA;AACA;AAOA;AAAA;AAAA;AAAA;AAAA;AAzBA;AA8CA;AAAA;AAAA;AACA;AACA;AAOA;AAAA;AAAA;AAAA;AAAA;AAzBA;AA0CA;AAAA;AAAA;AACA;AACA;AAMA;AAAA;AAAA;AAAA;AAAA;AApBA;AAsCA;AAAA;AAAA;AACA;AACA;AAOA;AAAA;AAAA;AAAA;AAAA;AAtBA;ACjHA;AAFA;AAGA;AAAA;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA;AAEA;AACA;AAAA;AAEA;AAgBA;AAAA;AAAA;AACA;AAEA;AACA;AAAA;AAEA;AAgBA;AAAA;AAAA;AACA;AAEA;AACA;AAAA;AAEA;AAeA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AF1JA;AAaA;AGjBA;AAIA;AAAA;AAAA;AAIA;AAAA;AAAA;AACA;AAAA;AAPA;ACKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAEA;AAAA;AAAA;AAAA;AAGA;AAEA;AAAA;AAAA;AAAA;AAIA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;AACA;AAAA;AAAA;AAAA;AAIA;AACA;AAAA;AAAA;AAAA;AAIA;AACA;AAAA;AAAA;AAAA;AAKA;AACA;AAAA;AAAA;AAAA;AAKA;AAAA;AAiBA;AACA;AAAA;AAIA;AAEA;AAIA;AAlBA;AAAA;AAuBA;AAIA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAKA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AANA;AAMA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;AAAA;AACA;AAAA;AAAA;AAAA;AAIA;AACA;AAMA;AAAA;AAAA;AAAA;AAEA;AAeA;AAAA;AAEA;AAAA;AAAA;AAAA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AAAA;AAEA;AACA;AAAA;AACA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;AACA;AAgEA;AAAA;AAxDA;AAEA;AAEA;AAeA;AAAA;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AAAA;AAAA;AAQA;AAEA;AAAA;AAcA;AAIA;AAAA;ACxQA;AAOA;AAAA;AAAA;ADuQA;AAGA;AAGA;AAGA;AAGA;AAEA;ACxQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AACA;AAAA;AAGA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAAA;AAGA;AAKA;AACA;AACA;AAMA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAaA;AAAA;AAAA;AAMA;AACA;AACA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAjBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBA;AAAA;AAAA;AAAA;AACA;AAAA;AAKA;AAAA;AAEA;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AADA;AAAA;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA5FA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiGA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAEA;AACA;AACA;AAAA;AAEA;AAAA;AAQA;AAAA;AALA;AACA;AACA;AACA;AAAA;AAAA;AAAA;ACvJA;AAGA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAiBA;AACA;AAaA;AAIA;AAGA;AACA;AASA;AACA;AASA;AAQA;AAIA;AAEA;AAGA;AACA;AAIA;AArEA;AAAA;AAAA;AAhBA;ACGA;AAIA;AAAA;AAAA;AAIA;AAIA;AAFA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AAOA;AAAA;AAAA;AAAA;AASA;AACA;AAAA;AAAA;AAlCA;AAkCA;AAAA;AAAA;AAAA;AAAA;AAAA;ACpCA;AACA;AAAA;AAAA;AAAA;AAGA;AAEA;AAGA;AAEA;AADA;AAAA;AAAA;AAZA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACcA;AACA;AAAA;AAAA;AAAA;AAGA;AAAA;AAEA;AAIA;AACA;AAEA;AAKA;AAEA;AAAA;AAEA;AACA;AAEA;AAKA;AAEA;AAAA;AAIA;AACA;AAEA;AAMA;AAAA;AAAA;AAAA;AACA;AC5DA;AAgBA;AAhBA;AAAA;AEOA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAIA;AAAA;AAJA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAKA;AAAA;AAHA;AAGA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AACA;AAAA;AADA;AACA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AAEA;AAAA;AAAA;AAAA;AACA;ACjBA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAEA;AACA;AAEA;AAGA;AACA;AACA;AAUA;AAAA;AAMA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAxCA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CA;AAEA;AAIA;AACA;AASA;AACA;AAIA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAAA;AASA;AAMA;AAIA;AAgBA;AAAA;AAAA;AAAA;AAAA;AAWA;AAAA;AAAA;AAAA;AAAA;AAIA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAEA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAIA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAhBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA;AAIA;AAGA;AAAA;AAHA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAUA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;AAAA;AAGA;AACA;AF3MA;AAUA;AAVA;AAuFA;AAOA;AAAA;AAAA;AAzCA;AAEA;AA2DA;AAAA;AACA;AAAA;AAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AACA;AAAA;AAAA;AAAA;AAMA;AACA;AAAA;AAAA;AAAA;AAIA;AACA;AAAA;AAQA;AAEA;AAIA;AAGA;AAAA;AAAA;AAAA;AAAA;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AACA;AAAA;AAIA;AAAA;AAAA;AAEA;AACA;AAIA;AAGA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;AAAA;AAAA;AAAA;AAAA;AAIA;AAEA;AAEA;AACA;AACA;AAAA;AAGA;AAAA;AAAA;AAGA;AAIA;AAAA;AAIA;AAAA;AACA;AAGA;AAAA;AAEA;AAAA;AAEA;AAGA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA;AAAA;AAOA;AAEA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AAEA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA1EA;;;;;AA0EA;AAAA;AAAA;AAAA;AAAA;AASA;AAEA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAXA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA;AAQA;AAIA;AAIA;AA8BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AALA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;AAAA;AAAA;AAAA;AAAA;AACA;AADA;AAAA;AACA;AACA;AAAA;AAKA;AACA;AACA;AAEA;AAGA;AAAA;AAIA;AAaA;AAMA;AAEA;AAGA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AAAA;AAAA;AAAA;AAWA;AAAA;AAAA;AAAA;AAaA;AAAA;AAAA;AAAA;AACA;AADA;AAAA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAgBA;AAAA;AAAA;AAAA;AAAA;AACA;AADA;AAAA;AACA;AACA;AAEA;AAEA;AAaA;AAAA;AAMA;AAGA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;AAAA;AAAA;AAAA;AACA;AAkBA;AAIA;AACA;AACA;AAIA;AAIA;AAIA;AAAA;AAAA;AAAA;AASA;AAEA;AAAA;AAAA;AAAA;AAQA;AAEA;AAAA;AAAA;AAAA;AAQA;AAEA;AAAA;AAAA;AAAA;AAAA;AASA;AAMA;AAEA;AAAA;AAFA;AAEA;AAAA;AAMA;AACA;AAEA;AAAA;AAEA;AACA;AAAA;AACA;AAAA;AAGA;AAAA;AAAA;AAIA;AACA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAGA;AAAA;AACA;AAEA;AAUA;AAAA;AAAA;AAKA;AAEA;AAAA;AAGA;AAEA;AAAA;AAEA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAMA;AAAA;AAAA;AAAA;AAGA;AACA;AAIA;AAJA;AAAA;AAIA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAGA;AACA;AACA;AAEA;AACA;AAAA;AAMA;AAAA;AAAA;AAAA;AAAA;AAaA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAGA;AAEA;AAMA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AASA;AAIA;AAAA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AADA;AACA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyDA;AA4BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA;AASA;AAAA;AAIA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAIA;AAEA;AAAA;AAAA;AAAA;AAEA;AAAA;AAYA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AACA;AACA;AAAA;AAIA;AAAA;AAAA;AAAA;AACA;AAAA;AAKA;AAAA;AAAA;AAAA;AACA;AAAA;AAEA;AACA;AAAA;AAAA;AAEA;AAEA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAUA;AALA;AAEA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;AAAA;AAAA;AAAA;AAIA;AAAA;AAMA;AAAA;AAAA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;;;AAvFA;;;;AAuFA;AAGA;AAAA;AAEA;AACA;AACA;AACA;AAAA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAKA;AAIA;AACA;AAAA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAKA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAIA;AAEA;AAEA;AACA;AAAA;AAEA;AAAA;AAIA;AAAA;AAEA;AAAA;AAAA;AAIA;AAGA;AAEA;AACA;AACA;AAAA;AAEA;AAAA;AAIA;AACA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AACA;AAMA;AAKA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAEA;AAAA;AAUA;AAAA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAvBA;AAKA;AAAA;AAkBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AAEA;AACA;AACA;AACA;AAOA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAGA;AACA;AAGA;AAEA;AACA;AACA;AAAA;AAEA;AAAA;AAIA;AACA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AAEA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAIA;AACA;AAAA;AAGA;AACA;AAAA;AAKA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AACA;AAAA;AAAA;AAAA;AAAA;AArhCA;AAKA;AAAA;AAAA;AAghCA;AGpnCA;AAAA;AAMA;AAAA;AACA;AAAA;AAAA;AAAA;AAGA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;ACbA;ACEA;AAKA;AAAA;AAAA;AAGA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAHA;AAEA;AACA;AAEA;AAAA;AACA;AADA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AACA;AADA;AACA;AACA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAbA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;AAeA;AAAA;AAAA;AAAA;AAKA;AACA;AAAA;AAAA;AAAA;AACA;ACjDA;AAQA;AAIA;AAIA;AAJA;AAAA;ACRA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAKA;AACA;AAAA;AAAA;AAAA;AAGA;AACA;AAAA;AAAA;AAAA;ACEA;AAGA;AAAA;AASA;AAAA;AAAA;AAAA;AAbA;AACA;AAAA;AAAA;AAAA;AAAA;AAeA;AAAA;AAAA;AAAA;AAAA;AAWA;AAAA;AAAA;AAAA;AACA;AAAA;AAIA;AAGA;AACA;AACA;AACA;AAAA;AAIA;AAKA;AACA;AAAA;AACA;AADA;AACA;AAWA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA5CA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+CA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AACA;AADA;AACA;AAqBA;AAAA;AAAA;AAAA;AAAA;AAGA;AAGA;AAAA;AAAA;AAAA;AAAA;AAcA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAvDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4DA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAFA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAKA;AAKA;AAAA;AAAA;AAEA;AAAA;AAIA;AAEA;AAEA;AAAA;AAGA;AACA;AACA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAaA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AA/CA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+CA;AAKA;AACA;AAKA;AAAA;AAAA;AAAA;AAAA;AAEA;ACjMA;AAAA;AAQA;AAAA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAcA;AAAA;AACA;AACA;AAOA;AAAA;AAAA;AAGA;AAAA;AAEA;AACA;AADA;AAAA;AACA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AACA;AAGA;AACA;AACA;AAAA;AAOA;AAKA;AAMA;AAEA;AAAA;AAIA;AAEA;AAAA;AAnDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAjBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyEA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAFA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAOA;AAAA;AAAA;AAAA;AAAA;AASA;AAAA;AAAA;AAAA;AAGA;ACvGA;AAAA;AASA;AACA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAMA;AALA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AADA;AAAA;AAAA;AAIA;AAAA;AACA;AAEA;AAAA;AAGA;AACA;AAAA;AAAA;AAAA;AAAA;AAYA;AACA;AAAA;AAMA;AAaA;AAEA;AAKA;AACA;AAQA;AAGA;AAEA;AAEA;AACA;AACA;AAAA;AAMA;AAIA;AAEA;AAWA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAlGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoGA;AAWA;AAAA;AAAA;AAAA;AAAA;AAUA;AAAA;AAAA;AAAA;AAAA;AAkBA;AAAA;AAAA;AAAA;AAAA;AAUA;AAAA;AAAA;AAAA;AACA;ACpHA;AAAA;AAAA;AAAA;AAWA;AAEA;AAEA;AAAA;ACxEA;AACA;AAIA;AACA;ADgGA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AAAA;AAAA;AACA;AAAA;AAGA;AAEA;AAAA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;AAAA;AAKA;AAAA;AACA;AAAA;AAAA;AAAA;AAEA;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAjCA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCA;AAaA;AAAA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAGA;AAEA;AAAA;AAEA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAnBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;AAAA;AAAA;AAAA;AAIA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAGA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA5BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAOA;AAAA;AALA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AAHA;AAAA;AAKA;AAAA;AAAA;AAAA;AACA;AAAA;AAGA;AAAA;AAAA;AAAA;AACA;AAAA;AAGA;AAAA;AAAA;AAAA;AACA;AAAA;AAOA;AAGA;AAAA;AACA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAzOA;AAAA;AAAA;AAAA;AA4OA;AAAA;AAAA;AAGA;AAAA;AAWA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAvFA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2FA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AAEA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAAA;AALA;AAAA;AAQA;AAAA;AAAA;AAAA;AACA;AAAA;AAGA;AAQA;AAAA;AAAA;AAIA;AACA;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA5CA;;;;AA4CA;AAIA;AAKA;AAAA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AACA;AAAA;AAEA;AAAA;AAKA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAHA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAEA;AAAA;AAAA;AAAA;AAGA;AAAA;AACA;AAAA;AAAA;AAAA;AAOA;AAAA;AAAA;AAAA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1DA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0DA;AAIA;AACA;AAEA;AAGA;AACA;AAEA;AAEA;AACA;AACA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AASA;AAAA;AAAA;AAAA;AALA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA;AAAA;AAEA;AAAA;AAAA;AAAA;AAGA;AAEA;AAGA;AAwIA;AACA;AAjHA;AArBA;AAAA;AAiBA;AAZA;AAEA;AAAA;AAGA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAeA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA;AAOA;AAgBA;AACA;AAMA;AAGA;AAAA;AAGA;AAEA;AACA;AAAA;AAAA;AAtCA;AAAA;AAAA;AAAA;AAAA;AA6CA;AAKA;AAQA;AAGA;AAAA;AAAA;AAAA;AACA;AAIA;AAKA;AAEA;AAgBA;AAAA;AAAA;AAAA;AACA;AAeA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAQA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AACA;AAKA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AAAA;AAAA;AAMA;AAEA;AACA;AAIA;AAEA;AAAA;AAAA;AAGA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmCA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAEA;AAAA;AAFA;AAEA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AACA;AAQA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAIA;AACA;AAAA;AAAA;AAAA;AACA;AEvrBA;AAAA;AAQA;AAAA;AAAA;AAAA;AAOA;AAGA;AAGA;AAKA;AAIA;AAAA;AAGA;AAAA;AAHA;AAGA;AAAA;AACA;AAEA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AAAA;AAEA;AACA;AAAA;AAEA;AAGA;AAAA;AAGA;AACA;AAAA;AAEA;AACA;AAAA;AACA;AAGA;AAAA;AAAA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAWA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AAAA;AAAA;AAAA;AAQA;AAAA;AAAA;AAAA;AAAA;AAMA;AAOA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAEA;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+DA;AAKA;AAjEA;AAIA;AACA;AAGA;AAAA;AA2DA;AAEA;AAGA;AAAA;AAAA;AAAA;AA2BA;AAYA;AACA;AAAA;AAAA;AAAA;AAAA;AAWA;AAGA;AAAA;AAAA;AAAA;AAqBA;AAEA;AAIA;AAAA;AAAA;AAAA;AAcA;AAGA;AAAA;AAAA;AAAA;AASA;AAGA;AAAA;AAAA;AAAA;AASA;AAMA;AAAA;AAAA;AAAA;AAEA;AAUA;AAUA;AAEA;AAQA;AAAA;AAAA;AAAA;ACxPA;AACA;AACA;AAIA;AAGA;AAAA;AAAA;AACA;AAIA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC1BA;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACPA;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACNA;AACA;AACA;AACA;AACA;;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","sources":["webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/AbortController.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/Errors.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/HttpClient.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/HubConnection.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/ILogger.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/ITransport.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/Loggers.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/Subject.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/Utils.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js","webpack:///../../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr/dist/esm/index.js","webpack:///./Frontend/src/Shared/Infrastructure/Ajax.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/AddressesTableBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/AjaxActionBehavior.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/AutoFocusBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/BaseControlBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/ChangablesBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/Component/ComponentBehavior.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/CustomFileBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/CustomSelectsBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/DatePickerBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/EnterBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/FileControlsBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/InputMaskBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/InputTrimBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/NotificationBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/PagerBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/PasswordPreviewBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/PaymentChannelAmountBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/RecaptchaBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/ReplaceTagBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/Reviews/UseBettingCartBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/ScrollbarBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/SortableBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/TabsBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/ToggleBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/TooltipsBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Behaviours/VoximplantCallBehaviour.ts","webpack:///./Frontend/src/Shared/Infrastructure/Controls.ts","webpack:///./Frontend/src/Shared/Infrastructure/LanguageSelector.ts","webpack:///./Frontend/src/Shared/Infrastructure/LocalStorageProvider.ts","webpack:///./Frontend/src/Shared/Infrastructure/Localization.ts","webpack:///./Frontend/src/Shared/Infrastructure/Metrics.ts","webpack:///./Frontend/src/Shared/Infrastructure/Popup.ts","webpack:///./Frontend/src/Shared/Infrastructure/SRLiveAdapter.ts","webpack:///./Frontend/src/Shared/Infrastructure/UiBlock.ts","webpack:///./Frontend/src/Shared/Infrastructure/Utils.ts","webpack:///./Frontend/src/Shared/Infrastructure/Validators.ts","webpack:///./Frontend/src/Shared/SignalR/SignalR.ts","webpack:///./Frontend/src/Shared/SignalR/SignalRConfigBuilder.ts","webpack:///./Frontend/src/Shared/Sports/Sports.ts","webpack:///external var \"jQuery\"","webpack:///./Frontend/src/Shared/libs/blockUI/jquery.blockUI.js","webpack:///./Frontend/src/Shared/libs/inputmask/inputmask.js","webpack:///./Frontend/src/Shared/libs/inputmask/jquery.inputmask.js","webpack:///./Frontend/src/Shared/libs/jquery.powertip/jquery.powertip.js","webpack:///./Frontend/src/Shared/libs/jquery.timepicker/jquery-ui-timepicker-addon.js","webpack:///./Frontend/src/Shared/libs/jquery.validate/jquery.validate.js","webpack:///./Frontend/src/Shared/libs/jquery.validate/jquery.validate.unobtrusive.js","webpack:///./Frontend/src/Shared/libs/jquery/jquery-ui-datepicker-settings.js","webpack:///./Frontend/src/Shared/libs/jquery/jquery-ui.min.js","webpack:///./Frontend/src/Shared/libs/jquery/jquery.nice-select.min.js","webpack:///./Frontend/src/Shared/libs/jquery/jquery.touchSwipe.min.js","webpack:///./Frontend/src/Shared/libs/jquery/jquery.ui.touch-punch.min.js","webpack:///signalR/webpack/universalModuleDefinition","webpack:///signalR/webpack/bootstrap","webpack:///signalR/webpack/runtime/define property getters","webpack:///signalR/webpack/runtime/global","webpack:///signalR/webpack/runtime/hasOwnProperty shorthand","webpack:///signalR/webpack/runtime/make namespace object","webpack:///signalR/src/ILogger.ts","webpack:///signalR/src/Errors.ts","webpack:///signalR/src/HttpClient.ts","webpack:///signalR/src/Loggers.ts","webpack:///signalR/src/Utils.ts","webpack:///signalR/src/FetchHttpClient.ts","webpack:///signalR/src/XhrHttpClient.ts","webpack:///signalR/src/DefaultHttpClient.ts","webpack:///signalR/src/TextMessageFormat.ts","webpack:///signalR/src/HandshakeProtocol.ts","webpack:///signalR/src/IHubProtocol.ts","webpack:///signalR/src/HubConnection.ts","webpack:///signalR/src/Subject.ts","webpack:///signalR/src/MessageBuffer.ts","webpack:///signalR/src/DefaultReconnectPolicy.ts","webpack:///signalR/src/HeaderNames.ts","webpack:///signalR/src/AccessTokenHttpClient.ts","webpack:///signalR/src/ITransport.ts","webpack:///signalR/src/AbortController.ts","webpack:///signalR/src/LongPollingTransport.ts","webpack:///signalR/src/ServerSentEventsTransport.ts","webpack:///signalR/src/WebSocketTransport.ts","webpack:///signalR/src/HttpConnection.ts","webpack:///signalR/src/DynamicImports.browser.ts","webpack:///signalR/src/JsonHubProtocol.ts","webpack:///signalR/src/HubConnectionBuilder.ts","webpack:///signalR/src/browser-index.ts","webpack:///./Frontend/src/Shared/startup.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/amd options","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/node module decorator","webpack:///./Frontend/src/infrastructure.ts"],"sourcesContent":["// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// Rough polyfill of https://developer.mozilla.org/en-US/docs/Web/API/AbortController\r\n// We don't actually ever use the API being polyfilled, we always use the polyfill because\r\n// it's a very new API right now.\r\n// Not exported from index.\r\n/** @private */\r\nexport class AbortController {\r\n constructor() {\r\n this._isAborted = false;\r\n this.onabort = null;\r\n }\r\n abort() {\r\n if (!this._isAborted) {\r\n this._isAborted = true;\r\n if (this.onabort) {\r\n this.onabort();\r\n }\r\n }\r\n }\r\n get signal() {\r\n return this;\r\n }\r\n get aborted() {\r\n return this._isAborted;\r\n }\r\n}\r\n//# sourceMappingURL=AbortController.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { HeaderNames } from \"./HeaderNames\";\r\nimport { HttpClient } from \"./HttpClient\";\r\n/** @private */\r\nexport class AccessTokenHttpClient extends HttpClient {\r\n constructor(innerClient, accessTokenFactory) {\r\n super();\r\n this._innerClient = innerClient;\r\n this._accessTokenFactory = accessTokenFactory;\r\n }\r\n async send(request) {\r\n let allowRetry = true;\r\n if (this._accessTokenFactory && (!this._accessToken || (request.url && request.url.indexOf(\"/negotiate?\") > 0))) {\r\n // don't retry if the request is a negotiate or if we just got a potentially new token from the access token factory\r\n allowRetry = false;\r\n this._accessToken = await this._accessTokenFactory();\r\n }\r\n this._setAuthorizationHeader(request);\r\n const response = await this._innerClient.send(request);\r\n if (allowRetry && response.statusCode === 401 && this._accessTokenFactory) {\r\n this._accessToken = await this._accessTokenFactory();\r\n this._setAuthorizationHeader(request);\r\n return await this._innerClient.send(request);\r\n }\r\n return response;\r\n }\r\n _setAuthorizationHeader(request) {\r\n if (!request.headers) {\r\n request.headers = {};\r\n }\r\n if (this._accessToken) {\r\n request.headers[HeaderNames.Authorization] = `Bearer ${this._accessToken}`;\r\n }\r\n // don't remove the header if there isn't an access token factory, the user manually added the header in this case\r\n else if (this._accessTokenFactory) {\r\n if (request.headers[HeaderNames.Authorization]) {\r\n delete request.headers[HeaderNames.Authorization];\r\n }\r\n }\r\n }\r\n getCookieString(url) {\r\n return this._innerClient.getCookieString(url);\r\n }\r\n}\r\n//# sourceMappingURL=AccessTokenHttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AbortError } from \"./Errors\";\r\nimport { FetchHttpClient } from \"./FetchHttpClient\";\r\nimport { HttpClient } from \"./HttpClient\";\r\nimport { Platform } from \"./Utils\";\r\nimport { XhrHttpClient } from \"./XhrHttpClient\";\r\n/** Default implementation of {@link @microsoft/signalr.HttpClient}. */\r\nexport class DefaultHttpClient extends HttpClient {\r\n /** Creates a new instance of the {@link @microsoft/signalr.DefaultHttpClient}, using the provided {@link @microsoft/signalr.ILogger} to log messages. */\r\n constructor(logger) {\r\n super();\r\n if (typeof fetch !== \"undefined\" || Platform.isNode) {\r\n this._httpClient = new FetchHttpClient(logger);\r\n }\r\n else if (typeof XMLHttpRequest !== \"undefined\") {\r\n this._httpClient = new XhrHttpClient(logger);\r\n }\r\n else {\r\n throw new Error(\"No usable HttpClient found.\");\r\n }\r\n }\r\n /** @inheritDoc */\r\n send(request) {\r\n // Check that abort was not signaled before calling send\r\n if (request.abortSignal && request.abortSignal.aborted) {\r\n return Promise.reject(new AbortError());\r\n }\r\n if (!request.method) {\r\n return Promise.reject(new Error(\"No method defined.\"));\r\n }\r\n if (!request.url) {\r\n return Promise.reject(new Error(\"No url defined.\"));\r\n }\r\n return this._httpClient.send(request);\r\n }\r\n getCookieString(url) {\r\n return this._httpClient.getCookieString(url);\r\n }\r\n}\r\n//# sourceMappingURL=DefaultHttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// 0, 2, 10, 30 second delays before reconnect attempts.\r\nconst DEFAULT_RETRY_DELAYS_IN_MILLISECONDS = [0, 2000, 10000, 30000, null];\r\n/** @private */\r\nexport class DefaultReconnectPolicy {\r\n constructor(retryDelays) {\r\n this._retryDelays = retryDelays !== undefined ? [...retryDelays, null] : DEFAULT_RETRY_DELAYS_IN_MILLISECONDS;\r\n }\r\n nextRetryDelayInMilliseconds(retryContext) {\r\n return this._retryDelays[retryContext.previousRetryCount];\r\n }\r\n}\r\n//# sourceMappingURL=DefaultReconnectPolicy.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n/** Error thrown when an HTTP request fails. */\r\nexport class HttpError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.HttpError}.\r\n *\r\n * @param {string} errorMessage A descriptive error message.\r\n * @param {number} statusCode The HTTP status code represented by this error.\r\n */\r\n constructor(errorMessage, statusCode) {\r\n const trueProto = new.target.prototype;\r\n super(`${errorMessage}: Status code '${statusCode}'`);\r\n this.statusCode = statusCode;\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when a timeout elapses. */\r\nexport class TimeoutError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.TimeoutError}.\r\n *\r\n * @param {string} errorMessage A descriptive error message.\r\n */\r\n constructor(errorMessage = \"A timeout occurred.\") {\r\n const trueProto = new.target.prototype;\r\n super(errorMessage);\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when an action is aborted. */\r\nexport class AbortError extends Error {\r\n /** Constructs a new instance of {@link AbortError}.\r\n *\r\n * @param {string} errorMessage A descriptive error message.\r\n */\r\n constructor(errorMessage = \"An abort occurred.\") {\r\n const trueProto = new.target.prototype;\r\n super(errorMessage);\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when the selected transport is unsupported by the browser. */\r\n/** @private */\r\nexport class UnsupportedTransportError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.UnsupportedTransportError}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n * @param {HttpTransportType} transport The {@link @microsoft/signalr.HttpTransportType} this error occurred on.\r\n */\r\n constructor(message, transport) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.transport = transport;\r\n this.errorType = 'UnsupportedTransportError';\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when the selected transport is disabled by the browser. */\r\n/** @private */\r\nexport class DisabledTransportError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.DisabledTransportError}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n * @param {HttpTransportType} transport The {@link @microsoft/signalr.HttpTransportType} this error occurred on.\r\n */\r\n constructor(message, transport) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.transport = transport;\r\n this.errorType = 'DisabledTransportError';\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when the selected transport cannot be started. */\r\n/** @private */\r\nexport class FailedToStartTransportError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.FailedToStartTransportError}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n * @param {HttpTransportType} transport The {@link @microsoft/signalr.HttpTransportType} this error occurred on.\r\n */\r\n constructor(message, transport) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.transport = transport;\r\n this.errorType = 'FailedToStartTransportError';\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when the negotiation with the server failed to complete. */\r\n/** @private */\r\nexport class FailedToNegotiateWithServerError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.FailedToNegotiateWithServerError}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n */\r\n constructor(message) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.errorType = 'FailedToNegotiateWithServerError';\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when multiple errors have occurred. */\r\n/** @private */\r\nexport class AggregateErrors extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.AggregateErrors}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n * @param {Error[]} innerErrors The collection of errors this error is aggregating.\r\n */\r\n constructor(message, innerErrors) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.innerErrors = innerErrors;\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n//# sourceMappingURL=Errors.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AbortError, HttpError, TimeoutError } from \"./Errors\";\r\nimport { HttpClient, HttpResponse } from \"./HttpClient\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { Platform, getGlobalThis, isArrayBuffer } from \"./Utils\";\r\nexport class FetchHttpClient extends HttpClient {\r\n constructor(logger) {\r\n super();\r\n this._logger = logger;\r\n // Node added a fetch implementation to the global scope starting in v18.\r\n // We need to add a cookie jar in node to be able to share cookies with WebSocket\r\n if (typeof fetch === \"undefined\" || Platform.isNode) {\r\n // In order to ignore the dynamic require in webpack builds we need to do this magic\r\n // @ts-ignore: TS doesn't know about these names\r\n const requireFunc = typeof __webpack_require__ === \"function\" ? __non_webpack_require__ : require;\r\n // Cookies aren't automatically handled in Node so we need to add a CookieJar to preserve cookies across requests\r\n this._jar = new (requireFunc(\"tough-cookie\")).CookieJar();\r\n if (typeof fetch === \"undefined\") {\r\n this._fetchType = requireFunc(\"node-fetch\");\r\n }\r\n else {\r\n // Use fetch from Node if available\r\n this._fetchType = fetch;\r\n }\r\n // node-fetch doesn't have a nice API for getting and setting cookies\r\n // fetch-cookie will wrap a fetch implementation with a default CookieJar or a provided one\r\n this._fetchType = requireFunc(\"fetch-cookie\")(this._fetchType, this._jar);\r\n }\r\n else {\r\n this._fetchType = fetch.bind(getGlobalThis());\r\n }\r\n if (typeof AbortController === \"undefined\") {\r\n // In order to ignore the dynamic require in webpack builds we need to do this magic\r\n // @ts-ignore: TS doesn't know about these names\r\n const requireFunc = typeof __webpack_require__ === \"function\" ? __non_webpack_require__ : require;\r\n // Node needs EventListener methods on AbortController which our custom polyfill doesn't provide\r\n this._abortControllerType = requireFunc(\"abort-controller\");\r\n }\r\n else {\r\n this._abortControllerType = AbortController;\r\n }\r\n }\r\n /** @inheritDoc */\r\n async send(request) {\r\n // Check that abort was not signaled before calling send\r\n if (request.abortSignal && request.abortSignal.aborted) {\r\n throw new AbortError();\r\n }\r\n if (!request.method) {\r\n throw new Error(\"No method defined.\");\r\n }\r\n if (!request.url) {\r\n throw new Error(\"No url defined.\");\r\n }\r\n const abortController = new this._abortControllerType();\r\n let error;\r\n // Hook our abortSignal into the abort controller\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = () => {\r\n abortController.abort();\r\n error = new AbortError();\r\n };\r\n }\r\n // If a timeout has been passed in, setup a timeout to call abort\r\n // Type needs to be any to fit window.setTimeout and NodeJS.setTimeout\r\n let timeoutId = null;\r\n if (request.timeout) {\r\n const msTimeout = request.timeout;\r\n timeoutId = setTimeout(() => {\r\n abortController.abort();\r\n this._logger.log(LogLevel.Warning, `Timeout from HTTP request.`);\r\n error = new TimeoutError();\r\n }, msTimeout);\r\n }\r\n if (request.content === \"\") {\r\n request.content = undefined;\r\n }\r\n if (request.content) {\r\n // Explicitly setting the Content-Type header for React Native on Android platform.\r\n request.headers = request.headers || {};\r\n if (isArrayBuffer(request.content)) {\r\n request.headers[\"Content-Type\"] = \"application/octet-stream\";\r\n }\r\n else {\r\n request.headers[\"Content-Type\"] = \"text/plain;charset=UTF-8\";\r\n }\r\n }\r\n let response;\r\n try {\r\n response = await this._fetchType(request.url, {\r\n body: request.content,\r\n cache: \"no-cache\",\r\n credentials: request.withCredentials === true ? \"include\" : \"same-origin\",\r\n headers: {\r\n \"X-Requested-With\": \"XMLHttpRequest\",\r\n ...request.headers,\r\n },\r\n method: request.method,\r\n mode: \"cors\",\r\n redirect: \"follow\",\r\n signal: abortController.signal,\r\n });\r\n }\r\n catch (e) {\r\n if (error) {\r\n throw error;\r\n }\r\n this._logger.log(LogLevel.Warning, `Error from HTTP request. ${e}.`);\r\n throw e;\r\n }\r\n finally {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = null;\r\n }\r\n }\r\n if (!response.ok) {\r\n const errorMessage = await deserializeContent(response, \"text\");\r\n throw new HttpError(errorMessage || response.statusText, response.status);\r\n }\r\n const content = deserializeContent(response, request.responseType);\r\n const payload = await content;\r\n return new HttpResponse(response.status, response.statusText, payload);\r\n }\r\n getCookieString(url) {\r\n let cookies = \"\";\r\n if (Platform.isNode && this._jar) {\r\n // @ts-ignore: unused variable\r\n this._jar.getCookies(url, (e, c) => cookies = c.join(\"; \"));\r\n }\r\n return cookies;\r\n }\r\n}\r\nfunction deserializeContent(response, responseType) {\r\n let content;\r\n switch (responseType) {\r\n case \"arraybuffer\":\r\n content = response.arrayBuffer();\r\n break;\r\n case \"text\":\r\n content = response.text();\r\n break;\r\n case \"blob\":\r\n case \"document\":\r\n case \"json\":\r\n throw new Error(`${responseType} is not supported.`);\r\n default:\r\n content = response.text();\r\n break;\r\n }\r\n return content;\r\n}\r\n//# sourceMappingURL=FetchHttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { TextMessageFormat } from \"./TextMessageFormat\";\r\nimport { isArrayBuffer } from \"./Utils\";\r\n/** @private */\r\nexport class HandshakeProtocol {\r\n // Handshake request is always JSON\r\n writeHandshakeRequest(handshakeRequest) {\r\n return TextMessageFormat.write(JSON.stringify(handshakeRequest));\r\n }\r\n parseHandshakeResponse(data) {\r\n let messageData;\r\n let remainingData;\r\n if (isArrayBuffer(data)) {\r\n // Format is binary but still need to read JSON text from handshake response\r\n const binaryData = new Uint8Array(data);\r\n const separatorIndex = binaryData.indexOf(TextMessageFormat.RecordSeparatorCode);\r\n if (separatorIndex === -1) {\r\n throw new Error(\"Message is incomplete.\");\r\n }\r\n // content before separator is handshake response\r\n // optional content after is additional messages\r\n const responseLength = separatorIndex + 1;\r\n messageData = String.fromCharCode.apply(null, Array.prototype.slice.call(binaryData.slice(0, responseLength)));\r\n remainingData = (binaryData.byteLength > responseLength) ? binaryData.slice(responseLength).buffer : null;\r\n }\r\n else {\r\n const textData = data;\r\n const separatorIndex = textData.indexOf(TextMessageFormat.RecordSeparator);\r\n if (separatorIndex === -1) {\r\n throw new Error(\"Message is incomplete.\");\r\n }\r\n // content before separator is handshake response\r\n // optional content after is additional messages\r\n const responseLength = separatorIndex + 1;\r\n messageData = textData.substring(0, responseLength);\r\n remainingData = (textData.length > responseLength) ? textData.substring(responseLength) : null;\r\n }\r\n // At this point we should have just the single handshake message\r\n const messages = TextMessageFormat.parse(messageData);\r\n const response = JSON.parse(messages[0]);\r\n if (response.type) {\r\n throw new Error(\"Expected a handshake response from the server.\");\r\n }\r\n const responseMessage = response;\r\n // multiple messages could have arrived with handshake\r\n // return additional data to be parsed as usual, or null if all parsed\r\n return [remainingData, responseMessage];\r\n }\r\n}\r\n//# sourceMappingURL=HandshakeProtocol.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nexport class HeaderNames {\r\n}\r\nHeaderNames.Authorization = \"Authorization\";\r\nHeaderNames.Cookie = \"Cookie\";\r\n//# sourceMappingURL=HeaderNames.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n/** Represents an HTTP response. */\r\nexport class HttpResponse {\r\n constructor(statusCode, statusText, content) {\r\n this.statusCode = statusCode;\r\n this.statusText = statusText;\r\n this.content = content;\r\n }\r\n}\r\n/** Abstraction over an HTTP client.\r\n *\r\n * This class provides an abstraction over an HTTP client so that a different implementation can be provided on different platforms.\r\n */\r\nexport class HttpClient {\r\n get(url, options) {\r\n return this.send({\r\n ...options,\r\n method: \"GET\",\r\n url,\r\n });\r\n }\r\n post(url, options) {\r\n return this.send({\r\n ...options,\r\n method: \"POST\",\r\n url,\r\n });\r\n }\r\n delete(url, options) {\r\n return this.send({\r\n ...options,\r\n method: \"DELETE\",\r\n url,\r\n });\r\n }\r\n /** Gets all cookies that apply to the specified URL.\r\n *\r\n * @param url The URL that the cookies are valid for.\r\n * @returns {string} A string containing all the key-value cookie pairs for the specified URL.\r\n */\r\n // @ts-ignore\r\n getCookieString(url) {\r\n return \"\";\r\n }\r\n}\r\n//# sourceMappingURL=HttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AccessTokenHttpClient } from \"./AccessTokenHttpClient\";\r\nimport { DefaultHttpClient } from \"./DefaultHttpClient\";\r\nimport { AggregateErrors, DisabledTransportError, FailedToNegotiateWithServerError, FailedToStartTransportError, HttpError, UnsupportedTransportError, AbortError } from \"./Errors\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { HttpTransportType, TransferFormat } from \"./ITransport\";\r\nimport { LongPollingTransport } from \"./LongPollingTransport\";\r\nimport { ServerSentEventsTransport } from \"./ServerSentEventsTransport\";\r\nimport { Arg, createLogger, getUserAgentHeader, Platform } from \"./Utils\";\r\nimport { WebSocketTransport } from \"./WebSocketTransport\";\r\nconst MAX_REDIRECTS = 100;\r\n/** @private */\r\nexport class HttpConnection {\r\n constructor(url, options = {}) {\r\n this._stopPromiseResolver = () => { };\r\n this.features = {};\r\n this._negotiateVersion = 1;\r\n Arg.isRequired(url, \"url\");\r\n this._logger = createLogger(options.logger);\r\n this.baseUrl = this._resolveUrl(url);\r\n options = options || {};\r\n options.logMessageContent = options.logMessageContent === undefined ? false : options.logMessageContent;\r\n if (typeof options.withCredentials === \"boolean\" || options.withCredentials === undefined) {\r\n options.withCredentials = options.withCredentials === undefined ? true : options.withCredentials;\r\n }\r\n else {\r\n throw new Error(\"withCredentials option was not a 'boolean' or 'undefined' value\");\r\n }\r\n options.timeout = options.timeout === undefined ? 100 * 1000 : options.timeout;\r\n let webSocketModule = null;\r\n let eventSourceModule = null;\r\n if (Platform.isNode && typeof require !== \"undefined\") {\r\n // In order to ignore the dynamic require in webpack builds we need to do this magic\r\n // @ts-ignore: TS doesn't know about these names\r\n const requireFunc = typeof __webpack_require__ === \"function\" ? __non_webpack_require__ : require;\r\n webSocketModule = requireFunc(\"ws\");\r\n eventSourceModule = requireFunc(\"eventsource\");\r\n }\r\n if (!Platform.isNode && typeof WebSocket !== \"undefined\" && !options.WebSocket) {\r\n options.WebSocket = WebSocket;\r\n }\r\n else if (Platform.isNode && !options.WebSocket) {\r\n if (webSocketModule) {\r\n options.WebSocket = webSocketModule;\r\n }\r\n }\r\n if (!Platform.isNode && typeof EventSource !== \"undefined\" && !options.EventSource) {\r\n options.EventSource = EventSource;\r\n }\r\n else if (Platform.isNode && !options.EventSource) {\r\n if (typeof eventSourceModule !== \"undefined\") {\r\n options.EventSource = eventSourceModule;\r\n }\r\n }\r\n this._httpClient = new AccessTokenHttpClient(options.httpClient || new DefaultHttpClient(this._logger), options.accessTokenFactory);\r\n this._connectionState = \"Disconnected\" /* ConnectionState.Disconnected */;\r\n this._connectionStarted = false;\r\n this._options = options;\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n async start(transferFormat) {\r\n transferFormat = transferFormat || TransferFormat.Binary;\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n this._logger.log(LogLevel.Debug, `Starting connection with transfer format '${TransferFormat[transferFormat]}'.`);\r\n if (this._connectionState !== \"Disconnected\" /* ConnectionState.Disconnected */) {\r\n return Promise.reject(new Error(\"Cannot start an HttpConnection that is not in the 'Disconnected' state.\"));\r\n }\r\n this._connectionState = \"Connecting\" /* ConnectionState.Connecting */;\r\n this._startInternalPromise = this._startInternal(transferFormat);\r\n await this._startInternalPromise;\r\n // The TypeScript compiler thinks that connectionState must be Connecting here. The TypeScript compiler is wrong.\r\n if (this._connectionState === \"Disconnecting\" /* ConnectionState.Disconnecting */) {\r\n // stop() was called and transitioned the client into the Disconnecting state.\r\n const message = \"Failed to start the HttpConnection before stop() was called.\";\r\n this._logger.log(LogLevel.Error, message);\r\n // We cannot await stopPromise inside startInternal since stopInternal awaits the startInternalPromise.\r\n await this._stopPromise;\r\n return Promise.reject(new AbortError(message));\r\n }\r\n else if (this._connectionState !== \"Connected\" /* ConnectionState.Connected */) {\r\n // stop() was called and transitioned the client into the Disconnecting state.\r\n const message = \"HttpConnection.startInternal completed gracefully but didn't enter the connection into the connected state!\";\r\n this._logger.log(LogLevel.Error, message);\r\n return Promise.reject(new AbortError(message));\r\n }\r\n this._connectionStarted = true;\r\n }\r\n send(data) {\r\n if (this._connectionState !== \"Connected\" /* ConnectionState.Connected */) {\r\n return Promise.reject(new Error(\"Cannot send data if the connection is not in the 'Connected' State.\"));\r\n }\r\n if (!this._sendQueue) {\r\n this._sendQueue = new TransportSendQueue(this.transport);\r\n }\r\n // Transport will not be null if state is connected\r\n return this._sendQueue.send(data);\r\n }\r\n async stop(error) {\r\n if (this._connectionState === \"Disconnected\" /* ConnectionState.Disconnected */) {\r\n this._logger.log(LogLevel.Debug, `Call to HttpConnection.stop(${error}) ignored because the connection is already in the disconnected state.`);\r\n return Promise.resolve();\r\n }\r\n if (this._connectionState === \"Disconnecting\" /* ConnectionState.Disconnecting */) {\r\n this._logger.log(LogLevel.Debug, `Call to HttpConnection.stop(${error}) ignored because the connection is already in the disconnecting state.`);\r\n return this._stopPromise;\r\n }\r\n this._connectionState = \"Disconnecting\" /* ConnectionState.Disconnecting */;\r\n this._stopPromise = new Promise((resolve) => {\r\n // Don't complete stop() until stopConnection() completes.\r\n this._stopPromiseResolver = resolve;\r\n });\r\n // stopInternal should never throw so just observe it.\r\n await this._stopInternal(error);\r\n await this._stopPromise;\r\n }\r\n async _stopInternal(error) {\r\n // Set error as soon as possible otherwise there is a race between\r\n // the transport closing and providing an error and the error from a close message\r\n // We would prefer the close message error.\r\n this._stopError = error;\r\n try {\r\n await this._startInternalPromise;\r\n }\r\n catch (e) {\r\n // This exception is returned to the user as a rejected Promise from the start method.\r\n }\r\n // The transport's onclose will trigger stopConnection which will run our onclose event.\r\n // The transport should always be set if currently connected. If it wasn't set, it's likely because\r\n // stop was called during start() and start() failed.\r\n if (this.transport) {\r\n try {\r\n await this.transport.stop();\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `HttpConnection.transport.stop() threw error '${e}'.`);\r\n this._stopConnection();\r\n }\r\n this.transport = undefined;\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, \"HttpConnection.transport is undefined in HttpConnection.stop() because start() failed.\");\r\n }\r\n }\r\n async _startInternal(transferFormat) {\r\n // Store the original base url and the access token factory since they may change\r\n // as part of negotiating\r\n let url = this.baseUrl;\r\n this._accessTokenFactory = this._options.accessTokenFactory;\r\n this._httpClient._accessTokenFactory = this._accessTokenFactory;\r\n try {\r\n if (this._options.skipNegotiation) {\r\n if (this._options.transport === HttpTransportType.WebSockets) {\r\n // No need to add a connection ID in this case\r\n this.transport = this._constructTransport(HttpTransportType.WebSockets);\r\n // We should just call connect directly in this case.\r\n // No fallback or negotiate in this case.\r\n await this._startTransport(url, transferFormat);\r\n }\r\n else {\r\n throw new Error(\"Negotiation can only be skipped when using the WebSocket transport directly.\");\r\n }\r\n }\r\n else {\r\n let negotiateResponse = null;\r\n let redirects = 0;\r\n do {\r\n negotiateResponse = await this._getNegotiationResponse(url);\r\n // the user tries to stop the connection when it is being started\r\n if (this._connectionState === \"Disconnecting\" /* ConnectionState.Disconnecting */ || this._connectionState === \"Disconnected\" /* ConnectionState.Disconnected */) {\r\n throw new AbortError(\"The connection was stopped during negotiation.\");\r\n }\r\n if (negotiateResponse.error) {\r\n throw new Error(negotiateResponse.error);\r\n }\r\n if (negotiateResponse.ProtocolVersion) {\r\n throw new Error(\"Detected a connection attempt to an ASP.NET SignalR Server. This client only supports connecting to an ASP.NET Core SignalR Server. See https://aka.ms/signalr-core-differences for details.\");\r\n }\r\n if (negotiateResponse.url) {\r\n url = negotiateResponse.url;\r\n }\r\n if (negotiateResponse.accessToken) {\r\n // Replace the current access token factory with one that uses\r\n // the returned access token\r\n const accessToken = negotiateResponse.accessToken;\r\n this._accessTokenFactory = () => accessToken;\r\n // set the factory to undefined so the AccessTokenHttpClient won't retry with the same token, since we know it won't change until a connection restart\r\n this._httpClient._accessToken = accessToken;\r\n this._httpClient._accessTokenFactory = undefined;\r\n }\r\n redirects++;\r\n } while (negotiateResponse.url && redirects < MAX_REDIRECTS);\r\n if (redirects === MAX_REDIRECTS && negotiateResponse.url) {\r\n throw new Error(\"Negotiate redirection limit exceeded.\");\r\n }\r\n await this._createTransport(url, this._options.transport, negotiateResponse, transferFormat);\r\n }\r\n if (this.transport instanceof LongPollingTransport) {\r\n this.features.inherentKeepAlive = true;\r\n }\r\n if (this._connectionState === \"Connecting\" /* ConnectionState.Connecting */) {\r\n // Ensure the connection transitions to the connected state prior to completing this.startInternalPromise.\r\n // start() will handle the case when stop was called and startInternal exits still in the disconnecting state.\r\n this._logger.log(LogLevel.Debug, \"The HttpConnection connected successfully.\");\r\n this._connectionState = \"Connected\" /* ConnectionState.Connected */;\r\n }\r\n // stop() is waiting on us via this.startInternalPromise so keep this.transport around so it can clean up.\r\n // This is the only case startInternal can exit in neither the connected nor disconnected state because stopConnection()\r\n // will transition to the disconnected state. start() will wait for the transition using the stopPromise.\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, \"Failed to start the connection: \" + e);\r\n this._connectionState = \"Disconnected\" /* ConnectionState.Disconnected */;\r\n this.transport = undefined;\r\n // if start fails, any active calls to stop assume that start will complete the stop promise\r\n this._stopPromiseResolver();\r\n return Promise.reject(e);\r\n }\r\n }\r\n async _getNegotiationResponse(url) {\r\n const headers = {};\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n const negotiateUrl = this._resolveNegotiateUrl(url);\r\n this._logger.log(LogLevel.Debug, `Sending negotiation request: ${negotiateUrl}.`);\r\n try {\r\n const response = await this._httpClient.post(negotiateUrl, {\r\n content: \"\",\r\n headers: { ...headers, ...this._options.headers },\r\n timeout: this._options.timeout,\r\n withCredentials: this._options.withCredentials,\r\n });\r\n if (response.statusCode !== 200) {\r\n return Promise.reject(new Error(`Unexpected status code returned from negotiate '${response.statusCode}'`));\r\n }\r\n const negotiateResponse = JSON.parse(response.content);\r\n if (!negotiateResponse.negotiateVersion || negotiateResponse.negotiateVersion < 1) {\r\n // Negotiate version 0 doesn't use connectionToken\r\n // So we set it equal to connectionId so all our logic can use connectionToken without being aware of the negotiate version\r\n negotiateResponse.connectionToken = negotiateResponse.connectionId;\r\n }\r\n if (negotiateResponse.useStatefulReconnect && this._options._useStatefulReconnect !== true) {\r\n return Promise.reject(new FailedToNegotiateWithServerError(\"Client didn't negotiate Stateful Reconnect but the server did.\"));\r\n }\r\n return negotiateResponse;\r\n }\r\n catch (e) {\r\n let errorMessage = \"Failed to complete negotiation with the server: \" + e;\r\n if (e instanceof HttpError) {\r\n if (e.statusCode === 404) {\r\n errorMessage = errorMessage + \" Either this is not a SignalR endpoint or there is a proxy blocking the connection.\";\r\n }\r\n }\r\n this._logger.log(LogLevel.Error, errorMessage);\r\n return Promise.reject(new FailedToNegotiateWithServerError(errorMessage));\r\n }\r\n }\r\n _createConnectUrl(url, connectionToken) {\r\n if (!connectionToken) {\r\n return url;\r\n }\r\n return url + (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + `id=${connectionToken}`;\r\n }\r\n async _createTransport(url, requestedTransport, negotiateResponse, requestedTransferFormat) {\r\n let connectUrl = this._createConnectUrl(url, negotiateResponse.connectionToken);\r\n if (this._isITransport(requestedTransport)) {\r\n this._logger.log(LogLevel.Debug, \"Connection was provided an instance of ITransport, using that directly.\");\r\n this.transport = requestedTransport;\r\n await this._startTransport(connectUrl, requestedTransferFormat);\r\n this.connectionId = negotiateResponse.connectionId;\r\n return;\r\n }\r\n const transportExceptions = [];\r\n const transports = negotiateResponse.availableTransports || [];\r\n let negotiate = negotiateResponse;\r\n for (const endpoint of transports) {\r\n const transportOrError = this._resolveTransportOrError(endpoint, requestedTransport, requestedTransferFormat, (negotiate === null || negotiate === void 0 ? void 0 : negotiate.useStatefulReconnect) === true);\r\n if (transportOrError instanceof Error) {\r\n // Store the error and continue, we don't want to cause a re-negotiate in these cases\r\n transportExceptions.push(`${endpoint.transport} failed:`);\r\n transportExceptions.push(transportOrError);\r\n }\r\n else if (this._isITransport(transportOrError)) {\r\n this.transport = transportOrError;\r\n if (!negotiate) {\r\n try {\r\n negotiate = await this._getNegotiationResponse(url);\r\n }\r\n catch (ex) {\r\n return Promise.reject(ex);\r\n }\r\n connectUrl = this._createConnectUrl(url, negotiate.connectionToken);\r\n }\r\n try {\r\n await this._startTransport(connectUrl, requestedTransferFormat);\r\n this.connectionId = negotiate.connectionId;\r\n return;\r\n }\r\n catch (ex) {\r\n this._logger.log(LogLevel.Error, `Failed to start the transport '${endpoint.transport}': ${ex}`);\r\n negotiate = undefined;\r\n transportExceptions.push(new FailedToStartTransportError(`${endpoint.transport} failed: ${ex}`, HttpTransportType[endpoint.transport]));\r\n if (this._connectionState !== \"Connecting\" /* ConnectionState.Connecting */) {\r\n const message = \"Failed to select transport before stop() was called.\";\r\n this._logger.log(LogLevel.Debug, message);\r\n return Promise.reject(new AbortError(message));\r\n }\r\n }\r\n }\r\n }\r\n if (transportExceptions.length > 0) {\r\n return Promise.reject(new AggregateErrors(`Unable to connect to the server with any of the available transports. ${transportExceptions.join(\" \")}`, transportExceptions));\r\n }\r\n return Promise.reject(new Error(\"None of the transports supported by the client are supported by the server.\"));\r\n }\r\n _constructTransport(transport) {\r\n switch (transport) {\r\n case HttpTransportType.WebSockets:\r\n if (!this._options.WebSocket) {\r\n throw new Error(\"'WebSocket' is not supported in your environment.\");\r\n }\r\n return new WebSocketTransport(this._httpClient, this._accessTokenFactory, this._logger, this._options.logMessageContent, this._options.WebSocket, this._options.headers || {});\r\n case HttpTransportType.ServerSentEvents:\r\n if (!this._options.EventSource) {\r\n throw new Error(\"'EventSource' is not supported in your environment.\");\r\n }\r\n return new ServerSentEventsTransport(this._httpClient, this._httpClient._accessToken, this._logger, this._options);\r\n case HttpTransportType.LongPolling:\r\n return new LongPollingTransport(this._httpClient, this._logger, this._options);\r\n default:\r\n throw new Error(`Unknown transport: ${transport}.`);\r\n }\r\n }\r\n _startTransport(url, transferFormat) {\r\n this.transport.onreceive = this.onreceive;\r\n if (this.features.reconnect) {\r\n this.transport.onclose = async (e) => {\r\n let callStop = false;\r\n if (this.features.reconnect) {\r\n try {\r\n this.features.disconnected();\r\n await this.transport.connect(url, transferFormat);\r\n await this.features.resend();\r\n }\r\n catch {\r\n callStop = true;\r\n }\r\n }\r\n else {\r\n this._stopConnection(e);\r\n return;\r\n }\r\n if (callStop) {\r\n this._stopConnection(e);\r\n }\r\n };\r\n }\r\n else {\r\n this.transport.onclose = (e) => this._stopConnection(e);\r\n }\r\n return this.transport.connect(url, transferFormat);\r\n }\r\n _resolveTransportOrError(endpoint, requestedTransport, requestedTransferFormat, useStatefulReconnect) {\r\n const transport = HttpTransportType[endpoint.transport];\r\n if (transport === null || transport === undefined) {\r\n this._logger.log(LogLevel.Debug, `Skipping transport '${endpoint.transport}' because it is not supported by this client.`);\r\n return new Error(`Skipping transport '${endpoint.transport}' because it is not supported by this client.`);\r\n }\r\n else {\r\n if (transportMatches(requestedTransport, transport)) {\r\n const transferFormats = endpoint.transferFormats.map((s) => TransferFormat[s]);\r\n if (transferFormats.indexOf(requestedTransferFormat) >= 0) {\r\n if ((transport === HttpTransportType.WebSockets && !this._options.WebSocket) ||\r\n (transport === HttpTransportType.ServerSentEvents && !this._options.EventSource)) {\r\n this._logger.log(LogLevel.Debug, `Skipping transport '${HttpTransportType[transport]}' because it is not supported in your environment.'`);\r\n return new UnsupportedTransportError(`'${HttpTransportType[transport]}' is not supported in your environment.`, transport);\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, `Selecting transport '${HttpTransportType[transport]}'.`);\r\n try {\r\n this.features.reconnect = transport === HttpTransportType.WebSockets ? useStatefulReconnect : undefined;\r\n return this._constructTransport(transport);\r\n }\r\n catch (ex) {\r\n return ex;\r\n }\r\n }\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, `Skipping transport '${HttpTransportType[transport]}' because it does not support the requested transfer format '${TransferFormat[requestedTransferFormat]}'.`);\r\n return new Error(`'${HttpTransportType[transport]}' does not support ${TransferFormat[requestedTransferFormat]}.`);\r\n }\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, `Skipping transport '${HttpTransportType[transport]}' because it was disabled by the client.`);\r\n return new DisabledTransportError(`'${HttpTransportType[transport]}' is disabled by the client.`, transport);\r\n }\r\n }\r\n }\r\n _isITransport(transport) {\r\n return transport && typeof (transport) === \"object\" && \"connect\" in transport;\r\n }\r\n _stopConnection(error) {\r\n this._logger.log(LogLevel.Debug, `HttpConnection.stopConnection(${error}) called while in state ${this._connectionState}.`);\r\n this.transport = undefined;\r\n // If we have a stopError, it takes precedence over the error from the transport\r\n error = this._stopError || error;\r\n this._stopError = undefined;\r\n if (this._connectionState === \"Disconnected\" /* ConnectionState.Disconnected */) {\r\n this._logger.log(LogLevel.Debug, `Call to HttpConnection.stopConnection(${error}) was ignored because the connection is already in the disconnected state.`);\r\n return;\r\n }\r\n if (this._connectionState === \"Connecting\" /* ConnectionState.Connecting */) {\r\n this._logger.log(LogLevel.Warning, `Call to HttpConnection.stopConnection(${error}) was ignored because the connection is still in the connecting state.`);\r\n throw new Error(`HttpConnection.stopConnection(${error}) was called while the connection is still in the connecting state.`);\r\n }\r\n if (this._connectionState === \"Disconnecting\" /* ConnectionState.Disconnecting */) {\r\n // A call to stop() induced this call to stopConnection and needs to be completed.\r\n // Any stop() awaiters will be scheduled to continue after the onclose callback fires.\r\n this._stopPromiseResolver();\r\n }\r\n if (error) {\r\n this._logger.log(LogLevel.Error, `Connection disconnected with error '${error}'.`);\r\n }\r\n else {\r\n this._logger.log(LogLevel.Information, \"Connection disconnected.\");\r\n }\r\n if (this._sendQueue) {\r\n this._sendQueue.stop().catch((e) => {\r\n this._logger.log(LogLevel.Error, `TransportSendQueue.stop() threw error '${e}'.`);\r\n });\r\n this._sendQueue = undefined;\r\n }\r\n this.connectionId = undefined;\r\n this._connectionState = \"Disconnected\" /* ConnectionState.Disconnected */;\r\n if (this._connectionStarted) {\r\n this._connectionStarted = false;\r\n try {\r\n if (this.onclose) {\r\n this.onclose(error);\r\n }\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `HttpConnection.onclose(${error}) threw error '${e}'.`);\r\n }\r\n }\r\n }\r\n _resolveUrl(url) {\r\n // startsWith is not supported in IE\r\n if (url.lastIndexOf(\"https://\", 0) === 0 || url.lastIndexOf(\"http://\", 0) === 0) {\r\n return url;\r\n }\r\n if (!Platform.isBrowser) {\r\n throw new Error(`Cannot resolve '${url}'.`);\r\n }\r\n // Setting the url to the href propery of an anchor tag handles normalization\r\n // for us. There are 3 main cases.\r\n // 1. Relative path normalization e.g \"b\" -> \"http://localhost:5000/a/b\"\r\n // 2. Absolute path normalization e.g \"/a/b\" -> \"http://localhost:5000/a/b\"\r\n // 3. Networkpath reference normalization e.g \"//localhost:5000/a/b\" -> \"http://localhost:5000/a/b\"\r\n const aTag = window.document.createElement(\"a\");\r\n aTag.href = url;\r\n this._logger.log(LogLevel.Information, `Normalizing '${url}' to '${aTag.href}'.`);\r\n return aTag.href;\r\n }\r\n _resolveNegotiateUrl(url) {\r\n const negotiateUrl = new URL(url);\r\n if (negotiateUrl.pathname.endsWith('/')) {\r\n negotiateUrl.pathname += \"negotiate\";\r\n }\r\n else {\r\n negotiateUrl.pathname += \"/negotiate\";\r\n }\r\n const searchParams = new URLSearchParams(negotiateUrl.searchParams);\r\n if (!searchParams.has(\"negotiateVersion\")) {\r\n searchParams.append(\"negotiateVersion\", this._negotiateVersion.toString());\r\n }\r\n if (searchParams.has(\"useStatefulReconnect\")) {\r\n if (searchParams.get(\"useStatefulReconnect\") === \"true\") {\r\n this._options._useStatefulReconnect = true;\r\n }\r\n }\r\n else if (this._options._useStatefulReconnect === true) {\r\n searchParams.append(\"useStatefulReconnect\", \"true\");\r\n }\r\n negotiateUrl.search = searchParams.toString();\r\n return negotiateUrl.toString();\r\n }\r\n}\r\nfunction transportMatches(requestedTransport, actualTransport) {\r\n return !requestedTransport || ((actualTransport & requestedTransport) !== 0);\r\n}\r\n/** @private */\r\nexport class TransportSendQueue {\r\n constructor(_transport) {\r\n this._transport = _transport;\r\n this._buffer = [];\r\n this._executing = true;\r\n this._sendBufferedData = new PromiseSource();\r\n this._transportResult = new PromiseSource();\r\n this._sendLoopPromise = this._sendLoop();\r\n }\r\n send(data) {\r\n this._bufferData(data);\r\n if (!this._transportResult) {\r\n this._transportResult = new PromiseSource();\r\n }\r\n return this._transportResult.promise;\r\n }\r\n stop() {\r\n this._executing = false;\r\n this._sendBufferedData.resolve();\r\n return this._sendLoopPromise;\r\n }\r\n _bufferData(data) {\r\n if (this._buffer.length && typeof (this._buffer[0]) !== typeof (data)) {\r\n throw new Error(`Expected data to be of type ${typeof (this._buffer)} but was of type ${typeof (data)}`);\r\n }\r\n this._buffer.push(data);\r\n this._sendBufferedData.resolve();\r\n }\r\n async _sendLoop() {\r\n while (true) {\r\n await this._sendBufferedData.promise;\r\n if (!this._executing) {\r\n if (this._transportResult) {\r\n this._transportResult.reject(\"Connection stopped.\");\r\n }\r\n break;\r\n }\r\n this._sendBufferedData = new PromiseSource();\r\n const transportResult = this._transportResult;\r\n this._transportResult = undefined;\r\n const data = typeof (this._buffer[0]) === \"string\" ?\r\n this._buffer.join(\"\") :\r\n TransportSendQueue._concatBuffers(this._buffer);\r\n this._buffer.length = 0;\r\n try {\r\n await this._transport.send(data);\r\n transportResult.resolve();\r\n }\r\n catch (error) {\r\n transportResult.reject(error);\r\n }\r\n }\r\n }\r\n static _concatBuffers(arrayBuffers) {\r\n const totalLength = arrayBuffers.map((b) => b.byteLength).reduce((a, b) => a + b);\r\n const result = new Uint8Array(totalLength);\r\n let offset = 0;\r\n for (const item of arrayBuffers) {\r\n result.set(new Uint8Array(item), offset);\r\n offset += item.byteLength;\r\n }\r\n return result.buffer;\r\n }\r\n}\r\nclass PromiseSource {\r\n constructor() {\r\n this.promise = new Promise((resolve, reject) => [this._resolver, this._rejecter] = [resolve, reject]);\r\n }\r\n resolve() {\r\n this._resolver();\r\n }\r\n reject(reason) {\r\n this._rejecter(reason);\r\n }\r\n}\r\n//# sourceMappingURL=HttpConnection.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { HandshakeProtocol } from \"./HandshakeProtocol\";\r\nimport { AbortError } from \"./Errors\";\r\nimport { MessageType } from \"./IHubProtocol\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { Subject } from \"./Subject\";\r\nimport { Arg, getErrorString, Platform } from \"./Utils\";\r\nimport { MessageBuffer } from \"./MessageBuffer\";\r\nconst DEFAULT_TIMEOUT_IN_MS = 30 * 1000;\r\nconst DEFAULT_PING_INTERVAL_IN_MS = 15 * 1000;\r\nconst DEFAULT_STATEFUL_RECONNECT_BUFFER_SIZE = 100000;\r\n/** Describes the current state of the {@link HubConnection} to the server. */\r\nexport var HubConnectionState;\r\n(function (HubConnectionState) {\r\n /** The hub connection is disconnected. */\r\n HubConnectionState[\"Disconnected\"] = \"Disconnected\";\r\n /** The hub connection is connecting. */\r\n HubConnectionState[\"Connecting\"] = \"Connecting\";\r\n /** The hub connection is connected. */\r\n HubConnectionState[\"Connected\"] = \"Connected\";\r\n /** The hub connection is disconnecting. */\r\n HubConnectionState[\"Disconnecting\"] = \"Disconnecting\";\r\n /** The hub connection is reconnecting. */\r\n HubConnectionState[\"Reconnecting\"] = \"Reconnecting\";\r\n})(HubConnectionState || (HubConnectionState = {}));\r\n/** Represents a connection to a SignalR Hub. */\r\nexport class HubConnection {\r\n /** @internal */\r\n // Using a public static factory method means we can have a private constructor and an _internal_\r\n // create method that can be used by HubConnectionBuilder. An \"internal\" constructor would just\r\n // be stripped away and the '.d.ts' file would have no constructor, which is interpreted as a\r\n // public parameter-less constructor.\r\n static create(connection, logger, protocol, reconnectPolicy, serverTimeoutInMilliseconds, keepAliveIntervalInMilliseconds, statefulReconnectBufferSize) {\r\n return new HubConnection(connection, logger, protocol, reconnectPolicy, serverTimeoutInMilliseconds, keepAliveIntervalInMilliseconds, statefulReconnectBufferSize);\r\n }\r\n constructor(connection, logger, protocol, reconnectPolicy, serverTimeoutInMilliseconds, keepAliveIntervalInMilliseconds, statefulReconnectBufferSize) {\r\n this._nextKeepAlive = 0;\r\n this._freezeEventListener = () => {\r\n this._logger.log(LogLevel.Warning, \"The page is being frozen, this will likely lead to the connection being closed and messages being lost. For more information see the docs at https://learn.microsoft.com/aspnet/core/signalr/javascript-client#bsleep\");\r\n };\r\n Arg.isRequired(connection, \"connection\");\r\n Arg.isRequired(logger, \"logger\");\r\n Arg.isRequired(protocol, \"protocol\");\r\n this.serverTimeoutInMilliseconds = serverTimeoutInMilliseconds !== null && serverTimeoutInMilliseconds !== void 0 ? serverTimeoutInMilliseconds : DEFAULT_TIMEOUT_IN_MS;\r\n this.keepAliveIntervalInMilliseconds = keepAliveIntervalInMilliseconds !== null && keepAliveIntervalInMilliseconds !== void 0 ? keepAliveIntervalInMilliseconds : DEFAULT_PING_INTERVAL_IN_MS;\r\n this._statefulReconnectBufferSize = statefulReconnectBufferSize !== null && statefulReconnectBufferSize !== void 0 ? statefulReconnectBufferSize : DEFAULT_STATEFUL_RECONNECT_BUFFER_SIZE;\r\n this._logger = logger;\r\n this._protocol = protocol;\r\n this.connection = connection;\r\n this._reconnectPolicy = reconnectPolicy;\r\n this._handshakeProtocol = new HandshakeProtocol();\r\n this.connection.onreceive = (data) => this._processIncomingData(data);\r\n this.connection.onclose = (error) => this._connectionClosed(error);\r\n this._callbacks = {};\r\n this._methods = {};\r\n this._closedCallbacks = [];\r\n this._reconnectingCallbacks = [];\r\n this._reconnectedCallbacks = [];\r\n this._invocationId = 0;\r\n this._receivedHandshakeResponse = false;\r\n this._connectionState = HubConnectionState.Disconnected;\r\n this._connectionStarted = false;\r\n this._cachedPingMessage = this._protocol.writeMessage({ type: MessageType.Ping });\r\n }\r\n /** Indicates the state of the {@link HubConnection} to the server. */\r\n get state() {\r\n return this._connectionState;\r\n }\r\n /** Represents the connection id of the {@link HubConnection} on the server. The connection id will be null when the connection is either\r\n * in the disconnected state or if the negotiation step was skipped.\r\n */\r\n get connectionId() {\r\n return this.connection ? (this.connection.connectionId || null) : null;\r\n }\r\n /** Indicates the url of the {@link HubConnection} to the server. */\r\n get baseUrl() {\r\n return this.connection.baseUrl || \"\";\r\n }\r\n /**\r\n * Sets a new url for the HubConnection. Note that the url can only be changed when the connection is in either the Disconnected or\r\n * Reconnecting states.\r\n * @param {string} url The url to connect to.\r\n */\r\n set baseUrl(url) {\r\n if (this._connectionState !== HubConnectionState.Disconnected && this._connectionState !== HubConnectionState.Reconnecting) {\r\n throw new Error(\"The HubConnection must be in the Disconnected or Reconnecting state to change the url.\");\r\n }\r\n if (!url) {\r\n throw new Error(\"The HubConnection url must be a valid url.\");\r\n }\r\n this.connection.baseUrl = url;\r\n }\r\n /** Starts the connection.\r\n *\r\n * @returns {Promise} A Promise that resolves when the connection has been successfully established, or rejects with an error.\r\n */\r\n start() {\r\n this._startPromise = this._startWithStateTransitions();\r\n return this._startPromise;\r\n }\r\n async _startWithStateTransitions() {\r\n if (this._connectionState !== HubConnectionState.Disconnected) {\r\n return Promise.reject(new Error(\"Cannot start a HubConnection that is not in the 'Disconnected' state.\"));\r\n }\r\n this._connectionState = HubConnectionState.Connecting;\r\n this._logger.log(LogLevel.Debug, \"Starting HubConnection.\");\r\n try {\r\n await this._startInternal();\r\n if (Platform.isBrowser) {\r\n // Log when the browser freezes the tab so users know why their connection unexpectedly stopped working\r\n window.document.addEventListener(\"freeze\", this._freezeEventListener);\r\n }\r\n this._connectionState = HubConnectionState.Connected;\r\n this._connectionStarted = true;\r\n this._logger.log(LogLevel.Debug, \"HubConnection connected successfully.\");\r\n }\r\n catch (e) {\r\n this._connectionState = HubConnectionState.Disconnected;\r\n this._logger.log(LogLevel.Debug, `HubConnection failed to start successfully because of error '${e}'.`);\r\n return Promise.reject(e);\r\n }\r\n }\r\n async _startInternal() {\r\n this._stopDuringStartError = undefined;\r\n this._receivedHandshakeResponse = false;\r\n // Set up the promise before any connection is (re)started otherwise it could race with received messages\r\n const handshakePromise = new Promise((resolve, reject) => {\r\n this._handshakeResolver = resolve;\r\n this._handshakeRejecter = reject;\r\n });\r\n await this.connection.start(this._protocol.transferFormat);\r\n try {\r\n let version = this._protocol.version;\r\n if (!this.connection.features.reconnect) {\r\n // Stateful Reconnect starts with HubProtocol version 2, newer clients connecting to older servers will fail to connect due to\r\n // the handshake only supporting version 1, so we will try to send version 1 during the handshake to keep old servers working.\r\n version = 1;\r\n }\r\n const handshakeRequest = {\r\n protocol: this._protocol.name,\r\n version,\r\n };\r\n this._logger.log(LogLevel.Debug, \"Sending handshake request.\");\r\n await this._sendMessage(this._handshakeProtocol.writeHandshakeRequest(handshakeRequest));\r\n this._logger.log(LogLevel.Information, `Using HubProtocol '${this._protocol.name}'.`);\r\n // defensively cleanup timeout in case we receive a message from the server before we finish start\r\n this._cleanupTimeout();\r\n this._resetTimeoutPeriod();\r\n this._resetKeepAliveInterval();\r\n await handshakePromise;\r\n // It's important to check the stopDuringStartError instead of just relying on the handshakePromise\r\n // being rejected on close, because this continuation can run after both the handshake completed successfully\r\n // and the connection was closed.\r\n if (this._stopDuringStartError) {\r\n // It's important to throw instead of returning a rejected promise, because we don't want to allow any state\r\n // transitions to occur between now and the calling code observing the exceptions. Returning a rejected promise\r\n // will cause the calling continuation to get scheduled to run later.\r\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\r\n throw this._stopDuringStartError;\r\n }\r\n const useStatefulReconnect = this.connection.features.reconnect || false;\r\n if (useStatefulReconnect) {\r\n this._messageBuffer = new MessageBuffer(this._protocol, this.connection, this._statefulReconnectBufferSize);\r\n this.connection.features.disconnected = this._messageBuffer._disconnected.bind(this._messageBuffer);\r\n this.connection.features.resend = () => {\r\n if (this._messageBuffer) {\r\n return this._messageBuffer._resend();\r\n }\r\n };\r\n }\r\n if (!this.connection.features.inherentKeepAlive) {\r\n await this._sendMessage(this._cachedPingMessage);\r\n }\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Debug, `Hub handshake failed with error '${e}' during start(). Stopping HubConnection.`);\r\n this._cleanupTimeout();\r\n this._cleanupPingTimer();\r\n // HttpConnection.stop() should not complete until after the onclose callback is invoked.\r\n // This will transition the HubConnection to the disconnected state before HttpConnection.stop() completes.\r\n await this.connection.stop(e);\r\n throw e;\r\n }\r\n }\r\n /** Stops the connection.\r\n *\r\n * @returns {Promise} A Promise that resolves when the connection has been successfully terminated, or rejects with an error.\r\n */\r\n async stop() {\r\n // Capture the start promise before the connection might be restarted in an onclose callback.\r\n const startPromise = this._startPromise;\r\n this.connection.features.reconnect = false;\r\n this._stopPromise = this._stopInternal();\r\n await this._stopPromise;\r\n try {\r\n // Awaiting undefined continues immediately\r\n await startPromise;\r\n }\r\n catch (e) {\r\n // This exception is returned to the user as a rejected Promise from the start method.\r\n }\r\n }\r\n _stopInternal(error) {\r\n if (this._connectionState === HubConnectionState.Disconnected) {\r\n this._logger.log(LogLevel.Debug, `Call to HubConnection.stop(${error}) ignored because it is already in the disconnected state.`);\r\n return Promise.resolve();\r\n }\r\n if (this._connectionState === HubConnectionState.Disconnecting) {\r\n this._logger.log(LogLevel.Debug, `Call to HttpConnection.stop(${error}) ignored because the connection is already in the disconnecting state.`);\r\n return this._stopPromise;\r\n }\r\n const state = this._connectionState;\r\n this._connectionState = HubConnectionState.Disconnecting;\r\n this._logger.log(LogLevel.Debug, \"Stopping HubConnection.\");\r\n if (this._reconnectDelayHandle) {\r\n // We're in a reconnect delay which means the underlying connection is currently already stopped.\r\n // Just clear the handle to stop the reconnect loop (which no one is waiting on thankfully) and\r\n // fire the onclose callbacks.\r\n this._logger.log(LogLevel.Debug, \"Connection stopped during reconnect delay. Done reconnecting.\");\r\n clearTimeout(this._reconnectDelayHandle);\r\n this._reconnectDelayHandle = undefined;\r\n this._completeClose();\r\n return Promise.resolve();\r\n }\r\n if (state === HubConnectionState.Connected) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._sendCloseMessage();\r\n }\r\n this._cleanupTimeout();\r\n this._cleanupPingTimer();\r\n this._stopDuringStartError = error || new AbortError(\"The connection was stopped before the hub handshake could complete.\");\r\n // HttpConnection.stop() should not complete until after either HttpConnection.start() fails\r\n // or the onclose callback is invoked. The onclose callback will transition the HubConnection\r\n // to the disconnected state if need be before HttpConnection.stop() completes.\r\n return this.connection.stop(error);\r\n }\r\n async _sendCloseMessage() {\r\n try {\r\n await this._sendWithProtocol(this._createCloseMessage());\r\n }\r\n catch {\r\n // Ignore, this is a best effort attempt to let the server know the client closed gracefully.\r\n }\r\n }\r\n /** Invokes a streaming hub method on the server using the specified name and arguments.\r\n *\r\n * @typeparam T The type of the items returned by the server.\r\n * @param {string} methodName The name of the server method to invoke.\r\n * @param {any[]} args The arguments used to invoke the server method.\r\n * @returns {IStreamResult} An object that yields results from the server as they are received.\r\n */\r\n stream(methodName, ...args) {\r\n const [streams, streamIds] = this._replaceStreamingParams(args);\r\n const invocationDescriptor = this._createStreamInvocation(methodName, args, streamIds);\r\n // eslint-disable-next-line prefer-const\r\n let promiseQueue;\r\n const subject = new Subject();\r\n subject.cancelCallback = () => {\r\n const cancelInvocation = this._createCancelInvocation(invocationDescriptor.invocationId);\r\n delete this._callbacks[invocationDescriptor.invocationId];\r\n return promiseQueue.then(() => {\r\n return this._sendWithProtocol(cancelInvocation);\r\n });\r\n };\r\n this._callbacks[invocationDescriptor.invocationId] = (invocationEvent, error) => {\r\n if (error) {\r\n subject.error(error);\r\n return;\r\n }\r\n else if (invocationEvent) {\r\n // invocationEvent will not be null when an error is not passed to the callback\r\n if (invocationEvent.type === MessageType.Completion) {\r\n if (invocationEvent.error) {\r\n subject.error(new Error(invocationEvent.error));\r\n }\r\n else {\r\n subject.complete();\r\n }\r\n }\r\n else {\r\n subject.next((invocationEvent.item));\r\n }\r\n }\r\n };\r\n promiseQueue = this._sendWithProtocol(invocationDescriptor)\r\n .catch((e) => {\r\n subject.error(e);\r\n delete this._callbacks[invocationDescriptor.invocationId];\r\n });\r\n this._launchStreams(streams, promiseQueue);\r\n return subject;\r\n }\r\n _sendMessage(message) {\r\n this._resetKeepAliveInterval();\r\n return this.connection.send(message);\r\n }\r\n /**\r\n * Sends a js object to the server.\r\n * @param message The js object to serialize and send.\r\n */\r\n _sendWithProtocol(message) {\r\n if (this._messageBuffer) {\r\n return this._messageBuffer._send(message);\r\n }\r\n else {\r\n return this._sendMessage(this._protocol.writeMessage(message));\r\n }\r\n }\r\n /** Invokes a hub method on the server using the specified name and arguments. Does not wait for a response from the receiver.\r\n *\r\n * The Promise returned by this method resolves when the client has sent the invocation to the server. The server may still\r\n * be processing the invocation.\r\n *\r\n * @param {string} methodName The name of the server method to invoke.\r\n * @param {any[]} args The arguments used to invoke the server method.\r\n * @returns {Promise} A Promise that resolves when the invocation has been successfully sent, or rejects with an error.\r\n */\r\n send(methodName, ...args) {\r\n const [streams, streamIds] = this._replaceStreamingParams(args);\r\n const sendPromise = this._sendWithProtocol(this._createInvocation(methodName, args, true, streamIds));\r\n this._launchStreams(streams, sendPromise);\r\n return sendPromise;\r\n }\r\n /** Invokes a hub method on the server using the specified name and arguments.\r\n *\r\n * The Promise returned by this method resolves when the server indicates it has finished invoking the method. When the promise\r\n * resolves, the server has finished invoking the method. If the server method returns a result, it is produced as the result of\r\n * resolving the Promise.\r\n *\r\n * @typeparam T The expected return type.\r\n * @param {string} methodName The name of the server method to invoke.\r\n * @param {any[]} args The arguments used to invoke the server method.\r\n * @returns {Promise} A Promise that resolves with the result of the server method (if any), or rejects with an error.\r\n */\r\n invoke(methodName, ...args) {\r\n const [streams, streamIds] = this._replaceStreamingParams(args);\r\n const invocationDescriptor = this._createInvocation(methodName, args, false, streamIds);\r\n const p = new Promise((resolve, reject) => {\r\n // invocationId will always have a value for a non-blocking invocation\r\n this._callbacks[invocationDescriptor.invocationId] = (invocationEvent, error) => {\r\n if (error) {\r\n reject(error);\r\n return;\r\n }\r\n else if (invocationEvent) {\r\n // invocationEvent will not be null when an error is not passed to the callback\r\n if (invocationEvent.type === MessageType.Completion) {\r\n if (invocationEvent.error) {\r\n reject(new Error(invocationEvent.error));\r\n }\r\n else {\r\n resolve(invocationEvent.result);\r\n }\r\n }\r\n else {\r\n reject(new Error(`Unexpected message type: ${invocationEvent.type}`));\r\n }\r\n }\r\n };\r\n const promiseQueue = this._sendWithProtocol(invocationDescriptor)\r\n .catch((e) => {\r\n reject(e);\r\n // invocationId will always have a value for a non-blocking invocation\r\n delete this._callbacks[invocationDescriptor.invocationId];\r\n });\r\n this._launchStreams(streams, promiseQueue);\r\n });\r\n return p;\r\n }\r\n on(methodName, newMethod) {\r\n if (!methodName || !newMethod) {\r\n return;\r\n }\r\n methodName = methodName.toLowerCase();\r\n if (!this._methods[methodName]) {\r\n this._methods[methodName] = [];\r\n }\r\n // Preventing adding the same handler multiple times.\r\n if (this._methods[methodName].indexOf(newMethod) !== -1) {\r\n return;\r\n }\r\n this._methods[methodName].push(newMethod);\r\n }\r\n off(methodName, method) {\r\n if (!methodName) {\r\n return;\r\n }\r\n methodName = methodName.toLowerCase();\r\n const handlers = this._methods[methodName];\r\n if (!handlers) {\r\n return;\r\n }\r\n if (method) {\r\n const removeIdx = handlers.indexOf(method);\r\n if (removeIdx !== -1) {\r\n handlers.splice(removeIdx, 1);\r\n if (handlers.length === 0) {\r\n delete this._methods[methodName];\r\n }\r\n }\r\n }\r\n else {\r\n delete this._methods[methodName];\r\n }\r\n }\r\n /** Registers a handler that will be invoked when the connection is closed.\r\n *\r\n * @param {Function} callback The handler that will be invoked when the connection is closed. Optionally receives a single argument containing the error that caused the connection to close (if any).\r\n */\r\n onclose(callback) {\r\n if (callback) {\r\n this._closedCallbacks.push(callback);\r\n }\r\n }\r\n /** Registers a handler that will be invoked when the connection starts reconnecting.\r\n *\r\n * @param {Function} callback The handler that will be invoked when the connection starts reconnecting. Optionally receives a single argument containing the error that caused the connection to start reconnecting (if any).\r\n */\r\n onreconnecting(callback) {\r\n if (callback) {\r\n this._reconnectingCallbacks.push(callback);\r\n }\r\n }\r\n /** Registers a handler that will be invoked when the connection successfully reconnects.\r\n *\r\n * @param {Function} callback The handler that will be invoked when the connection successfully reconnects.\r\n */\r\n onreconnected(callback) {\r\n if (callback) {\r\n this._reconnectedCallbacks.push(callback);\r\n }\r\n }\r\n _processIncomingData(data) {\r\n this._cleanupTimeout();\r\n if (!this._receivedHandshakeResponse) {\r\n data = this._processHandshakeResponse(data);\r\n this._receivedHandshakeResponse = true;\r\n }\r\n // Data may have all been read when processing handshake response\r\n if (data) {\r\n // Parse the messages\r\n const messages = this._protocol.parseMessages(data, this._logger);\r\n for (const message of messages) {\r\n if (this._messageBuffer && !this._messageBuffer._shouldProcessMessage(message)) {\r\n // Don't process the message, we are either waiting for a SequenceMessage or received a duplicate message\r\n continue;\r\n }\r\n switch (message.type) {\r\n case MessageType.Invocation:\r\n this._invokeClientMethod(message)\r\n .catch((e) => {\r\n this._logger.log(LogLevel.Error, `Invoke client method threw error: ${getErrorString(e)}`);\r\n });\r\n break;\r\n case MessageType.StreamItem:\r\n case MessageType.Completion: {\r\n const callback = this._callbacks[message.invocationId];\r\n if (callback) {\r\n if (message.type === MessageType.Completion) {\r\n delete this._callbacks[message.invocationId];\r\n }\r\n try {\r\n callback(message);\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `Stream callback threw error: ${getErrorString(e)}`);\r\n }\r\n }\r\n break;\r\n }\r\n case MessageType.Ping:\r\n // Don't care about pings\r\n break;\r\n case MessageType.Close: {\r\n this._logger.log(LogLevel.Information, \"Close message received from server.\");\r\n const error = message.error ? new Error(\"Server returned an error on close: \" + message.error) : undefined;\r\n if (message.allowReconnect === true) {\r\n // It feels wrong not to await connection.stop() here, but processIncomingData is called as part of an onreceive callback which is not async,\r\n // this is already the behavior for serverTimeout(), and HttpConnection.Stop() should catch and log all possible exceptions.\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.connection.stop(error);\r\n }\r\n else {\r\n // We cannot await stopInternal() here, but subsequent calls to stop() will await this if stopInternal() is still ongoing.\r\n this._stopPromise = this._stopInternal(error);\r\n }\r\n break;\r\n }\r\n case MessageType.Ack:\r\n if (this._messageBuffer) {\r\n this._messageBuffer._ack(message);\r\n }\r\n break;\r\n case MessageType.Sequence:\r\n if (this._messageBuffer) {\r\n this._messageBuffer._resetSequence(message);\r\n }\r\n break;\r\n default:\r\n this._logger.log(LogLevel.Warning, `Invalid message type: ${message.type}.`);\r\n break;\r\n }\r\n }\r\n }\r\n this._resetTimeoutPeriod();\r\n }\r\n _processHandshakeResponse(data) {\r\n let responseMessage;\r\n let remainingData;\r\n try {\r\n [remainingData, responseMessage] = this._handshakeProtocol.parseHandshakeResponse(data);\r\n }\r\n catch (e) {\r\n const message = \"Error parsing handshake response: \" + e;\r\n this._logger.log(LogLevel.Error, message);\r\n const error = new Error(message);\r\n this._handshakeRejecter(error);\r\n throw error;\r\n }\r\n if (responseMessage.error) {\r\n const message = \"Server returned handshake error: \" + responseMessage.error;\r\n this._logger.log(LogLevel.Error, message);\r\n const error = new Error(message);\r\n this._handshakeRejecter(error);\r\n throw error;\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, \"Server handshake complete.\");\r\n }\r\n this._handshakeResolver();\r\n return remainingData;\r\n }\r\n _resetKeepAliveInterval() {\r\n if (this.connection.features.inherentKeepAlive) {\r\n return;\r\n }\r\n // Set the time we want the next keep alive to be sent\r\n // Timer will be setup on next message receive\r\n this._nextKeepAlive = new Date().getTime() + this.keepAliveIntervalInMilliseconds;\r\n this._cleanupPingTimer();\r\n }\r\n _resetTimeoutPeriod() {\r\n if (!this.connection.features || !this.connection.features.inherentKeepAlive) {\r\n // Set the timeout timer\r\n this._timeoutHandle = setTimeout(() => this.serverTimeout(), this.serverTimeoutInMilliseconds);\r\n // Set keepAlive timer if there isn't one\r\n if (this._pingServerHandle === undefined) {\r\n let nextPing = this._nextKeepAlive - new Date().getTime();\r\n if (nextPing < 0) {\r\n nextPing = 0;\r\n }\r\n // The timer needs to be set from a networking callback to avoid Chrome timer throttling from causing timers to run once a minute\r\n this._pingServerHandle = setTimeout(async () => {\r\n if (this._connectionState === HubConnectionState.Connected) {\r\n try {\r\n await this._sendMessage(this._cachedPingMessage);\r\n }\r\n catch {\r\n // We don't care about the error. It should be seen elsewhere in the client.\r\n // The connection is probably in a bad or closed state now, cleanup the timer so it stops triggering\r\n this._cleanupPingTimer();\r\n }\r\n }\r\n }, nextPing);\r\n }\r\n }\r\n }\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n serverTimeout() {\r\n // The server hasn't talked to us in a while. It doesn't like us anymore ... :(\r\n // Terminate the connection, but we don't need to wait on the promise. This could trigger reconnecting.\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.connection.stop(new Error(\"Server timeout elapsed without receiving a message from the server.\"));\r\n }\r\n async _invokeClientMethod(invocationMessage) {\r\n const methodName = invocationMessage.target.toLowerCase();\r\n const methods = this._methods[methodName];\r\n if (!methods) {\r\n this._logger.log(LogLevel.Warning, `No client method with the name '${methodName}' found.`);\r\n // No handlers provided by client but the server is expecting a response still, so we send an error\r\n if (invocationMessage.invocationId) {\r\n this._logger.log(LogLevel.Warning, `No result given for '${methodName}' method and invocation ID '${invocationMessage.invocationId}'.`);\r\n await this._sendWithProtocol(this._createCompletionMessage(invocationMessage.invocationId, \"Client didn't provide a result.\", null));\r\n }\r\n return;\r\n }\r\n // Avoid issues with handlers removing themselves thus modifying the list while iterating through it\r\n const methodsCopy = methods.slice();\r\n // Server expects a response\r\n const expectsResponse = invocationMessage.invocationId ? true : false;\r\n // We preserve the last result or exception but still call all handlers\r\n let res;\r\n let exception;\r\n let completionMessage;\r\n for (const m of methodsCopy) {\r\n try {\r\n const prevRes = res;\r\n res = await m.apply(this, invocationMessage.arguments);\r\n if (expectsResponse && res && prevRes) {\r\n this._logger.log(LogLevel.Error, `Multiple results provided for '${methodName}'. Sending error to server.`);\r\n completionMessage = this._createCompletionMessage(invocationMessage.invocationId, `Client provided multiple results.`, null);\r\n }\r\n // Ignore exception if we got a result after, the exception will be logged\r\n exception = undefined;\r\n }\r\n catch (e) {\r\n exception = e;\r\n this._logger.log(LogLevel.Error, `A callback for the method '${methodName}' threw error '${e}'.`);\r\n }\r\n }\r\n if (completionMessage) {\r\n await this._sendWithProtocol(completionMessage);\r\n }\r\n else if (expectsResponse) {\r\n // If there is an exception that means either no result was given or a handler after a result threw\r\n if (exception) {\r\n completionMessage = this._createCompletionMessage(invocationMessage.invocationId, `${exception}`, null);\r\n }\r\n else if (res !== undefined) {\r\n completionMessage = this._createCompletionMessage(invocationMessage.invocationId, null, res);\r\n }\r\n else {\r\n this._logger.log(LogLevel.Warning, `No result given for '${methodName}' method and invocation ID '${invocationMessage.invocationId}'.`);\r\n // Client didn't provide a result or throw from a handler, server expects a response so we send an error\r\n completionMessage = this._createCompletionMessage(invocationMessage.invocationId, \"Client didn't provide a result.\", null);\r\n }\r\n await this._sendWithProtocol(completionMessage);\r\n }\r\n else {\r\n if (res) {\r\n this._logger.log(LogLevel.Error, `Result given for '${methodName}' method but server is not expecting a result.`);\r\n }\r\n }\r\n }\r\n _connectionClosed(error) {\r\n this._logger.log(LogLevel.Debug, `HubConnection.connectionClosed(${error}) called while in state ${this._connectionState}.`);\r\n // Triggering this.handshakeRejecter is insufficient because it could already be resolved without the continuation having run yet.\r\n this._stopDuringStartError = this._stopDuringStartError || error || new AbortError(\"The underlying connection was closed before the hub handshake could complete.\");\r\n // If the handshake is in progress, start will be waiting for the handshake promise, so we complete it.\r\n // If it has already completed, this should just noop.\r\n if (this._handshakeResolver) {\r\n this._handshakeResolver();\r\n }\r\n this._cancelCallbacksWithError(error || new Error(\"Invocation canceled due to the underlying connection being closed.\"));\r\n this._cleanupTimeout();\r\n this._cleanupPingTimer();\r\n if (this._connectionState === HubConnectionState.Disconnecting) {\r\n this._completeClose(error);\r\n }\r\n else if (this._connectionState === HubConnectionState.Connected && this._reconnectPolicy) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._reconnect(error);\r\n }\r\n else if (this._connectionState === HubConnectionState.Connected) {\r\n this._completeClose(error);\r\n }\r\n // If none of the above if conditions were true were called the HubConnection must be in either:\r\n // 1. The Connecting state in which case the handshakeResolver will complete it and stopDuringStartError will fail it.\r\n // 2. The Reconnecting state in which case the handshakeResolver will complete it and stopDuringStartError will fail the current reconnect attempt\r\n // and potentially continue the reconnect() loop.\r\n // 3. The Disconnected state in which case we're already done.\r\n }\r\n _completeClose(error) {\r\n if (this._connectionStarted) {\r\n this._connectionState = HubConnectionState.Disconnected;\r\n this._connectionStarted = false;\r\n if (this._messageBuffer) {\r\n this._messageBuffer._dispose(error !== null && error !== void 0 ? error : new Error(\"Connection closed.\"));\r\n this._messageBuffer = undefined;\r\n }\r\n if (Platform.isBrowser) {\r\n window.document.removeEventListener(\"freeze\", this._freezeEventListener);\r\n }\r\n try {\r\n this._closedCallbacks.forEach((c) => c.apply(this, [error]));\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `An onclose callback called with error '${error}' threw error '${e}'.`);\r\n }\r\n }\r\n }\r\n async _reconnect(error) {\r\n const reconnectStartTime = Date.now();\r\n let previousReconnectAttempts = 0;\r\n let retryError = error !== undefined ? error : new Error(\"Attempting to reconnect due to a unknown error.\");\r\n let nextRetryDelay = this._getNextRetryDelay(previousReconnectAttempts++, 0, retryError);\r\n if (nextRetryDelay === null) {\r\n this._logger.log(LogLevel.Debug, \"Connection not reconnecting because the IRetryPolicy returned null on the first reconnect attempt.\");\r\n this._completeClose(error);\r\n return;\r\n }\r\n this._connectionState = HubConnectionState.Reconnecting;\r\n if (error) {\r\n this._logger.log(LogLevel.Information, `Connection reconnecting because of error '${error}'.`);\r\n }\r\n else {\r\n this._logger.log(LogLevel.Information, \"Connection reconnecting.\");\r\n }\r\n if (this._reconnectingCallbacks.length !== 0) {\r\n try {\r\n this._reconnectingCallbacks.forEach((c) => c.apply(this, [error]));\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `An onreconnecting callback called with error '${error}' threw error '${e}'.`);\r\n }\r\n // Exit early if an onreconnecting callback called connection.stop().\r\n if (this._connectionState !== HubConnectionState.Reconnecting) {\r\n this._logger.log(LogLevel.Debug, \"Connection left the reconnecting state in onreconnecting callback. Done reconnecting.\");\r\n return;\r\n }\r\n }\r\n while (nextRetryDelay !== null) {\r\n this._logger.log(LogLevel.Information, `Reconnect attempt number ${previousReconnectAttempts} will start in ${nextRetryDelay} ms.`);\r\n await new Promise((resolve) => {\r\n this._reconnectDelayHandle = setTimeout(resolve, nextRetryDelay);\r\n });\r\n this._reconnectDelayHandle = undefined;\r\n if (this._connectionState !== HubConnectionState.Reconnecting) {\r\n this._logger.log(LogLevel.Debug, \"Connection left the reconnecting state during reconnect delay. Done reconnecting.\");\r\n return;\r\n }\r\n try {\r\n await this._startInternal();\r\n this._connectionState = HubConnectionState.Connected;\r\n this._logger.log(LogLevel.Information, \"HubConnection reconnected successfully.\");\r\n if (this._reconnectedCallbacks.length !== 0) {\r\n try {\r\n this._reconnectedCallbacks.forEach((c) => c.apply(this, [this.connection.connectionId]));\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `An onreconnected callback called with connectionId '${this.connection.connectionId}; threw error '${e}'.`);\r\n }\r\n }\r\n return;\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Information, `Reconnect attempt failed because of error '${e}'.`);\r\n if (this._connectionState !== HubConnectionState.Reconnecting) {\r\n this._logger.log(LogLevel.Debug, `Connection moved to the '${this._connectionState}' from the reconnecting state during reconnect attempt. Done reconnecting.`);\r\n // The TypeScript compiler thinks that connectionState must be Connected here. The TypeScript compiler is wrong.\r\n if (this._connectionState === HubConnectionState.Disconnecting) {\r\n this._completeClose();\r\n }\r\n return;\r\n }\r\n retryError = e instanceof Error ? e : new Error(e.toString());\r\n nextRetryDelay = this._getNextRetryDelay(previousReconnectAttempts++, Date.now() - reconnectStartTime, retryError);\r\n }\r\n }\r\n this._logger.log(LogLevel.Information, `Reconnect retries have been exhausted after ${Date.now() - reconnectStartTime} ms and ${previousReconnectAttempts} failed attempts. Connection disconnecting.`);\r\n this._completeClose();\r\n }\r\n _getNextRetryDelay(previousRetryCount, elapsedMilliseconds, retryReason) {\r\n try {\r\n return this._reconnectPolicy.nextRetryDelayInMilliseconds({\r\n elapsedMilliseconds,\r\n previousRetryCount,\r\n retryReason,\r\n });\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `IRetryPolicy.nextRetryDelayInMilliseconds(${previousRetryCount}, ${elapsedMilliseconds}) threw error '${e}'.`);\r\n return null;\r\n }\r\n }\r\n _cancelCallbacksWithError(error) {\r\n const callbacks = this._callbacks;\r\n this._callbacks = {};\r\n Object.keys(callbacks)\r\n .forEach((key) => {\r\n const callback = callbacks[key];\r\n try {\r\n callback(null, error);\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `Stream 'error' callback called with '${error}' threw error: ${getErrorString(e)}`);\r\n }\r\n });\r\n }\r\n _cleanupPingTimer() {\r\n if (this._pingServerHandle) {\r\n clearTimeout(this._pingServerHandle);\r\n this._pingServerHandle = undefined;\r\n }\r\n }\r\n _cleanupTimeout() {\r\n if (this._timeoutHandle) {\r\n clearTimeout(this._timeoutHandle);\r\n }\r\n }\r\n _createInvocation(methodName, args, nonblocking, streamIds) {\r\n if (nonblocking) {\r\n if (streamIds.length !== 0) {\r\n return {\r\n arguments: args,\r\n streamIds,\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n }\r\n else {\r\n return {\r\n arguments: args,\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n }\r\n }\r\n else {\r\n const invocationId = this._invocationId;\r\n this._invocationId++;\r\n if (streamIds.length !== 0) {\r\n return {\r\n arguments: args,\r\n invocationId: invocationId.toString(),\r\n streamIds,\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n }\r\n else {\r\n return {\r\n arguments: args,\r\n invocationId: invocationId.toString(),\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n }\r\n }\r\n }\r\n _launchStreams(streams, promiseQueue) {\r\n if (streams.length === 0) {\r\n return;\r\n }\r\n // Synchronize stream data so they arrive in-order on the server\r\n if (!promiseQueue) {\r\n promiseQueue = Promise.resolve();\r\n }\r\n // We want to iterate over the keys, since the keys are the stream ids\r\n // eslint-disable-next-line guard-for-in\r\n for (const streamId in streams) {\r\n streams[streamId].subscribe({\r\n complete: () => {\r\n promiseQueue = promiseQueue.then(() => this._sendWithProtocol(this._createCompletionMessage(streamId)));\r\n },\r\n error: (err) => {\r\n let message;\r\n if (err instanceof Error) {\r\n message = err.message;\r\n }\r\n else if (err && err.toString) {\r\n message = err.toString();\r\n }\r\n else {\r\n message = \"Unknown error\";\r\n }\r\n promiseQueue = promiseQueue.then(() => this._sendWithProtocol(this._createCompletionMessage(streamId, message)));\r\n },\r\n next: (item) => {\r\n promiseQueue = promiseQueue.then(() => this._sendWithProtocol(this._createStreamItemMessage(streamId, item)));\r\n },\r\n });\r\n }\r\n }\r\n _replaceStreamingParams(args) {\r\n const streams = [];\r\n const streamIds = [];\r\n for (let i = 0; i < args.length; i++) {\r\n const argument = args[i];\r\n if (this._isObservable(argument)) {\r\n const streamId = this._invocationId;\r\n this._invocationId++;\r\n // Store the stream for later use\r\n streams[streamId] = argument;\r\n streamIds.push(streamId.toString());\r\n // remove stream from args\r\n args.splice(i, 1);\r\n }\r\n }\r\n return [streams, streamIds];\r\n }\r\n _isObservable(arg) {\r\n // This allows other stream implementations to just work (like rxjs)\r\n return arg && arg.subscribe && typeof arg.subscribe === \"function\";\r\n }\r\n _createStreamInvocation(methodName, args, streamIds) {\r\n const invocationId = this._invocationId;\r\n this._invocationId++;\r\n if (streamIds.length !== 0) {\r\n return {\r\n arguments: args,\r\n invocationId: invocationId.toString(),\r\n streamIds,\r\n target: methodName,\r\n type: MessageType.StreamInvocation,\r\n };\r\n }\r\n else {\r\n return {\r\n arguments: args,\r\n invocationId: invocationId.toString(),\r\n target: methodName,\r\n type: MessageType.StreamInvocation,\r\n };\r\n }\r\n }\r\n _createCancelInvocation(id) {\r\n return {\r\n invocationId: id,\r\n type: MessageType.CancelInvocation,\r\n };\r\n }\r\n _createStreamItemMessage(id, item) {\r\n return {\r\n invocationId: id,\r\n item,\r\n type: MessageType.StreamItem,\r\n };\r\n }\r\n _createCompletionMessage(id, error, result) {\r\n if (error) {\r\n return {\r\n error,\r\n invocationId: id,\r\n type: MessageType.Completion,\r\n };\r\n }\r\n return {\r\n invocationId: id,\r\n result,\r\n type: MessageType.Completion,\r\n };\r\n }\r\n _createCloseMessage() {\r\n return { type: MessageType.Close };\r\n }\r\n}\r\n//# sourceMappingURL=HubConnection.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { DefaultReconnectPolicy } from \"./DefaultReconnectPolicy\";\r\nimport { HttpConnection } from \"./HttpConnection\";\r\nimport { HubConnection } from \"./HubConnection\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { JsonHubProtocol } from \"./JsonHubProtocol\";\r\nimport { NullLogger } from \"./Loggers\";\r\nimport { Arg, ConsoleLogger } from \"./Utils\";\r\nconst LogLevelNameMapping = {\r\n trace: LogLevel.Trace,\r\n debug: LogLevel.Debug,\r\n info: LogLevel.Information,\r\n information: LogLevel.Information,\r\n warn: LogLevel.Warning,\r\n warning: LogLevel.Warning,\r\n error: LogLevel.Error,\r\n critical: LogLevel.Critical,\r\n none: LogLevel.None,\r\n};\r\nfunction parseLogLevel(name) {\r\n // Case-insensitive matching via lower-casing\r\n // Yes, I know case-folding is a complicated problem in Unicode, but we only support\r\n // the ASCII strings defined in LogLevelNameMapping anyway, so it's fine -anurse.\r\n const mapping = LogLevelNameMapping[name.toLowerCase()];\r\n if (typeof mapping !== \"undefined\") {\r\n return mapping;\r\n }\r\n else {\r\n throw new Error(`Unknown log level: ${name}`);\r\n }\r\n}\r\n/** A builder for configuring {@link @microsoft/signalr.HubConnection} instances. */\r\nexport class HubConnectionBuilder {\r\n configureLogging(logging) {\r\n Arg.isRequired(logging, \"logging\");\r\n if (isLogger(logging)) {\r\n this.logger = logging;\r\n }\r\n else if (typeof logging === \"string\") {\r\n const logLevel = parseLogLevel(logging);\r\n this.logger = new ConsoleLogger(logLevel);\r\n }\r\n else {\r\n this.logger = new ConsoleLogger(logging);\r\n }\r\n return this;\r\n }\r\n withUrl(url, transportTypeOrOptions) {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isNotEmpty(url, \"url\");\r\n this.url = url;\r\n // Flow-typing knows where it's at. Since HttpTransportType is a number and IHttpConnectionOptions is guaranteed\r\n // to be an object, we know (as does TypeScript) this comparison is all we need to figure out which overload was called.\r\n if (typeof transportTypeOrOptions === \"object\") {\r\n this.httpConnectionOptions = { ...this.httpConnectionOptions, ...transportTypeOrOptions };\r\n }\r\n else {\r\n this.httpConnectionOptions = {\r\n ...this.httpConnectionOptions,\r\n transport: transportTypeOrOptions,\r\n };\r\n }\r\n return this;\r\n }\r\n /** Configures the {@link @microsoft/signalr.HubConnection} to use the specified Hub Protocol.\r\n *\r\n * @param {IHubProtocol} protocol The {@link @microsoft/signalr.IHubProtocol} implementation to use.\r\n */\r\n withHubProtocol(protocol) {\r\n Arg.isRequired(protocol, \"protocol\");\r\n this.protocol = protocol;\r\n return this;\r\n }\r\n withAutomaticReconnect(retryDelaysOrReconnectPolicy) {\r\n if (this.reconnectPolicy) {\r\n throw new Error(\"A reconnectPolicy has already been set.\");\r\n }\r\n if (!retryDelaysOrReconnectPolicy) {\r\n this.reconnectPolicy = new DefaultReconnectPolicy();\r\n }\r\n else if (Array.isArray(retryDelaysOrReconnectPolicy)) {\r\n this.reconnectPolicy = new DefaultReconnectPolicy(retryDelaysOrReconnectPolicy);\r\n }\r\n else {\r\n this.reconnectPolicy = retryDelaysOrReconnectPolicy;\r\n }\r\n return this;\r\n }\r\n /** Configures {@link @microsoft/signalr.HubConnection.serverTimeoutInMilliseconds} for the {@link @microsoft/signalr.HubConnection}.\r\n *\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n withServerTimeout(milliseconds) {\r\n Arg.isRequired(milliseconds, \"milliseconds\");\r\n this._serverTimeoutInMilliseconds = milliseconds;\r\n return this;\r\n }\r\n /** Configures {@link @microsoft/signalr.HubConnection.keepAliveIntervalInMilliseconds} for the {@link @microsoft/signalr.HubConnection}.\r\n *\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n withKeepAliveInterval(milliseconds) {\r\n Arg.isRequired(milliseconds, \"milliseconds\");\r\n this._keepAliveIntervalInMilliseconds = milliseconds;\r\n return this;\r\n }\r\n /** Enables and configures options for the Stateful Reconnect feature.\r\n *\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n withStatefulReconnect(options) {\r\n if (this.httpConnectionOptions === undefined) {\r\n this.httpConnectionOptions = {};\r\n }\r\n this.httpConnectionOptions._useStatefulReconnect = true;\r\n this._statefulReconnectBufferSize = options === null || options === void 0 ? void 0 : options.bufferSize;\r\n return this;\r\n }\r\n /** Creates a {@link @microsoft/signalr.HubConnection} from the configuration options specified in this builder.\r\n *\r\n * @returns {HubConnection} The configured {@link @microsoft/signalr.HubConnection}.\r\n */\r\n build() {\r\n // If httpConnectionOptions has a logger, use it. Otherwise, override it with the one\r\n // provided to configureLogger\r\n const httpConnectionOptions = this.httpConnectionOptions || {};\r\n // If it's 'null', the user **explicitly** asked for null, don't mess with it.\r\n if (httpConnectionOptions.logger === undefined) {\r\n // If our logger is undefined or null, that's OK, the HttpConnection constructor will handle it.\r\n httpConnectionOptions.logger = this.logger;\r\n }\r\n // Now create the connection\r\n if (!this.url) {\r\n throw new Error(\"The 'HubConnectionBuilder.withUrl' method must be called before building the connection.\");\r\n }\r\n const connection = new HttpConnection(this.url, httpConnectionOptions);\r\n return HubConnection.create(connection, this.logger || NullLogger.instance, this.protocol || new JsonHubProtocol(), this.reconnectPolicy, this._serverTimeoutInMilliseconds, this._keepAliveIntervalInMilliseconds, this._statefulReconnectBufferSize);\r\n }\r\n}\r\nfunction isLogger(logger) {\r\n return logger.log !== undefined;\r\n}\r\n//# sourceMappingURL=HubConnectionBuilder.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n/** Defines the type of a Hub Message. */\r\nexport var MessageType;\r\n(function (MessageType) {\r\n /** Indicates the message is an Invocation message and implements the {@link @microsoft/signalr.InvocationMessage} interface. */\r\n MessageType[MessageType[\"Invocation\"] = 1] = \"Invocation\";\r\n /** Indicates the message is a StreamItem message and implements the {@link @microsoft/signalr.StreamItemMessage} interface. */\r\n MessageType[MessageType[\"StreamItem\"] = 2] = \"StreamItem\";\r\n /** Indicates the message is a Completion message and implements the {@link @microsoft/signalr.CompletionMessage} interface. */\r\n MessageType[MessageType[\"Completion\"] = 3] = \"Completion\";\r\n /** Indicates the message is a Stream Invocation message and implements the {@link @microsoft/signalr.StreamInvocationMessage} interface. */\r\n MessageType[MessageType[\"StreamInvocation\"] = 4] = \"StreamInvocation\";\r\n /** Indicates the message is a Cancel Invocation message and implements the {@link @microsoft/signalr.CancelInvocationMessage} interface. */\r\n MessageType[MessageType[\"CancelInvocation\"] = 5] = \"CancelInvocation\";\r\n /** Indicates the message is a Ping message and implements the {@link @microsoft/signalr.PingMessage} interface. */\r\n MessageType[MessageType[\"Ping\"] = 6] = \"Ping\";\r\n /** Indicates the message is a Close message and implements the {@link @microsoft/signalr.CloseMessage} interface. */\r\n MessageType[MessageType[\"Close\"] = 7] = \"Close\";\r\n MessageType[MessageType[\"Ack\"] = 8] = \"Ack\";\r\n MessageType[MessageType[\"Sequence\"] = 9] = \"Sequence\";\r\n})(MessageType || (MessageType = {}));\r\n//# sourceMappingURL=IHubProtocol.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// These values are designed to match the ASP.NET Log Levels since that's the pattern we're emulating here.\r\n/** Indicates the severity of a log message.\r\n *\r\n * Log Levels are ordered in increasing severity. So `Debug` is more severe than `Trace`, etc.\r\n */\r\nexport var LogLevel;\r\n(function (LogLevel) {\r\n /** Log level for very low severity diagnostic messages. */\r\n LogLevel[LogLevel[\"Trace\"] = 0] = \"Trace\";\r\n /** Log level for low severity diagnostic messages. */\r\n LogLevel[LogLevel[\"Debug\"] = 1] = \"Debug\";\r\n /** Log level for informational diagnostic messages. */\r\n LogLevel[LogLevel[\"Information\"] = 2] = \"Information\";\r\n /** Log level for diagnostic messages that indicate a non-fatal problem. */\r\n LogLevel[LogLevel[\"Warning\"] = 3] = \"Warning\";\r\n /** Log level for diagnostic messages that indicate a failure in the current operation. */\r\n LogLevel[LogLevel[\"Error\"] = 4] = \"Error\";\r\n /** Log level for diagnostic messages that indicate a failure that will terminate the entire application. */\r\n LogLevel[LogLevel[\"Critical\"] = 5] = \"Critical\";\r\n /** The highest possible log level. Used when configuring logging to indicate that no log messages should be emitted. */\r\n LogLevel[LogLevel[\"None\"] = 6] = \"None\";\r\n})(LogLevel || (LogLevel = {}));\r\n//# sourceMappingURL=ILogger.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// This will be treated as a bit flag in the future, so we keep it using power-of-two values.\r\n/** Specifies a specific HTTP transport type. */\r\nexport var HttpTransportType;\r\n(function (HttpTransportType) {\r\n /** Specifies no transport preference. */\r\n HttpTransportType[HttpTransportType[\"None\"] = 0] = \"None\";\r\n /** Specifies the WebSockets transport. */\r\n HttpTransportType[HttpTransportType[\"WebSockets\"] = 1] = \"WebSockets\";\r\n /** Specifies the Server-Sent Events transport. */\r\n HttpTransportType[HttpTransportType[\"ServerSentEvents\"] = 2] = \"ServerSentEvents\";\r\n /** Specifies the Long Polling transport. */\r\n HttpTransportType[HttpTransportType[\"LongPolling\"] = 4] = \"LongPolling\";\r\n})(HttpTransportType || (HttpTransportType = {}));\r\n/** Specifies the transfer format for a connection. */\r\nexport var TransferFormat;\r\n(function (TransferFormat) {\r\n /** Specifies that only text data will be transmitted over the connection. */\r\n TransferFormat[TransferFormat[\"Text\"] = 1] = \"Text\";\r\n /** Specifies that binary data will be transmitted over the connection. */\r\n TransferFormat[TransferFormat[\"Binary\"] = 2] = \"Binary\";\r\n})(TransferFormat || (TransferFormat = {}));\r\n//# sourceMappingURL=ITransport.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { MessageType } from \"./IHubProtocol\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\nimport { NullLogger } from \"./Loggers\";\r\nimport { TextMessageFormat } from \"./TextMessageFormat\";\r\nconst JSON_HUB_PROTOCOL_NAME = \"json\";\r\n/** Implements the JSON Hub Protocol. */\r\nexport class JsonHubProtocol {\r\n constructor() {\r\n /** @inheritDoc */\r\n this.name = JSON_HUB_PROTOCOL_NAME;\r\n /** @inheritDoc */\r\n this.version = 2;\r\n /** @inheritDoc */\r\n this.transferFormat = TransferFormat.Text;\r\n }\r\n /** Creates an array of {@link @microsoft/signalr.HubMessage} objects from the specified serialized representation.\r\n *\r\n * @param {string} input A string containing the serialized representation.\r\n * @param {ILogger} logger A logger that will be used to log messages that occur during parsing.\r\n */\r\n parseMessages(input, logger) {\r\n // The interface does allow \"ArrayBuffer\" to be passed in, but this implementation does not. So let's throw a useful error.\r\n if (typeof input !== \"string\") {\r\n throw new Error(\"Invalid input for JSON hub protocol. Expected a string.\");\r\n }\r\n if (!input) {\r\n return [];\r\n }\r\n if (logger === null) {\r\n logger = NullLogger.instance;\r\n }\r\n // Parse the messages\r\n const messages = TextMessageFormat.parse(input);\r\n const hubMessages = [];\r\n for (const message of messages) {\r\n const parsedMessage = JSON.parse(message);\r\n if (typeof parsedMessage.type !== \"number\") {\r\n throw new Error(\"Invalid payload.\");\r\n }\r\n switch (parsedMessage.type) {\r\n case MessageType.Invocation:\r\n this._isInvocationMessage(parsedMessage);\r\n break;\r\n case MessageType.StreamItem:\r\n this._isStreamItemMessage(parsedMessage);\r\n break;\r\n case MessageType.Completion:\r\n this._isCompletionMessage(parsedMessage);\r\n break;\r\n case MessageType.Ping:\r\n // Single value, no need to validate\r\n break;\r\n case MessageType.Close:\r\n // All optional values, no need to validate\r\n break;\r\n case MessageType.Ack:\r\n this._isAckMessage(parsedMessage);\r\n break;\r\n case MessageType.Sequence:\r\n this._isSequenceMessage(parsedMessage);\r\n break;\r\n default:\r\n // Future protocol changes can add message types, old clients can ignore them\r\n logger.log(LogLevel.Information, \"Unknown message type '\" + parsedMessage.type + \"' ignored.\");\r\n continue;\r\n }\r\n hubMessages.push(parsedMessage);\r\n }\r\n return hubMessages;\r\n }\r\n /** Writes the specified {@link @microsoft/signalr.HubMessage} to a string and returns it.\r\n *\r\n * @param {HubMessage} message The message to write.\r\n * @returns {string} A string containing the serialized representation of the message.\r\n */\r\n writeMessage(message) {\r\n return TextMessageFormat.write(JSON.stringify(message));\r\n }\r\n _isInvocationMessage(message) {\r\n this._assertNotEmptyString(message.target, \"Invalid payload for Invocation message.\");\r\n if (message.invocationId !== undefined) {\r\n this._assertNotEmptyString(message.invocationId, \"Invalid payload for Invocation message.\");\r\n }\r\n }\r\n _isStreamItemMessage(message) {\r\n this._assertNotEmptyString(message.invocationId, \"Invalid payload for StreamItem message.\");\r\n if (message.item === undefined) {\r\n throw new Error(\"Invalid payload for StreamItem message.\");\r\n }\r\n }\r\n _isCompletionMessage(message) {\r\n if (message.result && message.error) {\r\n throw new Error(\"Invalid payload for Completion message.\");\r\n }\r\n if (!message.result && message.error) {\r\n this._assertNotEmptyString(message.error, \"Invalid payload for Completion message.\");\r\n }\r\n this._assertNotEmptyString(message.invocationId, \"Invalid payload for Completion message.\");\r\n }\r\n _isAckMessage(message) {\r\n if (typeof message.sequenceId !== 'number') {\r\n throw new Error(\"Invalid SequenceId for Ack message.\");\r\n }\r\n }\r\n _isSequenceMessage(message) {\r\n if (typeof message.sequenceId !== 'number') {\r\n throw new Error(\"Invalid SequenceId for Sequence message.\");\r\n }\r\n }\r\n _assertNotEmptyString(value, errorMessage) {\r\n if (typeof value !== \"string\" || value === \"\") {\r\n throw new Error(errorMessage);\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=JsonHubProtocol.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n/** A logger that does nothing when log messages are sent to it. */\r\nexport class NullLogger {\r\n constructor() { }\r\n /** @inheritDoc */\r\n // eslint-disable-next-line\r\n log(_logLevel, _message) {\r\n }\r\n}\r\n/** The singleton instance of the {@link @microsoft/signalr.NullLogger}. */\r\nNullLogger.instance = new NullLogger();\r\n//# sourceMappingURL=Loggers.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AbortController } from \"./AbortController\";\r\nimport { HttpError, TimeoutError } from \"./Errors\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\nimport { Arg, getDataDetail, getUserAgentHeader, sendMessage } from \"./Utils\";\r\n// Not exported from 'index', this type is internal.\r\n/** @private */\r\nexport class LongPollingTransport {\r\n // This is an internal type, not exported from 'index' so this is really just internal.\r\n get pollAborted() {\r\n return this._pollAbort.aborted;\r\n }\r\n constructor(httpClient, logger, options) {\r\n this._httpClient = httpClient;\r\n this._logger = logger;\r\n this._pollAbort = new AbortController();\r\n this._options = options;\r\n this._running = false;\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n async connect(url, transferFormat) {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isRequired(transferFormat, \"transferFormat\");\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n this._url = url;\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Connecting.\");\r\n // Allow binary format on Node and Browsers that support binary content (indicated by the presence of responseType property)\r\n if (transferFormat === TransferFormat.Binary &&\r\n (typeof XMLHttpRequest !== \"undefined\" && typeof new XMLHttpRequest().responseType !== \"string\")) {\r\n throw new Error(\"Binary protocols over XmlHttpRequest not implementing advanced features are not supported.\");\r\n }\r\n const [name, value] = getUserAgentHeader();\r\n const headers = { [name]: value, ...this._options.headers };\r\n const pollOptions = {\r\n abortSignal: this._pollAbort.signal,\r\n headers,\r\n timeout: 100000,\r\n withCredentials: this._options.withCredentials,\r\n };\r\n if (transferFormat === TransferFormat.Binary) {\r\n pollOptions.responseType = \"arraybuffer\";\r\n }\r\n // Make initial long polling request\r\n // Server uses first long polling request to finish initializing connection and it returns without data\r\n const pollUrl = `${url}&_=${Date.now()}`;\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) polling: ${pollUrl}.`);\r\n const response = await this._httpClient.get(pollUrl, pollOptions);\r\n if (response.statusCode !== 200) {\r\n this._logger.log(LogLevel.Error, `(LongPolling transport) Unexpected response code: ${response.statusCode}.`);\r\n // Mark running as false so that the poll immediately ends and runs the close logic\r\n this._closeError = new HttpError(response.statusText || \"\", response.statusCode);\r\n this._running = false;\r\n }\r\n else {\r\n this._running = true;\r\n }\r\n this._receiving = this._poll(this._url, pollOptions);\r\n }\r\n async _poll(url, pollOptions) {\r\n try {\r\n while (this._running) {\r\n try {\r\n const pollUrl = `${url}&_=${Date.now()}`;\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) polling: ${pollUrl}.`);\r\n const response = await this._httpClient.get(pollUrl, pollOptions);\r\n if (response.statusCode === 204) {\r\n this._logger.log(LogLevel.Information, \"(LongPolling transport) Poll terminated by server.\");\r\n this._running = false;\r\n }\r\n else if (response.statusCode !== 200) {\r\n this._logger.log(LogLevel.Error, `(LongPolling transport) Unexpected response code: ${response.statusCode}.`);\r\n // Unexpected status code\r\n this._closeError = new HttpError(response.statusText || \"\", response.statusCode);\r\n this._running = false;\r\n }\r\n else {\r\n // Process the response\r\n if (response.content) {\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) data received. ${getDataDetail(response.content, this._options.logMessageContent)}.`);\r\n if (this.onreceive) {\r\n this.onreceive(response.content);\r\n }\r\n }\r\n else {\r\n // This is another way timeout manifest.\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Poll timed out, reissuing.\");\r\n }\r\n }\r\n }\r\n catch (e) {\r\n if (!this._running) {\r\n // Log but disregard errors that occur after stopping\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) Poll errored after shutdown: ${e.message}`);\r\n }\r\n else {\r\n if (e instanceof TimeoutError) {\r\n // Ignore timeouts and reissue the poll.\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Poll timed out, reissuing.\");\r\n }\r\n else {\r\n // Close the connection with the error as the result.\r\n this._closeError = e;\r\n this._running = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n finally {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Polling complete.\");\r\n // We will reach here with pollAborted==false when the server returned a response causing the transport to stop.\r\n // If pollAborted==true then client initiated the stop and the stop method will raise the close event after DELETE is sent.\r\n if (!this.pollAborted) {\r\n this._raiseOnClose();\r\n }\r\n }\r\n }\r\n async send(data) {\r\n if (!this._running) {\r\n return Promise.reject(new Error(\"Cannot send until the transport is connected\"));\r\n }\r\n return sendMessage(this._logger, \"LongPolling\", this._httpClient, this._url, data, this._options);\r\n }\r\n async stop() {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Stopping polling.\");\r\n // Tell receiving loop to stop, abort any current request, and then wait for it to finish\r\n this._running = false;\r\n this._pollAbort.abort();\r\n try {\r\n await this._receiving;\r\n // Send DELETE to clean up long polling on the server\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) sending DELETE request to ${this._url}.`);\r\n const headers = {};\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n const deleteOptions = {\r\n headers: { ...headers, ...this._options.headers },\r\n timeout: this._options.timeout,\r\n withCredentials: this._options.withCredentials,\r\n };\r\n let error;\r\n try {\r\n await this._httpClient.delete(this._url, deleteOptions);\r\n }\r\n catch (err) {\r\n error = err;\r\n }\r\n if (error) {\r\n if (error instanceof HttpError) {\r\n if (error.statusCode === 404) {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) A 404 response was returned from sending a DELETE request.\");\r\n }\r\n else {\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) Error sending a DELETE request: ${error}`);\r\n }\r\n }\r\n }\r\n else {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) DELETE request accepted.\");\r\n }\r\n }\r\n finally {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Stop finished.\");\r\n // Raise close event here instead of in polling\r\n // It needs to happen after the DELETE request is sent\r\n this._raiseOnClose();\r\n }\r\n }\r\n _raiseOnClose() {\r\n if (this.onclose) {\r\n let logMessage = \"(LongPolling transport) Firing onclose event.\";\r\n if (this._closeError) {\r\n logMessage += \" Error: \" + this._closeError;\r\n }\r\n this._logger.log(LogLevel.Trace, logMessage);\r\n this.onclose(this._closeError);\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=LongPollingTransport.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { MessageType } from \"./IHubProtocol\";\r\nimport { isArrayBuffer } from \"./Utils\";\r\n/** @private */\r\nexport class MessageBuffer {\r\n constructor(protocol, connection, bufferSize) {\r\n this._bufferSize = 100000;\r\n this._messages = [];\r\n this._totalMessageCount = 0;\r\n this._waitForSequenceMessage = false;\r\n // Message IDs start at 1 and always increment by 1\r\n this._nextReceivingSequenceId = 1;\r\n this._latestReceivedSequenceId = 0;\r\n this._bufferedByteCount = 0;\r\n this._reconnectInProgress = false;\r\n this._protocol = protocol;\r\n this._connection = connection;\r\n this._bufferSize = bufferSize;\r\n }\r\n async _send(message) {\r\n const serializedMessage = this._protocol.writeMessage(message);\r\n let backpressurePromise = Promise.resolve();\r\n // Only count invocation messages. Acks, pings, etc. don't need to be resent on reconnect\r\n if (this._isInvocationMessage(message)) {\r\n this._totalMessageCount++;\r\n let backpressurePromiseResolver = () => { };\r\n let backpressurePromiseRejector = () => { };\r\n if (isArrayBuffer(serializedMessage)) {\r\n this._bufferedByteCount += serializedMessage.byteLength;\r\n }\r\n else {\r\n this._bufferedByteCount += serializedMessage.length;\r\n }\r\n if (this._bufferedByteCount >= this._bufferSize) {\r\n backpressurePromise = new Promise((resolve, reject) => {\r\n backpressurePromiseResolver = resolve;\r\n backpressurePromiseRejector = reject;\r\n });\r\n }\r\n this._messages.push(new BufferedItem(serializedMessage, this._totalMessageCount, backpressurePromiseResolver, backpressurePromiseRejector));\r\n }\r\n try {\r\n // If this is set it means we are reconnecting or resending\r\n // We don't want to send on a disconnected connection\r\n // And we don't want to send if resend is running since that would mean sending\r\n // this message twice\r\n if (!this._reconnectInProgress) {\r\n await this._connection.send(serializedMessage);\r\n }\r\n }\r\n catch {\r\n this._disconnected();\r\n }\r\n await backpressurePromise;\r\n }\r\n _ack(ackMessage) {\r\n let newestAckedMessage = -1;\r\n // Find index of newest message being acked\r\n for (let index = 0; index < this._messages.length; index++) {\r\n const element = this._messages[index];\r\n if (element._id <= ackMessage.sequenceId) {\r\n newestAckedMessage = index;\r\n if (isArrayBuffer(element._message)) {\r\n this._bufferedByteCount -= element._message.byteLength;\r\n }\r\n else {\r\n this._bufferedByteCount -= element._message.length;\r\n }\r\n // resolve items that have already been sent and acked\r\n element._resolver();\r\n }\r\n else if (this._bufferedByteCount < this._bufferSize) {\r\n // resolve items that now fall under the buffer limit but haven't been acked\r\n element._resolver();\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n if (newestAckedMessage !== -1) {\r\n // We're removing everything including the message pointed to, so add 1\r\n this._messages = this._messages.slice(newestAckedMessage + 1);\r\n }\r\n }\r\n _shouldProcessMessage(message) {\r\n if (this._waitForSequenceMessage) {\r\n if (message.type !== MessageType.Sequence) {\r\n return false;\r\n }\r\n else {\r\n this._waitForSequenceMessage = false;\r\n return true;\r\n }\r\n }\r\n // No special processing for acks, pings, etc.\r\n if (!this._isInvocationMessage(message)) {\r\n return true;\r\n }\r\n const currentId = this._nextReceivingSequenceId;\r\n this._nextReceivingSequenceId++;\r\n if (currentId <= this._latestReceivedSequenceId) {\r\n if (currentId === this._latestReceivedSequenceId) {\r\n // Should only hit this if we just reconnected and the server is sending\r\n // Messages it has buffered, which would mean it hasn't seen an Ack for these messages\r\n this._ackTimer();\r\n }\r\n // Ignore, this is a duplicate message\r\n return false;\r\n }\r\n this._latestReceivedSequenceId = currentId;\r\n // Only start the timer for sending an Ack message when we have a message to ack. This also conveniently solves\r\n // timer throttling by not having a recursive timer, and by starting the timer via a network call (recv)\r\n this._ackTimer();\r\n return true;\r\n }\r\n _resetSequence(message) {\r\n if (message.sequenceId > this._nextReceivingSequenceId) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._connection.stop(new Error(\"Sequence ID greater than amount of messages we've received.\"));\r\n return;\r\n }\r\n this._nextReceivingSequenceId = message.sequenceId;\r\n }\r\n _disconnected() {\r\n this._reconnectInProgress = true;\r\n this._waitForSequenceMessage = true;\r\n }\r\n async _resend() {\r\n const sequenceId = this._messages.length !== 0\r\n ? this._messages[0]._id\r\n : this._totalMessageCount + 1;\r\n await this._connection.send(this._protocol.writeMessage({ type: MessageType.Sequence, sequenceId }));\r\n // Get a local variable to the _messages, just in case messages are acked while resending\r\n // Which would slice the _messages array (which creates a new copy)\r\n const messages = this._messages;\r\n for (const element of messages) {\r\n await this._connection.send(element._message);\r\n }\r\n this._reconnectInProgress = false;\r\n }\r\n _dispose(error) {\r\n error !== null && error !== void 0 ? error : (error = new Error(\"Unable to reconnect to server.\"));\r\n // Unblock backpressure if any\r\n for (const element of this._messages) {\r\n element._rejector(error);\r\n }\r\n }\r\n _isInvocationMessage(message) {\r\n // There is no way to check if something implements an interface.\r\n // So we individually check the messages in a switch statement.\r\n // To make sure we don't miss any message types we rely on the compiler\r\n // seeing the function returns a value and it will do the\r\n // exhaustive check for us on the switch statement, since we don't use 'case default'\r\n switch (message.type) {\r\n case MessageType.Invocation:\r\n case MessageType.StreamItem:\r\n case MessageType.Completion:\r\n case MessageType.StreamInvocation:\r\n case MessageType.CancelInvocation:\r\n return true;\r\n case MessageType.Close:\r\n case MessageType.Sequence:\r\n case MessageType.Ping:\r\n case MessageType.Ack:\r\n return false;\r\n }\r\n }\r\n _ackTimer() {\r\n if (this._ackTimerHandle === undefined) {\r\n this._ackTimerHandle = setTimeout(async () => {\r\n try {\r\n if (!this._reconnectInProgress) {\r\n await this._connection.send(this._protocol.writeMessage({ type: MessageType.Ack, sequenceId: this._latestReceivedSequenceId }));\r\n }\r\n // Ignore errors, that means the connection is closed and we don't care about the Ack message anymore.\r\n }\r\n catch { }\r\n clearTimeout(this._ackTimerHandle);\r\n this._ackTimerHandle = undefined;\r\n // 1 second delay so we don't spam Ack messages if there are many messages being received at once.\r\n }, 1000);\r\n }\r\n }\r\n}\r\nclass BufferedItem {\r\n constructor(message, id, resolver, rejector) {\r\n this._message = message;\r\n this._id = id;\r\n this._resolver = resolver;\r\n this._rejector = rejector;\r\n }\r\n}\r\n//# sourceMappingURL=MessageBuffer.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\nimport { Arg, getDataDetail, getUserAgentHeader, Platform, sendMessage } from \"./Utils\";\r\n/** @private */\r\nexport class ServerSentEventsTransport {\r\n constructor(httpClient, accessToken, logger, options) {\r\n this._httpClient = httpClient;\r\n this._accessToken = accessToken;\r\n this._logger = logger;\r\n this._options = options;\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n async connect(url, transferFormat) {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isRequired(transferFormat, \"transferFormat\");\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n this._logger.log(LogLevel.Trace, \"(SSE transport) Connecting.\");\r\n // set url before accessTokenFactory because this._url is only for send and we set the auth header instead of the query string for send\r\n this._url = url;\r\n if (this._accessToken) {\r\n url += (url.indexOf(\"?\") < 0 ? \"?\" : \"&\") + `access_token=${encodeURIComponent(this._accessToken)}`;\r\n }\r\n return new Promise((resolve, reject) => {\r\n let opened = false;\r\n if (transferFormat !== TransferFormat.Text) {\r\n reject(new Error(\"The Server-Sent Events transport only supports the 'Text' transfer format\"));\r\n return;\r\n }\r\n let eventSource;\r\n if (Platform.isBrowser || Platform.isWebWorker) {\r\n eventSource = new this._options.EventSource(url, { withCredentials: this._options.withCredentials });\r\n }\r\n else {\r\n // Non-browser passes cookies via the dictionary\r\n const cookies = this._httpClient.getCookieString(url);\r\n const headers = {};\r\n headers.Cookie = cookies;\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n eventSource = new this._options.EventSource(url, { withCredentials: this._options.withCredentials, headers: { ...headers, ...this._options.headers } });\r\n }\r\n try {\r\n eventSource.onmessage = (e) => {\r\n if (this.onreceive) {\r\n try {\r\n this._logger.log(LogLevel.Trace, `(SSE transport) data received. ${getDataDetail(e.data, this._options.logMessageContent)}.`);\r\n this.onreceive(e.data);\r\n }\r\n catch (error) {\r\n this._close(error);\r\n return;\r\n }\r\n }\r\n };\r\n // @ts-ignore: not using event on purpose\r\n eventSource.onerror = (e) => {\r\n // EventSource doesn't give any useful information about server side closes.\r\n if (opened) {\r\n this._close();\r\n }\r\n else {\r\n reject(new Error(\"EventSource failed to connect. The connection could not be found on the server,\"\r\n + \" either the connection ID is not present on the server, or a proxy is refusing/buffering the connection.\"\r\n + \" If you have multiple servers check that sticky sessions are enabled.\"));\r\n }\r\n };\r\n eventSource.onopen = () => {\r\n this._logger.log(LogLevel.Information, `SSE connected to ${this._url}`);\r\n this._eventSource = eventSource;\r\n opened = true;\r\n resolve();\r\n };\r\n }\r\n catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n });\r\n }\r\n async send(data) {\r\n if (!this._eventSource) {\r\n return Promise.reject(new Error(\"Cannot send until the transport is connected\"));\r\n }\r\n return sendMessage(this._logger, \"SSE\", this._httpClient, this._url, data, this._options);\r\n }\r\n stop() {\r\n this._close();\r\n return Promise.resolve();\r\n }\r\n _close(e) {\r\n if (this._eventSource) {\r\n this._eventSource.close();\r\n this._eventSource = undefined;\r\n if (this.onclose) {\r\n this.onclose(e);\r\n }\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=ServerSentEventsTransport.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { SubjectSubscription } from \"./Utils\";\r\n/** Stream implementation to stream items to the server. */\r\nexport class Subject {\r\n constructor() {\r\n this.observers = [];\r\n }\r\n next(item) {\r\n for (const observer of this.observers) {\r\n observer.next(item);\r\n }\r\n }\r\n error(err) {\r\n for (const observer of this.observers) {\r\n if (observer.error) {\r\n observer.error(err);\r\n }\r\n }\r\n }\r\n complete() {\r\n for (const observer of this.observers) {\r\n if (observer.complete) {\r\n observer.complete();\r\n }\r\n }\r\n }\r\n subscribe(observer) {\r\n this.observers.push(observer);\r\n return new SubjectSubscription(this, observer);\r\n }\r\n}\r\n//# sourceMappingURL=Subject.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// Not exported from index\r\n/** @private */\r\nexport class TextMessageFormat {\r\n static write(output) {\r\n return `${output}${TextMessageFormat.RecordSeparator}`;\r\n }\r\n static parse(input) {\r\n if (input[input.length - 1] !== TextMessageFormat.RecordSeparator) {\r\n throw new Error(\"Message is incomplete.\");\r\n }\r\n const messages = input.split(TextMessageFormat.RecordSeparator);\r\n messages.pop();\r\n return messages;\r\n }\r\n}\r\nTextMessageFormat.RecordSeparatorCode = 0x1e;\r\nTextMessageFormat.RecordSeparator = String.fromCharCode(TextMessageFormat.RecordSeparatorCode);\r\n//# sourceMappingURL=TextMessageFormat.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { NullLogger } from \"./Loggers\";\r\n// Version token that will be replaced by the prepack command\r\n/** The version of the SignalR client. */\r\nexport const VERSION = \"8.0.7\";\r\n/** @private */\r\nexport class Arg {\r\n static isRequired(val, name) {\r\n if (val === null || val === undefined) {\r\n throw new Error(`The '${name}' argument is required.`);\r\n }\r\n }\r\n static isNotEmpty(val, name) {\r\n if (!val || val.match(/^\\s*$/)) {\r\n throw new Error(`The '${name}' argument should not be empty.`);\r\n }\r\n }\r\n static isIn(val, values, name) {\r\n // TypeScript enums have keys for **both** the name and the value of each enum member on the type itself.\r\n if (!(val in values)) {\r\n throw new Error(`Unknown ${name} value: ${val}.`);\r\n }\r\n }\r\n}\r\n/** @private */\r\nexport class Platform {\r\n // react-native has a window but no document so we should check both\r\n static get isBrowser() {\r\n return !Platform.isNode && typeof window === \"object\" && typeof window.document === \"object\";\r\n }\r\n // WebWorkers don't have a window object so the isBrowser check would fail\r\n static get isWebWorker() {\r\n return !Platform.isNode && typeof self === \"object\" && \"importScripts\" in self;\r\n }\r\n // react-native has a window but no document\r\n static get isReactNative() {\r\n return !Platform.isNode && typeof window === \"object\" && typeof window.document === \"undefined\";\r\n }\r\n // Node apps shouldn't have a window object, but WebWorkers don't either\r\n // so we need to check for both WebWorker and window\r\n static get isNode() {\r\n return typeof process !== \"undefined\" && process.release && process.release.name === \"node\";\r\n }\r\n}\r\n/** @private */\r\nexport function getDataDetail(data, includeContent) {\r\n let detail = \"\";\r\n if (isArrayBuffer(data)) {\r\n detail = `Binary data of length ${data.byteLength}`;\r\n if (includeContent) {\r\n detail += `. Content: '${formatArrayBuffer(data)}'`;\r\n }\r\n }\r\n else if (typeof data === \"string\") {\r\n detail = `String data of length ${data.length}`;\r\n if (includeContent) {\r\n detail += `. Content: '${data}'`;\r\n }\r\n }\r\n return detail;\r\n}\r\n/** @private */\r\nexport function formatArrayBuffer(data) {\r\n const view = new Uint8Array(data);\r\n // Uint8Array.map only supports returning another Uint8Array?\r\n let str = \"\";\r\n view.forEach((num) => {\r\n const pad = num < 16 ? \"0\" : \"\";\r\n str += `0x${pad}${num.toString(16)} `;\r\n });\r\n // Trim of trailing space.\r\n return str.substr(0, str.length - 1);\r\n}\r\n// Also in signalr-protocol-msgpack/Utils.ts\r\n/** @private */\r\nexport function isArrayBuffer(val) {\r\n return val && typeof ArrayBuffer !== \"undefined\" &&\r\n (val instanceof ArrayBuffer ||\r\n // Sometimes we get an ArrayBuffer that doesn't satisfy instanceof\r\n (val.constructor && val.constructor.name === \"ArrayBuffer\"));\r\n}\r\n/** @private */\r\nexport async function sendMessage(logger, transportName, httpClient, url, content, options) {\r\n const headers = {};\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n logger.log(LogLevel.Trace, `(${transportName} transport) sending data. ${getDataDetail(content, options.logMessageContent)}.`);\r\n const responseType = isArrayBuffer(content) ? \"arraybuffer\" : \"text\";\r\n const response = await httpClient.post(url, {\r\n content,\r\n headers: { ...headers, ...options.headers },\r\n responseType,\r\n timeout: options.timeout,\r\n withCredentials: options.withCredentials,\r\n });\r\n logger.log(LogLevel.Trace, `(${transportName} transport) request complete. Response status: ${response.statusCode}.`);\r\n}\r\n/** @private */\r\nexport function createLogger(logger) {\r\n if (logger === undefined) {\r\n return new ConsoleLogger(LogLevel.Information);\r\n }\r\n if (logger === null) {\r\n return NullLogger.instance;\r\n }\r\n if (logger.log !== undefined) {\r\n return logger;\r\n }\r\n return new ConsoleLogger(logger);\r\n}\r\n/** @private */\r\nexport class SubjectSubscription {\r\n constructor(subject, observer) {\r\n this._subject = subject;\r\n this._observer = observer;\r\n }\r\n dispose() {\r\n const index = this._subject.observers.indexOf(this._observer);\r\n if (index > -1) {\r\n this._subject.observers.splice(index, 1);\r\n }\r\n if (this._subject.observers.length === 0 && this._subject.cancelCallback) {\r\n this._subject.cancelCallback().catch((_) => { });\r\n }\r\n }\r\n}\r\n/** @private */\r\nexport class ConsoleLogger {\r\n constructor(minimumLogLevel) {\r\n this._minLevel = minimumLogLevel;\r\n this.out = console;\r\n }\r\n log(logLevel, message) {\r\n if (logLevel >= this._minLevel) {\r\n const msg = `[${new Date().toISOString()}] ${LogLevel[logLevel]}: ${message}`;\r\n switch (logLevel) {\r\n case LogLevel.Critical:\r\n case LogLevel.Error:\r\n this.out.error(msg);\r\n break;\r\n case LogLevel.Warning:\r\n this.out.warn(msg);\r\n break;\r\n case LogLevel.Information:\r\n this.out.info(msg);\r\n break;\r\n default:\r\n // console.debug only goes to attached debuggers in Node, so we use console.log for Trace and Debug\r\n this.out.log(msg);\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n/** @private */\r\nexport function getUserAgentHeader() {\r\n let userAgentHeaderName = \"X-SignalR-User-Agent\";\r\n if (Platform.isNode) {\r\n userAgentHeaderName = \"User-Agent\";\r\n }\r\n return [userAgentHeaderName, constructUserAgent(VERSION, getOsName(), getRuntime(), getRuntimeVersion())];\r\n}\r\n/** @private */\r\nexport function constructUserAgent(version, os, runtime, runtimeVersion) {\r\n // Microsoft SignalR/[Version] ([Detailed Version]; [Operating System]; [Runtime]; [Runtime Version])\r\n let userAgent = \"Microsoft SignalR/\";\r\n const majorAndMinor = version.split(\".\");\r\n userAgent += `${majorAndMinor[0]}.${majorAndMinor[1]}`;\r\n userAgent += ` (${version}; `;\r\n if (os && os !== \"\") {\r\n userAgent += `${os}; `;\r\n }\r\n else {\r\n userAgent += \"Unknown OS; \";\r\n }\r\n userAgent += `${runtime}`;\r\n if (runtimeVersion) {\r\n userAgent += `; ${runtimeVersion}`;\r\n }\r\n else {\r\n userAgent += \"; Unknown Runtime Version\";\r\n }\r\n userAgent += \")\";\r\n return userAgent;\r\n}\r\n// eslint-disable-next-line spaced-comment\r\n/*#__PURE__*/ function getOsName() {\r\n if (Platform.isNode) {\r\n switch (process.platform) {\r\n case \"win32\":\r\n return \"Windows NT\";\r\n case \"darwin\":\r\n return \"macOS\";\r\n case \"linux\":\r\n return \"Linux\";\r\n default:\r\n return process.platform;\r\n }\r\n }\r\n else {\r\n return \"\";\r\n }\r\n}\r\n// eslint-disable-next-line spaced-comment\r\n/*#__PURE__*/ function getRuntimeVersion() {\r\n if (Platform.isNode) {\r\n return process.versions.node;\r\n }\r\n return undefined;\r\n}\r\nfunction getRuntime() {\r\n if (Platform.isNode) {\r\n return \"NodeJS\";\r\n }\r\n else {\r\n return \"Browser\";\r\n }\r\n}\r\n/** @private */\r\nexport function getErrorString(e) {\r\n if (e.stack) {\r\n return e.stack;\r\n }\r\n else if (e.message) {\r\n return e.message;\r\n }\r\n return `${e}`;\r\n}\r\n/** @private */\r\nexport function getGlobalThis() {\r\n // globalThis is semi-new and not available in Node until v12\r\n if (typeof globalThis !== \"undefined\") {\r\n return globalThis;\r\n }\r\n if (typeof self !== \"undefined\") {\r\n return self;\r\n }\r\n if (typeof window !== \"undefined\") {\r\n return window;\r\n }\r\n if (typeof global !== \"undefined\") {\r\n return global;\r\n }\r\n throw new Error(\"could not find global\");\r\n}\r\n//# sourceMappingURL=Utils.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { HeaderNames } from \"./HeaderNames\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\nimport { Arg, getDataDetail, getUserAgentHeader, Platform } from \"./Utils\";\r\n/** @private */\r\nexport class WebSocketTransport {\r\n constructor(httpClient, accessTokenFactory, logger, logMessageContent, webSocketConstructor, headers) {\r\n this._logger = logger;\r\n this._accessTokenFactory = accessTokenFactory;\r\n this._logMessageContent = logMessageContent;\r\n this._webSocketConstructor = webSocketConstructor;\r\n this._httpClient = httpClient;\r\n this.onreceive = null;\r\n this.onclose = null;\r\n this._headers = headers;\r\n }\r\n async connect(url, transferFormat) {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isRequired(transferFormat, \"transferFormat\");\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n this._logger.log(LogLevel.Trace, \"(WebSockets transport) Connecting.\");\r\n let token;\r\n if (this._accessTokenFactory) {\r\n token = await this._accessTokenFactory();\r\n }\r\n return new Promise((resolve, reject) => {\r\n url = url.replace(/^http/, \"ws\");\r\n let webSocket;\r\n const cookies = this._httpClient.getCookieString(url);\r\n let opened = false;\r\n if (Platform.isNode || Platform.isReactNative) {\r\n const headers = {};\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n if (token) {\r\n headers[HeaderNames.Authorization] = `Bearer ${token}`;\r\n }\r\n if (cookies) {\r\n headers[HeaderNames.Cookie] = cookies;\r\n }\r\n // Only pass headers when in non-browser environments\r\n webSocket = new this._webSocketConstructor(url, undefined, {\r\n headers: { ...headers, ...this._headers },\r\n });\r\n }\r\n else {\r\n if (token) {\r\n url += (url.indexOf(\"?\") < 0 ? \"?\" : \"&\") + `access_token=${encodeURIComponent(token)}`;\r\n }\r\n }\r\n if (!webSocket) {\r\n // Chrome is not happy with passing 'undefined' as protocol\r\n webSocket = new this._webSocketConstructor(url);\r\n }\r\n if (transferFormat === TransferFormat.Binary) {\r\n webSocket.binaryType = \"arraybuffer\";\r\n }\r\n webSocket.onopen = (_event) => {\r\n this._logger.log(LogLevel.Information, `WebSocket connected to ${url}.`);\r\n this._webSocket = webSocket;\r\n opened = true;\r\n resolve();\r\n };\r\n webSocket.onerror = (event) => {\r\n let error = null;\r\n // ErrorEvent is a browser only type we need to check if the type exists before using it\r\n if (typeof ErrorEvent !== \"undefined\" && event instanceof ErrorEvent) {\r\n error = event.error;\r\n }\r\n else {\r\n error = \"There was an error with the transport\";\r\n }\r\n this._logger.log(LogLevel.Information, `(WebSockets transport) ${error}.`);\r\n };\r\n webSocket.onmessage = (message) => {\r\n this._logger.log(LogLevel.Trace, `(WebSockets transport) data received. ${getDataDetail(message.data, this._logMessageContent)}.`);\r\n if (this.onreceive) {\r\n try {\r\n this.onreceive(message.data);\r\n }\r\n catch (error) {\r\n this._close(error);\r\n return;\r\n }\r\n }\r\n };\r\n webSocket.onclose = (event) => {\r\n // Don't call close handler if connection was never established\r\n // We'll reject the connect call instead\r\n if (opened) {\r\n this._close(event);\r\n }\r\n else {\r\n let error = null;\r\n // ErrorEvent is a browser only type we need to check if the type exists before using it\r\n if (typeof ErrorEvent !== \"undefined\" && event instanceof ErrorEvent) {\r\n error = event.error;\r\n }\r\n else {\r\n error = \"WebSocket failed to connect. The connection could not be found on the server,\"\r\n + \" either the endpoint may not be a SignalR endpoint,\"\r\n + \" the connection ID is not present on the server, or there is a proxy blocking WebSockets.\"\r\n + \" If you have multiple servers check that sticky sessions are enabled.\";\r\n }\r\n reject(new Error(error));\r\n }\r\n };\r\n });\r\n }\r\n send(data) {\r\n if (this._webSocket && this._webSocket.readyState === this._webSocketConstructor.OPEN) {\r\n this._logger.log(LogLevel.Trace, `(WebSockets transport) sending data. ${getDataDetail(data, this._logMessageContent)}.`);\r\n this._webSocket.send(data);\r\n return Promise.resolve();\r\n }\r\n return Promise.reject(\"WebSocket is not in the OPEN state\");\r\n }\r\n stop() {\r\n if (this._webSocket) {\r\n // Manually invoke onclose callback inline so we know the HttpConnection was closed properly before returning\r\n // This also solves an issue where websocket.onclose could take 18+ seconds to trigger during network disconnects\r\n this._close(undefined);\r\n }\r\n return Promise.resolve();\r\n }\r\n _close(event) {\r\n // webSocket will be null if the transport did not start successfully\r\n if (this._webSocket) {\r\n // Clear websocket handlers because we are considering the socket closed now\r\n this._webSocket.onclose = () => { };\r\n this._webSocket.onmessage = () => { };\r\n this._webSocket.onerror = () => { };\r\n this._webSocket.close();\r\n this._webSocket = undefined;\r\n }\r\n this._logger.log(LogLevel.Trace, \"(WebSockets transport) socket closed.\");\r\n if (this.onclose) {\r\n if (this._isCloseEvent(event) && (event.wasClean === false || event.code !== 1000)) {\r\n this.onclose(new Error(`WebSocket closed with status code: ${event.code} (${event.reason || \"no reason given\"}).`));\r\n }\r\n else if (event instanceof Error) {\r\n this.onclose(event);\r\n }\r\n else {\r\n this.onclose();\r\n }\r\n }\r\n }\r\n _isCloseEvent(event) {\r\n return event && typeof event.wasClean === \"boolean\" && typeof event.code === \"number\";\r\n }\r\n}\r\n//# sourceMappingURL=WebSocketTransport.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AbortError, HttpError, TimeoutError } from \"./Errors\";\r\nimport { HttpClient, HttpResponse } from \"./HttpClient\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { isArrayBuffer } from \"./Utils\";\r\nexport class XhrHttpClient extends HttpClient {\r\n constructor(logger) {\r\n super();\r\n this._logger = logger;\r\n }\r\n /** @inheritDoc */\r\n send(request) {\r\n // Check that abort was not signaled before calling send\r\n if (request.abortSignal && request.abortSignal.aborted) {\r\n return Promise.reject(new AbortError());\r\n }\r\n if (!request.method) {\r\n return Promise.reject(new Error(\"No method defined.\"));\r\n }\r\n if (!request.url) {\r\n return Promise.reject(new Error(\"No url defined.\"));\r\n }\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(request.method, request.url, true);\r\n xhr.withCredentials = request.withCredentials === undefined ? true : request.withCredentials;\r\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n if (request.content === \"\") {\r\n request.content = undefined;\r\n }\r\n if (request.content) {\r\n // Explicitly setting the Content-Type header for React Native on Android platform.\r\n if (isArrayBuffer(request.content)) {\r\n xhr.setRequestHeader(\"Content-Type\", \"application/octet-stream\");\r\n }\r\n else {\r\n xhr.setRequestHeader(\"Content-Type\", \"text/plain;charset=UTF-8\");\r\n }\r\n }\r\n const headers = request.headers;\r\n if (headers) {\r\n Object.keys(headers)\r\n .forEach((header) => {\r\n xhr.setRequestHeader(header, headers[header]);\r\n });\r\n }\r\n if (request.responseType) {\r\n xhr.responseType = request.responseType;\r\n }\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = () => {\r\n xhr.abort();\r\n reject(new AbortError());\r\n };\r\n }\r\n if (request.timeout) {\r\n xhr.timeout = request.timeout;\r\n }\r\n xhr.onload = () => {\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = null;\r\n }\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n resolve(new HttpResponse(xhr.status, xhr.statusText, xhr.response || xhr.responseText));\r\n }\r\n else {\r\n reject(new HttpError(xhr.response || xhr.responseText || xhr.statusText, xhr.status));\r\n }\r\n };\r\n xhr.onerror = () => {\r\n this._logger.log(LogLevel.Warning, `Error from HTTP request. ${xhr.status}: ${xhr.statusText}.`);\r\n reject(new HttpError(xhr.statusText, xhr.status));\r\n };\r\n xhr.ontimeout = () => {\r\n this._logger.log(LogLevel.Warning, `Timeout from HTTP request.`);\r\n reject(new TimeoutError());\r\n };\r\n xhr.send(request.content);\r\n });\r\n }\r\n}\r\n//# sourceMappingURL=XhrHttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nexport { AbortError, HttpError, TimeoutError } from \"./Errors\";\r\nexport { HttpClient, HttpResponse } from \"./HttpClient\";\r\nexport { DefaultHttpClient } from \"./DefaultHttpClient\";\r\nexport { HubConnection, HubConnectionState } from \"./HubConnection\";\r\nexport { HubConnectionBuilder } from \"./HubConnectionBuilder\";\r\nexport { MessageType } from \"./IHubProtocol\";\r\nexport { LogLevel } from \"./ILogger\";\r\nexport { HttpTransportType, TransferFormat } from \"./ITransport\";\r\nexport { NullLogger } from \"./Loggers\";\r\nexport { JsonHubProtocol } from \"./JsonHubProtocol\";\r\nexport { Subject } from \"./Subject\";\r\nexport { VERSION } from \"./Utils\";\r\n//# sourceMappingURL=index.js.map","declare var ErrorHandler: any;\n\nvar Ajax = window.Ajax = (function () {\n\n var ajaxViewParsers = {};\n function addAjaxViewParser(parser: any, name?: string) {\n name = name || 'default';\n ajaxViewParsers[name] = parser;\n }\n\n interface IUnAuthorizedHandler {\n (data: any): void;\n }\n\n var unauthorizedHandlers: IUnAuthorizedHandler[] = [];\n\n function subscribeUnauthorized(handler: IUnAuthorizedHandler) {\n if (unauthorizedHandlers.indexOf(handler) < 0) {\n unauthorizedHandlers.push(handler);\n }\n }\n\n function unSubscribeUnauthorized(handler: IUnAuthorizedHandler) {\n var index = unauthorizedHandlers.indexOf(handler);\n if (index >= 0) {\n unauthorizedHandlers.splice(index, 1);\n }\n }\n\n var globalErrorHandler = (jqXHR, textStatus, errorThrown) => console.log('AjaxError Moq: ' + textStatus + ' ' + errorThrown);\n\n $(document).ready(function () {\n if (typeof (ErrorHandler) != 'undefined' && typeof (ErrorHandler.handle) == 'function')\n globalErrorHandler = ErrorHandler.handle;\n });\n\n function commonErrorHandler(jqXHR: JQueryXHR, textStatus: string, errorThrown: string, error: any) {\n if (textStatus == null) return;\n\n if (typeof (error) != 'function') error = globalErrorHandler;\n\n error(jqXHR, textStatus, errorThrown);\n }\n function callAjaxViewParsers(view: IAjaxView) {\n var parsers = Object.keys(ajaxViewParsers);\n for (var i = 0; i < parsers.length; i++) {\n callAjaxViewParser(ajaxViewParsers[parsers[i]], view);\n }\n }\n\n function callAjaxViewParser(parser: any, view: IAjaxView) {\n if (parser) {\n if (typeof (parser) == 'function') {\n parser(view);\n } else if (typeof (parser.parse) == 'function') {\n parser.parse(view);\n }\n }\n }\n\n function processViews(views: IAjaxView[], doCallAjaxViewParsers: boolean) {\n for (var i = 0; i < views.length; i++) {\n var view = views[i];\n\n $(view.Selector).promise().done(function () {\n $(view.Selector).replaceWith(view.Html);\n if (doCallAjaxViewParsers)\n callAjaxViewParsers(view);\n });\n\n var afterRender = view.AfterRender;\n if (afterRender && afterRender.length > 0) {\n afterRender.forEach(function (act) {\n var handler = eval(act.name);\n handler.call(view, act.args);\n })\n }\n }\n }\n\n function commonSuccessHandler(data: IAjaxData, textStatus: string, jqXHR: JQueryXHR, success: any, doCallAjaxViewParsers: boolean) {\n if (data.RedirectUrl) {\n Ajax.redirect(data.RedirectUrl, data.ActionData);\n return;\n }\n\n if (data.Views && data.Views.length > 0) {\n processViews(data.Views, doCallAjaxViewParsers);\n }\n\n if (success && typeof (success) == 'function') {\n var notifyData = data.ActionData;\n if (data.IsUnauthorized === true) {\n notifyData = $.extend(true, {}, notifyData || {}, { IsUnauthorized: true });\n }\n\n success(notifyData, textStatus, jqXHR);\n }\n\n if (data.IsUnauthorized === true) {\n unauthorizedHandlers.forEach((handler, index, arr) => handler(data));\n }\n }\n\n function postJson(url: string, options?: any) {\n options = options || {};\n options.dataType = 'json'; //text html or default(IG)\n options.method = 'POST';\n\n var dataToSend = options.data;\n if (typeof dataToSend == \"string\") {\n dataToSend = JSON.parse(dataToSend);\n }\n dataToSend = dataToSend || {};\n dataToSend.isAjax = true;\n options.data = dataToSend;\n\n if (!options.hasOwnProperty('async')) {\n options.async = true\n }\n\n var uiBlock = options.uiBlock;\n options.uiBlock = undefined;\n var uiBlockNeeded = UiBlock.needBlock(uiBlock);\n\n var concreteSuccessHandler = options.success;\n var concreteErrorHandler = options.error;\n options.error = (jqXHR, textStatus, errorThrown) => {\n if (uiBlockNeeded) UiBlock.unBlock(uiBlock);\n\n commonErrorHandler(jqXHR, textStatus, errorThrown, concreteErrorHandler);\n }\n\n var doCallAjaxViewParsers = options.hasOwnProperty('doCallAjaxViewParsers') ? options.doCallAjaxViewParsers : true;\n\n options.success = (data, textStatus, jqXHR) => {\n if (uiBlockNeeded) UiBlock.unBlock(uiBlock);\n\n commonSuccessHandler(data, textStatus, jqXHR, concreteSuccessHandler, doCallAjaxViewParsers);\n }\n\n if (uiBlockNeeded) UiBlock.block(uiBlock);\n\n return $.ajax(url, options);\n }\n function SubmitFileForm(element: HTMLElement): void {\n var form = $(element).parents('form')[0];\n var actionUrl = $(form).attr('action');\n var f: any = $(form);\n var validator = f.validate();\n\n\n if (f.valid()) {\n document.dispatchEvent(new CustomEvent('validationSuccess', {\n detail: {\n validator\n }\n }))\n\n var formData = new FormData(f[0]);\n\n var uiBlock = UiBlock.getUiBlockDescriptor(element, UiBlock.getDefaultSpinnerBlock(element));\n UiBlock.block(uiBlock);\n\n $.ajax(actionUrl,\n {\n url: actionUrl,\n type: 'POST',\n data: formData,\n processData: false,\n contentType: false,\n success: (data, textStatus, jqXHR) => {\n UiBlock.unBlock(uiBlock);\n\n commonSuccessHandler(data, textStatus, jqXHR, null, true);\n },\n error: (jqXHR, textStatus, errorThrown) => {\n UiBlock.unBlock(uiBlock);\n },\n dataType: 'json'\n });\n } else {\n document.dispatchEvent(new CustomEvent('validationError', {\n detail: {\n validator\n }\n }))\n }\n }\n\n function getJson(url: string, options?: JQueryAjaxSettings) {\n options = options || {};\n options.dataType = 'json'; //text html or default(IG)\n options.method = 'GET';\n options.async = true;\n\n\n var dataToSend = options.data || '';\n if (typeof dataToSend == \"object\" && Object.keys(dataToSend).length > 0) {\n dataToSend = $.param(dataToSend);\n }\n dataToSend.isAjax = true;\n options.data = dataToSend;\n var concreteSuccessHandler = options.success;\n var concreteErrorHandler = options.error;\n options.error = (jqXHR, textStatus, errorThrown) => commonErrorHandler(jqXHR, textStatus, errorThrown, concreteErrorHandler);\n options.success = (data, textStatus, jqXHR) => commonSuccessHandler(data, textStatus, jqXHR, concreteSuccessHandler, false);\n\n return $.ajax(url, options);\n }\n\n function redirect(url: string, data?: any) {\n if (data)\n data = '?' + $.param(data);\n else\n data = \"\";\n window.location.href = url + data;\n }\n\n function refreshPage() {\n document.location.reload();\n }\n\n function serializeObject(element: any) {\n var o = {};\n var a = $(element).serializeArray();\n var ignore = $.unique($(element).find('[form-submit-ignore]').find('input').filter(function () { return this.name; }).map((i, elem: any) => { return elem.name; }).get());\n $.each(a, function () {\n if (ignore.indexOf(this.name) != -1)\n return;\n\n if (o[this.name] !== undefined) {\n if (!o[this.name].push) {\n o[this.name] = [o[this.name]];\n }\n o[this.name].push(this.value || '');\n } else {\n o[this.name] = this.value || '';\n }\n });\n return o;\n };\n\n function collectForm(element: any): any {\n var form = $(element).parents('form')[0];\n var f: any = $(form);\n\n var validator = f.validate();\n\n if (f.valid()) {\n document.dispatchEvent(new CustomEvent('validationSuccess', {\n detail: {\n validator\n }\n }))\n\n return { form: Ajax.serializeObject(form), isValid: true };\n }\n else {\n document.dispatchEvent(new CustomEvent('validationError', {\n detail: {\n validator\n }\n }))\n\n return { isValid: false };\n }\n }\n\n function submitByElement(element: HTMLElement) {\n var form = $(element).parents('form')[0];\n var actionUrl = $(form).attr('action');\n var f: any = $(form);\n if (f.valid()) {\n var data = Ajax.serializeObject(form);\n var uiBlock = UiBlock.getUiBlockDescriptor(element, UiBlock.getDefaultSpinnerBlock(element));\n\n Ajax.postJson(actionUrl, { data: data, uiBlock: uiBlock });\n }\n }\n\n function submit(selector: any) {\n var element;\n if (typeof (selector) == 'string') {\n element = $(selector)[0];\n } else if (typeof (selector) == 'object' && selector.tagName) {\n element = selector;\n }\n\n submitByElement(selector);\n }\n\n function ajaxAction(url, input) {\n var dataJson = $(input).attr('ajaxData');\n var data = null;\n if (dataJson) {\n data = JSON.parse(dataJson);\n }\n\n var uiBlock = UiBlock.getUiBlockDescriptor(input, UiBlock.getDefaultSpinnerBlock(input));\n\n Ajax.postJson(url, { data: data, uiBlock: uiBlock });\n }\n\n function init(lang: string, appSource: string) {\n if (appSource != null && appSource != undefined) {\n $.ajaxSetup({\n headers: {\n 'bb-ajax': '1',\n 'bb_lang': lang,\n 'bb_appSource': appSource\n }\n });\n }\n else {\n $.ajaxSetup({\n headers: {\n 'bb-ajax': '1',\n 'bb_lang': lang\n }\n });\n }\n }\n\n return {\n addAjaxViewParser,\n subscribeUnauthorized,\n unSubscribeUnauthorized,\n processViews,\n postJson,\n SubmitFileForm,\n getJson,\n redirect,\n refreshPage,\n serializeObject,\n collectForm,\n submit,\n ajaxAction,\n init\n }\n})()","import { BaseControlBehaviour } from './BaseControlBehaviour';\ndeclare let ymaps: any;\ndeclare let Map: any;\nexport class AddressesTableBehaviour extends BaseControlBehaviour {\n constructor() {\n super('city-expander');\n }\n\n getInstalledTag() {\n return this.tagInstalled;\n }\n\n static installMap(mapElement: JQuery) {\n if (\n mapElement.data('longitude') == '' ||\n mapElement.data('latitude') == ''\n ) {\n mapElement.text(\n window.Localization.getString(\n 'Scripts_Shared_Infrastructure.AddressesTableBehaviour_2',\n 'Карта недоступна'\n )\n );\n return;\n }\n\n const myMap = new ymaps.Map(mapElement[0], {\n center: [mapElement.data('longitude'), mapElement.data('latitude')],\n zoom: 16,\n });\n\n Map = myMap;\n\n const clusterer = new ymaps.Clusterer({\n preset: 'islands#nightClusterIcons',\n }),\n myPlacemark = new ymaps.Placemark(\n [mapElement.data('longitude'), mapElement.data('latitude')],\n null,\n {\n iconLayout: 'default#image',\n iconImageHref:\n '../../../Content/shared/images/mapmarker.png',\n iconImageSize: [50, 65],\n iconImageOffset: [-25, -68],\n }\n );\n\n myMap.controls.remove('trafficControl');\n myMap.controls.remove('searchControl');\n myMap.controls.remove('fullscreenControl');\n\n clusterer.add(myPlacemark);\n\n myMap.geoObjects.add(clusterer);\n }\n\n protected installBehaviour(element: HTMLElement): void {\n $(element).click(function () {\n const toToggle = $(this).siblings(\n '.addresses-body__expanded-table'\n );\n\n toToggle.slideToggle('medium', () => {\n $(this).trigger('endToggle');\n });\n\n const mapRow = $('.addresses-body__expanded-row', toToggle);\n\n if ($(this).hasClass('m-opened')) {\n $(this).removeClass('m-opened');\n $(this)\n .parent('.addresses-body__table-row-wrapper')\n .removeClass('m-opened');\n mapRow.unbind('click');\n } else {\n /*\n var openedExpander = $('.addresses-body__table-row.m-opened');\n if (openedExpander.length != 0) {\n var table = openedExpander.siblings('.addresses-body__expanded-table');\n table.toggle('medium');\n openedExpander.removeClass('m-opened');\n openedExpander.parent('.addresses-body__table-row-wrapper').removeClass('m-opened');\n var openedRow = $('.addresses-body__expanded-row', table);\n openedRow.unbind('click');\n }\n*/\n\n $(this).addClass('m-opened');\n $(this)\n .parent('.addresses-body__table-row-wrapper')\n .addClass('m-opened');\n\n mapRow.click(function () {\n const map = $(this).siblings(\n '.addresses-body__expanded-table-map'\n );\n\n const openedMap = $(\n '.addresses-body__expanded-table-map.m-opened'\n );\n\n if (map.hasClass('m-opened')) {\n map.removeClass('m-opened');\n $(this)\n .parent('.addresses-body__expanded-row-wrapper')\n .removeClass('m-opened');\n } else {\n if (openedMap.length != 0) {\n openedMap.removeClass('m-opened');\n openedMap\n .parent('.addresses-body__expanded-row-wrapper')\n .removeClass('m-opened');\n if (Map.length != 0) Map.destroy();\n }\n\n map.addClass('m-opened');\n $(this)\n .parent('.addresses-body__expanded-row-wrapper')\n .addClass('m-opened');\n const mapContainer = $('#adressmap', map);\n\n if (mapContainer[0].innerHTML == '')\n ymaps.ready(\n AddressesTableBehaviour.installMap(mapContainer)\n );\n\n $(this).trigger('endToggle');\n }\n });\n }\n });\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.AddressesTableBehaviour = AddressesTableBehaviour;\n","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\n\n/**\n * AjaxAction - добавляет ajax postJson поведение на контрол с аттрибутом ajax-action\n * если указан атррибут ajax-action-form то на все input[type=text] навешивается keydown, кроме элементов исключений, указанных в массиве excludeTags\n * если контрол начинается с input- но не submit то вызов ajax метода будет осуществляться по изменению, в противном случае по клик\n * Зависит от EnterBehaviour\n * ajax-action-use-spinner - показывать или нет спиннер\n * ajax-action-success-action - действие на успех\n */\nexport class AjaxActionBehavior extends BaseEmptyPrefixControlBehaviour {\n ajaxActionTypes: any = {\n default: {\n all: {},\n 'input-checkbox': {\n delay: 300,\n },\n },\n };\n private excludeTags: string[];\n\n constructor() {\n super('ajax-action');\n this.excludeTags = [new Behaviours.EnterBehaviour().getInstalledTag()];\n }\n\n protected installBehaviour(element: HTMLElement): void {\n const isAjsxForm = $(element).attr(this.tag + '-form');\n if (isAjsxForm) {\n const form = $(element).parents('form')[0];\n const selector = 'input[type=text]';\n let excludeSelector = '';\n if (this.excludeTags && this.excludeTags.length > 0) {\n excludeSelector += ':not(';\n for (let i = 0; i < this.excludeTags.length; i++) {\n excludeSelector += '[' + this.excludeTags[i] + ']';\n if (i < this.excludeTags.length - 1) excludeSelector += ',';\n }\n excludeSelector += ')';\n }\n $(form).on(\n 'keydown',\n selector + excludeSelector,\n { ajaxActionElement: element },\n (e) => this.ajaxActionEnterHandler(e)\n );\n }\n\n const elementFullType = Utils.getElementFullType(element);\n if (\n elementFullType.startsWith('input-') &&\n elementFullType != 'input-submit'\n ) {\n $(element).change((e) => this.ajaxActionSubmitHandler(e));\n } else {\n $(element).click((e) => this.ajaxActionSubmitHandler(e));\n }\n\n $(element).on('ajax-action', (e) => this.ajaxActionSubmitHandler(e));\n\n $(element).removeAttr('href');\n }\n\n private ajaxActionSubmitHandler(evt) {\n evt.preventDefault();\n\n return this.ajaxActionSubmit(evt.currentTarget);\n }\n\n private ajaxActionSubmit(element) {\n const url = $(element).attr(this.tag);\n\n let data;\n const elementFullType = Utils.getElementFullType(element);\n if (elementFullType == 'input-checkbox') {\n data = {};\n data[$(element).attr('name')] = $(element).is(':checked');\n } else if (elementFullType.startsWith('input-')) {\n data = {};\n data[$(element).attr('name')] = $(element).val();\n } else {\n const val = $(element).data('value');\n if (val) {\n data = Utils.tryEval($(element).data('value'));\n }\n }\n\n let config = $.extend(\n true,\n {},\n this.ajaxActionTypes.default.all,\n this.ajaxActionTypes.default[elementFullType] || {}\n );\n config = Utils.getObjectByAttributes(this.tag, element, null, config);\n\n if (config.form != undefined) {\n const formResult = Ajax.collectForm(element);\n if (!formResult.isValid) return;\n data = $.extend(true, data, {}, formResult.form);\n }\n\n const toSend: any = {\n data: data,\n };\n\n if ($(element).attr(this.tag + '-use-spinner') != null) {\n const uiBlock = UiBlock.getUiBlockDescriptor(\n element,\n UiBlock.getDefaultSpinnerBlock(element)\n );\n toSend.uiBlock = uiBlock;\n }\n\n const func = $(element).attr(this.tag + '-success-action');\n if ($(element).attr(this.tag + '-success-action') != null) {\n toSend.success = (\n data,\n textStatus,\n jqXHR,\n concreteSuccessHandler\n ) => Utils.runFunction(func, element, data);\n }\n\n if (config.delay) {\n setTimeout(() => {\n Ajax.postJson(url, toSend);\n }, config.delay);\n } else {\n Ajax.postJson(url, toSend);\n }\n }\n\n private ajaxActionEnterHandler(keyupEvent) {\n if (keyupEvent.which == 13) {\n keyupEvent.preventDefault();\n\n this.ajaxActionSubmit(keyupEvent.data.ajaxActionElement);\n }\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.AjaxActionBehavior = AjaxActionBehavior;","import { BaseControlBehaviour } from './BaseControlBehaviour';\n\n/**\n * AutoFocus - устанавливает при загрузке фокус на элемент с аттрибутом bb-auto-focus\n */\nexport class AutoFocusBehaviour extends BaseControlBehaviour {\n constructor() {\n super('auto-focus');\n }\n\n protected installBehaviour(element: HTMLElement): void {\n const isFocusedString = $(element).attr('bb-auto-focus');\n\n const isFocused: boolean = isFocusedString.toLowerCase() == 'true';\n\n if (isFocused) {\n $(element).focus();\n if (element instanceof HTMLInputElement) {\n element.selectionStart = element.value.length;\n }\n }\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.AutoFocusBehaviour = AutoFocusBehaviour;","/**\n * BaseControl - базовый класс поведения\n * дефолт: prefix: \"bb-\", installed: \"-installed\"\n *\n */\nexport abstract class BaseControlBehaviour {\n private prefix = 'bb-';\n readonly installed: string = '-installed';\n\n protected tag: string;\n protected tagInstalled: string;\n protected name: string;\n protected options: IControlsOptions;\n\n constructor(name: string) {\n this.tag = this.getPrefix() + name;\n this.tagInstalled = this.tag + this.installed;\n this.name = name;\n }\n\n public getBehaviorName(): string {\n return this.name;\n }\n\n protected getPrefix(): string {\n return this.prefix;\n }\n\n protected getFullTag(): string {\n return this.tag;\n }\n\n public shouldInstall(element: any): boolean {\n return (\n $(element).is(\n '[' + this.tag + ']:not([' + this.tagInstalled + '])'\n ) && this.installCondition(element)\n );\n }\n\n protected installCondition(element: any): boolean {\n return true;\n }\n\n protected getBehaviorValue(element: any): string {\n return $(element).attr(this.tag);\n }\n\n protected setInstalled(element: any): void {\n if (!$(element).attr(this.tagInstalled)) {\n $(element).attr(this.tagInstalled, 'true');\n }\n }\n\n protected abstract installBehaviour(element: HTMLElement): void;\n public install(element: any, opts?: IControlsOptions): void {\n this.options = opts;\n this.installBehaviour(element);\n this.setInstalled(element);\n }\n}\n\n/**\n * BaseEmptyPrefixControl - базовый класс поведения c переопределенным префиксом = \"\"\n * дефолт: prefix: \"\", installed: \"-installed\"\n *\n */\nexport abstract class BaseEmptyPrefixControlBehaviour extends BaseControlBehaviour {\n constructor(attr: string) {\n super(attr);\n }\n\n protected getPrefix(): string {\n return '';\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.BaseControlBehaviour = BaseControlBehaviour;\nwindow.Behaviours.BaseEmptyPrefixControlBehaviour = BaseEmptyPrefixControlBehaviour","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\n/**\n * Changables - элемент с аттрибутом changable и input или select\n * будет обрабатываться как элемент с начальными данными лежащими в data-initial-value\n * каждый раз при изменении, данный элемент будет помечаться модификатором m-changed, если данные отличаются от начальных\n * В аттрибуте можно указать список ID buttons которые будут дизейблится при изменении\n */\nexport class ChangablesBehaviour extends BaseEmptyPrefixControlBehaviour {\n constructor() {\n super('changable');\n }\n\n protected installBehaviour(element: HTMLElement): void {\n const initialValue = this.getValue(element);\n $(element).attr('data-initial-value', initialValue);\n $(element).change((e) => this.handleChangableChanged(e));\n }\n\n private handleChangableChanged(evt) {\n const currentElement = evt.currentTarget;\n const config = Utils.getObjectByAttributes(\n this.tag,\n currentElement,\n null,\n { modifier: 'm-changed' }\n );\n const tagValue = this.getBehaviorValue(currentElement);\n\n const initialValue = $(currentElement).attr('data-initial-value');\n const currentValue = this.getValue(currentElement);\n if (currentValue == initialValue) {\n $(currentElement).removeClass(config.modifier);\n if (tagValue) {\n $(tagValue).each((index, elem) => {\n $(elem).removeClass('m-disabled');\n });\n }\n } else {\n $(currentElement).addClass(config.modifier);\n if (tagValue) {\n $(tagValue).each((index, elem) => {\n $(elem).addClass('m-disabled');\n });\n }\n }\n }\n\n private getValue(element: HTMLElement): any {\n const changableFullType = Utils.getElementFullType(element);\n if (changableFullType == 'select') {\n return $(element).find(':selected').val();\n }\n return $(element).val();\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.ChangablesBehaviour = ChangablesBehaviour;","import { BaseControlBehaviour } from '../BaseControlBehaviour';\nexport interface IComponentController {\n load(element: HTMLElement, config: any);\n}\n\nexport class ComponentBehavior extends BaseControlBehaviour {\n private _defaultConfig = {\n controller: null,\n };\n constructor() {\n super('component');\n }\n\n protected getControllerClass(controllerClass: string) {\n return eval(controllerClass);\n }\n protected installBehaviour(element: HTMLElement): void {\n const config = Utils.getObjectByAttributes(\n this.tag,\n element,\n null,\n $.extend(true, {}, this._defaultConfig)\n );\n if (config.controller) {\n const controllerClass = this.getControllerClass(config.controller);\n const controller: IComponentController = new controllerClass();\n $(element).data('controller', controller);\n controller.load(element, config);\n }\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.ComponentBehavior = ComponentBehavior;\n","import { BaseControlBehaviour } from \"./BaseControlBehaviour\";\n\nexport function unbindWindowWarning() {\n window.onbeforeunload = null;\n}\n\nexport class CustomFileBehaviour extends BaseControlBehaviour {\n constructor() {\n super('custom-file');\n }\n\n public static deleteFile(removeButton, parentSelector, fileSelector) {\n const parent = $(removeButton).parent(parentSelector);\n const file = $(fileSelector, parent);\n\n if (file.val() != '') {\n const isConfirmed = confirm(\n Localization.getString(\n 'FileControls.DeleteFile',\n 'Удалить файл?'\n )\n );\n if (isConfirmed) {\n file.val('');\n $(removeButton)\n .siblings('label')\n .children('mark')\n .text(\n Localization.getString(\n 'FileControls.NoFiles',\n 'Файл не выбран'\n )\n );\n $(removeButton).css('display', 'none');\n }\n }\n\n const fileNames = [];\n const totalFiles = $(parentSelector).find('[type=\"file\"]');\n\n const labelCssClass = $(file).attr('custom-file-label-class');\n if (labelCssClass) {\n $(parent).siblings('.j-upload-label').removeClass(labelCssClass);\n }\n\n $.each(totalFiles, function (i, item) {\n const value = $(totalFiles[i]).val();\n if (value != '') {\n fileNames.push(value);\n }\n });\n\n if (fileNames.length == 0) window.onbeforeunload = null;\n }\n\n public static clearFileInput(removeButton, parentSelector, fileSelector) {\n const parent = $(removeButton).closest(parentSelector);\n const file = $(fileSelector, parent)[0];\n\n $(file).val('');\n\n const labelCssClass = $(file).attr('custom-file-label-class');\n if (labelCssClass) {\n $('.j-upload-label', parent).removeClass(labelCssClass);\n }\n $(file).siblings('.j-upload-value').text('');\n }\n\n private static RollbackFileControls(\n inputElement: any,\n uploadButton: JQuery\n ) {\n const inputWrapper = $(inputElement);\n inputWrapper.val('');\n if (inputElement.files.length > 0) inputElement.files[0] = null;\n if (uploadButton.length > 0) {\n uploadButton.addClass('m-disabled');\n }\n $('[custom-file-uploadPath-element]').text(\n window.Localization.getString(\n 'Scripts_Shared_Infrastructure.CustomFileBehaviour_3',\n 'Загрузить файл'\n )\n );\n }\n\n protected installBehaviour(element: HTMLElement) {\n $(element).attr('custom-file-installed', 'true');\n const clearFileInputButtonSelector = $(element).attr(\n 'custom-file-clear-button'\n );\n if (clearFileInputButtonSelector) {\n $(element)\n .siblings(clearFileInputButtonSelector)\n .click((evt) => {\n evt.preventDefault();\n evt.stopPropagation();\n $(evt.target);\n const parentSelector =\n $(evt.target).attr('parent-selector') || 'div';\n const fileSelector =\n $(evt.target).attr('file-selector') ||\n 'input[type=file]';\n\n CustomFileBehaviour.clearFileInput(\n evt.target,\n parentSelector,\n fileSelector\n );\n });\n }\n $(element).change(function () {\n let isError = false;\n let errorMessage = '';\n\n const maxUSerSize = parseInt($(this).attr('custom-file-max-size')); //мегабайты\n const maxSizeBytes: number = maxUSerSize * 1024 * 1024; //байты\n const uploadButton = $('[custom-file-uploadButton]');\n if (this.files.length == 0) {\n CustomFileBehaviour.RollbackFileControls(this, uploadButton);\n return;\n }\n const fileSize: number = this.files[0].size;\n\n if (fileSize > maxSizeBytes) {\n errorMessage =\n Localization.getString(\n 'FileControls.MaxUserSize1',\n 'Размер файла не должен превышать '\n ) +\n maxUSerSize +\n Localization.getString('FileControls.MaxUserSize2', ' Мб');\n isError = true;\n }\n\n const allowedExtensions = $(this)\n .attr('custom-file-extensions')\n .split(',');\n const fileName: string = $(this).val();\n const extension: string = fileName.replace(/^.*\\./, '');\n\n if ($.inArray(extension, allowedExtensions) == -1) {\n errorMessage =\n Localization.getString(\n 'FileControls.AllowedExtensions1',\n 'Допускаются только '\n ) +\n allowedExtensions.toString() +\n Localization.getString(\n 'FileControls.AllowedExtensions2',\n ' расширения файлов'\n );\n isError = true;\n }\n\n if (isError) {\n alert(errorMessage);\n CustomFileBehaviour.RollbackFileControls(this, uploadButton);\n } else {\n if (uploadButton.length > 0) {\n uploadButton.removeClass('m-disabled');\n }\n const uploadPathElement = $('[custom-file-uploadPath-element]');\n $(this).siblings('.j-upload-value').text($(element).val());\n\n const labelCssClass = $(this).attr('custom-file-label-class');\n if (labelCssClass) {\n $(this).siblings('.j-upload-label').addClass(labelCssClass);\n }\n\n if (uploadPathElement.length > 0) {\n uploadPathElement.html(fileName.split(/(\\\\|\\/)/g).pop());\n }\n\n if (\n $(this).attr('custom-file-warning') == 'true' &&\n this.files[0] != null\n ) {\n window.onbeforeunload = function () {\n return Localization.getString(\n 'FileControls.FilesWillBeDeleted',\n 'При перезагрузке страницы прикрепленные файлы будут удалены'\n );\n };\n }\n }\n });\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.CustomFileBehaviour = CustomFileBehaviour;\nwindow.Behaviours.unbindWindowWarning = unbindWindowWarning;","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\n/**\n * CustomSelects - применяет к элементу с аттрибтом custom-select niceSelect\n */\nexport class CustomSelectsBehaviour extends BaseEmptyPrefixControlBehaviour {\n constructor() {\n super('custom-select');\n }\n\n protected installBehaviour(element: HTMLElement): void {\n if (\n (window).globalAppSettings.isMobileDevice &&\n !(window).globalAppSettings.isMobileDeviceInDesktopMode\n ) {\n return;\n }\n\n if ($.fn.niceSelect) {\n ($(element)).niceSelect();\n }\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.CustomSelectsBehaviour = CustomSelectsBehaviour;","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\n/**\n * DatePicker - элмент с аттрибутом datepicker указывает на то, что будет к нему применен метод ui.datepicker\n * свойства используемые в дейтпикере (коррелирют со свойствами ui.datepicker):\n * minDate\n * maxDate\n * yearRange\n * dateFormat\n * showOtherMonths (по-умолчанию = true)\n * selectOtherMonths (по-умолчанию = true)\n * changeYear (по-умолчанию = true)\n * beforeShow\n * duration (по-умолчанию = fast)\n * inputMask\n * z-index (по-умолчанию = 1000)\n */\nexport class DatePickerBehaviour extends BaseEmptyPrefixControlBehaviour {\n private functions: any = {\n beforeShow: true,\n onSelect: true,\n };\n private defaults: any = {\n showOtherMonths: true,\n selectOtherMonths: true,\n changeYear: true,\n duration: 'fast',\n 'z-index': 1000,\n onSelect: (text, instance) => {\n const jq: any = $;\n const input = instance.input[0];\n const form = input.form;\n const validator = jq(form).validate();\n if (validator) validator.element(input);\n if ($(input).is('[pager-trigger]')) $(input).keyup();\n },\n };\n private properties: any = {\n 0: {\n mindate: 'minDate',\n maxdate: 'maxDate',\n yearrange: 'yearRange',\n dateformat: 'dateFormat',\n showothermonths: 'showOtherMonths',\n selectothermonths: 'selectOtherMonths',\n changeyear: 'changeYear',\n beforeshow: 'beforeShow',\n duration: 'duration',\n inputmask: 'inputMask',\n onselect: 'onSelect',\n },\n };\n\n constructor() {\n super('datepicker');\n }\n protected installCondition(element: any): boolean {\n return !!$.datepicker;\n }\n protected installBehaviour(element: HTMLElement): void {\n const dp = $(element);\n const data: any = Utils.getObjectByAttributes(\n this.tag,\n element,\n (p, l) => this.propertyTranslator(p, l),\n this.defaults\n );\n for (const key in data) {\n if (this.isFunction(key)) {\n data[key] = eval(data[key]);\n }\n }\n\n const beforeShow = data.beforeShow;\n data.beforeShow = function (input, instance) {\n instance.dpDiv.addClass('blockMsg');\n\n if (beforeShow) beforeShow.apply(this, arguments);\n };\n\n dp.datepicker(data);\n }\n\n private isFunction(property) {\n return this.functions[property];\n }\n\n private propertyTranslator(property: string, level: number): string {\n const levelObj = this.properties[level];\n if (levelObj) {\n const result = levelObj[property];\n if (result) return result;\n }\n return property;\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.DatePickerBehaviour = DatePickerBehaviour;","import { BaseControlBehaviour } from './BaseControlBehaviour';\n/**\n * Enter - устанавливает keydown и обрабатывает enter\n * если дополнительно указан bb-enter-btn то считаем что в аттрибуте лежат контролы разделенные | на которые будет повешен keydown, а элемент на котором bb-enter будет кликаться\n * если не указан то считаем что на данный элемент надо повесить keydown а контролы для клика указаны в значении аттрибута bb-enter\n */\nexport class EnterBehaviour extends BaseControlBehaviour {\n constructor() {\n super('enter');\n }\n\n getInstalledTag() {\n return this.tagInstalled;\n }\n\n protected installBehaviour(element: HTMLElement): void {\n const fromBtn = $(element).attr(this.tag + '-btn');\n const idCtrls = this.getBehaviorValue(element).split('|');\n if (fromBtn) {\n for (let i = 0; i < idCtrls.length; i++) {\n this.setKeydown($('#' + idCtrls[i]), element);\n }\n } else {\n for (let i = 0; i < idCtrls.length; i++) {\n this.setKeydown(element, $('#' + idCtrls[i]));\n }\n }\n }\n\n private setKeydown(element: any, clickElement: any) {\n $(element).keydown((e) => {\n if (e.which === 13) {\n e.stopPropagation();\n e.preventDefault();\n\n clickElement.click();\n }\n });\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.EnterBehaviour = EnterBehaviour;","window.FileControlsBehaviour = (function () {\n function parse(element: any) {\n installCustomFileInputs(element);\n }\n\n function unbindWindowWarning() {\n window.onbeforeunload = null;\n }\n function deleteFile(removeButton, parentSelector, fileSelector) {\n const parent = $(removeButton).parent(parentSelector);\n const file = $(fileSelector, parent);\n\n if (file.val() != '') {\n const isConfirmed = confirm(\n Localization.getString(\n 'FileControls.DeleteFile',\n 'Удалить файл?'\n )\n );\n if (isConfirmed) {\n file.val('');\n $(removeButton)\n .siblings('label')\n .children('mark')\n .text(\n Localization.getString(\n 'FileControls.NoFiles',\n 'Файл не выбран'\n )\n );\n $(removeButton).css('display', 'none');\n }\n }\n\n const fileNames = [];\n const totalFiles = $(parentSelector).find('[type=\"file\"]');\n\n $.each(totalFiles, function (i, item) {\n const value = $(totalFiles[i]).val();\n if (value != '') {\n fileNames.push(value);\n }\n });\n\n if (fileNames.length == 0) window.onbeforeunload = null;\n }\n\n function installCustomFileInputs(element) {\n const customFiles = $('[custom-file]', element).not(\n '[custom-file-installed]'\n );\n\n for (let i = 0; i < customFiles.length; i++) {\n const customFileElement = $(customFiles[i]);\n customFileElement.attr('custom-file-installed', 'true');\n customFileElement.change(function () {\n let isError = false;\n let errorMessage = '';\n\n const maxUSerSize = parseInt(\n $(this).attr('custom-file-max-size')\n ); //мегабайты\n const maxSizeBytes: number = maxUSerSize * 1024 * 1024; //байты\n const uploadButton = $('[custom-file-uploadButton]');\n if (this.files.length == 0) {\n RollbackFileControls(this, uploadButton);\n return;\n }\n const fileSize: number = this.files[0].size;\n\n if (fileSize > maxSizeBytes) {\n errorMessage =\n Localization.getString(\n 'FileControls.MaxUserSize1',\n 'Размер файла не должен превышать '\n ) +\n maxUSerSize +\n Localization.getString(\n 'FileControls.MaxUserSize2',\n ' Мб'\n );\n isError = true;\n }\n\n const allowedExtensions = $(this)\n .attr('custom-file-extensions')\n .split(',');\n const fileName: string = $(this).val();\n const extension: string = fileName.replace(/^.*\\./, '');\n\n if ($.inArray(extension, allowedExtensions) == -1) {\n errorMessage =\n Localization.getString(\n 'FileControls.AllowedExtensions1',\n 'Допускаются только '\n ) +\n allowedExtensions.toString() +\n Localization.getString(\n 'FileControls.AllowedExtensions2',\n ' расширения файлов'\n );\n isError = true;\n }\n\n if (isError) {\n alert(errorMessage);\n RollbackFileControls(this, uploadButton);\n } else {\n if (uploadButton.length > 0) {\n uploadButton.removeClass('m-disabled');\n }\n const uploadPathElement = $(\n '[custom-file-uploadPath-element]'\n );\n if (uploadPathElement.length > 0) {\n uploadPathElement.html(\n fileName.split(/(\\\\|\\/)/g).pop()\n );\n }\n\n if (\n $(this).attr('custom-file-warning') == 'true' &&\n this.files[0] != null\n ) {\n window.onbeforeunload = function () {\n return Localization.getString(\n 'FileControls.FilesWillBeDeleted',\n 'При перезагрузке страницы прикрепленные файлы будут удалены'\n );\n };\n }\n }\n });\n }\n }\n\n function RollbackFileControls(inputElement: any, uploadButton: JQuery) {\n const inputWrapper = $(inputElement);\n inputWrapper.val('');\n if (inputElement.files.length > 0) inputElement.files[0] = null;\n if (uploadButton.length > 0) {\n uploadButton.addClass('m-disabled');\n }\n $('[custom-file-uploadPath-element]').text(\n window.Localization.getString(\n 'Scripts_Shared_Infrastructure.CustomFileBehaviour_3',\n 'Загрузить файл'\n )\n );\n }\n\n return {\n parse,\n unbindWindowWarning,\n deleteFile,\n };\n})();\n","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\n/**\n * InputMask - основной аттрибут inputmask, указывает на то, что будет использоваться кастомная реализация маски для элмента\n * inputmaskplaceholder - заменяет placeholder\n * используется маска взятая с options по типу указанному в аттрибует inputmask по регулярке /^type\\:(.*?)$/g\n * если под регулярку не попадаем то используем ту маску что указана в значении аттрибута\n */\nexport class InputMaskBehaviour extends BaseEmptyPrefixControlBehaviour {\n private inputMaskFn: Function = undefined;\n\n constructor() {\n super('inputmask');\n }\n\n protected installCondition(element: any): boolean {\n return !!$(element).inputmask;\n }\n\n protected installBehaviour(element: HTMLElement): void {\n let inputMask: any = Utils.getObjectByAttributes(\n this.tag,\n element,\n null,\n {}\n );\n\n let mask = this.getBehaviorValue(element);\n const placeholder = $(element).attr(this.tag + 'placeholder');\n if (mask) {\n const maskTypeRegex = /^type\\:(.*?)$/g;\n const typeMatch = maskTypeRegex.exec(mask);\n if (typeMatch) {\n const maskType = typeMatch[1];\n inputMask = $.extend(\n true,\n {},\n this.options.types.inputMask[maskType] || {},\n inputMask\n );\n mask = inputMask.mask;\n inputMask.mask = undefined;\n }\n\n if (placeholder !== undefined) {\n inputMask.placeholder = placeholder;\n }\n $(element).inputmask(mask, inputMask);\n } else if (inputMask) {\n $(element).inputmask(inputMask);\n }\n if (inputMask.clearbtn) {\n $(inputMask.clearbtn).click(() => {\n $(element).inputmask('setvalue', '');\n \n });\n }\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.InputMaskBehaviour = InputMaskBehaviour;","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\n/**\n * InputTrim - устанавливает на контрол с аттрибутом trim поведение, удаляющее пробельные символы с начала и конца строки.\n * Пробельными символами в этом контексте считаются все собственно пробельные символы (пробел, табуляция, неразрывный пробел и прочие) и все символы конца строки (LF, CR и прочие).\n * Применяется к элементам с типом input.\n */\nexport class InputTrimBehaviour extends BaseEmptyPrefixControlBehaviour {\n constructor() {\n super('inputtrim');\n }\n\n protected installCondition(element: any): boolean {\n return $(element).is('input');\n }\n\n protected installBehaviour(element: HTMLElement): void {\n $(element).change((e) => this.onInputChanged(e.currentTarget));\n }\n\n private onInputChanged(element: any) {\n const input = $(element);\n const trimmed = input.val().trim();\n input.val(trimmed);\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.InputTrimBehaviour = InputTrimBehaviour;","import { BaseControlBehaviour } from './BaseControlBehaviour';\nexport class NotificationBehaviour extends BaseControlBehaviour {\n constructor() {\n super('notification-toggler');\n }\n\n getInstalledTag() {\n return this.tagInstalled;\n }\n\n private static installTogglers(\n togglers: JQuery,\n blockSelector: HTMLElement\n ): void {\n const pages = $('[data-stage]', blockSelector);\n\n $('.m-page').text('1 / ' + pages.length);\n\n $(togglers).click(function () {\n const currentPage = $(pages).filter('.m-active');\n\n const num: number = $(currentPage).data('stage');\n\n const direction = $(this).data('toggledirection');\n\n let nextNum = 0;\n\n switch (direction) {\n case 'prev': {\n nextNum = num == 0 ? num : num - 1;\n\n $('[data-toggleDirection=\"next\"]', blockSelector).show();\n $('[notification-confirm]', blockSelector).hide();\n\n if (nextNum == 0) {\n $(this).hide();\n }\n break;\n }\n case 'next': {\n nextNum = num === pages.length - 1 ? 0 : num + 1;\n\n $('[data-toggleDirection=\"prev\"]', blockSelector).show();\n\n if (nextNum == pages.length - 1) {\n $('[notification-confirm]', blockSelector).show();\n\n $(this).hide();\n }\n\n break;\n }\n }\n\n const nextPage = $(pages).filter(\n '[data-stage=\"' + nextNum + '\"]'\n )[0];\n\n $('.m-page').text(nextNum + 1 + ' / ' + pages.length);\n\n $(currentPage).hide();\n $(nextPage).show();\n\n $(currentPage).removeClass('m-active');\n $(nextPage).addClass('m-active');\n });\n }\n\n private static installCloseButton(blockSelector: HTMLElement): void {\n $(\n '[notification-close-control], [notification-confirm]',\n blockSelector\n ).click(function () {\n const id = $(this).data('notificationid');\n\n $('.notification-message-container', blockSelector).css(\n 'display',\n 'none'\n );\n\n $('[data-stage]', blockSelector).each(function (i, elem) {\n $(elem).hide();\n $(elem).removeClass('m-active');\n\n if (i == 0) {\n $(elem).show();\n $(elem).addClass('m-active');\n }\n });\n\n $('.m-page').text('');\n\n $('[data-stage = \"0\"]', blockSelector).addClass('m-active');\n\n const noShow = $(\n '.superexpress-checkbox__input',\n blockSelector\n ).prop('checked');\n\n const res = Ajax.postJson('/api/notification/close', {\n data: { notificationId: id, showNoMore: noShow },\n });\n\n res.done(function (data) {\n if (!data.isPersistent) {\n $(blockSelector).remove();\n }\n });\n\n UiBlock.unBlock({ selector: '_window' });\n });\n }\n\n private getNotificationContentNode(\n senderElement: HTMLElement\n ): HTMLElement {\n const key = $(senderElement).attr('notificationkey');\n return $(`[contentNotificationKey = \"${key}\"]`, document)[0];\n }\n\n public static ShowModalWindow(notificationKey: string) {\n const contentNode = $(\n `[contentNotificationKey = \"${notificationKey}\"]`,\n document\n )[0];\n\n if (contentNode) {\n const togglers = $('[notification-page-toggle]', contentNode);\n NotificationBehaviour.installTogglers(togglers, contentNode);\n NotificationBehaviour.installCloseButton(contentNode);\n\n $('.notification-message-container', contentNode).css(\n 'display',\n 'flex'\n );\n Ajax.postJson('/api/notification/setviewed', {\n data: { notificationKey: notificationKey },\n });\n\n UiBlock.block({\n message: contentNode,\n selector: '_window',\n });\n }\n }\n\n public ShowModalWindow(\n senderElement: HTMLElement,\n internalHandler: Function\n ) {\n const contentNode = this.getNotificationContentNode(senderElement);\n\n if (contentNode) {\n const togglers = $('[notification-page-toggle]', contentNode);\n\n NotificationBehaviour.installTogglers(togglers, contentNode);\n NotificationBehaviour.installCloseButton(contentNode);\n\n $('.notification-message-container', contentNode).css(\n 'display',\n 'flex'\n );\n\n const key = $(senderElement).attr('notificationkey');\n\n Ajax.postJson('/api/notification/setviewed', {\n data: { notificationKey: key },\n });\n\n UiBlock.block({\n message: contentNode,\n selector: '_window',\n });\n\n if ($(senderElement).attr('isTriggeredOnce') == 'true')\n $('[isTriggeredOnce]', document).each((i, element) =>\n $(element).removeAttr('notificationkey')\n );\n }\n\n if (internalHandler) internalHandler();\n }\n\n private showNotification(content: HTMLElement): void {\n $('.notification-message-container', content).css('display', 'flex');\n\n UiBlock.block({\n message: content,\n selector: '_window',\n });\n }\n\n protected installBehaviour(element: HTMLElement): void {\n const contentNode = this.getNotificationContentNode(element);\n\n if (contentNode) {\n const togglers = $('[notification-page-toggle]', contentNode);\n\n NotificationBehaviour.installTogglers(togglers, contentNode);\n NotificationBehaviour.installCloseButton(contentNode);\n\n const isAutoShow = $(element).data('autoshow') == true;\n\n if (isAutoShow) {\n const key = $(element).attr('notificationkey');\n\n Ajax.postJson('/api/notification/setviewed', {\n data: { notificationKey: key },\n });\n\n this.showNotification(contentNode);\n } else {\n $(element).on('click', function () {\n const key = $(element).attr('notificationkey');\n\n Ajax.postJson('/api/notification/setviewed', {\n data: { notificationKey: key },\n });\n\n this.showNotification(contentNode);\n\n if ($(element).attr('isTriggeredOnce') == 'true')\n $(element).removeAttr('notificationkey');\n });\n }\n }\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.NotificationBehaviour = NotificationBehaviour;","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\nclass PagerUtils {\n static GetFilterData(): any {\n const dataProviders = $('[pager-trigger]');\n const dataArray = {};\n\n for (let i = 0; i <= dataProviders.length; i++) {\n const propName = $(dataProviders[i]).data('propertyname');\n const nodeName = $(dataProviders[i]).prop('nodeName');\n\n let propValue = '';\n const className = 'selected_value_' + propName;\n\n if (\n nodeName != 'SELECT' &&\n $(dataProviders[i]).hasClass(className)\n ) {\n propValue = $(dataProviders[i]).data('propertyvalue');\n } else {\n propValue = $(dataProviders[i]).val();\n }\n\n if (propName && propValue) {\n const data = {};\n data[propName] = propValue;\n $.extend(dataArray, data);\n }\n }\n\n return dataArray;\n }\n\n static GetCurrentPage(element: any): number {\n const maxPage = $(element).data('maxpage');\n const minPage = $(element).data('minpage');\n let requestedPage = $(element).val() - 1;\n\n if (requestedPage > maxPage) requestedPage = maxPage;\n if (requestedPage < minPage) requestedPage = minPage;\n return requestedPage;\n }\n}\n/**\n * PagerTrigger - устанавливает на элемент разметки с аттрибутом pager-trigger смену фильтров через Ajax.postJson\n * Если элемент с тэгом А то по клику, если элемент Select то по изменению\n * Предназначен для определения дополнительных фильтров\n * pager-trigger-after выполняется после фильтрации\n * pager-trigger-before выполняется до фильтрации\n * pager-trigger-minlength задает минимальную длинну запроса для отправки на сервер\n * для input используется keyup и таймер\n */\nexport class PagerTriggerBehaviour extends BaseEmptyPrefixControlBehaviour {\n constructor() {\n super('pager-trigger');\n }\n\n protected installBehaviour(element: HTMLElement): void {\n const nodeName = $(element).prop('nodeName');\n if (nodeName == 'INPUT') {\n let searchSendTimeoutHandler;\n let lastQuery = $(element).val();\n const minLength =\n parseInt($(element).attr(this.tag + '-minlength')) || 1;\n $(element).on('keyup', () => {\n const query = $(element).val();\n\n if (query === lastQuery && query.length > 0) return false;\n\n if (query.length < minLength && query.length > 0) return false;\n lastQuery = query.trim();\n clearTimeout(searchSendTimeoutHandler);\n searchSendTimeoutHandler = setTimeout(() => {\n this.handleFilterChange(element);\n }, 500);\n });\n } else {\n let eventName = '';\n switch (nodeName) {\n case 'A':\n case 'DIV': {\n eventName = 'click';\n break;\n }\n case 'SELECT': {\n eventName = 'change';\n break;\n }\n }\n $(element).on(eventName, () => {\n this.handleFilterChange(element);\n });\n }\n }\n\n private handleFilterChange(element: any) {\n this.before(element);\n\n if ($(element).prop('nodeName') == 'A') {\n const propName = $(element).data('propertyname');\n const className = 'selected_value_' + propName;\n const current = $('.' + className);\n current.each((index, value) => {\n $(value).removeClass(className);\n });\n $(element).addClass(className);\n }\n\n let data = PagerUtils.GetFilterData();\n data = Utils.getObjectByAttributes('data', element, null, data);\n data.page = $.extend({}, { number: 0 }, data.page);\n const url = $(element).attr('filterUrl');\n\n const uiBlock = UiBlock.getUiBlockDescriptor(\n element,\n UiBlock.getDefaultSpinnerBlock(element)\n );\n Ajax.postJson(url, {\n data: data,\n success: () => {\n this.after(element);\n },\n uiBlock: uiBlock,\n });\n }\n\n private before(element: any) {\n const before = $(element).attr(this.tag + '-before');\n this.call(before, element);\n }\n\n private after(element: any) {\n const after = $(element).attr(this.tag + '-after');\n this.call(after, element);\n }\n\n private call(func: string, element: any): void {\n if (func != null) {\n if (func.lastIndexOf(';') !== func.length - 1) {\n Utils.runFunctionByName(func, null, element);\n } else {\n Function(func).apply(element);\n }\n }\n }\n}\n\n/**\n * Pager - устанавливает на элемент разметки с аттрибутом pager отправку Ajax.postJson по клику на элементе,\n * если он не имеет класса disabled\n */\nexport class PagerBehaviour extends BaseEmptyPrefixControlBehaviour {\n constructor() {\n super('pager');\n }\n\n protected installBehaviour(element: any): void {\n const pager = $(element);\n if (!pager.hasClass('disabled')) {\n const pagerData: any = Utils.getObjectByAttributes(\n 'page',\n element,\n null,\n { hasPager: true }\n );\n if (pagerData.hasPager) {\n if (pager.is('input')) {\n //\n pager.on('change', () => {\n pagerData.number = PagerUtils.GetCurrentPage(element);\n\n this.sendPageRequest(element, pagerData);\n });\n } else {\n pager.on('click', () => {\n this.sendPageRequest(element, pagerData);\n });\n }\n }\n }\n }\n\n private sendPageRequest(element: any, pagerData: any) {\n let data = pagerData.data;\n if (data) {\n data = JSON.parse(data);\n }\n data = data || {};\n const additionalData = PagerUtils.GetFilterData();\n if (additionalData) {\n data = $.extend(data, additionalData);\n }\n data = Utils.getObjectByAttributes('data', element, null, data);\n data.page = {\n number: pagerData.number,\n size: pagerData.size,\n };\n const uiBlock = UiBlock.getUiBlockDescriptor(\n element,\n UiBlock.getDefaultSpinnerBlock(element)\n );\n Ajax.postJson(pagerData.url, { data: data, uiBlock: uiBlock });\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.PagerBehaviour = PagerBehaviour;\nwindow.Behaviours.PagerTriggerBehaviour = PagerTriggerBehaviour;","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\n/**\n * PasswordPreview - устанавливает на контрол с аттрибутом passwordpreview контрол показывающий пароль\n * применяется к элменттом с типом input[type=\"password\"]\n */\nexport class PasswordPreviewBehaviour extends BaseEmptyPrefixControlBehaviour {\n constructor() {\n super('passwordpreview');\n }\n\n protected installBehaviour(element: HTMLElement): void {\n const previewPasswordConfig: any = Utils.getObjectByAttributes(\n this.tag,\n element,\n null,\n {}\n );\n\n const id = 'id' + Math.random();\n $(element).attr(this.tagInstalled, id);\n let previewA =\n '';\n if (previewPasswordConfig.content) {\n previewA += $(previewPasswordConfig.content).html();\n }\n previewA += '';\n\n $(element).after(previewA);\n\n $(element).change((e) =>\n this.handlePasswordInputChanged(e.currentTarget)\n );\n $(element).keyup((e) =>\n this.handlePasswordInputChanged(e.currentTarget)\n );\n\n const previewButton = $('a[id=\"' + id + '\"]')[0];\n if (previewPasswordConfig.previewbuttonclass) {\n $(previewButton).addClass(previewPasswordConfig.previewbuttonclass);\n }\n\n $(previewButton).mousedown(this, this.handlePreviewButtonMouseDown);\n $(previewButton).mouseup(this, this.handlePreviewButtonMouseUp);\n $(previewButton).mouseout(this, this.handlePreviewButtonMouseUp);\n\n $(previewButton).on('touchstart', this, this.handlePasswordTouchStart);\n $(previewButton).on('touchend', this, this.handlePasswordTouchEnd);\n $(previewButton).on(\n 'touchcancel',\n this,\n this.handlePasswordTouchCancel\n );\n\n this.renderPasswordPreview(previewButton);\n }\n\n private handlePasswordTouchStart(evt: JQueryEventObject) {\n evt.preventDefault();\n evt.data.showPasswordPreview(evt.currentTarget);\n }\n\n private handlePasswordTouchEnd(evt: JQueryEventObject) {\n evt.preventDefault();\n evt.data.hidePasswordPreview(evt.currentTarget);\n }\n\n private handlePasswordTouchCancel(evt: JQueryEventObject) {\n evt.preventDefault();\n evt.data.hidePasswordPreview(evt.currentTarget);\n }\n\n private showPasswordPreview(element: any) {\n const previewButton = $(element);\n const id = previewButton.attr('id');\n const input = $('input[' + this.tagInstalled + '=\"' + id + '\"]');\n input.attr('type', 'text');\n\n this.renderPasswordPreview(previewButton);\n }\n\n private hidePasswordPreview(element: any) {\n const previewButton = $(element);\n const id = previewButton.attr('id');\n const input = $('input[' + this.tagInstalled + '=\"' + id + '\"]');\n input.attr('type', 'password');\n\n this.renderPasswordPreview(previewButton);\n }\n\n private handlePasswordInputChanged(element: any) {\n const input = $(element);\n const id = input.attr(this.tagInstalled);\n const previewButton = $('a[id=\"' + id + '\"]')[0];\n\n this.renderPasswordPreview(previewButton);\n }\n\n private handlePreviewButtonMouseDown(evt: JQueryMouseEventObject) {\n evt.preventDefault();\n evt.data.showPasswordPreview(evt.currentTarget);\n }\n\n private handlePreviewButtonMouseUp(evt: JQueryMouseEventObject) {\n evt.preventDefault();\n evt.data.hidePasswordPreview(evt.currentTarget);\n }\n\n private renderPasswordPreview(previewButton) {\n previewButton = $(previewButton);\n const id = previewButton.attr('id');\n const input = $('input[' + this.tagInstalled + '=\"' + id + '\"]');\n const text = input.val();\n if (text && text != '') {\n previewButton.show();\n } else {\n previewButton.hide();\n }\n\n const inputType = input.attr('type');\n if (inputType == 'password') {\n input.addClass('password-hidden');\n previewButton.addClass('password-hidden');\n\n input.removeClass('password-visible');\n previewButton.removeClass('password-visible');\n } else {\n input.addClass('password-visible');\n previewButton.addClass('password-visible');\n\n input.removeClass('password-hidden');\n previewButton.removeClass('password-hidden');\n }\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.PasswordPreviewBehaviour = PasswordPreviewBehaviour;","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\nexport class PaymentChannelAmountBehaviour extends BaseEmptyPrefixControlBehaviour {\n constructor() {\n super('data-bb-payment-subchannels');\n }\n\n protected installBehaviour(element: HTMLElement): void {\n $(element).on('change', '[name = \"SelectedSubChannel\"]', function () {\n const selectedSCh = $('[name = \"SelectedSubChannel\"]:checked');\n\n const amount = $('[name=Amount]', element).first();\n amount.form().removeData('validator');\n\n $('.js-min', element).text(\n selectedSCh.attr('data-bb-subchannels-min-amount')\n );\n $('.js-max', element).text(\n selectedSCh.attr('data-bb-subchannels-max-amount')\n );\n\n amount.attr(\n 'data-val-minvalue-min',\n selectedSCh.attr('data-bb-subchannels-min')\n );\n amount.attr(\n 'data-val-maxvalue-max',\n selectedSCh.attr('data-bb-subchannels-max')\n );\n amount.attr(\n 'data-val-minvalue',\n selectedSCh.attr('data-bb-subchannels-min-amount-text')\n );\n amount.attr(\n 'data-val-maxvalue',\n selectedSCh.attr('data-bb-subchannels-max-amount-text')\n );\n\n Validators.parse(amount.form());\n });\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.PaymentChannelAmountBehaviour = PaymentChannelAmountBehaviour;","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\n/**\n * Recaptcha - рендерит recaptcha от гугла на элемент с аттрибутом recaptcha\n * настройки рекапчи беруться из свойств данного элемента\n */\nexport class RecaptchaBehaviour extends BaseEmptyPrefixControlBehaviour {\n constructor() {\n super('recaptcha');\n }\n\n protected installBehaviour(element: HTMLElement): void {\n const recaptcha: any = Utils.getObjectByAttributes(\n this.tag,\n element,\n null,\n {}\n );\n grecaptcha.render(recaptcha.selector, {\n sitekey: recaptcha.publickey,\n callback: (code) => {\n this.setRecaptchaValueAndRevalidate(\n recaptcha.resultselector,\n code\n );\n if (recaptcha.callback) {\n Utils.runFunctionByName(recaptcha.callback, null, null);\n }\n },\n 'expired-callback': () => {\n this.setRecaptchaValueAndRevalidate(\n recaptcha.resultselector,\n null\n );\n },\n });\n }\n\n private setRecaptchaValueAndRevalidate(selector, code) {\n const input: any = $(selector)[0];\n $(input).val(code);\n\n const form = input.form;\n const validator = ($(form)).validate();\n validator.element(input);\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.RecaptchaBehaviour = RecaptchaBehaviour;","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\n/**\n * ReplaceTag - заменяет у элемента таг на таг указанный в аттрибуте replacetag в качестве значения\n */\nexport class ReplaceTagBehaviour extends BaseEmptyPrefixControlBehaviour {\n constructor() {\n super('replacetag');\n }\n\n protected installBehaviour(element: HTMLElement): void {\n const tag = this.getBehaviorValue(element);\n const newTag = $('<' + tag + '>')[0];\n $.each(element.attributes, (i, value) => {\n newTag.setAttribute(element.attributes[i].name, value);\n });\n $(element).children().clone(true, true).appendTo(newTag);\n $(element).replaceWith(newTag);\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.ReplaceTagBehaviour = ReplaceTagBehaviour;","/* eslint-disable @typescript-eslint/no-namespace */\nimport { BaseControlBehaviour } from '../BaseControlBehaviour';\n/**\n * UseBettingCartBehaviour - добавляет функционал добавление коэфа в корзину\n */\nexport class UseBettingCartBehaviour extends BaseControlBehaviour {\n constructor() {\n super('use-betting-cart');\n }\n\n protected installBehaviour(element: HTMLElement): void {\n const jel: JQuery = $(element);\n const coefProp: string = this.getBehaviorValue(element);\n const coefTitle: string = jel.attr(this.tag + '-title');\n const event: any = jel.data('event');\n\n const data: BettingCartItem = {\n oId: event[coefProp].OriginalId,\n aId:\n event[coefProp].ActualId == 0 ||\n event[coefProp].ActualId == null\n ? event[coefProp].OriginalId\n : event[coefProp].ActualId,\n eId: event.EventId,\n eTitle: event.EventName,\n rTitle: coefTitle,\n val: event[coefProp].Value,\n isLive: event.IsLive,\n };\n\n const isClientCartEnabled =\n window?.globalAppSettings?.isClientCartEnabled;\n\n function removeFromCart(oId) {\n if (isClientCartEnabled) {\n window.ClientCart.removeOutcome(Number(oId));\n } else {\n BettingCart.removeItem(oId);\n }\n }\n\n function addToCart(sData) {\n if (isClientCartEnabled) {\n window.ClientCart.addOutcome({\n oId: Number(sData.oId),\n eId: Number(sData.eId),\n });\n return true;\n } else {\n return BettingCart.addItem(sData);\n }\n }\n\n function isInCart(oId) {\n if (isClientCartEnabled) {\n return window.ClientCart.hasOutcome(Number(oId));\n }\n return BettingCart.hasItem(Number(oId));\n }\n\n jel.click((el) => {\n if (isInCart(data.oId)) {\n removeFromCart(data.oId);\n jel.removeClass('active');\n } else {\n Metrics.sendMetrics('reviewWidgetAdding', data);\n if (addToCart(data)) {\n jel.addClass('active');\n BettingCart.Highlighting.activate.table();\n }\n }\n });\n\n if (isInCart(data.oId)) jel.addClass('active');\n\n $(document).on('deactivateCoefHightlight', (e, oid) => {\n if (data.oId == oid) jel.removeClass('active');\n });\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.UseBettingCartBehaviour = UseBettingCartBehaviour;","import { BaseControlBehaviour } from './BaseControlBehaviour';\n\ndeclare class AwesomeScrollbar {\n constructor(containerSelector: any, addClass: string);\n}\n\n/**\n * Scrollbar - устанавливает Scrollbar\n */\nexport class ScrollbarBehaviour extends BaseControlBehaviour {\n constructor() {\n super('scrollbar');\n }\n\n protected installBehaviour(element: any): void {\n if ((window).globalAppSettings.isMobileDevice) {\n return;\n }\n\n new AwesomeScrollbar($(element), this.getBehaviorValue(element));\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.ScrollbarBehaviour = ScrollbarBehaviour;","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\n/**\n * Sortable - использует $.ui.sortable\n * основной аттрибут - sortable\n * используется опция revert - плавный анимированный возврат на свою позицию\n */\nexport class SortableBehaviour extends BaseEmptyPrefixControlBehaviour {\n constructor() {\n super('sortable');\n }\n\n protected installBehaviour(element: HTMLElement): void {\n $(element).sortable({\n revert: true,\n });\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.SortableBehaviour = SortableBehaviour;\n","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\n/**\n * Tabs - используется для обработки переключений табов\n * основной аттрибут tab-id:\n * используется клик на тэге A, при отсутствуии href вызывается как Ajax.redirect, в противном случае меняет активность табса(m-active, selectedTabContent)\n * дополнительный аттрибут tab-view-settings:\n * используется на input[shouldrefreshtabs=true] по изменению элемента сериализует данные элемента и отправляет через Ajax.postJson\n */\nexport class TabsBehaviour extends BaseEmptyPrefixControlBehaviour {\n private tagViewSettings = 'tab-view-settings';\n\n constructor() {\n super('tabs');\n }\n\n protected getTabSwitches(element: any): JQuery {\n return $('a[tab-id]', element);\n }\n\n protected installBehaviour(element: HTMLElement): void {\n const tabs = this.getTabSwitches(element);\n tabs.unbind('click');\n tabs.on('click', (e) => this.handleTabClick(e));\n\n const refreshers = $(\n '.' + this.tagViewSettings + ' input[shouldrefreshtabs=true]',\n element\n );\n refreshers.change((e) => this.handleRefresherChange(e));\n }\n\n private handleTabClick(evt: JQueryEventObject) {\n evt.preventDefault();\n const tab = $(evt.currentTarget);\n\n const tabHref = tab.attr('href');\n if (tabHref == undefined || tabHref == '#') {\n const tabControl = tab.parents('[tabs]')[0];\n\n const tabHeaders = $('[tab-id]', tabControl).filter(\n (idx, el) => $(el).parents('[tabs]')[0] === tabControl\n );\n const tabSettingsContainer =\n '.' +\n this.tagViewSettings +\n '.tabs-' +\n $(tabControl).attr('id');\n\n $(tabSettingsContainer + ' input[name=m-active]').val(\n tab.attr(this.tag)\n );\n tabHeaders.removeClass('m-active');\n tab.addClass('m-active');\n\n const tabs = $('[tab-panelid]', tabControl).filter(\n (idx, el) => $(el).parents('[tabs]')[0] === tabControl\n );\n const tabContentShow = tabs.filter(\n '[tab-panelid=' + tab.attr('tab-id') + ']'\n );\n tabs.hide();\n tabs.removeClass('selectedTabContent');\n\n tabContentShow.show();\n tabContentShow.addClass('selectedTabContent');\n } else {\n Ajax.redirect(tabHref);\n }\n }\n\n private handleRefresherChange(evt: JQueryEventObject) {\n const settingsDiv = $(evt.target).parent(\n '.' + this.tagViewSettings + ''\n )[0];\n const settings = $('input', settingsDiv).serializeArray();\n const settingsObject: any = {};\n for (let i = 0; i < settings.length; i++) {\n const s = settings[i];\n settingsObject[s.name] = s.value;\n }\n\n if (\n settingsObject.tabsRefreshAjaxUrl &&\n settingsObject.tabsRefreshAjaxUrl !== ''\n ) {\n Ajax.postJson(settingsObject.tabsRefreshAjaxUrl, {\n data: settingsObject,\n });\n }\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.TabsBehaviour = TabsBehaviour;","import { BaseControlBehaviour } from './BaseControlBehaviour';\n/**\n */\nexport class ToggleBehaviour extends BaseControlBehaviour {\n constructor() {\n super('toggle');\n }\n\n protected installBehaviour(element: any): void {\n const selector = this.getBehaviorValue(element);\n\n $(element).on('change', () => {\n $(selector).toggle();\n });\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.ToggleBehaviour = ToggleBehaviour;","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\n/**\n * Tooltip - использует $.powertip\n * основной аттрибут - tooltip\n * дополнительные свойства беруться из атррибутов:\n * placement\n * smartPlacement\n * popupClass\n * manual\n * mouseOnToPopup\n * openEvents\n * closeEvents\n * title\n * одноименные свойства powerTip\n */\nexport class TooltipsBehaviour extends BaseEmptyPrefixControlBehaviour {\n private properties: any = {\n 0: {\n placement: 'placement',\n smartplacement: 'smartPlacement',\n popupclass: 'popupClass',\n manual: 'manual',\n mouseontopopup: 'mouseOnToPopup',\n openevents: 'openEvents',\n closeevents: 'closeEvents',\n },\n };\n\n constructor() {\n super('tooltip');\n }\n\n getTagName(): string {\n return this.tag;\n }\n\n protected installCondition(element: any): boolean {\n const jq: any = $;\n\n return !!jq.powerTip;\n }\n\n protected installBehaviour(element: HTMLElement): void {\n let tooltip: any = Utils.getObjectByAttributes(\n this.tag,\n element,\n (p, l) => this.propertyTranslator(p, l),\n {}\n );\n if (tooltip.type) {\n tooltip = $.extend(\n true,\n {},\n this.options.types.tooltip[tooltip.type] || {},\n tooltip\n );\n tooltip.type = undefined;\n }\n\n if (tooltip.title) {\n $(element).attr('title', tooltip.title);\n }\n $(element).powerTip(tooltip);\n }\n\n private propertyTranslator(property: string, level: number): string {\n const levelObj = this.properties[level];\n if (levelObj) {\n const result = levelObj[property];\n if (result) return result;\n }\n return property;\n }\n}\n\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.TooltipsBehaviour = TooltipsBehaviour;","import { BaseEmptyPrefixControlBehaviour } from './BaseControlBehaviour';\ndeclare let voxAPI: any;\ndeclare let VoxImplant: any;\ndeclare let currentCall: any;\nexport class VoximplantCallBehaviour extends BaseEmptyPrefixControlBehaviour {\n constructor() {\n super('voximplant-call');\n }\n\n private static OnConnected(): void {\n $.ajax('/SimpleIdentification/GetVoximplantCredentials', {\n success: function (data) {\n {\n voxAPI.login(data.login, data.password);\n }\n },\n });\n }\n\n public static initApi() {\n voxAPI = VoxImplant.getInstance();\n\n voxAPI.on(\n VoxImplant.Events.SDKReady,\n VoximplantCallBehaviour.OnSdkReady\n );\n voxAPI.on(\n VoxImplant.Events.ConnectionEstablished,\n VoximplantCallBehaviour.OnConnected\n );\n voxAPI.on(VoxImplant.Events.AuthResult, VoximplantCallBehaviour.OnAuth);\n\n if (!voxAPI.alreadyInitialized) {\n $.ajax('/SimpleIdentification/GetVoximplantSettings', {\n success: function (data) {\n {\n voxAPI.init({\n localVideoContainerId: 'voximplant_container',\n showDebugInfo: data.showDebugInfo,\n });\n }\n },\n });\n } else VoximplantCallBehaviour.OnSdkReady();\n }\n\n private static UpdateFPS() {\n $.ajax('/SimpleIdentification/GetVoximplantSettings', {\n success: function (data) {\n const sender =\n currentCall.peerConnection.impl.getTransceivers()[1].sender;\n\n const parameters = sender.getParameters();\n\n delete parameters.encodings[0].maxBitrate;\n\n parameters.encodings[0].maxFramerate = data.callFps;\n\n sender.setParameters(parameters);\n },\n });\n }\n\n private static Call(): void {\n $('#voximplantDataForm').validate();\n\n if ($('#voximplantDataForm').valid()) {\n $.ajax('/SimpleIdentification/GetAccountCustomCallData', {\n success: function (receivedData) {\n const formData = Ajax.serializeObject(\n $('#voximplantDataForm')\n );\n\n $.ajax('/account/profile/edit/voximplantcallback', {\n data: formData,\n method: 'post',\n success: function (result) {\n $.extend(formData, receivedData);\n\n const callSettings = {\n num: receivedData.callCenterNumber,\n useVideo: {\n sendVideo: true,\n },\n customData: formData,\n };\n\n currentCall = voxAPI.call(\n receivedData.callCenterNumber,\n {\n sendVideo: true,\n receiveVideo: true,\n },\n formData,\n {}\n );\n\n currentCall.addEventListener(\n VoxImplant.CallEvents.Connected,\n VoximplantCallBehaviour.OnCallConnected\n );\n currentCall.addEventListener(\n VoxImplant.CallEvents.Disconnected,\n VoximplantCallBehaviour.OnCallDiconnected\n );\n currentCall.addEventListener(\n VoxImplant.CallEvents.Failed,\n VoximplantCallBehaviour.OnCallFailed\n );\n\n $('#callButton').hide();\n $('#endCallButton').show();\n $('#voximplantDataForm').hide();\n },\n });\n },\n });\n }\n }\n\n private static OnCallFailed() {\n $.ajax('/account/profile/edit/voximplantfailcallback', {\n success: function () {\n VoxImplant.Hardware.StreamManager.get().hideLocalVideo();\n $('.btn-group').hide();\n $('#voximplantDataForm').hide();\n $('.voximplant_container_common').html(\n '

' +\n window.Localization.getString(\n 'Scripts_Shared_Infrastructure.VoximplantCallBehaviour_4',\n 'Ошибка при звонке'\n ) +\n '

' +\n window.Localization.getString(\n 'Scripts_Shared_Infrastructure.VoximplantCallBehaviour_5',\n 'Попробуйте еще раз или выберите другой способ идентификации'\n ) +\n '

'\n );\n },\n });\n }\n\n private static OnCallConnected() {\n VoximplantCallBehaviour.UpdateFPS();\n VoximplantCallBehaviour.sendVideo(true);\n VoximplantCallBehaviour.showRemoteVideo(true);\n }\n\n private static OnCallDiconnected(call, headers) {\n $('.btn-group').hide();\n $('#voximplantDataForm').hide();\n VoxImplant.Hardware.StreamManager.get().hideLocalVideo();\n $('.voximplant_container_common').html(\n '

' +\n window.Localization.getString(\n 'Scripts_Shared_Infrastructure.VoximplantCallBehaviour_7',\n 'Проводится идентификация!'\n ) +\n '

' +\n window.Localization.getString(\n 'Scripts_Shared_Infrastructure.VoximplantCallBehaviour_8',\n 'Это может занять определенное время'\n ) +\n '

'\n );\n voxAPI.disconnect();\n }\n\n private static OnSdkReady(): void {\n voxAPI.connect();\n }\n\n private static OnAuth(e): void {\n $('.btn-group').show();\n $('#voximplantDataForm').show();\n $('#voximplantSpinner').hide();\n\n VoxImplant.Hardware.CameraManager.get()\n .getInputDevices()\n .then(function (result) {\n const select = document.getElementById('camerasUser');\n\n for (let i = 0; i < result.length; i++) {\n const opt = document.createElement('option');\n\n opt.value = result[i].id;\n opt.innerHTML = result[i].name;\n\n select.appendChild(opt);\n }\n }, null);\n\n VoxImplant.Hardware.StreamManager.get().showLocalVideo(true);\n\n $.ajax('/SimpleIdentification/GetVoximplantVideoResolution', {\n success: function (result) {\n VoxImplant.Hardware.CameraManager.get().setDefaultVideoSettings(\n {\n frameHeight: result.frameHeight,\n frameWidth: result.frameWidth,\n }\n );\n },\n });\n }\n\n private static showRemoteVideo(flag) {\n currentCall.showRemoteVideo(flag);\n }\n\n private static sendVideo(flag) {\n currentCall.sendVideo(flag);\n }\n\n public static EndWork() {\n window.location.reload();\n }\n\n public static HangupCall() {\n if (typeof currentCall !== 'undefined') currentCall.hangup();\n\n $('#endCallButton').hide();\n }\n\n protected installBehaviour(element: HTMLElement): void {\n $(element).click(function () {\n VoximplantCallBehaviour.Call();\n });\n\n $('#endCallButton').click(function () {\n VoximplantCallBehaviour.HangupCall();\n });\n\n $('#camerasUser').change(function () {\n $.ajax('/SimpleIdentification/GetVoximplantVideoResolution', {\n success: function (result) {\n const selectedCam = $('#camerasUser').val();\n\n VoxImplant.Hardware.StreamManager.get().hideLocalVideo();\n\n VoxImplant.Hardware.CameraManager.get().setDefaultVideoSettings(\n {\n frameHeight: result.frameHeight,\n frameWidth: result.frameWidth,\n cameraId: selectedCam,\n }\n );\n\n if (typeof currentCall !== 'undefined') {\n VoxImplant.Hardware.CameraManager.get().setCallVideoSettings(\n currentCall,\n {\n frameHeight: result.frameHeight,\n frameWidth: result.frameWidth,\n cameraId: selectedCam,\n }\n );\n\n VoximplantCallBehaviour.UpdateFPS();\n }\n\n VoxImplant.Hardware.StreamManager.get().showLocalVideo(\n true\n );\n },\n });\n });\n }\n}\n\nif(!window.Behaviours) window.Behaviours = {};\nwindow.Behaviours.VoximplantCallBehaviour = VoximplantCallBehaviour;","import { BaseControlBehaviour } from './Behaviours/BaseControlBehaviour';\n\ndeclare var Inputmask: Function;\n\nwindow.ControlshandleGrecaptchaLoaded = function() {\n Controls.continueConfiguring();\n}\n\ninterface IControlTypeDefinitions {\n inputMask?: any;\n tooltip?: any;\n\n}\ninterface IControlsOptions {\n useRecaptcha?: boolean;\n types?: IControlTypeDefinitions;\n requiredBehaviors?: string[];\n}\n\nvar Controls = window.Controls = (function () {\n var options: IControlsOptions;\n let behaviours: BaseControlBehaviour[] = [];\n var requiredBehaviors: {};\n\n function configure(opts?: IControlsOptions) {\n if (typeof Behaviours.ReplaceTagBehaviour === 'function') behaviours.push(new Behaviours.ReplaceTagBehaviour());\n if (typeof Behaviours.InputMaskBehaviour === 'function') behaviours.push(new Behaviours.InputMaskBehaviour());\n if (typeof Behaviours.InputTrimBehaviour === 'function') behaviours.push(new Behaviours.InputTrimBehaviour());\n if (typeof Behaviours.DatePickerBehaviour === 'function') behaviours.push(new Behaviours.DatePickerBehaviour());\n if (typeof Behaviours.PagerBehaviour === 'function') behaviours.push(new Behaviours.PagerBehaviour());\n if (typeof Behaviours.PagerTriggerBehaviour === 'function') behaviours.push(new Behaviours.PagerTriggerBehaviour());\n if (typeof Behaviours.TabsBehaviour === 'function') behaviours.push(new Behaviours.TabsBehaviour());\n if (typeof Behaviours.TooltipsBehaviour === 'function') behaviours.push(new Behaviours.TooltipsBehaviour());\n if (typeof Behaviours.RecaptchaBehaviour === 'function') behaviours.push(new Behaviours.RecaptchaBehaviour());\n if (typeof Behaviours.PasswordPreviewBehaviour === 'function') behaviours.push(new Behaviours.PasswordPreviewBehaviour());\n if (typeof Behaviours.SortableBehaviour === 'function') behaviours.push(new Behaviours.SortableBehaviour());\n if (typeof Behaviours.ChangablesBehaviour === 'function') behaviours.push(new Behaviours.ChangablesBehaviour());\n if (typeof Behaviours.CustomSelectsBehaviour === 'function') behaviours.push(new Behaviours.CustomSelectsBehaviour());\n if (typeof Behaviours.AutoFocusBehaviour === 'function') behaviours.push(new Behaviours.AutoFocusBehaviour());\n if (typeof Behaviours.EnterBehaviour === 'function') behaviours.push(new Behaviours.EnterBehaviour());\n if (typeof Behaviours.AjaxActionBehavior === 'function') behaviours.push(new Behaviours.AjaxActionBehavior());\n if (typeof Behaviours.ToggleBehaviour === 'function') behaviours.push(new Behaviours.ToggleBehaviour());\n if (typeof Behaviours.ComponentBehavior === 'function') behaviours.push(new Behaviours.ComponentBehavior());\n if (typeof Behaviours.NotificationBehaviour === 'function') behaviours.push(new Behaviours.NotificationBehaviour());\n if (typeof Behaviours.WidgetBehavior === 'function') behaviours.push(new Behaviours.WidgetBehavior());\n if (typeof Behaviours.ScrollbarBehaviour === 'function') behaviours.push(new Behaviours.ScrollbarBehaviour());\n if (typeof Behaviours.UseBettingCartBehaviour === 'function') behaviours.push(new Behaviours.UseBettingCartBehaviour());\n if (typeof Behaviours.AddressesTableBehaviour === 'function') behaviours.push(new Behaviours.AddressesTableBehaviour());\n if (typeof Behaviours.PaymentChannelAmountBehaviour === 'function') behaviours.push(new Behaviours.PaymentChannelAmountBehaviour());\n if (typeof Behaviours.VoximplantCallBehaviour === 'function') behaviours.push(new Behaviours.VoximplantCallBehaviour());\n if (typeof Behaviours.CustomFileBehaviour === 'function') behaviours.push(new Behaviours.CustomFileBehaviour());\n options = opts || {};\n\n var behaviorsToInstall;\n if (!!options.requiredBehaviors) {\n behaviorsToInstall = options.requiredBehaviors;\n }\n else {\n behaviorsToInstall = ['*'];\n\n }\n\n setRequiredBehaviors.apply(behaviorsToInstall, behaviorsToInstall);\n\n configureDefaultOptions();\n\n if (options.useRecaptcha) {\n var s = document.createElement(\"script\");\n s.type = \"text/javascript\";\n s.src = \"https://www.google.com/recaptcha/api.js?render=explicit&onload=ControlshandleGrecaptchaLoaded&hl=ru\";\n s.async = true;\n s.defer = true;\n\n $(\"body\").append(s);\n }\n else {\n continueConfiguring();\n }\n }\n\n function setRequiredBehaviors() {\n requiredBehaviors = {};\n for (var i = 0; i < arguments.length; i++) {\n var b = arguments[i];\n if (b == '*') {\n requiredBehaviors = {};\n for (var j = 0; j < behaviours.length; j++) {\n requiredBehaviors[behaviours[j].getBehaviorName()] = true;\n }\n\n return;\n }\n else {\n requiredBehaviors[b] = true;\n }\n }\n }\n\n function configureDefaultOptions() {\n options.types = $.extend(true, {}, options.types || {});\n options.types.inputMask = $.extend(true, {}, options.types.inputMask || {});\n options.types.tooltip = $.extend(true, {}, options.types.tooltip || {});\n }\n\n function detectSelector(element: any) {\n if (!element) return null;\n if (typeof (element) == 'string') return { selector: element, type: 'css' }; //css Selector\n\n if (typeof (element) == 'object') {\n if (element.Selector && element.Html) return { selector: element.Selector, type: 'ajax', view: element }; // IAjaxView\n\n return { selector: element, type: 'html' };//вероятно HTML Element\n }\n\n return null;\n }\n\n function parse(element: any) {\n var selector = detectSelector(element);\n if (!selector) return;\n var shouldInstall = selector.type == 'css'\n || selector.type == 'html'\n || (selector.type == 'ajax' && !selector.view.OmitControlsInitialization);\n\n if (shouldInstall) {\n var elements = $('*', selector.selector);\n for (let i = 0; i < behaviours.length; i++) {\n let b = behaviours[i];\n if (requiredBehaviors[b.getBehaviorName()]) {\n for (var elementIndex = 0; elementIndex < elements.length; elementIndex++) {\n var elementToCheck = elements[elementIndex];\n\n if (b.shouldInstall(elementToCheck)) {\n b.install(elementToCheck, options);\n }\n }\n }\n }\n\n Validators.parse(selector.selector);\n }\n }\n\n function parseOne(element: HTMLElement, controlBehaviour: Behaviours.BaseControlBehaviour) {\n var selector = detectSelector(element);\n if (!selector) return;\n var shouldInstall = selector.type == 'css'\n || selector.type == 'html'\n || (selector.type == 'ajax' && !selector.view.OmitControlsInitialization);\n\n if (shouldInstall) {\n var elements = $('*', selector.selector);\n if (requiredBehaviors[controlBehaviour.getBehaviorName()]) {\n for (var elementIndex = 0; elementIndex < elements.length; elementIndex++) {\n var elementToCheck = elements[elementIndex];\n if (controlBehaviour.shouldInstall(elementToCheck)) {\n controlBehaviour.install(elementToCheck, options);\n }\n }\n }\n Validators.parse(selector.selector);\n }\n }\n\n function continueConfiguring() {\n Ajax.addAjaxViewParser((view) => {\n if (Controls) {\n Controls.parse(view);\n }\n }, 'default');\n\n Validators.init();\n\n parse(document);\n }\n\n return {\n configure,\n setRequiredBehaviors,\n parse,\n parseOne,\n continueConfiguring\n }\n}())","var LanguageSelector = window.LanguageSelector = (function () {\n function init(languageContainer) {\n $(document).on('click touch', languageContainer, function (event) {\n event.stopPropagation();\n\n if ($(event.target).closest('.j-lang-selected-option').length > 0) {\n dropListTrigger(event.currentTarget);\n } else if ($(event.target).closest('.drop-list__items > .option').length > 0) {\n let selectedOption = $(event.target).closest('.option')[0];\n let langContainer = event.currentTarget;\n\n event.stopPropagation();\n selectLanguage(selectedOption, langContainer);\n closeList(langContainer);\n }\n });\n\n $(document).on('click', function (e) {\n if ($(e.target).closest(languageContainer).length == 0) {\n closeList(languageContainer);\n }\n });\n }\n //dropList\n function dropListTrigger(triggerEl) {\n let dropListEl = $(\".j-lang-selector-drop-list\", triggerEl);\n let dropListArrow = $(\".j-lang-selector-drop-arrow\", triggerEl);\n\n if (dropListEl.hasClass(\"active\")) {\n dropListEl.removeClass(\"active\");\n dropListArrow.removeClass(\"open\");\n } else {\n dropListEl.addClass(\"active\");\n dropListArrow.addClass(\"open\");\n }\n }\n\n function closeList(langContainer) {\n let dropListEl = $(\".j-lang-selector-drop-list\", langContainer);\n let dropListArrow = $(\".j-lang-selector-drop-arrow\", langContainer);\n\n dropListEl.removeClass(\"active\");\n dropListArrow.removeClass(\"open\");\n }\n\n function selectLanguage(selectedOption, langContainer) {\n const langId = $(selectedOption).data('lang');\n const langName = $(selectedOption).text();\n const flagLang = $('.country-flag > img', selectedOption).attr('src');\n $('.j-lang-value', langContainer).val(langId);\n $('.j-lang-selected-option > .country-lang', langContainer).text(langName);\n $('.j-lang-selected-option > .country-flag > .country-flag__image', langContainer).attr('src', flagLang);\n const langIcon = langContainer.querySelector('.icon use');\n if (langIcon) {\n const culture = $(selectedOption).data('culture');\n const iconPath = `${window.globalAppSettings.svg.defaultSprite}#flag-${culture}`;\n langIcon.setAttribute('xlink:href', iconPath);\n }\n\n\n $(selectedOption).siblings().removeClass('selected');\n $(selectedOption).addClass('selected');\n\n Localization.changeLanguage(langId);\n }\n\n return {\n init\n }\n})()\n\nLanguageSelector.init('.j-lang-selector');","var LocalStorageProvider = window.LocalStorageProvider = (function() {\n function clearOutdatedBettingCart() {\n var curTimestamp = Date.now();\n var cart: any = localStorage.getItem('bettingCart');\n var isBettingCartUpdated = false;\n\n if (cart) {\n\n cart = JSON.parse(cart);\n\n // если запись о последних изменениях в корзине делалалсь более 24 часов назад, она удаляется\n // для каждого пользователя проверяется отдельно\n for (var userData in cart) {\n if ((curTimestamp - cart[userData].timestamp) > (1000 * 60 * 60 * 24)) {\n delete cart[userData];\n isBettingCartUpdated = true;\n }\n }\n\n if (isBettingCartUpdated === true) {\n localStorage.setItem('bettingCart', JSON.stringify(cart));\n }\n }\n }\n\n return {\n clearOutdatedBettingCart\n }\n})()","var Localization = window.Localization = (function () {\n var hashCode: string;\n var culture: string;\n var allResources;\n\n var resourcesByType;\n\n function get(key, defaultValue) {\n if (this[key] == undefined)\n return defaultValue;\n else return this[key];\n }\n\n function init(version: string, cultureName: string) {\n\n hashCode = version;\n culture = cultureName;\n\n $.ajax(\"/resources/allresources/\" + hashCode, {\n data: {},\n success: resp => {\n\n allResources = resp.ActionData.resources;\n },\n async: false\n });\n\n resourcesByType = {};\n\n for (var i in allResources) {\n resourcesByType[allResources[i].Type] = getResource(allResources[i].Type, allResources[i].HashCodes[culture]);\n }\n }\n\n function getString(resourceKey: string, defaultValue: string) {\n const [type, key] = resourceKey.split('.');\n return key && resourcesByType[type]?.[key] ? resourcesByType[type][key] : defaultValue;\n }\n\n function getResource(type: string, version: string): JSON {\n var a: JSON;\n\n $.ajax(\"/resources/get/\" + type + \"/\" + version, {\n data: { typeString: type },\n success: response => {\n a = response.ActionData.res;\n },\n async: false\n });\n\n return a;\n }\n\n function getLanguage() {\n return (window).globalAppSettings.lang; //TODO: get from cookie\n }\n\n function changeLanguage(lang: string) {\n const currentPath = window.location.pathname;\n const currentLang = getLanguage();\n\n if (currentPath === `/${currentLang}` || currentPath.startsWith(`/${currentLang}/`)) {\n window.location.href = `/${lang}` + currentPath.substring(3);\n }\n }\n\n return {\n get,\n init,\n getString,\n getLanguage,\n changeLanguage\n }\n})()\n\n\n","declare var globalAppSettings: any;\ndeclare var Base64: any;\n\nvar Metrics = window.Metrics = (function () {\n const selectors = {\n content: \"#page-content\",\n scrollarea: \"#m-page-content-scrollbar-scrollarea\",\n pageContent: \"#page-content\",\n pageFaq: \".article.page-content__overlay\",\n pageNews: \".news-body\",\n pageReview: \".review-page\",\n };\n const logTypes = {\n scroll: \"uni:page-scroll\",\n transition: \"uni:page-transition\",\n reviewAdding: \"uni:review-coef-added\",\n reviewWidgetAdding: \"uni:review-widget-coef-added\",\n };\n\n function getScrollPercent() {\n const documentScrolled = $(selectors.scrollarea).scrollTop();\n const contentHeight = $(selectors.content).height(); // only content without header and footer\n const scrollAreaHeight = $(selectors.scrollarea).height(); // content and footer\n let scrolledPercent = Math.floor(documentScrolled / (contentHeight - scrollAreaHeight) * 100);\n\n if (scrolledPercent > 100 || contentHeight < scrollAreaHeight) {\n scrolledPercent = 100;\n }\n\n return scrolledPercent;\n }\n\n function sendMetrics(type, body) {\n if (!globalAppSettings.isUiLogEnabled) {\n return;\n }\n\n type = logTypes[type];\n\n if (type === logTypes.reviewWidgetAdding && $(selectors.pageReview).length > 0) {\n type = logTypes.reviewAdding;\n }\n var data = JSON.parse(globalAppSettings.statisticsTemplateMessage);\n data.t = type;\n data.body = body;\n var dataString = Base64.toBase64(JSON.stringify(data));\n\n var img = $('');\n img.on('error', () => { img.remove(); });\n img.on('load', () => { img.remove(); });\n $('head').append(img);\n }\n\n function sendScroll(baseMetricData) {\n if ($(selectors.pageContent)) {\n let scrollPercent;\n setInterval(() => {\n const newScrollPercent = getScrollPercent();\n if (newScrollPercent !== scrollPercent) {\n\n var metricData = {\n scrolledPercent: newScrollPercent,\n location: window.location.href,\n Title: document.title,\n UniqueId: window.location.href\n };\n\n sendMetrics(\"scroll\", Object.assign(baseMetricData, metricData));\n scrollPercent = newScrollPercent;\n }\n }, 2000);\n }\n }\n\n function transitionLog(baseMetricData) {\n const link: any = document.activeElement;\n const currentLink: any = link.href != undefined ? link.href : \"undefined\";\n\n var metricData = {\n PreviousUrl: window.location.href,\n CurrentUrl: currentLink,\n Title: document.title,\n UniqueId: window.location.href\n };\n\n Metrics.sendMetrics(\"transition\", Object.assign(baseMetricData, metricData));\n };\n\n // send scroll position from /faq/\n if ($(selectors.pageFaq).length > 0) {\n const name: string = \"FAQ\";\n sendScroll({ Name: name });\n window.addEventListener(\"beforeunload\", () => { transitionLog({ Name: name }); });\n }\n\n // send scroll position from /reviews/\n if ($(selectors.pageReview).length > 0) {\n const name: string = \"Reviews\";\n\n var eventName = $(\".review-article__header-event-name\").data(\"event-name\");\n sendScroll({ Name: name, EventName: eventName });\n window.addEventListener(\"beforeunload\", () => { transitionLog({ Name: name, EventName: eventName }); });\n }\n\n // send scroll position from /news/\n if ($(selectors.pageNews).length > 0) {\n const name: string = \"News\";\n sendScroll({ Name: name });\n window.addEventListener(\"beforeunload\", () => { transitionLog({ Name: name }); });\n }\n\n return {\n sendMetrics\n }\n}());\n","var Popup = window.Popup = (function() {\n function Show(popupSelector: any) {\n let popup = null;\n const scrollPage = $(document).scrollTop();\n\n $(\".m-mobile body\").css({ position: 'fixed', top: -scrollPage + 'px', overflow: 'hidden' });\n\n if (popupSelector) {\n popup = $(popupSelector)[0];\n }\n else if (!popupSelector && this.Selector) {\n var possiblePopups = $('.popup', this.Selector);\n if (possiblePopups.length > 0) {\n popup = possiblePopups[0];\n }\n }\n\n\n if (!popup) return;\n const blockUi: any = UiBlock.getUiBlockDescriptor(popup);\n\n if (UiBlock.needBlock(blockUi)) {\n\n blockUi.message = popup.outerHTML;\n $(popup).remove();\n\n var previousOnBlock = blockUi.onBlock;\n blockUi.onBlock = function () {\n Controls.parse(this);\n if (previousOnBlock) previousOnBlock.call(this, arguments);\n }\n UiBlock.block(blockUi);\n }\n else {\n $(popup).show();\n }\n\n initHistoryBetCalcPopupPopover();\n\n document.dispatchEvent(\n new CustomEvent('mtmCustomEvent', {\n detail: {\n id: 'popup-show',\n popup,\n },\n })\n );\n }\n\n function isInPopup(element: any) {\n return $(element).parents('.popup').length > 0;\n }\n\n function getPopupSelector(element: any) {\n var parentPopup = $(element).parents('.popup')\n var popupCssClasses = parentPopup.attr('class').split(/\\s+/);\n var popupSelector = parentPopup.prop('tagName');\n if (popupCssClasses.length > 0) {\n popupSelector += '.' + popupCssClasses.join('.');\n }\n\n return popupSelector;\n }\n\n function Close(element: any) {\n const popup = findPopup(element);\n const blockUi: any = UiBlock.getUiBlockDescriptor(popup);\n const scrollPage = $(\".m-mobile body\").css('top');\n\n $(\".m-mobile body\").css({ position: '', top: '', overflow: '' });\n window.scrollTo(0, parseInt(scrollPage || '0') * -1);\n\n if (UiBlock.needBlock(blockUi)) {\n UiBlock.unBlock(blockUi);\n $(popup).remove();\n }\n else {\n $(popup).hide();\n }\n document.dispatchEvent(\n new CustomEvent('mtmCustomEvent', {\n detail: {\n id: 'popup-close',\n popup,\n },\n })\n );\n }\n\n function CloseWithCheckFlag(element: any, flagSelector: any, messageId: number) {\n const popup = findPopup(element);\n const flag = ($(popup).find(flagSelector)[0]) as HTMLInputElement;\n const state = flag.checked;\n\n Ajax.postJson(\"/ajax/message/modal/close\", {\n data: {\n messageId: messageId,\n stateModal: state\n },\n error: function () {\n }\n });\n\n Close(element);\n }\n\n function findPopup(element: any) {\n return $(element).parents('.popup')[0];\n }\n\n function SwitchLink(from: any, to: any, imgUrl: any) {\n var popup = findPopup(from);\n\n $(from).hide();\n $(to, popup).show();\n if (!!imgUrl) {\n $(to).append('\"\"');\n }\n }\n\n function initHistoryBetCalcPopupPopover() {\n const isInitParam = !!(+sessionStorage.getItem('initHistoryBetCalcPopupPopover'));\n\n if (!isInitParam) {\n return;\n }\n\n document.dispatchEvent(new CustomEvent('betCalcPopupPopover:show'));\n }\n\n return {\n Show,\n isInPopup,\n getPopupSelector,\n Close,\n CloseWithCheckFlag,\n SwitchLink\n }\n}());","var SRLiveAdapter = window.SRLiveAdapter = (function () {\n\tvar SRLive: any;\n\n function init(SRLiveInst: any) {\n\t\tSRLive = SRLiveInst;\n\t\tvar event = document.createEvent('Event');\n\t\tvar initEvent = event.initEvent('initSRLive', false, true);\n document.dispatchEvent(event);\n }\n\n function addWidget(params: Object) {\n return new Promise((resolve, reject) => {\n if (!SRLive) {\n document.addEventListener('initSRLive', function () {\n resolve(SRLive.addWidget(params));\n });\n } else {\n resolve(SRLive.addWidget(params));\n }\n });\n }\n\n function stopWidget(widget: Object) {\n if (SRLive) {\n var SRWidget = SRLive.getWidget(widget);\n if (SRWidget) SRWidget.pauseFeeds();\n }\n return;\n }\n\n function resumeWidget(widget: Object) {\n if (SRLive) {\n var SRWidget = SRLive.getWidget(widget);\n if (SRWidget) SRWidget.resumeFeeds(true);\n }\n return;\n }\n\n function removeWidget(widget: Object) {\n if (SRLive) {\n SRLive.removeWidget(widget);\n }\n }\n\n function isSRLiveReady() {\n return SRLive ? true : false;\n }\n\n function getSRLive() {\n return SRLive;\n }\n\n return {\n init,\n addWidget,\n stopWidget,\n resumeWidget,\n removeWidget,\n isSRLiveReady,\n getSRLive\n }\n}());","var UiBlock = window.UiBlock = (function() {\n function unBlock(uiBlock) {\n $(uiBlock.selector == '_window' ? window : uiBlock.selector).unblock();\n }\n\n var blockTypes =\n {\n default: {\n css: {\n zIndex: 1011,\n position: 'fixed',\n padding: 0,\n margin: 0,\n width: '100%',\n top: 0,\n left: 0,\n textAlign: 'left',\n color: 'rgb(0, 0, 0)',\n border: 'none',\n backgroundColor: 'transparent',\n cursor: 'default',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n },\n themedCSS: {\n width: '30%',\n top: '30%',\n left: '35%'\n },\n overlayCSS: {\n borderRadius: '0px'\n }\n },\n transparent: { css: { border: 'none', 'background-color': 'transparent' } },\n '680px': { css: { width: '36%', left: '32%' } }\n };\n\n function block(uiBlock) {\n var block = $.extend(true, {}, uiBlock);\n delete block.messageSelector;\n delete block.message;\n\n if (uiBlock.message) {\n block.message = uiBlock.message;\n }\n if (uiBlock.messageSelector) {\n block.message = $(uiBlock.messageSelector).clone().wrap('

').parent().html();\n }\n\n var blckConfig: any = {};\n $.extend(true, blckConfig, blockTypes.default);\n\n if (block.type)\n {\n $.extend(true, blckConfig, blockTypes[block.type] || {});\n\n block.type = null;\n }\n\n $.extend(true, blckConfig, block);\n\n if (blckConfig.overlayCSS && blckConfig.overlayCSS.position) {\n blckConfig.overlayCSS.userOverlayCSSPosition = true;\n }\n\n $(uiBlock.selector == '_window' ? window : uiBlock.selector).block(blckConfig);\n }\n\n function getUiBlockPropertyName(attrName: string, level: number) {\n if (level == 0 && attrName.toLowerCase() == 'overlaycss') {\n return 'overlayCSS';\n }\n if (level == 0 && attrName.toLowerCase() == 'blockmsgclass') {\n return 'blockMsgClass';\n }\n\n if (level == 0 && attrName.toLowerCase() == 'centerx') {\n return 'centerX';\n }\n\n if (level == 0 && attrName.toLowerCase() == 'centery') {\n return 'centerY';\n }\n\n if (level == 0 && attrName.toLowerCase() == 'messageselector') {\n return 'messageSelector';\n }\n if (attrName.toLocaleLowerCase() == 'backgroundcolor')\n {\n return 'background-color';\n }\n\n return attrName;\n }\n\n function getDefaultSpinnerBlock(element: HTMLElement, defaultValue: any = undefined ) {\n var blockSelector: string = '_window';\n if (Popup.isInPopup(element)) blockSelector = Popup.getPopupSelector(element);\n\n return $.extend(true, {}, { messageSelector: '.common-ajax-loader', selector: blockSelector }, defaultValue || {});\n }\n\n function getUiBlockDescriptor(element: HTMLElement, defaultValue: any = undefined) {\n var result = Utils.getObjectByAttributes('block', element, getUiBlockPropertyName, defaultValue);\n\n return result;\n }\n\n function needBlock(blockUi) { return (typeof (blockUi) === 'object') && blockUi && (Object.keys(blockUi).length > 0); }\n\n return {\n unBlock,\n block,\n getDefaultSpinnerBlock,\n getUiBlockDescriptor,\n needBlock\n }\n}());","declare class Tooltip {\n static errorNode(node: any, message: string, persistent: boolean);\n static successNode(node: any, message: string, persistent: boolean);\n static updateOpenedTooltipText(node: any, message: any);\n}\n\nvar Utils = window.Utils = (function () {\n function getObjectPropertyKey(\n property,\n propertyNameTranslator: (property: string, level: number) => string,\n level: number\n ) {\n let key = property;\n if (propertyNameTranslator) {\n key = propertyNameTranslator(property, level);\n }\n\n return key;\n }\n function getObjectByAttributes(\n prefix,\n element: HTMLElement,\n propertyNameTranslator: (property: string, level: number) => string,\n defaults\n ) {\n const result = $.extend(true, {}, defaults || {});\n for (let i = 0; i < element.attributes.length; i++) {\n const attr = element.attributes[i];\n if (attr.name.indexOf(prefix + '-') == 0) {\n const blockName = attr.name.substr((prefix + '-').length);\n const blockSubNames = blockName.split('-');\n let currentObject = result;\n for (var j = 0; j < blockSubNames.length - 1; j++) {\n var key = getObjectPropertyKey(\n blockSubNames[j],\n propertyNameTranslator,\n j\n );\n if (!currentObject[key]) {\n currentObject[key] = {};\n }\n currentObject = currentObject[key];\n }\n\n var key = getObjectPropertyKey(\n blockSubNames[j],\n propertyNameTranslator,\n j\n );\n let val: any = $(element).attr(attr.name);\n\n if (val === 'false') val = false;\n if (val === 'true') val = true;\n\n const arrayRegex = /^array\\:(.*?)$/g;\n const arrayMatch = arrayRegex.exec(val);\n if (arrayMatch) {\n const array = arrayMatch[1];\n val = eval(array);\n }\n\n currentObject[key] = val;\n }\n }\n\n return result;\n }\n\n function addAttributes(element, attrName, attributes) {\n if (typeof attributes === 'object') {\n for (const key in attributes) {\n const prefix = (attrName + '-' + key).toLowerCase();\n\n addAttributes(element, prefix, attributes[key]);\n }\n } else {\n $(element).attr(attrName, attributes);\n }\n }\n\n function getElementFullType(element) {\n let result = element.tagName.toLowerCase();\n if (result === 'input') {\n result += '-' + $(element).attr('type').toLowerCase();\n }\n return result;\n }\n\n function tryEval(toEval) {\n try {\n return eval('(' + toEval + ')');\n } catch (e) {}\n return toEval;\n }\n\n /**\n * Runs directly a function from its name with/without arguments.\n *\n * @param functionName {String}\n * @param context {Object || null}\n */\n function runFunctionByName(functionName, context, args): any {\n // If using Node.js, the context will be an empty object\n if (typeof window == 'undefined') {\n context = context || {};\n } else {\n // Use the window (from browser) as context if none providen.\n context = context || window;\n }\n\n // Retrieve the namespaces of the function you want to execute\n // e.g Namespaces of \"MyLib.UI.alerti\" would be [\"MyLib\",\"UI\"]\n const namespaces = functionName.split('.');\n\n // Retrieve the real name of the function i.e alerti\n const functionToExecute = namespaces.pop();\n\n // Iterate through every namespace to access the one that has the function\n // you want to execute. For example with the alert fn \"MyLib.UI.SomeSub.alert\"\n // Loop until context will be equal to SomeSub\n for (let i = 0; i < namespaces.length; i++) {\n context = context[namespaces[i]];\n }\n\n // If the context really exists (namespaces), return the function or property\n return context[functionToExecute].apply(context, args);\n }\n\n function runFunction(func: string, element: any, data?: any): void {\n if (func != null) {\n if (func.lastIndexOf(';') !== func.length - 1) {\n const args = [element];\n if (data != null) args.splice(1, 0, data);\n Utils.runFunctionByName(func, null, args);\n } else {\n Function(func).apply(element, data);\n }\n }\n }\n\n function showTooltipError(obj: any, data: any, persistent = false) {\n if (data)\n Tooltip.errorNode(\n $(obj),\n typeof data === 'string' ? data : data.error,\n persistent\n );\n }\n\n function showTooltipSuccess(obj: any, data: any, persistent = false) {\n if (data)\n Tooltip.successNode(\n $(obj),\n typeof data === 'string' ? data : data.success,\n persistent\n );\n }\n\n function svgHtml(fileName, className) {\n fileName = fileName || '';\n className = className || '';\n return (\n 'window).globalAppSettings.svg.defaultSprite +\n '#' +\n fileName +\n '\">'\n );\n }\n\n function displayCoefValue(coefValue: number): string {\n const oddsType = window.globalAppSettings.oddsType;\n switch (oddsType) {\n case 'American':\n if (coefValue > 1 && coefValue < 2)\n return '-' + Math.round(100 / (coefValue - 1)).toFixed(0);\n if (coefValue === 2) return 'Even';\n if (coefValue > 2)\n return '+' + Math.round(100 * (coefValue - 1)).toFixed(0);\n return '-';\n case 'British':\n const numerator = Math.round(100 * (coefValue - 1));\n const denominator = 100;\n const hcf = gcd(numerator, denominator);\n return (\n Math.floor(numerator / hcf) +\n '/' +\n Math.floor(denominator / hcf)\n );\n case 'HongKong':\n return (coefValue - 1).toFixed(2);\n case 'Indonesian':\n if (coefValue > 1 && coefValue < 2)\n return '-' + Math.round(1 / (coefValue - 1)).toFixed(2);\n if (coefValue === 2) return 'Even';\n if (coefValue > 2)\n return '+' + Math.round(coefValue - 1).toFixed(2);\n return '-';\n case 'Malaysian':\n if (coefValue > 1 && coefValue < 2)\n return '+' + Math.round(1 / (coefValue - 1)).toFixed(2);\n if (coefValue === 2) return 'Even';\n if (coefValue > 2)\n return '-' + Math.round(coefValue - 1).toFixed(2);\n return '-';\n case 'European':\n default:\n return coefValue.toFixed(2);\n }\n }\n\n /**\n * Finds the greatest common divisor using binary GCD algorithm.\n * @param a First number\n * @param b Second number\n * @returns GCD of a and b.\n */\n function gcd(a: number, b: number): number {\n /* GCD(0, b) == b; GCD(a, 0) == a,\n GCD(0, 0) == 0 */\n if (a == 0) return b;\n if (b == 0) return a;\n\n /*Finding K, where K is the\n greatest power of 2\n that divides both a and b. */\n let k: number;\n for (k = 0; ((a | b) & 1) == 0; ++k) {\n a >>= 1;\n b >>= 1;\n }\n\n /* Dividing a by 2 until a becomes odd */\n while ((a & 1) == 0) a >>= 1;\n\n /* From here on, 'a' is always odd. */\n do {\n /* If b is even, remove all factor of 2 in b */\n while ((b & 1) == 0) b >>= 1;\n\n /* Now a and b are both odd.\n Swap if necessary so a <= b,\n then set b = b - a (which is even).*/\n if (a > b) {\n const t = a;\n a = b;\n b = t;\n }\n\n b = b - a;\n } while (b != 0);\n\n /* restore common factors of 2 */\n return a << k;\n }\n\n return {\n getObjectByAttributes,\n addAttributes,\n getElementFullType,\n tryEval,\n runFunctionByName,\n runFunction,\n showTooltipError,\n showTooltipSuccess,\n svgHtml,\n displayCoefValue,\n };\n}());\n","var Validators = window.Validators = (function() {\n function init() {\n registerRequiredIfValidator();\n registerRequiredBooleanValidator();\n registerIgnoreCaseComaprer();\n registerMaxDateValidator();\n registerMinDateValidator();\n registerMinValueValidator();\n registerMaxValueValidator();\n registerCreditCardValidator();\n registerDocTypeDependentNumberValidator();\n registerCheckMatchingValidator();\n registerConferenceIdentityIfValidator();\n customiseUnobtrusiveValidators();\n registerInnCheckSumValidator();\n registerSnilsCheckSumValidator();\n }\n\n function parse(element: any) {\n var jq: any = $;\n if (jq.validator && jq.validator.unobtrusive) {\n jq.validator.unobtrusive.parse(element);\n }\n }\n\n function creditCardLuhnCheck(val) {\n var sum = 0;\n for (var i = 0; i < val.length; i++) {\n var intVal = parseInt(val.substr(i, 1));\n if (i % 2 == 0) {\n intVal *= 2;\n if (intVal > 9) {\n intVal = 1 + (intVal % 10);\n }\n }\n sum += intVal;\n }\n return (sum % 10) == 0;\n }\n\n function registerCreditCardValidator() {\n var jq: any = $;\n jq.validator.unobtrusive.adapters.add('creditcard',\n options => {\n });\n\n jq.validator.addMethod('creditcard',\n (value, element, parameters) => {\n value = value.replace(/[\\s-_]/gm, '');\n\n return creditCardLuhnCheck(value);\n });\n }\n\n function tryParseDatepickerDate(element, value) {\n if ($.datepicker && $(element).attr('datepicker-dateformat')) {\n var format = $(element).attr('datepicker-dateformat');\n var dt = null;\n try {\n dt = $.datepicker.parseDate(format, value);\n\n if (!/Invalid|NaN/.test(dt.toString())) {\n return { date: dt, valid: true };\n }\n } catch (e) {\n }\n\n return { valid: false };\n }\n }\n\n function isDate(element, value) {\n return tryParseDatepickerDate(element, value).valid;\n }\n\n function registerMinValueValidator() {\n var jq: any = $;\n jq.validator.unobtrusive.adapters.add('minvalue',\n ['min'],\n options => {\n options.rules['min'] = options.params;\n options.messages['min'] = options.message;\n });\n\n jq.validator.addMethod('min',\n (value, element, parameters) => {\n if ($.isNumeric(value)) {\n try {\n var val = parseFloat(value);\n var min = parseFloat(parameters.min);\n\n return val >= min;\n } catch (err) {\n }\n\n return false;\n } else if (isDate(element, value)) {\n var date = tryParseDatepickerDate(element, value).date;\n var minDate = tryParseDatepickerDate(element, parameters).date;\n\n return date >= minDate;\n }\n });\n }\n\n function registerMaxValueValidator() {\n var jq: any = $;\n jq.validator.unobtrusive.adapters.add('maxvalue',\n ['max'],\n options => {\n options.rules['max'] = options.params;\n options.messages['max'] = options.message;\n });\n\n jq.validator.addMethod('max',\n (value, element, parameters) => {\n if ($.isNumeric(value)) {\n try {\n var val = parseFloat(value);\n var max = parseFloat(parameters.max);\n\n return val <= max;\n } catch (err) {\n }\n\n return false;\n } else if (isDate(element, value)) {\n var date = tryParseDatepickerDate(element, value).date;\n var minDate = tryParseDatepickerDate(element, parameters).date;\n\n return date <= minDate;\n }\n });\n }\n\n function registerRequiredBooleanValidator() {\n var jq: any = $;\n jq.validator.unobtrusive.adapters.add('requiredbool',\n ['value'],\n options => {\n options.rules['requiredbool'] = options.params;\n options.messages['requiredbool'] = options.message;\n });\n\n jq.validator.addMethod('requiredbool',\n (value, element, parameters) => {\n var expectedValue: any = parameters.value.toString().toLowerCase();\n var val: any = null;\n if (element.type == 'checkbox') {\n val = $(element).is(':checked');\n } else {\n val = $(element).val();\n }\n\n val = val.toString().toLowerCase();\n\n return val == expectedValue;\n });\n }\n\n function registerDocTypeDependentNumberValidator() {\n var jq: any = $;\n\n jq.validator.unobtrusive.adapters.add('doctypedependency',\n ['dependentproperty', 'mainproperty'],\n options => {\n options.rules['doctypedependency'] = options.params;\n options.messages['doctypedependency'] = options.message;\n var dependentProperty: any = $('#' + options.params.dependentproperty);\n dependentProperty.change(function () {\n var validator = jq(options.form).validate();\n validator.element(options.element);\n });\n });\n\n jq.validator.addMethod('doctypedependency',\n function (value, element, parameters) {\n var selectedType = $('#DocType').val();\n\n var toCheck = value.replace(/ /g, \"\");\n\n if (selectedType == 'RussianPassport' && $('#ShouldEnterPersonalData').val() == 'True') {\n if (parameters.mainproperty == 'DocumentSeries' || parameters.mainproperty == 'DocSeries')\n return toCheck.match(/^\\d{4}$/);\n else\n return toCheck.match(/^\\d{6}$/);\n }\n\n return true;\n });\n }\n\n function registerRequiredIfValidator() {\n var jq: any = $;\n jq.validator.unobtrusive.adapters.add('requiredif',\n ['dependsonproperties', 'dependsonvalues', 'requiredvalue'],\n options => {\n options.rules['requiredif'] = options.params;\n options.messages['requiredif'] = options.message;\n\n var dependsOnProperties = JSON.parse(options.params.dependsonproperties)\n if (dependsOnProperties) {\n for (var i = 0; i < dependsOnProperties.length; i++) {\n var dependesOnProperty: any = $('#' + dependsOnProperties[i]);\n dependesOnProperty.change(function () {\n var validator = jq(options.form).validate();\n validator.element(options.element);\n });\n }\n }\n });\n\n jq.validator.addMethod('requiredif',\n function (value, element, parameters) {\n let dependsOnProperties = JSON.parse(parameters.dependsonproperties)\n let shouldValidate = true;\n if (dependsOnProperties?.length) {\n var dependsOnValues = JSON.parse(parameters.dependsonvalues);\n if (dependsOnValues?.length) {\n dependsOnValues = dependsOnValues.map((val) => { return val == null ? '' : val.toString().trim().toLowerCase() });\n for (let i = 0; i < dependsOnProperties.length; i++) {\n let controlType = $(\"input[id$='\" + dependsOnProperties[i] + \"']\").attr(\"type\");\n let actualValue = null;\n\n if (controlType == \"checkbox\" || controlType == \"radio\") {\n let control = $(\"input[id$='\" + dependsOnProperties[i] + \"']:checked\");\n actualValue = control.val();\n } else {\n actualValue = $(\"#\" + dependsOnProperties[i]).val();\n }\n actualValue = $.trim(actualValue).toLocaleLowerCase()\n\n let dependentValueMatches = false;\n for (let vInd = 0; vInd < dependsOnValues.length; vInd++) {\n if (dependsOnValues[vInd] === actualValue) {\n dependentValueMatches = true;\n break;\n }\n }\n if (!dependentValueMatches) {\n shouldValidate = false;\n break;\n }\n }\n }\n }\n\n if(shouldValidate)\n return parameters.requiredvalue == ''\n ? jq.validator.methods.required.call(this, value, element, parameters)\n : value == parameters.requiredvalue;\n\n return true;\n });\n }\n\n function registerCheckMatchingValidator() {\n var jq: any = $;\n jq.validator.unobtrusive.adapters.add('checkmatching', ['validationattributename', 'userinputattributename'],\n options => {\n options.rules['checkmatching'] = options.params;\n options.messages['checkmatching'] = options.message;\n var validationattributename: any = jq('[name^=' + options.params.validationattributename + ']');\n validationattributename.bind('input', function () {\n var validator = jq(options.form).validate();\n validator.element(options.element);\n });\n });\n\n jq.validator.addMethod('checkmatching',\n function (value, element, parameters) {\n if (value) {\n var allBets = jq('[name$=' + parameters.validationattributename + ']');\n if (allBets && allBets.length > 1) {\n var otherBets = allBets.filter(function (idx, elm) {\n return elm.id != element.id;\n });\n jq('#' + element.id + '+[name$=' + parameters.userinputattributename + ']').val(otherBets.map(function () {\n return jq(this).val();\n }).toArray().join('|'));\n\n return !otherBets.filter(function (idx, elm) {\n return jq(elm).val() == value;\n }).length;\n }\n }\n\n return true;\n });\n }\n\n function registerConferenceIdentityIfValidator() {\n var jq: any = $;\n jq.validator.unobtrusive.adapters.add('conferenceidentityif',\n ['dependentproperty', 'regexppattern', 'maxlengthskypelogin', 'maxlengtherrormessage', 'phonepatternerrormessage'],\n options => {\n options.rules['conferenceidentityif'] = options.params;\n var dependentProperty: any = $('[name$=' + options.params.dependentproperty + ']');\n dependentProperty.change(function () {\n var validator = jq(options.form).validate();\n validator.element(options.element);\n });\n });\n\n jq.validator.addMethod('conferenceidentityif',\n function (value, element, parameters) {\n var conferenceType = $('[name$=' + parameters.dependentproperty + ']').val();\n switch (conferenceType) {\n case \"Viber\":\n case \"Whatsapp\":\n jq.validator.messages['conferenceidentityif'] = parameters.phonepatternerrormessage;\n return !!jq.validator.methods.regex.call(this, value, element, new RegExp(parameters.regexppattern));\n case \"Skype\":\n jq.validator.messages['conferenceidentityif'] = parameters.maxlengtherrormessage;\n return jq.validator.methods.maxlength.call(this, value, element, parameters.maxlengthskypelogin);\n }\n return false;\n });\n }\n\n function registerIgnoreCaseComaprer() {\n var jq: any = $;\n jq.validator.unobtrusive.adapters.add('ignorecasecompare',\n ['dependentproperty'],\n options => {\n options.rules['ignorecasecompare'] = options.params;\n options.messages['ignorecasecompare'] = options.message;\n\n\n var dependentProperty: any = $('#' + options.params.dependentproperty);\n dependentProperty.change(function () {\n var validator = jq(options.form).validate();\n validator.element(options.element);\n });\n });\n\n\n jq.validator.addMethod('ignorecasecompare',\n (value, element, parameters) => {\n var dependent = $(\"input[id$='\" + parameters.dependentproperty + \"']\");\n return (dependent.val().toUpperCase() === value.toUpperCase())\n });\n }\n\n function registerMaxDateValidator() {\n var jq: any = $;\n jq.validator.unobtrusive.adapters.add('maxdate',\n ['relativeyears', 'isnullvalid'],\n options => {\n options.rules['maxdate'] = options.params;\n options.messages['maxdate'] = options.message;\n });\n\n jq.validator.addMethod('maxdate',\n (value, element, parameters) => {\n\n var isNullValid = parameters.isnullvalid;\n\n if (value == '' && isNullValid) return true;\n\n var d = tryParseDatepickerDate(element, value);\n if (d.valid) {\n var actualDate = new Date();\n var targetDate = new Date(actualDate.getFullYear() + parseInt(parameters.relativeyears),\n actualDate.getMonth(),\n actualDate.getDate());\n\n\n return d.date <= targetDate;\n }\n\n return false;\n });\n }\n\n function registerMinDateValidator() {\n var jq: any = $;\n jq.validator.unobtrusive.adapters.add('mindate',\n ['relativeyears', 'isnullvalid'],\n options => {\n options.rules['mindate'] = options.params;\n options.messages['mindate'] = options.message;\n });\n\n jq.validator.addMethod('mindate',\n (value, element, parameters) => {\n\n var isNullValid = parameters.isnullvalid;\n\n if (value == '' && isNullValid) return true;\n\n var d = tryParseDatepickerDate(element, value);\n if (d.valid) {\n var actualDate = new Date();\n var targetDate = new Date(actualDate.getFullYear() + parseInt(parameters.relativeyears),\n actualDate.getMonth(),\n actualDate.getDate());\n\n return d.date >= targetDate;\n }\n\n return false;\n });\n }\n\n function validateDate(value, element) {\n if ($.datepicker && $(element).attr('datepicker-dateformat')) {\n var format = $(element).attr('datepicker-dateformat');\n var dateValid = false;\n var dt = null;\n try {\n dt = $.datepicker.parseDate(format, value);\n dateValid = true;\n } catch (e) {\n }\n\n return this.optional(element) || (dateValid && !/Invalid|NaN/.test(dt.toString()));\n }\n if (($).timepicker && $.datepicker) {\n var timeFormat = 'HH:mm:ss',\n dateFormat = 'dd.mm.yy',\n dateValid = false,\n dt = null;\n try {\n dt = ($.datepicker).parseDateTime(dateFormat, timeFormat, value);\n dateValid = true;\n } catch (e) {\n }\n\n return this.optional(element) || (dateValid && !/Invalid|NaN/.test(dt.toString()));\n }\n return this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString());\n }\n\n function customiseUnobtrusiveValidators() {\n var jq: any = $;\n jq.validator.prototype.customDataMessage = function (element, method) {\n var dataUpperCasedName = \"msg\" + method.charAt(0).toUpperCase() + method.substring(1).toLowerCase();\n var dataLowerCasedName = \"msg\" + method.toLowerCase();\n\n return $(element).data(dataUpperCasedName) || $(element).data(dataLowerCasedName) || $(element).data(\"msg\");\n };\n\n if (jq.validator) {\n jq.validator.methods.date = validateDate;\n jq.validator.setDefaults(\n {\n ignore: null,\n }\n );\n }\n }\n\n function registerInnCheckSumValidator() {\n var jq: any = $;\n jq.validator.unobtrusive.adapters.add('innchecksum',\n options => {\n options.rules['innchecksum'] = options.params;\n options.messages['innchecksum'] = options.message;\n });\n\n jq.validator.addMethod('innchecksum',\n (value, element, parameters) => {\n if (value) {\n const coefsFor11 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8];\n const coefsFor12 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8];\n let dgt11: number;\n let dgt12: number;\n\n try {\n dgt11 = getCheckNumber(value, coefsFor11);\n dgt12 = getCheckNumber(value, coefsFor12);\n } catch (e) {\n return false;\n }\n return parseInt(value[10]) == dgt11 && parseInt(value[11]) == dgt12;\n }\n return true;\n });\n }\n\n function getCheckNumber(innString, checkSumCoefs) {\n let checkNumber = 0;\n for (var i = 0; i < checkSumCoefs.length; i++) {\n checkNumber += parseInt(innString[i]) * checkSumCoefs[i];\n }\n\n return (checkNumber % 11) % 10;\n }\n\n\n\n function registerSnilsCheckSumValidator() {\n var jq: any = $;\n jq.validator.unobtrusive.adapters.add('snilschecksum',\n options => {\n options.rules['snilschecksum'] = options.params;\n options.messages['snilschecksum'] = options.message;\n\n });\n\n jq.validator.addMethod('snilschecksum',\n (value, element, parameters) => {\n if (value) {\n let numbersOnly = value.toString().replace(/\\D/g, '');\n if (numbersOnly.length != 11)\n return false;\n\n if (parseInt(numbersOnly.substring(0, 9)) <= 1001998)\n return true;\n\n let checkSum = parseInt(numbersOnly.substring(9));\n let sum = 0;\n for (let i = 1; i < 10; i++)\n sum += i * parseInt(numbersOnly[9 - i]);\n\n if (sum > 101)\n sum %= 101;\n\n return sum < 100 ? sum == checkSum : sum == 0;\n }\n return true;\n });\n }\n\n return {\n init,\n parse\n }\n}());","declare var HistoryUpdatePool: any;\n//declare var signalR: any;\nimport * as signalR from \"@microsoft/signalr\"; //not build\n\nwindow.SignalR = (function () {\n var connection: any;//signalR.HubConnection; //not build\n var config: ISignalRConfig;\n\n function start(conf: ISignalRConfig) {\n config = conf;\n connection = new signalR.HubConnectionBuilder()\n .withUrl(\"/account\", {\n transport: signalR.HttpTransportType.WebSockets,\n })\n .withAutomaticReconnect()\n .build();\n connection.onreconnecting(() => {\n join();\n });\n subscribe();\n connection.start().then(() => {\n if (connection.state.toString() === \"Connected\")\n join();\n });\n }\n\n function join() {\n if (config.isAuthenticated) {\n connection.send(\"join\", config.accountToken);\n }\n }\n\n function subscribe() {\n connection.on('RefreshToken', () => {\n var queryTokenUrl = '/api/signalr/account/refreshtoken?rnd=' + Math.random();\n $.get(queryTokenUrl, token => {\n config.accountToken = token;\n join();\n });\n\n });\n\n connection.on('AccountLogout', msg => {\n var logoutEvent = new CustomEvent('accountLogout');\n window.dispatchEvent(logoutEvent);\n window.location.reload();\n });\n\n connection.on('LogoutAll', msg => {\n var logoutEvent = new CustomEvent('accountLogout');\n window.dispatchEvent(logoutEvent);\n window.location.reload();\n });\n\n connection.on('NotifyPackageBetResult', BettingCart.notification.NotifyPackageBetResult);\n\n var isHistory = () => $('#page-content').attr('data-page') === 'history';\n connection.on('AccountBalanceChanged', (accountId, amount: number, bonusValue: number, betBalance: number) => {\n var notificationBalanceUpdateEvent = new CustomEvent<{\n balanceVal: number;\n bonusPoints: number;\n }>('notificationBalanceUpdate', {\n detail: {\n balanceVal: amount,\n bonusPoints: bonusValue,\n },\n });\n\n window.dispatchEvent(notificationBalanceUpdateEvent);\n\n if (isHistory()) {\n HistoryUpdatePool.add();\n }\n });\n\n connection.on('AccountBetBalanceChanged', (accountId: number, betBalance: number) => {\n var notificationBetBalanceUpdateEvent = new CustomEvent<{\n betBalance: number;\n }>('notificationBetBalanceUpdate', {\n detail: {\n betBalance\n },\n });\n\n window.dispatchEvent(notificationBetBalanceUpdateEvent);\n });\n\n connection.on('UnviewedBetsChanged', (accountId, unviewedBetCount: number) => {\n const selectors = {\n mnHistCount: '#mn-hist_count',\n };\n if (isHistory()) {\n HistoryUpdatePool.add();\n }\n else {\n (unviewedBetCount > 0) ? $(selectors.mnHistCount).text(unviewedBetCount).addClass('active') : $(selectors.mnHistCount).removeClass('active');\n }\n });\n }\n\n return {\n start\n }\n}());","export class SignalRConfigBuilder {\n defaultConfig: ISignalRConfig = {\n accountToken: 'None',\n isAuthenticated: false\n };\n config: ISignalRConfig;\n\n constructor() {\n this.config = this.defaultConfig;\n }\n\n build(): ISignalRConfig {\n return this.config;\n }\n\n withToken(token: string): SignalRConfigBuilder {\n this.config.accountToken = token;\n return this;\n }\n\n withAuth(auth: boolean): SignalRConfigBuilder {\n this.config.isAuthenticated = auth;\n return this;\n }\n}\n\nwindow.SignalRConfigBuilder = SignalRConfigBuilder;","window.Sports = (function () {\n const actions = {\n handlers: {\n addSportHandler: function (\n control: any,\n maxCount: number,\n svgNumber: number,\n scope: any\n ) {\n let selectedCount = parseInt(\n $('span.selected-sports-counter', scope).text()\n );\n\n if (selectedCount < maxCount) {\n const data = $(control).data('value');\n\n const stringData = $(control).data('stringvalue');\n\n $('.icon-sport-' + svgNumber, scope).remove();\n\n $('ul.selected-sports__list', scope).append(\n '

  • '\n );\n $('ul.selected-sports__list li:last-child', scope).append(\n '
    '\n );\n $('ul.selected-sports__list li:last-child', scope).append(\n '
    ' +\n app.svgSports(\n svgNumber,\n 'selected-sports__item-icon'\n ) +\n '
    '\n );\n $('ul.selected-sports__list li:last-child', scope).append(\n ''\n );\n $('ul.selected-sports__list li:last-child', scope).append(\n stringData\n );\n $('ul.selected-sports__list li:last-child', scope).append(\n '
    '\n );\n $(\n 'ul.selected-sports__list li:last-child > div.settings-bin__sports-wrapper',\n scope\n ).append(\n '' +\n Utils.svgHtml('bin', 'settings-bin__sports-icon') +\n ''\n );\n\n $(control).closest('li').remove();\n $(control).remove();\n\n selectedCount += 1;\n\n $('span.selected-sports-counter', scope).html(\n selectedCount.toString()\n );\n }\n },\n removeSportHandler: function (\n control: any,\n maxCount: number,\n svgNumber: number,\n scope: any\n ) {\n let selectedCount = parseInt(\n $('span.selected-sports-counter', scope).text()\n );\n\n const data = $(control).data('value');\n\n const stringData = $(control).data('stringvalue');\n\n $('.icon-sport-' + svgNumber, scope).remove();\n\n $('ul.available-sports__list', scope).append(\n '
  • '\n );\n $('ul.available-sports__list li:last-child', scope).append(\n '
    '\n );\n $(\n 'ul.available-sports__list li:last-child > div.available-sports__item-icon',\n scope\n ).append(\n app.svgSports(\n svgNumber,\n 'settings-sort__sports-icon m-contrast',\n scope\n )\n );\n $('ul.available-sports__list li:last-child', scope).append(\n '' +\n stringData +\n ''\n );\n\n const listItems = $('ul.available-sports__list > li', scope);\n\n const s = $(listItems)\n .detach()\n .sort(function (a, b) {\n const contentA = $(a).children('a').text();\n const contentB = $(b).children('a').text();\n\n return contentA < contentB\n ? -1\n : contentA > contentB\n ? 1\n : 0;\n });\n\n s.each(function (index, row) {\n $('ul.available-sports__list', scope).append(row);\n });\n\n $(control).closest('li').remove();\n $(control).remove();\n\n selectedCount -= 1;\n\n $('span.selected-sports-counter', scope).html(\n selectedCount.toString()\n );\n },\n },\n };\n\n return {\n actions,\n };\n})();\n","module.exports = jQuery;","/*!\n * jQuery blockUI plugin\n * Version 2.70.0-2014.11.23\n * Requires jQuery v1.7 or later\n *\n * Examples at: http://malsup.com/jquery/block/\n * Copyright (c) 2007-2013 M. Alsup\n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl.html\n *\n * Thanks to Amir-Hossein Sobhi for some excellent contributions!\n */\n\n;(function() {\n/*jshint eqeqeq:false curly:false latedef:false */\n\"use strict\";\n\n\tfunction setup($) {\n\t\t$.fn._fadeIn = $.fn.fadeIn;\n\n\t\tvar noOp = $.noop || function() {};\n\n\t\t// this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle\n\t\t// confusing userAgent strings on Vista)\n\t\tvar msie = /MSIE/.test(navigator.userAgent);\n\t\tvar ie6 = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent);\n\t\tvar mode = document.documentMode || 0;\n\t\tvar setExpr = $.isFunction( document.createElement('div').style.setExpression );\n\n\t\t// global $ methods for blocking/unblocking the entire page\n\t\t$.blockUI = function(opts) { install(window, opts); };\n\t\t$.unblockUI = function(opts) { remove(window, opts); };\n\n\t\t// convenience method for quick growl-like notifications (http://www.google.com/search?q=growl)\n\t\t$.growlUI = function(title, message, timeout, onClose) {\n\t\t\tvar $m = $('
    ');\n\t\t\tif (title) $m.append('

    '+title+'

    ');\n\t\t\tif (message) $m.append('

    '+message+'

    ');\n\t\t\tif (timeout === undefined) timeout = 3000;\n\n\t\t\t// Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications\n\t\t\tvar callBlock = function(opts) {\n\t\t\t\topts = opts || {};\n\n\t\t\t\t$.blockUI({\n\t\t\t\t\tmessage: $m,\n\t\t\t\t\tfadeIn : typeof opts.fadeIn !== 'undefined' ? opts.fadeIn : 700,\n\t\t\t\t\tfadeOut: typeof opts.fadeOut !== 'undefined' ? opts.fadeOut : 1000,\n\t\t\t\t\ttimeout: typeof opts.timeout !== 'undefined' ? opts.timeout : timeout,\n\t\t\t\t\tcenterY: false,\n\t\t\t\t\tshowOverlay: false,\n\t\t\t\t\tonUnblock: onClose,\n\t\t\t\t\tcss: $.blockUI.defaults.growlCSS\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tcallBlock();\n\t\t\tvar nonmousedOpacity = $m.css('opacity');\n\t\t\t$m.mouseover(function() {\n\t\t\t\tcallBlock({\n\t\t\t\t\tfadeIn: 0,\n\t\t\t\t\ttimeout: 30000\n\t\t\t\t});\n\n\t\t\t\tvar displayBlock = $('.blockMsg');\n\t\t\t\tdisplayBlock.stop(); // cancel fadeout if it has started\n\t\t\t\tdisplayBlock.fadeTo(300, 1); // make it easier to read the message by removing transparency\n\t\t\t}).mouseout(function() {\n\t\t\t\t$('.blockMsg').fadeOut(1000);\n\t\t\t});\n\t\t\t// End konapun additions\n\t\t};\n\n\t\t// plugin method for blocking element content\n\t\t$.fn.block = function(opts) {\n\t\t\tif ( this[0] === window ) {\n\t\t\t\t$.blockUI( opts );\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tvar fullOpts = $.extend({}, $.blockUI.defaults, opts || {});\n\t\t\tthis.each(function() {\n\t\t\t\tvar $el = $(this);\n\t\t\t\tif (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked'))\n\t\t\t\t\treturn;\n\t\t\t\t$el.unblock({ fadeOut: 0 });\n\t\t\t});\n\n\t\t\treturn this.each(function() {\n\t\t\t\tif ($.css(this,'position') == 'static') {\n\t\t\t\t\tthis.style.position = 'relative';\n\t\t\t\t\t$(this).data('blockUI.static', true);\n\t\t\t\t}\n\t\t\t\tthis.style.zoom = 1; // force 'hasLayout' in ie\n\t\t\t\tinstall(this, opts);\n\t\t\t});\n\t\t};\n\n\t\t// plugin method for unblocking element content\n\t\t$.fn.unblock = function(opts) {\n\t\t\tif ( this[0] === window ) {\n\t\t\t\t$.unblockUI( opts );\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\treturn this.each(function() {\n\t\t\t\tremove(this, opts);\n\t\t\t});\n\t\t};\n\n\t\t$.blockUI.version = 2.70; // 2nd generation blocking at no extra cost!\n\n\t\t// override these in your code to change the default behavior and style\n\t\t$.blockUI.defaults = {\n\t\t\t// message displayed when blocking (use null for no message)\n\t\t\tmessage: '

    Please wait...

    ',\n\n\t\t\ttitle: null,\t\t// title string; only used when theme == true\n\t\t\tdraggable: true,\t// only used when theme == true (requires jquery-ui.js to be loaded)\n\n\t\t\ttheme: false, // set to true to use with jQuery UI themes\n\n\t\t\t// styles for the message when blocking; if you wish to disable\n\t\t\t// these and use an external stylesheet then do this in your code:\n\t\t\t// $.blockUI.defaults.css = {};\n\t\t\tcss: {\n\t\t\t\tpadding:\t0,\n\t\t\t\tmargin:\t\t0,\n\t\t\t\twidth:\t\t'30%',\n\t\t\t\ttop:\t\t'40%',\n\t\t\t\tleft:\t\t'35%',\n\t\t\t\ttextAlign:\t'center',\n\t\t\t\tcolor:\t\t'#000',\n\t\t\t\tborder:\t\t'3px solid #aaa',\n\t\t\t\tbackgroundColor:'#fff',\n\t\t\t\tcursor:\t\t'wait'\n\t\t\t},\n\n\t\t\t// minimal style set used when themes are used\n\t\t\tthemedCSS: {\n\t\t\t\twidth:\t'30%',\n\t\t\t\ttop:\t'40%',\n\t\t\t\tleft:\t'35%'\n\t\t\t},\n\n\t\t\t// styles for the overlay\n\t\t\toverlayCSS: {\n\t\t\t\tbackgroundColor:\t'#000',\n\t\t\t\topacity:\t\t\t0.85,\n\t\t\t\tcursor: 'wait',\n\t\t\t\t'-webkit-border-radius': '10px',\n\t\t\t\t'-moz-border-radius': '10px',\n\t\t\t\t'border-radius': '10px'\n\t\t\t},\n\n\t\t\t// style to replace wait cursor before unblocking to correct issue\n\t\t\t// of lingering wait cursor\n\t\t\tcursorReset: 'default',\n\n\t\t\t// styles applied when using $.growlUI\n\t\t\tgrowlCSS: {\n\t\t\t\twidth:\t\t'350px',\n\t\t\t\ttop:\t\t'10px',\n\t\t\t\tleft:\t\t'',\n\t\t\t\tright:\t\t'10px',\n\t\t\t\tborder:\t\t'none',\n\t\t\t\tpadding:\t'5px',\n\t\t\t\topacity:\t0.6,\n\t\t\t\tcursor:\t\t'default',\n\t\t\t\tcolor:\t\t'#fff',\n\t\t\t\tbackgroundColor: '#000',\n\t\t\t\t'-webkit-border-radius':'10px',\n\t\t\t\t'-moz-border-radius':\t'10px',\n\t\t\t\t'border-radius':\t\t'10px'\n\t\t\t},\n\n\t\t\t// IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w\n\t\t\t// (hat tip to Jorge H. N. de Vasconcelos)\n\t\t\t/*jshint scripturl:true */\n\t\t\tiframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',\n\n\t\t\t// force usage of iframe in non-IE browsers (handy for blocking applets)\n\t\t\tforceIframe: false,\n\n\t\t\t// z-index for the blocking overlay\n\t\t\tbaseZ: 1000,\n\n\t\t\t// set these to true to have the message automatically centered\n\t\t\tcenterX: true, // <-- only effects element blocking (page block controlled via css above)\n\t\t\tcenterY: true,\n\n\t\t\t// allow body element to be stetched in ie6; this makes blocking look better\n\t\t\t// on \"short\" pages. disable if you wish to prevent changes to the body height\n\t\t\tallowBodyStretch: true,\n\n\t\t\t// enable if you want key and mouse events to be disabled for content that is blocked\n\t\t\tbindEvents: true,\n\n\t\t\t// be default blockUI will supress tab navigation from leaving blocking content\n\t\t\t// (if bindEvents is true)\n\t\t\tconstrainTabKey: true,\n\n\t\t\t// fadeIn time in millis; set to 0 to disable fadeIn on block\n\t\t\tfadeIn: 200,\n\n\t\t\t// fadeOut time in millis; set to 0 to disable fadeOut on unblock\n\t\t\tfadeOut: 400,\n\n\t\t\t// time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock\n\t\t\ttimeout: 0,\n\n\t\t\t// disable if you don't want to show the overlay\n\t\t\tshowOverlay: true,\n\n\t\t\t// if true, focus will be placed in the first available input field when\n\t\t\t// page blocking\n\t\t\tfocusInput: true,\n\n // elements that can receive focus\n focusableElements: ':input:enabled:visible',\n\n\t\t\t// suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)\n\t\t\t// no longer needed in 2012\n\t\t\t// applyPlatformOpacityRules: true,\n\n\t\t\t// callback method invoked when fadeIn has completed and blocking message is visible\n\t\t\tonBlock: null,\n\n\t\t\t// callback method invoked when unblocking has completed; the callback is\n\t\t\t// passed the element that has been unblocked (which is the window object for page\n\t\t\t// blocks) and the options that were passed to the unblock call:\n\t\t\t//\tonUnblock(element, options)\n\t\t\tonUnblock: null,\n\n\t\t\t// callback method invoked when the overlay area is clicked.\n\t\t\t// setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used.\n\t\t\tonOverlayClick: null,\n\n\t\t\t// don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493\n\t\t\tquirksmodeOffsetHack: 4,\n\n\t\t\t// class name of the message block\n\t\t\tblockMsgClass: 'blockMsg',\n\n\t\t\t// if it is already blocked, then ignore it (don't unblock and reblock)\n\t\t\tignoreIfBlocked: false\n\t\t};\n\n\t\t// private data and functions follow...\n\n\t\tvar pageBlock = null;\n\t\tvar pageBlockEls = [];\n\n\t\tfunction install(el, opts) {\n\t\t\tvar css, themedCSS;\n\t\t\tvar full = (el == window);\n\t\t\tvar msg = (opts && opts.message !== undefined ? opts.message : undefined);\n\t\t\topts = $.extend({}, $.blockUI.defaults, opts || {});\n\n\t\t\tif (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked'))\n\t\t\t\treturn;\n\n\t\t\topts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});\n\t\t\tcss = $.extend({}, $.blockUI.defaults.css, opts.css || {});\n\t\t\tif (opts.onOverlayClick)\n\t\t\t\topts.overlayCSS.cursor = 'pointer';\n\n\t\t\tthemedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});\n\t\t\tmsg = msg === undefined ? opts.message : msg;\n\n\t\t\t// remove the current block (if there is one)\n\t\t\tif (full && pageBlock)\n\t\t\t\tremove(window, {fadeOut:0});\n\n\t\t\t// if an existing element is being used as the blocking content then we capture\n\t\t\t// its current place in the DOM (and current display style) so we can restore\n\t\t\t// it when we unblock\n\t\t\tif (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {\n\t\t\t\tvar node = msg.jquery ? msg[0] : msg;\n\t\t\t\tvar data = {};\n\t\t\t\t$(el).data('blockUI.history', data);\n\t\t\t\tdata.el = node;\n\t\t\t\tdata.parent = node.parentNode;\n\t\t\t\tdata.display = node.style.display;\n\t\t\t\tdata.position = node.style.position;\n\t\t\t\tif (data.parent)\n\t\t\t\t\tdata.parent.removeChild(node);\n\t\t\t}\n\n\t\t\t$(el).data('blockUI.onUnblock', opts.onUnblock);\n\t\t\tvar z = opts.baseZ;\n\n\t\t\t// blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;\n\t\t\t// layer1 is the iframe layer which is used to supress bleed through of underlying content\n\t\t\t// layer2 is the overlay layer which has opacity and a wait cursor (by default)\n\t\t\t// layer3 is the message content that is displayed while blocking\n\t\t\tvar lyr1, lyr2, lyr3, s;\n\t\t\tif (msie || opts.forceIframe)\n\t\t\t\tlyr1 = $('');\n\t\t\telse\n\t\t\t\tlyr1 = $('
    ');\n\n\t\t\tif (opts.theme)\n\t\t\t\tlyr2 = $('
    ');\n\t\t\telse\n\t\t\t\tlyr2 = $('
    ');\n\n\t\t\tif (opts.theme && full) {\n\t\t\t\ts = '';\n\t\t\t}\n\t\t\telse if (opts.theme) {\n\t\t\t\ts = '';\n\t\t\t}\n\t\t\telse if (full) {\n\t\t\t\ts = '';\n\t\t\t}\n\t\t\telse {\n\t\t\t\ts = '';\n\t\t\t}\n\t\t\tlyr3 = $(s);\n\n\t\t\t// if we have a message, style it\n\t\t\tif (msg) {\n\t\t\t\tif (opts.theme) {\n\t\t\t\t\tlyr3.css(themedCSS);\n\t\t\t\t\tlyr3.addClass('ui-widget-content');\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tlyr3.css(css);\n\t\t\t}\n\n\t\t\t// style the overlay\n\t\t\tif (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/)\n\t\t\t lyr2.css(opts.overlayCSS);\n\t\t\tif (!opts.overlayCSS.userOverlayCSSPosition) {\n\t\t\t lyr2.css('position', full ? 'fixed' : 'absolute');\n\t\t\t}\n\n\t\t\t// make iframe layer transparent in IE\n\t\t\tif (msie || opts.forceIframe)\n\t\t\t\tlyr1.css('opacity',0.0);\n\n\t\t\t//$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);\n\t\t\tvar layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el);\n\t\t\t$.each(layers, function() {\n\t\t\t\tthis.appendTo($par);\n\t\t\t});\n\n\t\t\tif (opts.theme && opts.draggable && $.fn.draggable) {\n\t\t\t\tlyr3.draggable({\n\t\t\t\t\thandle: '.ui-dialog-titlebar',\n\t\t\t\t\tcancel: 'li'\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)\n\t\t\tvar expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0);\n\t\t\tif (ie6 || expr) {\n\t\t\t\t// give body 100% height\n\t\t\t\tif (full && opts.allowBodyStretch && $.support.boxModel)\n\t\t\t\t\t$('html,body').css('height','100%');\n\n\t\t\t\t// fix ie6 issue when blocked element has a border width\n\t\t\t\tif ((ie6 || !$.support.boxModel) && !full) {\n\t\t\t\t\tvar t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');\n\t\t\t\t\tvar fixT = t ? '(0 - '+t+')' : 0;\n\t\t\t\t\tvar fixL = l ? '(0 - '+l+')' : 0;\n\t\t\t\t}\n\n\t\t\t\t// simulate fixed position\n\t\t\t\t$.each(layers, function(i,o) {\n\t\t\t\t\tvar s = o[0].style;\n\t\t\t\t\ts.position = 'absolute';\n\t\t\t\t\tif (i < 2) {\n\t\t\t\t\t\tif (full)\n\t\t\t\t\t\t\ts.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + \"px\"');\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ts.setExpression('height','this.parentNode.offsetHeight + \"px\"');\n\t\t\t\t\t\tif (full)\n\t\t\t\t\t\t\ts.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + \"px\"');\n\t\t\t\t\t\telse\n s.setExpression('width', 'this.parentNode.offsetWidth + \"px\"');\n\t\t\t\t\t\tif (fixL) s.setExpression('left', fixL);\n\t\t\t\t\t\tif (fixT) s.setExpression('top', fixT);\n\t\t\t\t\t}\n\t\t\t\t\telse if (opts.centerY) {\n\t\t\t\t\t\tif (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + \"px\"');\n\t\t\t\t\t\ts.marginTop = 0;\n\t\t\t\t\t}\n\t\t\t\t\telse if (!opts.centerY && full) {\n\t\t\t\t\t\tvar top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0;\n\t\t\t\t\t\tvar expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + \"px\"';\n\t\t\t\t\t\ts.setExpression('top',expression);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// show the message\n\t\t\tif (msg) {\n\t\t\t\tif (opts.theme)\n\t\t\t\t\tlyr3.find('.ui-widget-content').append(msg);\n\t\t\t\telse\n\t\t\t\t\tlyr3.append(msg);\n\t\t\t\tif (msg.jquery || msg.nodeType)\n\t\t\t\t\t$(msg).show();\n\t\t\t}\n\n\t\t\tif ((msie || opts.forceIframe) && opts.showOverlay)\n\t\t\t\tlyr1.show(); // opacity is zero\n\t\t\tif (opts.fadeIn) {\n\t\t\t\tvar cb = opts.onBlock ? opts.onBlock : noOp;\n\t\t\t\tvar cb1 = (opts.showOverlay && !msg) ? cb : noOp;\n\t\t\t\tvar cb2 = msg ? cb : noOp;\n\t\t\t\tif (opts.showOverlay)\n\t\t\t\t\tlyr2._fadeIn(opts.fadeIn, cb1);\n\t\t\t\tif (msg)\n\t\t\t\t\tlyr3._fadeIn(opts.fadeIn, cb2);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (opts.showOverlay)\n\t\t\t\t\tlyr2.show();\n\t\t\t\tif (msg)\n\t\t\t\t\tlyr3.show();\n\t\t\t\tif (opts.onBlock)\n\t\t\t\t\topts.onBlock.bind(lyr3)();\n\t\t\t}\n\n\t\t\t// bind key and mouse events\n\t\t\tbind(1, el, opts);\n\n\t\t\tif (full) {\n\t\t\t\tpageBlock = lyr3[0];\n\t\t\t\tpageBlockEls = $(opts.focusableElements,pageBlock);\n\t\t\t\tif (opts.focusInput)\n\t\t\t\t\tsetTimeout(focus, 20);\n\t\t\t}\n\t\t\telse\n\t\t\t\tcenter(lyr3[0], opts.centerX, opts.centerY);\n\n\t\t\tif (opts.timeout) {\n\t\t\t\t// auto-unblock\n\t\t\t\tvar to = setTimeout(function() {\n\t\t\t\t\tif (full)\n\t\t\t\t\t\t$.unblockUI(opts);\n\t\t\t\t\telse\n\t\t\t\t\t\t$(el).unblock(opts);\n\t\t\t\t}, opts.timeout);\n\t\t\t\t$(el).data('blockUI.timeout', to);\n\t\t\t}\n\t\t}\n\n\t\t// remove the block\n\t\tfunction remove(el, opts) {\n\t\t\tvar count;\n\t\t\tvar full = (el == window);\n\t\t\tvar $el = $(el);\n\t\t\tvar data = $el.data('blockUI.history');\n\t\t\tvar to = $el.data('blockUI.timeout');\n\t\t\tif (to) {\n\t\t\t\tclearTimeout(to);\n\t\t\t\t$el.removeData('blockUI.timeout');\n\t\t\t}\n\t\t\topts = $.extend({}, $.blockUI.defaults, opts || {});\n\t\t\tbind(0, el, opts); // unbind events\n\n\t\t\tif (opts.onUnblock === null) {\n\t\t\t\topts.onUnblock = $el.data('blockUI.onUnblock');\n\t\t\t\t$el.removeData('blockUI.onUnblock');\n\t\t\t}\n\n\t\t\tvar els;\n\t\t\tif (full) // crazy selector to handle odd field errors in ie6/7\n\t\t\t\tels = $('body').children().filter('.blockUI').add('body > .blockUI');\n\t\t\telse\n\t\t\t\tels = $el.find('>.blockUI');\n\n\t\t\t// fix cursor issue\n\t\t\tif ( opts.cursorReset ) {\n\t\t\t\tif ( els.length > 1 )\n\t\t\t\t\tels[1].style.cursor = opts.cursorReset;\n\t\t\t\tif ( els.length > 2 )\n\t\t\t\t\tels[2].style.cursor = opts.cursorReset;\n\t\t\t}\n\n\t\t\tif (full)\n\t\t\t\tpageBlock = pageBlockEls = null;\n\n\t\t\tif (opts.fadeOut) {\n\t\t\t\tcount = els.length;\n\t\t\t\tels.stop().fadeOut(opts.fadeOut, function() {\n\t\t\t\t\tif ( --count === 0)\n\t\t\t\t\t\treset(els,data,opts,el);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse\n\t\t\t\treset(els, data, opts, el);\n\t\t}\n\n\t\t// move blocking element back into the DOM where it started\n\t\tfunction reset(els,data,opts,el) {\n\t\t\tvar $el = $(el);\n\t\t\tif ( $el.data('blockUI.isBlocked') )\n\t\t\t\treturn;\n\n\t\t\tels.each(function(i,o) {\n\t\t\t\t// remove via DOM calls so we don't lose event handlers\n\t\t\t\tif (this.parentNode)\n\t\t\t\t\tthis.parentNode.removeChild(this);\n\t\t\t});\n\n\t\t\tif (data && data.el) {\n\t\t\t\tdata.el.style.display = data.display;\n\t\t\t\tdata.el.style.position = data.position;\n\t\t\t\tdata.el.style.cursor = 'default'; // #59\n\t\t\t\tif (data.parent)\n\t\t\t\t\tdata.parent.appendChild(data.el);\n\t\t\t\t$el.removeData('blockUI.history');\n\t\t\t}\n\n\t\t\tif ($el.data('blockUI.static')) {\n\t\t\t\t$el.css('position', 'static'); // #22\n\t\t\t}\n\n\t\t\tif (typeof opts.onUnblock == 'function')\n\t\t\t\topts.onUnblock(el,opts);\n\n\t\t\t// fix issue in Safari 6 where block artifacts remain until reflow\n\t\t\tvar body = $(document.body), w = body.width(), cssW = body[0].style.width;\n\t\t\tbody.width(w-1).width(w);\n\t\t\tbody[0].style.width = cssW;\n\t\t}\n\n\t\t// bind/unbind the handler\n\t\tfunction bind(b, el, opts) {\n\t\t\tvar full = el == window, $el = $(el);\n\n\t\t\t// don't bother unbinding if there is nothing to unbind\n\t\t\tif (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))\n\t\t\t\treturn;\n\n\t\t\t$el.data('blockUI.isBlocked', b);\n\n\t\t\t// don't bind events when overlay is not in use or if bindEvents is false\n\t\t\tif (!full || !opts.bindEvents || (b && !opts.showOverlay))\n\t\t\t\treturn;\n\n\t\t\t// bind anchors and inputs for mouse and key events\n\t\t\tvar events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove';\n\t\t\tif (b)\n\t\t\t\t$(document).bind(events, opts, handler);\n\t\t\telse\n\t\t\t\t$(document).unbind(events, handler);\n\n\t\t// former impl...\n\t\t//\t\tvar $e = $('a,:input');\n\t\t//\t\tb ? $e.bind(events, opts, handler) : $e.unbind(events, handler);\n\t\t}\n\n\t\t// event handler to suppress keyboard/mouse events when blocking\n\t\tfunction handler(e) {\n\t\t\t// allow tab navigation (conditionally)\n\t\t\tif (e.type === 'keydown' && e.keyCode && e.keyCode == 9) {\n\t\t\t\tif (pageBlock && e.data.constrainTabKey) {\n\t\t\t\t\tvar els = pageBlockEls;\n\t\t\t\t\tvar fwd = !e.shiftKey && e.target === els[els.length-1];\n\t\t\t\t\tvar back = e.shiftKey && e.target === els[0];\n\t\t\t\t\tif (fwd || back) {\n\t\t\t\t\t\tsetTimeout(function(){focus(back);},10);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar opts = e.data;\n\t\t\tvar target = $(e.target);\n\t\t\tif (target.hasClass('blockOverlay') && opts.onOverlayClick)\n\t\t\t\topts.onOverlayClick(e);\n\n\t\t\t// allow events within the message content\n\t\t\tif (target.parents('div.' + opts.blockMsgClass).length > 0)\n\t\t\t\treturn true;\n\n\t\t\t// allow events for content that is not being blocked\n\t\t\treturn target.parents().children().filter('div.blockUI').length === 0;\n\t\t}\n\n\t\tfunction focus(back) {\n\t\t\tif (!pageBlockEls)\n\t\t\t\treturn;\n\t\t\tvar e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];\n\t\t\tif (e)\n\t\t\t\te.focus();\n\t\t}\n\n function center(el, x, y) {\n\t\t\tvar p = el.parentNode, s = el.style;\n\t\t\tvar l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');\n\t\t\tvar t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');\n\t\t\tif (x) s.left = l > 0 ? (l+'px') : '0';\n\t\t\tif (y) s.top = t > 0 ? (t+'px') : '0';\n\t\t}\n\n\t\tfunction sz(el, p) {\n\t\t\treturn parseInt($.css(el,p),10)||0;\n\t\t}\n\n\t}\n\n\n\t/*global define:true */\n\tif (typeof define === 'function' && define.amd && define.amd.jQuery) {\n\t\tdefine(['jquery'], setup);\n\t} else {\n\t\tsetup(jQuery);\n\t}\n\n})();\n","/*!\n* inputmask.js\n* https://github.com/RobinHerbots/Inputmask\n* Copyright (c) 2010 - 2017 Robin Herbots\n* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)\n* Version: 3.3.6-49\n*/\n\n!function(factory) {\n window.Inputmask = factory(window.dependencyLib || jQuery, window, document);\n}(function($, window, document, undefined) {\n function Inputmask(alias, options, internal) {\n if (!(this instanceof Inputmask)) return new Inputmask(alias, options, internal);\n this.el = undefined, this.events = {}, this.maskset = undefined, this.refreshValue = !1,\n !0 !== internal && ($.isPlainObject(alias) ? options = alias : (options = options || {},\n options.alias = alias), this.opts = $.extend(!0, {}, this.defaults, options), this.noMasksCache = options && options.definitions !== undefined,\n this.userOptions = options || {}, this.isRTL = this.opts.numericInput, resolveAlias(this.opts.alias, options, this.opts));\n }\n function resolveAlias(aliasStr, options, opts) {\n var aliasDefinition = Inputmask.prototype.aliases[aliasStr];\n return aliasDefinition ? (aliasDefinition.alias && resolveAlias(aliasDefinition.alias, undefined, opts),\n $.extend(!0, opts, aliasDefinition), $.extend(!0, opts, options), !0) : (null === opts.mask && (opts.mask = aliasStr),\n !1);\n }\n function generateMaskSet(opts, nocache) {\n function generateMask(mask, metadata, opts) {\n var regexMask = !1;\n if (null !== mask && \"\" !== mask || (regexMask = null !== opts.regex, regexMask ? (mask = opts.regex,\n mask = mask.replace(/^(\\^)(.*)(\\$)$/, \"$2\")) : mask = \"*{*}\"), 1 === mask.length && !1 === opts.greedy && 0 !== opts.repeat && (opts.placeholder = \"\"),\n opts.repeat > 0 || \"*\" === opts.repeat || \"+\" === opts.repeat) {\n var repeatStart = \"*\" === opts.repeat ? 0 : \"+\" === opts.repeat ? 1 : opts.repeat;\n mask = opts.groupmarker.start + mask + opts.groupmarker.end + opts.quantifiermarker.start + repeatStart + \",\" + opts.repeat + opts.quantifiermarker.end;\n }\n var masksetDefinition, maskdefKey = regexMask ? \"regex_\" + opts.regex : opts.numericInput ? mask.split(\"\").reverse().join(\"\") : mask;\n return Inputmask.prototype.masksCache[maskdefKey] === undefined || !0 === nocache ? (masksetDefinition = {\n mask: mask,\n maskToken: Inputmask.prototype.analyseMask(mask, regexMask, opts),\n validPositions: {},\n _buffer: undefined,\n buffer: undefined,\n tests: {},\n metadata: metadata,\n maskLength: undefined\n }, !0 !== nocache && (Inputmask.prototype.masksCache[maskdefKey] = masksetDefinition,\n masksetDefinition = $.extend(!0, {}, Inputmask.prototype.masksCache[maskdefKey]))) : masksetDefinition = $.extend(!0, {}, Inputmask.prototype.masksCache[maskdefKey]),\n masksetDefinition;\n }\n if ($.isFunction(opts.mask) && (opts.mask = opts.mask(opts)), $.isArray(opts.mask)) {\n if (opts.mask.length > 1) {\n opts.keepStatic = null === opts.keepStatic || opts.keepStatic;\n var altMask = opts.groupmarker.start;\n return $.each(opts.numericInput ? opts.mask.reverse() : opts.mask, function(ndx, msk) {\n altMask.length > 1 && (altMask += opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start),\n msk.mask === undefined || $.isFunction(msk.mask) ? altMask += msk : altMask += msk.mask;\n }), altMask += opts.groupmarker.end, generateMask(altMask, opts.mask, opts);\n }\n opts.mask = opts.mask.pop();\n }\n return opts.mask && opts.mask.mask !== undefined && !$.isFunction(opts.mask.mask) ? generateMask(opts.mask.mask, opts.mask, opts) : generateMask(opts.mask, opts.mask, opts);\n }\n function maskScope(actionObj, maskset, opts) {\n function getMaskTemplate(baseOnInput, minimalPos, includeMode) {\n minimalPos = minimalPos || 0;\n var ndxIntlzr, test, testPos, maskTemplate = [], pos = 0, lvp = getLastValidPosition();\n -1 === (maxLength = el !== undefined ? el.maxLength : undefined) && (maxLength = undefined);\n do {\n !0 === baseOnInput && getMaskSet().validPositions[pos] ? (testPos = getMaskSet().validPositions[pos],\n test = testPos.match, ndxIntlzr = testPos.locator.slice(), maskTemplate.push(!0 === includeMode ? testPos.input : !1 === includeMode ? test.nativeDef : getPlaceholder(pos, test))) : (testPos = getTestTemplate(pos, ndxIntlzr, pos - 1),\n test = testPos.match, ndxIntlzr = testPos.locator.slice(), (!1 === opts.jitMasking || pos < lvp || \"number\" == typeof opts.jitMasking && isFinite(opts.jitMasking) && opts.jitMasking > pos) && maskTemplate.push(!1 === includeMode ? test.nativeDef : getPlaceholder(pos, test))),\n pos++;\n } while ((maxLength === undefined || pos < maxLength) && (null !== test.fn || \"\" !== test.def) || minimalPos > pos);\n return \"\" === maskTemplate[maskTemplate.length - 1] && maskTemplate.pop(), getMaskSet().maskLength = pos + 1,\n maskTemplate;\n }\n function getMaskSet() {\n return maskset;\n }\n function resetMaskSet(soft) {\n var maskset = getMaskSet();\n maskset.buffer = undefined, !0 !== soft && (maskset.validPositions = {}, maskset.p = 0);\n }\n function getLastValidPosition(closestTo, strict, validPositions) {\n var before = -1, after = -1, valids = validPositions || getMaskSet().validPositions;\n closestTo === undefined && (closestTo = -1);\n for (var posNdx in valids) {\n var psNdx = parseInt(posNdx);\n valids[psNdx] && (strict || !0 !== valids[psNdx].generatedInput) && (psNdx <= closestTo && (before = psNdx),\n psNdx >= closestTo && (after = psNdx));\n }\n return -1 !== before && closestTo - before > 1 || after < closestTo ? before : after;\n }\n function stripValidPositions(start, end, nocheck, strict) {\n var i, startPos = start, positionsClone = $.extend(!0, {}, getMaskSet().validPositions), needsValidation = !1;\n for (getMaskSet().p = start, i = end - 1; i >= startPos; i--) getMaskSet().validPositions[i] !== undefined && (!0 !== nocheck && (!getMaskSet().validPositions[i].match.optionality && function(pos) {\n var posMatch = getMaskSet().validPositions[pos];\n if (posMatch !== undefined && null === posMatch.match.fn) {\n var prevMatch = getMaskSet().validPositions[pos - 1], nextMatch = getMaskSet().validPositions[pos + 1];\n return prevMatch !== undefined && nextMatch !== undefined;\n }\n return !1;\n }(i) || !1 === opts.canClearPosition(getMaskSet(), i, getLastValidPosition(), strict, opts)) || delete getMaskSet().validPositions[i]);\n for (resetMaskSet(!0), i = startPos + 1; i <= getLastValidPosition(); ) {\n for (;getMaskSet().validPositions[startPos] !== undefined; ) startPos++;\n if (i < startPos && (i = startPos + 1), getMaskSet().validPositions[i] === undefined && isMask(i)) i++; else {\n var t = getTestTemplate(i);\n !1 === needsValidation && positionsClone[startPos] && positionsClone[startPos].match.def === t.match.def ? (getMaskSet().validPositions[startPos] = $.extend(!0, {}, positionsClone[startPos]),\n getMaskSet().validPositions[startPos].input = t.input, delete getMaskSet().validPositions[i],\n i++) : positionCanMatchDefinition(startPos, t.match.def) ? !1 !== isValid(startPos, t.input || getPlaceholder(i), !0) && (delete getMaskSet().validPositions[i],\n i++, needsValidation = !0) : isMask(i) || (i++, startPos--), startPos++;\n }\n }\n resetMaskSet(!0);\n }\n function determineTestTemplate(tests, guessNextBest) {\n for (var testPos, testPositions = tests, lvp = getLastValidPosition(), lvTest = getMaskSet().validPositions[lvp] || getTests(0)[0], lvTestAltArr = lvTest.alternation !== undefined ? lvTest.locator[lvTest.alternation].toString().split(\",\") : [], ndx = 0; ndx < testPositions.length && (testPos = testPositions[ndx],\n !(testPos.match && (opts.greedy && !0 !== testPos.match.optionalQuantifier || (!1 === testPos.match.optionality || !1 === testPos.match.newBlockMarker) && !0 !== testPos.match.optionalQuantifier) && (lvTest.alternation === undefined || lvTest.alternation !== testPos.alternation || testPos.locator[lvTest.alternation] !== undefined && checkAlternationMatch(testPos.locator[lvTest.alternation].toString().split(\",\"), lvTestAltArr))) || !0 === guessNextBest && (null !== testPos.match.fn || /[0-9a-bA-Z]/.test(testPos.match.def))); ndx++) ;\n return testPos;\n }\n function getTestTemplate(pos, ndxIntlzr, tstPs) {\n return getMaskSet().validPositions[pos] || determineTestTemplate(getTests(pos, ndxIntlzr ? ndxIntlzr.slice() : ndxIntlzr, tstPs));\n }\n function getTest(pos) {\n return getMaskSet().validPositions[pos] ? getMaskSet().validPositions[pos] : getTests(pos)[0];\n }\n function positionCanMatchDefinition(pos, def) {\n for (var valid = !1, tests = getTests(pos), tndx = 0; tndx < tests.length; tndx++) if (tests[tndx].match && tests[tndx].match.def === def) {\n valid = !0;\n break;\n }\n return valid;\n }\n function getTests(pos, ndxIntlzr, tstPs) {\n function resolveTestFromToken(maskToken, ndxInitializer, loopNdx, quantifierRecurse) {\n function handleMatch(match, loopNdx, quantifierRecurse) {\n function isFirstMatch(latestMatch, tokenGroup) {\n var firstMatch = 0 === $.inArray(latestMatch, tokenGroup.matches);\n return firstMatch || $.each(tokenGroup.matches, function(ndx, match) {\n if (!0 === match.isQuantifier && (firstMatch = isFirstMatch(latestMatch, tokenGroup.matches[ndx - 1]))) return !1;\n }), firstMatch;\n }\n function resolveNdxInitializer(pos, alternateNdx, targetAlternation) {\n var bestMatch, indexPos;\n if (getMaskSet().validPositions[pos - 1] && targetAlternation && getMaskSet().tests[pos]) for (var vpAlternation = getMaskSet().validPositions[pos - 1].locator, tpAlternation = getMaskSet().tests[pos][0].locator, i = 0; i < targetAlternation; i++) if (vpAlternation[i] !== tpAlternation[i]) return vpAlternation[targetAlternation];\n return (getMaskSet().tests[pos] || getMaskSet().validPositions[pos]) && $.each(getMaskSet().tests[pos] || [ getMaskSet().validPositions[pos] ], function(ndx, lmnt) {\n var alternation = targetAlternation !== undefined ? targetAlternation : lmnt.alternation, ndxPos = lmnt.locator[alternation] !== undefined ? lmnt.locator[alternation].toString().indexOf(alternateNdx) : -1;\n (indexPos === undefined || ndxPos < indexPos) && -1 !== ndxPos && (bestMatch = lmnt,\n indexPos = ndxPos);\n }), bestMatch ? bestMatch.locator.slice((targetAlternation !== undefined ? targetAlternation : bestMatch.alternation) + 1) : targetAlternation !== undefined ? resolveNdxInitializer(pos, alternateNdx) : undefined;\n }\n if (testPos > 1e4) throw \"Inputmask: There is probably an error in your mask definition or in the code. Create an issue on github with an example of the mask you are using. \" + getMaskSet().mask;\n if (testPos === pos && match.matches === undefined) return matches.push({\n match: match,\n locator: loopNdx.reverse(),\n cd: cacheDependency\n }), !0;\n if (match.matches !== undefined) {\n if (match.isGroup && quantifierRecurse !== match) {\n if (match = handleMatch(maskToken.matches[$.inArray(match, maskToken.matches) + 1], loopNdx)) return !0;\n } else if (match.isOptional) {\n var optionalToken = match;\n if (match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse)) {\n if (latestMatch = matches[matches.length - 1].match, !isFirstMatch(latestMatch, optionalToken)) return !0;\n insertStop = !0, testPos = pos;\n }\n } else if (match.isAlternator) {\n var maltMatches, alternateToken = match, malternateMatches = [], currentMatches = matches.slice(), loopNdxCnt = loopNdx.length, altIndex = ndxInitializer.length > 0 ? ndxInitializer.shift() : -1;\n if (-1 === altIndex || \"string\" == typeof altIndex) {\n var amndx, currentPos = testPos, ndxInitializerClone = ndxInitializer.slice(), altIndexArr = [];\n if (\"string\" == typeof altIndex) altIndexArr = altIndex.split(\",\"); else for (amndx = 0; amndx < alternateToken.matches.length; amndx++) altIndexArr.push(amndx);\n for (var ndx = 0; ndx < altIndexArr.length; ndx++) {\n if (amndx = parseInt(altIndexArr[ndx]), matches = [], ndxInitializer = resolveNdxInitializer(testPos, amndx, loopNdxCnt) || ndxInitializerClone.slice(),\n !0 !== (match = handleMatch(alternateToken.matches[amndx] || maskToken.matches[amndx], [ amndx ].concat(loopNdx), quantifierRecurse) || match) && match !== undefined && altIndexArr[altIndexArr.length - 1] < alternateToken.matches.length) {\n var ntndx = $.inArray(match, maskToken.matches) + 1;\n maskToken.matches.length > ntndx && (match = handleMatch(maskToken.matches[ntndx], [ ntndx ].concat(loopNdx.slice(1, loopNdx.length)), quantifierRecurse)) && (altIndexArr.push(ntndx.toString()),\n $.each(matches, function(ndx, lmnt) {\n lmnt.alternation = loopNdx.length - 1;\n }));\n }\n maltMatches = matches.slice(), testPos = currentPos, matches = [];\n for (var ndx1 = 0; ndx1 < maltMatches.length; ndx1++) {\n var altMatch = maltMatches[ndx1], dropMatch = !1;\n altMatch.alternation = altMatch.alternation || loopNdxCnt;\n for (var ndx2 = 0; ndx2 < malternateMatches.length; ndx2++) {\n var altMatch2 = malternateMatches[ndx2];\n if (\"string\" != typeof altIndex || -1 !== $.inArray(altMatch.locator[altMatch.alternation].toString(), altIndexArr)) {\n if (function(source, target) {\n return source.match.nativeDef === target.match.nativeDef || source.match.def === target.match.nativeDef || source.match.nativeDef === target.match.def;\n }(altMatch, altMatch2)) {\n dropMatch = !0, altMatch.alternation == altMatch2.alternation && -1 === altMatch2.locator[altMatch2.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) && (altMatch2.locator[altMatch2.alternation] = altMatch2.locator[altMatch2.alternation] + \",\" + altMatch.locator[altMatch.alternation],\n altMatch2.alternation = altMatch.alternation), altMatch.match.nativeDef === altMatch2.match.def && (altMatch.locator[altMatch.alternation] = altMatch2.locator[altMatch2.alternation],\n malternateMatches.splice(malternateMatches.indexOf(altMatch2), 1, altMatch));\n break;\n }\n if (altMatch.match.def === altMatch2.match.def) {\n dropMatch = !1;\n break;\n }\n if (function(source, target) {\n return null === source.match.fn && null !== target.match.fn && target.match.fn.test(source.match.def, getMaskSet(), pos, !1, opts, !1);\n }(altMatch, altMatch2) || function(source, target) {\n return null !== source.match.fn && null !== target.match.fn && target.match.fn.test(source.match.def.replace(/[\\[\\]]/g, \"\"), getMaskSet(), pos, !1, opts, !1);\n }(altMatch, altMatch2)) {\n altMatch.alternation == altMatch2.alternation && -1 === altMatch.locator[altMatch.alternation].toString().indexOf(altMatch2.locator[altMatch2.alternation].toString().split(\"\")[0]) && (altMatch.na = altMatch.na || altMatch.locator[altMatch.alternation].toString(),\n -1 === altMatch.na.indexOf(altMatch.locator[altMatch.alternation].toString().split(\"\")[0]) && (altMatch.na = altMatch.na + \",\" + altMatch.locator[altMatch2.alternation].toString().split(\"\")[0]),\n dropMatch = !0, altMatch.locator[altMatch.alternation] = altMatch2.locator[altMatch2.alternation].toString().split(\"\")[0] + \",\" + altMatch.locator[altMatch.alternation],\n malternateMatches.splice(malternateMatches.indexOf(altMatch2), 0, altMatch));\n break;\n }\n }\n }\n dropMatch || malternateMatches.push(altMatch);\n }\n }\n \"string\" == typeof altIndex && (malternateMatches = $.map(malternateMatches, function(lmnt, ndx) {\n if (isFinite(ndx)) {\n var alternation = lmnt.alternation, altLocArr = lmnt.locator[alternation].toString().split(\",\");\n lmnt.locator[alternation] = undefined, lmnt.alternation = undefined;\n for (var alndx = 0; alndx < altLocArr.length; alndx++) -1 !== $.inArray(altLocArr[alndx], altIndexArr) && (lmnt.locator[alternation] !== undefined ? (lmnt.locator[alternation] += \",\",\n lmnt.locator[alternation] += altLocArr[alndx]) : lmnt.locator[alternation] = parseInt(altLocArr[alndx]),\n lmnt.alternation = alternation);\n if (lmnt.locator[alternation] !== undefined) return lmnt;\n }\n })), matches = currentMatches.concat(malternateMatches), testPos = pos, insertStop = matches.length > 0,\n match = malternateMatches.length > 0, ndxInitializer = ndxInitializerClone.slice();\n } else match = handleMatch(alternateToken.matches[altIndex] || maskToken.matches[altIndex], [ altIndex ].concat(loopNdx), quantifierRecurse);\n if (match) return !0;\n } else if (match.isQuantifier && quantifierRecurse !== maskToken.matches[$.inArray(match, maskToken.matches) - 1]) for (var qt = match, qndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; qndx < (isNaN(qt.quantifier.max) ? qndx + 1 : qt.quantifier.max) && testPos <= pos; qndx++) {\n var tokenGroup = maskToken.matches[$.inArray(qt, maskToken.matches) - 1];\n if (match = handleMatch(tokenGroup, [ qndx ].concat(loopNdx), tokenGroup)) {\n if (latestMatch = matches[matches.length - 1].match, latestMatch.optionalQuantifier = qndx > qt.quantifier.min - 1,\n isFirstMatch(latestMatch, tokenGroup)) {\n if (qndx > qt.quantifier.min - 1) {\n insertStop = !0, testPos = pos;\n break;\n }\n return !0;\n }\n return !0;\n }\n } else if (match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse)) return !0;\n } else testPos++;\n }\n for (var tndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; tndx < maskToken.matches.length; tndx++) if (!0 !== maskToken.matches[tndx].isQuantifier) {\n var match = handleMatch(maskToken.matches[tndx], [ tndx ].concat(loopNdx), quantifierRecurse);\n if (match && testPos === pos) return match;\n if (testPos > pos) break;\n }\n }\n function filterTests(tests) {\n return opts.keepStatic && pos > 0 && tests.length > 1 + (\"\" === tests[tests.length - 1].match.def ? 1 : 0) && !0 !== tests[0].match.optionality && !0 !== tests[0].match.optionalQuantifier && null === tests[0].match.fn && !/[0-9a-bA-Z]/.test(tests[0].match.def) ? [ determineTestTemplate(tests) ] : tests;\n }\n var latestMatch, maskTokens = getMaskSet().maskToken, testPos = ndxIntlzr ? tstPs : 0, ndxInitializer = ndxIntlzr ? ndxIntlzr.slice() : [ 0 ], matches = [], insertStop = !1, cacheDependency = ndxIntlzr ? ndxIntlzr.join(\"\") : \"\";\n if (pos > -1) {\n if (ndxIntlzr === undefined) {\n for (var test, previousPos = pos - 1; (test = getMaskSet().validPositions[previousPos] || getMaskSet().tests[previousPos]) === undefined && previousPos > -1; ) previousPos--;\n test !== undefined && previousPos > -1 && (ndxInitializer = function(tests) {\n var locator = [];\n return $.isArray(tests) || (tests = [ tests ]), tests.length > 0 && (tests[0].alternation === undefined ? (locator = determineTestTemplate(tests.slice()).locator.slice(),\n 0 === locator.length && (locator = tests[0].locator.slice())) : $.each(tests, function(ndx, tst) {\n if (\"\" !== tst.def) if (0 === locator.length) locator = tst.locator.slice(); else for (var i = 0; i < locator.length; i++) tst.locator[i] && -1 === locator[i].toString().indexOf(tst.locator[i]) && (locator[i] += \",\" + tst.locator[i]);\n })), locator;\n }(test), cacheDependency = ndxInitializer.join(\"\"), testPos = previousPos);\n }\n if (getMaskSet().tests[pos] && getMaskSet().tests[pos][0].cd === cacheDependency) return filterTests(getMaskSet().tests[pos]);\n for (var mtndx = ndxInitializer.shift(); mtndx < maskTokens.length; mtndx++) {\n if (resolveTestFromToken(maskTokens[mtndx], ndxInitializer, [ mtndx ]) && testPos === pos || testPos > pos) break;\n }\n }\n return (0 === matches.length || insertStop) && matches.push({\n match: {\n fn: null,\n cardinality: 0,\n optionality: !0,\n casing: null,\n def: \"\",\n placeholder: \"\"\n },\n locator: [],\n cd: cacheDependency\n }), ndxIntlzr !== undefined && getMaskSet().tests[pos] ? filterTests($.extend(!0, [], matches)) : (getMaskSet().tests[pos] = $.extend(!0, [], matches),\n filterTests(getMaskSet().tests[pos]));\n }\n function getBufferTemplate() {\n return getMaskSet()._buffer === undefined && (getMaskSet()._buffer = getMaskTemplate(!1, 1),\n getMaskSet().buffer === undefined && (getMaskSet().buffer = getMaskSet()._buffer.slice())),\n getMaskSet()._buffer;\n }\n function getBuffer(noCache) {\n return getMaskSet().buffer !== undefined && !0 !== noCache || (getMaskSet().buffer = getMaskTemplate(!0, getLastValidPosition(), !0)),\n getMaskSet().buffer;\n }\n function refreshFromBuffer(start, end, buffer) {\n var i, p;\n if (!0 === start) resetMaskSet(), start = 0, end = buffer.length; else for (i = start; i < end; i++) delete getMaskSet().validPositions[i];\n for (p = start, i = start; i < end; i++) if (resetMaskSet(!0), buffer[i] !== opts.skipOptionalPartCharacter) {\n var valResult = isValid(p, buffer[i], !0, !0);\n !1 !== valResult && (resetMaskSet(!0), p = valResult.caret !== undefined ? valResult.caret : valResult.pos + 1);\n }\n }\n function casing(elem, test, pos) {\n switch (opts.casing || test.casing) {\n case \"upper\":\n elem = elem.toUpperCase();\n break;\n\n case \"lower\":\n elem = elem.toLowerCase();\n break;\n\n case \"title\":\n var posBefore = getMaskSet().validPositions[pos - 1];\n elem = 0 === pos || posBefore && posBefore.input === String.fromCharCode(Inputmask.keyCode.SPACE) ? elem.toUpperCase() : elem.toLowerCase();\n }\n return elem;\n }\n function checkAlternationMatch(altArr1, altArr2, na) {\n for (var naNdx, altArrC = opts.greedy ? altArr2 : altArr2.slice(0, 1), isMatch = !1, naArr = na !== undefined ? na.split(\",\") : [], i = 0; i < naArr.length; i++) -1 !== (naNdx = altArr1.indexOf(naArr[i])) && altArr1.splice(naNdx, 1);\n for (var alndx = 0; alndx < altArr1.length; alndx++) if (-1 !== $.inArray(altArr1[alndx], altArrC)) {\n isMatch = !0;\n break;\n }\n return isMatch;\n }\n function isValid(pos, c, strict, fromSetValid, fromAlternate) {\n function isSelection(posObj) {\n var selection = isRTL ? posObj.begin - posObj.end > 1 || posObj.begin - posObj.end == 1 : posObj.end - posObj.begin > 1 || posObj.end - posObj.begin == 1;\n return selection && 0 === posObj.begin && posObj.end === getMaskSet().maskLength ? \"full\" : selection;\n }\n function _isValid(position, c, strict) {\n var rslt = !1;\n return $.each(getTests(position), function(ndx, tst) {\n for (var test = tst.match, loopend = c ? 1 : 0, chrs = \"\", i = test.cardinality; i > loopend; i--) chrs += getBufferElement(position - (i - 1));\n if (c && (chrs += c), getBuffer(!0), !1 !== (rslt = null != test.fn ? test.fn.test(chrs, getMaskSet(), position, strict, opts, isSelection(pos)) : (c === test.def || c === opts.skipOptionalPartCharacter) && \"\" !== test.def && {\n c: getPlaceholder(position, test, !0) || test.def,\n pos: position\n })) {\n var elem = rslt.c !== undefined ? rslt.c : c;\n elem = elem === opts.skipOptionalPartCharacter && null === test.fn ? getPlaceholder(position, test, !0) || test.def : elem;\n var validatedPos = position, possibleModifiedBuffer = getBuffer();\n if (rslt.remove !== undefined && ($.isArray(rslt.remove) || (rslt.remove = [ rslt.remove ]),\n $.each(rslt.remove.sort(function(a, b) {\n return b - a;\n }), function(ndx, lmnt) {\n stripValidPositions(lmnt, lmnt + 1, !0);\n })), rslt.insert !== undefined && ($.isArray(rslt.insert) || (rslt.insert = [ rslt.insert ]),\n $.each(rslt.insert.sort(function(a, b) {\n return a - b;\n }), function(ndx, lmnt) {\n isValid(lmnt.pos, lmnt.c, !0, fromSetValid);\n })), rslt.refreshFromBuffer) {\n var refresh = rslt.refreshFromBuffer;\n if (refreshFromBuffer(!0 === refresh ? refresh : refresh.start, refresh.end, possibleModifiedBuffer),\n rslt.pos === undefined && rslt.c === undefined) return rslt.pos = getLastValidPosition(),\n !1;\n if ((validatedPos = rslt.pos !== undefined ? rslt.pos : position) !== position) return rslt = $.extend(rslt, isValid(validatedPos, elem, !0, fromSetValid)),\n !1;\n } else if (!0 !== rslt && rslt.pos !== undefined && rslt.pos !== position && (validatedPos = rslt.pos,\n refreshFromBuffer(position, validatedPos, getBuffer().slice()), validatedPos !== position)) return rslt = $.extend(rslt, isValid(validatedPos, elem, !0)),\n !1;\n return (!0 === rslt || rslt.pos !== undefined || rslt.c !== undefined) && (ndx > 0 && resetMaskSet(!0),\n setValidPosition(validatedPos, $.extend({}, tst, {\n input: casing(elem, test, validatedPos)\n }), fromSetValid, isSelection(pos)) || (rslt = !1), !1);\n }\n }), rslt;\n }\n function setValidPosition(pos, validTest, fromSetValid, isSelection) {\n if (isSelection || opts.insertMode && getMaskSet().validPositions[pos] !== undefined && fromSetValid === undefined) {\n var i, positionsClone = $.extend(!0, {}, getMaskSet().validPositions), lvp = getLastValidPosition(undefined, !0);\n for (i = pos; i <= lvp; i++) delete getMaskSet().validPositions[i];\n getMaskSet().validPositions[pos] = $.extend(!0, {}, validTest);\n var j, valid = !0, vps = getMaskSet().validPositions, needsValidation = !1, initialLength = getMaskSet().maskLength;\n for (i = j = pos; i <= lvp; i++) {\n var t = positionsClone[i];\n if (t !== undefined) for (var posMatch = j; posMatch < getMaskSet().maskLength && (null === t.match.fn && vps[i] && (!0 === vps[i].match.optionalQuantifier || !0 === vps[i].match.optionality) || null != t.match.fn); ) {\n if (posMatch++, !1 === needsValidation && positionsClone[posMatch] && positionsClone[posMatch].match.def === t.match.def) getMaskSet().validPositions[posMatch] = $.extend(!0, {}, positionsClone[posMatch]),\n getMaskSet().validPositions[posMatch].input = t.input, fillMissingNonMask(posMatch),\n j = posMatch, valid = !0; else if (positionCanMatchDefinition(posMatch, t.match.def)) {\n var result = isValid(posMatch, t.input, !0, !0);\n valid = !1 !== result, j = result.caret || result.insert ? getLastValidPosition() : posMatch,\n needsValidation = !0;\n } else if (!(valid = !0 === t.generatedInput) && posMatch >= getMaskSet().maskLength - 1) break;\n if (getMaskSet().maskLength < initialLength && (getMaskSet().maskLength = initialLength),\n valid) break;\n }\n if (!valid) break;\n }\n if (!valid) return getMaskSet().validPositions = $.extend(!0, {}, positionsClone),\n resetMaskSet(!0), !1;\n } else getMaskSet().validPositions[pos] = $.extend(!0, {}, validTest);\n return resetMaskSet(!0), !0;\n }\n function fillMissingNonMask(maskPos) {\n for (var pndx = maskPos - 1; pndx > -1 && !getMaskSet().validPositions[pndx]; pndx--) ;\n var testTemplate, testsFromPos;\n for (pndx++; pndx < maskPos; pndx++) getMaskSet().validPositions[pndx] === undefined && (!1 === opts.jitMasking || opts.jitMasking > pndx) && (testsFromPos = getTests(pndx, getTestTemplate(pndx - 1).locator, pndx - 1).slice(),\n \"\" === testsFromPos[testsFromPos.length - 1].match.def && testsFromPos.pop(), (testTemplate = determineTestTemplate(testsFromPos)) && (testTemplate.match.def === opts.radixPointDefinitionSymbol || !isMask(pndx, !0) || $.inArray(opts.radixPoint, getBuffer()) < pndx && testTemplate.match.fn && testTemplate.match.fn.test(getPlaceholder(pndx), getMaskSet(), pndx, !1, opts)) && !1 !== (result = _isValid(pndx, getPlaceholder(pndx, testTemplate.match, !0) || (null == testTemplate.match.fn ? testTemplate.match.def : \"\" !== getPlaceholder(pndx) ? getPlaceholder(pndx) : getBuffer()[pndx]), !0)) && (getMaskSet().validPositions[result.pos || pndx].generatedInput = !0));\n }\n strict = !0 === strict;\n var maskPos = pos;\n pos.begin !== undefined && (maskPos = isRTL && !isSelection(pos) ? pos.end : pos.begin);\n var result = !0, positionsClone = $.extend(!0, {}, getMaskSet().validPositions);\n if ($.isFunction(opts.preValidation) && !strict && !0 !== fromSetValid && (result = opts.preValidation(getBuffer(), maskPos, c, isSelection(pos), opts)),\n !0 === result) {\n if (fillMissingNonMask(maskPos), isSelection(pos) && (handleRemove(undefined, Inputmask.keyCode.DELETE, pos),\n maskPos = getMaskSet().p), maskPos < getMaskSet().maskLength && (maxLength === undefined || maskPos < maxLength) && (result = _isValid(maskPos, c, strict),\n (!strict || !0 === fromSetValid) && !1 === result)) {\n var currentPosValid = getMaskSet().validPositions[maskPos];\n if (!currentPosValid || null !== currentPosValid.match.fn || currentPosValid.match.def !== c && c !== opts.skipOptionalPartCharacter) {\n if ((opts.insertMode || getMaskSet().validPositions[seekNext(maskPos)] === undefined) && !isMask(maskPos, !0)) for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) if (!1 !== (result = _isValid(nPos, c, strict))) {\n !function(originalPos, newPos) {\n var vp = getMaskSet().validPositions[newPos];\n if (vp) for (var targetLocator = vp.locator, tll = targetLocator.length, ps = originalPos; ps < newPos; ps++) if (getMaskSet().validPositions[ps] === undefined && !isMask(ps, !0)) {\n var tests = getTests(ps).slice(), bestMatch = determineTestTemplate(tests, !0), equality = -1;\n \"\" === tests[tests.length - 1].match.def && tests.pop(), $.each(tests, function(ndx, tst) {\n for (var i = 0; i < tll; i++) {\n if (tst.locator[i] === undefined || !checkAlternationMatch(tst.locator[i].toString().split(\",\"), targetLocator[i].toString().split(\",\"), tst.na)) {\n var targetAI = targetLocator[i], bestMatchAI = bestMatch.locator[i], tstAI = tst.locator[i];\n targetAI - bestMatchAI > Math.abs(targetAI - tstAI) && (bestMatch = tst);\n break;\n }\n equality < i && (equality = i, bestMatch = tst);\n }\n }), bestMatch = $.extend({}, bestMatch, {\n input: getPlaceholder(ps, bestMatch.match, !0) || bestMatch.match.def\n }), bestMatch.generatedInput = !0, setValidPosition(ps, bestMatch, !0), getMaskSet().validPositions[newPos] = undefined,\n _isValid(newPos, vp.input, !0);\n }\n }(maskPos, result.pos !== undefined ? result.pos : nPos), maskPos = nPos;\n break;\n }\n } else result = {\n caret: seekNext(maskPos)\n };\n }\n !1 === result && opts.keepStatic && !strict && !0 !== fromAlternate && (result = function(pos, c, strict) {\n var lastAlt, alternation, altPos, prevAltPos, i, validPos, altNdxs, decisionPos, validPsClone = $.extend(!0, {}, getMaskSet().validPositions), isValidRslt = !1, lAltPos = getLastValidPosition();\n for (prevAltPos = getMaskSet().validPositions[lAltPos]; lAltPos >= 0; lAltPos--) if ((altPos = getMaskSet().validPositions[lAltPos]) && altPos.alternation !== undefined) {\n if (lastAlt = lAltPos, alternation = getMaskSet().validPositions[lastAlt].alternation,\n prevAltPos.locator[altPos.alternation] !== altPos.locator[altPos.alternation]) break;\n prevAltPos = altPos;\n }\n if (alternation !== undefined) {\n decisionPos = parseInt(lastAlt);\n var decisionTaker = prevAltPos.locator[prevAltPos.alternation || alternation] !== undefined ? prevAltPos.locator[prevAltPos.alternation || alternation] : altNdxs[0];\n decisionTaker.length > 0 && (decisionTaker = decisionTaker.split(\",\")[0]);\n var possibilityPos = getMaskSet().validPositions[decisionPos], prevPos = getMaskSet().validPositions[decisionPos - 1];\n $.each(getTests(decisionPos, prevPos ? prevPos.locator : undefined, decisionPos - 1), function(ndx, test) {\n altNdxs = test.locator[alternation] ? test.locator[alternation].toString().split(\",\") : [];\n for (var mndx = 0; mndx < altNdxs.length; mndx++) {\n var validInputs = [], staticInputsBeforePos = 0, staticInputsBeforePosAlternate = 0, verifyValidInput = !1;\n if (decisionTaker < altNdxs[mndx] && (test.na === undefined || -1 === $.inArray(altNdxs[mndx], test.na.split(\",\")) || -1 === $.inArray(decisionTaker.toString(), altNdxs))) {\n getMaskSet().validPositions[decisionPos] = $.extend(!0, {}, test);\n var possibilities = getMaskSet().validPositions[decisionPos].locator;\n for (getMaskSet().validPositions[decisionPos].locator[alternation] = parseInt(altNdxs[mndx]),\n null == test.match.fn ? (possibilityPos.input !== test.match.def && (verifyValidInput = !0,\n !0 !== possibilityPos.generatedInput && validInputs.push(possibilityPos.input)),\n staticInputsBeforePosAlternate++, getMaskSet().validPositions[decisionPos].generatedInput = !/[0-9a-bA-Z]/.test(test.match.def),\n getMaskSet().validPositions[decisionPos].input = test.match.def) : getMaskSet().validPositions[decisionPos].input = possibilityPos.input,\n i = decisionPos + 1; i < getLastValidPosition(undefined, !0) + 1; i++) validPos = getMaskSet().validPositions[i],\n validPos && !0 !== validPos.generatedInput && /[0-9a-bA-Z]/.test(validPos.input) ? validInputs.push(validPos.input) : i < pos && staticInputsBeforePos++,\n delete getMaskSet().validPositions[i];\n for (verifyValidInput && validInputs[0] === test.match.def && validInputs.shift(),\n resetMaskSet(!0), isValidRslt = !0; validInputs.length > 0; ) {\n var input = validInputs.shift();\n if (input !== opts.skipOptionalPartCharacter && !(isValidRslt = isValid(getLastValidPosition(undefined, !0) + 1, input, !1, fromSetValid, !0))) break;\n }\n if (isValidRslt) {\n getMaskSet().validPositions[decisionPos].locator = possibilities;\n var targetLvp = getLastValidPosition(pos) + 1;\n for (i = decisionPos + 1; i < getLastValidPosition() + 1; i++) ((validPos = getMaskSet().validPositions[i]) === undefined || null == validPos.match.fn) && i < pos + (staticInputsBeforePosAlternate - staticInputsBeforePos) && staticInputsBeforePosAlternate++;\n pos += staticInputsBeforePosAlternate - staticInputsBeforePos, isValidRslt = isValid(pos > targetLvp ? targetLvp : pos, c, strict, fromSetValid, !0);\n }\n if (isValidRslt) return !1;\n resetMaskSet(), getMaskSet().validPositions = $.extend(!0, {}, validPsClone);\n }\n }\n });\n }\n return isValidRslt;\n }(maskPos, c, strict)), !0 === result && (result = {\n pos: maskPos\n });\n }\n if ($.isFunction(opts.postValidation) && !1 !== result && !strict && !0 !== fromSetValid) {\n var postResult = opts.postValidation(getBuffer(!0), result, opts);\n if (postResult.refreshFromBuffer && postResult.buffer) {\n var refresh = postResult.refreshFromBuffer;\n refreshFromBuffer(!0 === refresh ? refresh : refresh.start, refresh.end, postResult.buffer);\n }\n result = !0 === postResult ? result : postResult;\n }\n return result.pos === undefined && (result.pos = maskPos), !1 === result && (resetMaskSet(!0),\n getMaskSet().validPositions = $.extend(!0, {}, positionsClone)), result;\n }\n function isMask(pos, strict) {\n var test = getTestTemplate(pos).match;\n if (\"\" === test.def && (test = getTest(pos).match), null != test.fn) return test.fn;\n if (!0 !== strict && pos > -1) {\n var tests = getTests(pos);\n return tests.length > 1 + (\"\" === tests[tests.length - 1].match.def ? 1 : 0);\n }\n return !1;\n }\n function seekNext(pos, newBlock) {\n var maskL = getMaskSet().maskLength;\n if (pos >= maskL) return maskL;\n var position = pos;\n for (getTests(maskL + 1).length > 1 && (getMaskTemplate(!0, maskL + 1, !0), maskL = getMaskSet().maskLength); ++position < maskL && (!0 === newBlock && (!0 !== getTest(position).match.newBlockMarker || !isMask(position)) || !0 !== newBlock && !isMask(position)); ) ;\n return position;\n }\n function seekPrevious(pos, newBlock) {\n var tests, position = pos;\n if (position <= 0) return 0;\n for (;--position > 0 && (!0 === newBlock && !0 !== getTest(position).match.newBlockMarker || !0 !== newBlock && !isMask(position) && (tests = getTests(position),\n tests.length < 2 || 2 === tests.length && \"\" === tests[1].match.def)); ) ;\n return position;\n }\n function getBufferElement(position) {\n return getMaskSet().validPositions[position] === undefined ? getPlaceholder(position) : getMaskSet().validPositions[position].input;\n }\n function writeBuffer(input, buffer, caretPos, event, triggerInputEvent) {\n if (event && $.isFunction(opts.onBeforeWrite)) {\n var result = opts.onBeforeWrite(event, buffer, caretPos, opts);\n if (result) {\n if (result.refreshFromBuffer) {\n var refresh = result.refreshFromBuffer;\n refreshFromBuffer(!0 === refresh ? refresh : refresh.start, refresh.end, result.buffer || buffer),\n buffer = getBuffer(!0);\n }\n caretPos !== undefined && (caretPos = result.caret !== undefined ? result.caret : caretPos);\n }\n }\n input !== undefined && (input.inputmask._valueSet(buffer.join(\"\")), caretPos === undefined || event !== undefined && \"blur\" === event.type ? renderColorMask(input, buffer, caretPos) : android && \"input\" === event.type ? setTimeout(function() {\n caret(input, caretPos);\n }, 0) : caret(input, caretPos), !0 === triggerInputEvent && (skipInputEvent = !0,\n $(input).trigger(\"input\")));\n }\n function getPlaceholder(pos, test, returnPL) {\n if (test = test || getTest(pos).match, test.placeholder !== undefined || !0 === returnPL) return $.isFunction(test.placeholder) ? test.placeholder(opts) : test.placeholder;\n if (null === test.fn) {\n if (pos > -1 && getMaskSet().validPositions[pos] === undefined) {\n var prevTest, tests = getTests(pos), staticAlternations = [];\n if (tests.length > 1 + (\"\" === tests[tests.length - 1].match.def ? 1 : 0)) for (var i = 0; i < tests.length; i++) if (!0 !== tests[i].match.optionality && !0 !== tests[i].match.optionalQuantifier && (null === tests[i].match.fn || prevTest === undefined || !1 !== tests[i].match.fn.test(prevTest.match.def, getMaskSet(), pos, !0, opts)) && (staticAlternations.push(tests[i]),\n null === tests[i].match.fn && (prevTest = tests[i]), staticAlternations.length > 1 && /[0-9a-bA-Z]/.test(staticAlternations[0].match.def))) return opts.placeholder.charAt(pos % opts.placeholder.length);\n }\n return test.def;\n }\n return opts.placeholder.charAt(pos % opts.placeholder.length);\n }\n function checkVal(input, writeOut, strict, nptvl, initiatingEvent) {\n function isTemplateMatch(ndx, charCodes) {\n return -1 !== getBufferTemplate().slice(ndx, seekNext(ndx)).join(\"\").indexOf(charCodes) && !isMask(ndx) && getTest(ndx).match.nativeDef === charCodes.charAt(charCodes.length - 1);\n }\n var inputValue = nptvl.slice(), charCodes = \"\", initialNdx = 0, result = undefined;\n if (resetMaskSet(), getMaskSet().p = seekNext(-1), !strict) if (!0 !== opts.autoUnmask) {\n var staticInput = getBufferTemplate().slice(0, seekNext(-1)).join(\"\"), matches = inputValue.join(\"\").match(new RegExp(\"^\" + Inputmask.escapeRegex(staticInput), \"g\"));\n matches && matches.length > 0 && (inputValue.splice(0, matches.length * staticInput.length),\n initialNdx = seekNext(initialNdx));\n } else initialNdx = seekNext(initialNdx);\n if ($.each(inputValue, function(ndx, charCode) {\n if (charCode !== undefined) {\n var keypress = new $.Event(\"_checkval\");\n keypress.which = charCode.charCodeAt(0), charCodes += charCode;\n var lvp = getLastValidPosition(undefined, !0), lvTest = getMaskSet().validPositions[lvp], nextTest = getTestTemplate(lvp + 1, lvTest ? lvTest.locator.slice() : undefined, lvp);\n if (!isTemplateMatch(initialNdx, charCodes) || strict || opts.autoUnmask) {\n var pos = strict ? ndx : null == nextTest.match.fn && nextTest.match.optionality && lvp + 1 < getMaskSet().p ? lvp + 1 : getMaskSet().p;\n result = EventHandlers.keypressEvent.call(input, keypress, !0, !1, strict, pos),\n initialNdx = pos + 1, charCodes = \"\";\n } else result = EventHandlers.keypressEvent.call(input, keypress, !0, !1, !0, lvp + 1);\n if (!strict && $.isFunction(opts.onBeforeWrite)) {\n var fp = result.forwardPosition;\n if (result = opts.onBeforeWrite(keypress, getBuffer(), result.forwardPosition, opts),\n result.forwardPosition = fp, result && result.refreshFromBuffer) {\n var refresh = result.refreshFromBuffer;\n refreshFromBuffer(!0 === refresh ? refresh : refresh.start, refresh.end, result.buffer),\n resetMaskSet(!0), result.caret && (getMaskSet().p = result.caret, result.forwardPosition = result.caret);\n }\n }\n }\n }), writeOut) {\n var caretPos = undefined;\n document.activeElement === input && result && (caretPos = opts.numericInput ? seekPrevious(result.forwardPosition) : result.forwardPosition),\n writeBuffer(input, getBuffer(), caretPos, initiatingEvent || new $.Event(\"checkval\"), initiatingEvent && \"input\" === initiatingEvent.type);\n }\n }\n function unmaskedvalue(input) {\n if (input) {\n if (input.inputmask === undefined) return input.value;\n input.inputmask && input.inputmask.refreshValue && EventHandlers.setValueEvent.call(input);\n }\n var umValue = [], vps = getMaskSet().validPositions;\n for (var pndx in vps) vps[pndx].match && null != vps[pndx].match.fn && umValue.push(vps[pndx].input);\n var unmaskedValue = 0 === umValue.length ? \"\" : (isRTL ? umValue.reverse() : umValue).join(\"\");\n if ($.isFunction(opts.onUnMask)) {\n var bufferValue = (isRTL ? getBuffer().slice().reverse() : getBuffer()).join(\"\");\n unmaskedValue = opts.onUnMask(bufferValue, unmaskedValue, opts);\n }\n return unmaskedValue;\n }\n function caret(input, begin, end, notranslate) {\n function translatePosition(pos) {\n if (!0 !== notranslate && isRTL && \"number\" == typeof pos && (!opts.greedy || \"\" !== opts.placeholder)) {\n pos = getBuffer().join(\"\").length - pos;\n }\n return pos;\n }\n var range;\n if (begin === undefined) return input.setSelectionRange ? (begin = input.selectionStart,\n end = input.selectionEnd) : window.getSelection ? (range = window.getSelection().getRangeAt(0),\n range.commonAncestorContainer.parentNode !== input && range.commonAncestorContainer !== input || (begin = range.startOffset,\n end = range.endOffset)) : document.selection && document.selection.createRange && (range = document.selection.createRange(),\n begin = 0 - range.duplicate().moveStart(\"character\", -input.inputmask._valueGet().length),\n end = begin + range.text.length), {\n begin: translatePosition(begin),\n end: translatePosition(end)\n };\n if (begin.begin !== undefined && (end = begin.end, begin = begin.begin), \"number\" == typeof begin) {\n begin = translatePosition(begin), end = translatePosition(end), end = \"number\" == typeof end ? end : begin;\n var scrollCalc = parseInt(((input.ownerDocument.defaultView || window).getComputedStyle ? (input.ownerDocument.defaultView || window).getComputedStyle(input, null) : input.currentStyle).fontSize) * end;\n if (input.scrollLeft = scrollCalc > input.scrollWidth ? scrollCalc : 0, mobile || !1 !== opts.insertMode || begin !== end || end++,\n input.setSelectionRange) input.selectionStart = begin, input.selectionEnd = end; else if (window.getSelection) {\n if (range = document.createRange(), input.firstChild === undefined || null === input.firstChild) {\n var textNode = document.createTextNode(\"\");\n input.appendChild(textNode);\n }\n range.setStart(input.firstChild, begin < input.inputmask._valueGet().length ? begin : input.inputmask._valueGet().length),\n range.setEnd(input.firstChild, end < input.inputmask._valueGet().length ? end : input.inputmask._valueGet().length),\n range.collapse(!0);\n var sel = window.getSelection();\n sel.removeAllRanges(), sel.addRange(range);\n } else input.createTextRange && (range = input.createTextRange(), range.collapse(!0),\n range.moveEnd(\"character\", end), range.moveStart(\"character\", begin), range.select());\n renderColorMask(input, undefined, {\n begin: begin,\n end: end\n });\n }\n }\n function determineLastRequiredPosition(returnDefinition) {\n var pos, testPos, buffer = getBuffer(), bl = buffer.length, lvp = getLastValidPosition(), positions = {}, lvTest = getMaskSet().validPositions[lvp], ndxIntlzr = lvTest !== undefined ? lvTest.locator.slice() : undefined;\n for (pos = lvp + 1; pos < buffer.length; pos++) testPos = getTestTemplate(pos, ndxIntlzr, pos - 1),\n ndxIntlzr = testPos.locator.slice(), positions[pos] = $.extend(!0, {}, testPos);\n var lvTestAlt = lvTest && lvTest.alternation !== undefined ? lvTest.locator[lvTest.alternation] : undefined;\n for (pos = bl - 1; pos > lvp && (testPos = positions[pos], (testPos.match.optionality || testPos.match.optionalQuantifier && testPos.match.newBlockMarker || lvTestAlt && (lvTestAlt !== positions[pos].locator[lvTest.alternation] && null != testPos.match.fn || null === testPos.match.fn && testPos.locator[lvTest.alternation] && checkAlternationMatch(testPos.locator[lvTest.alternation].toString().split(\",\"), lvTestAlt.toString().split(\",\")) && \"\" !== getTests(pos)[0].def)) && buffer[pos] === getPlaceholder(pos, testPos.match)); pos--) bl--;\n return returnDefinition ? {\n l: bl,\n def: positions[bl] ? positions[bl].match : undefined\n } : bl;\n }\n function clearOptionalTail(buffer) {\n for (var validPos, rl = determineLastRequiredPosition(), bl = buffer.length, lv = getMaskSet().validPositions[getLastValidPosition()]; rl < bl && !isMask(rl, !0) && (validPos = lv !== undefined ? getTestTemplate(rl, lv.locator.slice(\"\"), lv) : getTest(rl)) && !0 !== validPos.match.optionality && (!0 !== validPos.match.optionalQuantifier && !0 !== validPos.match.newBlockMarker || rl + 1 === bl && \"\" === (lv !== undefined ? getTestTemplate(rl + 1, lv.locator.slice(\"\"), lv) : getTest(rl + 1)).match.def); ) rl++;\n for (;(validPos = getMaskSet().validPositions[rl - 1]) && validPos && validPos.match.optionality && validPos.input === opts.skipOptionalPartCharacter; ) rl--;\n return buffer.splice(rl), buffer;\n }\n function isComplete(buffer) {\n if ($.isFunction(opts.isComplete)) return opts.isComplete(buffer, opts);\n if (\"*\" === opts.repeat) return undefined;\n var complete = !1, lrp = determineLastRequiredPosition(!0), aml = seekPrevious(lrp.l);\n if (lrp.def === undefined || lrp.def.newBlockMarker || lrp.def.optionality || lrp.def.optionalQuantifier) {\n complete = !0;\n for (var i = 0; i <= aml; i++) {\n var test = getTestTemplate(i).match;\n if (null !== test.fn && getMaskSet().validPositions[i] === undefined && !0 !== test.optionality && !0 !== test.optionalQuantifier || null === test.fn && buffer[i] !== getPlaceholder(i, test)) {\n complete = !1;\n break;\n }\n }\n }\n return complete;\n }\n function handleRemove(input, k, pos, strict) {\n if ((opts.numericInput || isRTL) && (k === Inputmask.keyCode.BACKSPACE ? k = Inputmask.keyCode.DELETE : k === Inputmask.keyCode.DELETE && (k = Inputmask.keyCode.BACKSPACE),\n isRTL)) {\n var pend = pos.end;\n pos.end = pos.begin, pos.begin = pend;\n }\n k === Inputmask.keyCode.BACKSPACE && (pos.end - pos.begin < 1 || !1 === opts.insertMode) ? (pos.begin = seekPrevious(pos.begin),\n getMaskSet().validPositions[pos.begin] === undefined || getMaskSet().validPositions[pos.begin].input !== opts.groupSeparator && getMaskSet().validPositions[pos.begin].input !== opts.radixPoint || pos.begin--) : k === Inputmask.keyCode.DELETE && pos.begin === pos.end && (pos.end = isMask(pos.end, !0) ? pos.end + 1 : seekNext(pos.end) + 1,\n getMaskSet().validPositions[pos.begin] === undefined || getMaskSet().validPositions[pos.begin].input !== opts.groupSeparator && getMaskSet().validPositions[pos.begin].input !== opts.radixPoint || pos.end++),\n stripValidPositions(pos.begin, pos.end, !1, strict), !0 !== strict && function() {\n if (opts.keepStatic) {\n for (var validInputs = [], lastAlt = getLastValidPosition(-1, !0), positionsClone = $.extend(!0, {}, getMaskSet().validPositions), prevAltPos = getMaskSet().validPositions[lastAlt]; lastAlt >= 0; lastAlt--) {\n var altPos = getMaskSet().validPositions[lastAlt];\n if (altPos) {\n if (!0 !== altPos.generatedInput && /[0-9a-bA-Z]/.test(altPos.input) && validInputs.push(altPos.input),\n delete getMaskSet().validPositions[lastAlt], altPos.alternation !== undefined && altPos.locator[altPos.alternation] !== prevAltPos.locator[altPos.alternation]) break;\n prevAltPos = altPos;\n }\n }\n if (lastAlt > -1) for (getMaskSet().p = seekNext(getLastValidPosition(-1, !0)); validInputs.length > 0; ) {\n var keypress = new $.Event(\"keypress\");\n keypress.which = validInputs.pop().charCodeAt(0), EventHandlers.keypressEvent.call(input, keypress, !0, !1, !1, getMaskSet().p);\n } else getMaskSet().validPositions = $.extend(!0, {}, positionsClone);\n }\n }();\n var lvp = getLastValidPosition(pos.begin, !0);\n lvp < pos.begin ? getMaskSet().p = seekNext(lvp) : !0 !== strict && (getMaskSet().p = pos.begin);\n }\n function initializeColorMask(input) {\n function findCaretPos(clientx) {\n var caretPos, e = document.createElement(\"span\");\n for (var style in computedStyle) isNaN(style) && -1 !== style.indexOf(\"font\") && (e.style[style] = computedStyle[style]);\n e.style.textTransform = computedStyle.textTransform, e.style.letterSpacing = computedStyle.letterSpacing,\n e.style.position = \"absolute\", e.style.height = \"auto\", e.style.width = \"auto\",\n e.style.visibility = \"hidden\", e.style.whiteSpace = \"nowrap\", document.body.appendChild(e);\n var itl, inputText = input.inputmask._valueGet(), previousWidth = 0;\n for (caretPos = 0, itl = inputText.length; caretPos <= itl; caretPos++) {\n if (e.innerHTML += inputText.charAt(caretPos) || \"_\", e.offsetWidth >= clientx) {\n var offset1 = clientx - previousWidth, offset2 = e.offsetWidth - clientx;\n e.innerHTML = inputText.charAt(caretPos), offset1 -= e.offsetWidth / 3, caretPos = offset1 < offset2 ? caretPos - 1 : caretPos;\n break;\n }\n previousWidth = e.offsetWidth;\n }\n return document.body.removeChild(e), caretPos;\n }\n function position() {\n colorMask.style.position = \"absolute\", colorMask.style.top = offset.top + \"px\",\n colorMask.style.left = offset.left + \"px\", colorMask.style.width = parseInt(input.offsetWidth) - parseInt(computedStyle.paddingLeft) - parseInt(computedStyle.paddingRight) - parseInt(computedStyle.borderLeftWidth) - parseInt(computedStyle.borderRightWidth) + \"px\",\n colorMask.style.height = parseInt(input.offsetHeight) - parseInt(computedStyle.paddingTop) - parseInt(computedStyle.paddingBottom) - parseInt(computedStyle.borderTopWidth) - parseInt(computedStyle.borderBottomWidth) + \"px\",\n colorMask.style.lineHeight = colorMask.style.height, colorMask.style.zIndex = isNaN(computedStyle.zIndex) ? -1 : computedStyle.zIndex - 1,\n colorMask.style.webkitAppearance = \"textfield\", colorMask.style.mozAppearance = \"textfield\",\n colorMask.style.Appearance = \"textfield\";\n }\n var offset = $(input).position(), computedStyle = (input.ownerDocument.defaultView || window).getComputedStyle(input, null);\n input.parentNode;\n colorMask = document.createElement(\"div\"), document.body.appendChild(colorMask);\n for (var style in computedStyle) computedStyle.hasOwnProperty(style) && isNaN(style) && \"cssText\" !== style && -1 == style.indexOf(\"webkit\") && (colorMask.style[style] = computedStyle[style]);\n input.style.backgroundColor = \"transparent\", input.style.color = \"transparent\",\n input.style.webkitAppearance = \"caret\", input.style.mozAppearance = \"caret\", input.style.Appearance = \"caret\",\n position(), $(window).on(\"resize\", function(e) {\n offset = $(input).position(), computedStyle = (input.ownerDocument.defaultView || window).getComputedStyle(input, null),\n position();\n }), $(input).on(\"click\", function(e) {\n return caret(input, findCaretPos(e.clientX)), EventHandlers.clickEvent.call(this, [ e ]);\n }), $(input).on(\"keydown\", function(e) {\n e.shiftKey || !1 === opts.insertMode || setTimeout(function() {\n renderColorMask(input);\n }, 0);\n });\n }\n function renderColorMask(input, buffer, caretPos) {\n function handleStatic() {\n isStatic || null !== test.fn && testPos.input !== undefined ? isStatic && null !== test.fn && testPos.input !== undefined && (isStatic = !1,\n maskTemplate += \"\") : (isStatic = !0, maskTemplate += \"\");\n }\n if (colorMask !== undefined) {\n buffer = buffer || getBuffer(), caretPos === undefined ? caretPos = caret(input) : caretPos.begin === undefined && (caretPos = {\n begin: caretPos,\n end: caretPos\n });\n var maskTemplate = \"\", isStatic = !1;\n if (\"\" != buffer) {\n var ndxIntlzr, test, testPos, pos = 0, lvp = getLastValidPosition();\n do {\n pos === caretPos.begin && document.activeElement === input && (maskTemplate += \"\"),\n getMaskSet().validPositions[pos] ? (testPos = getMaskSet().validPositions[pos],\n test = testPos.match, ndxIntlzr = testPos.locator.slice(), handleStatic(), maskTemplate += testPos.input) : (testPos = getTestTemplate(pos, ndxIntlzr, pos - 1),\n test = testPos.match, ndxIntlzr = testPos.locator.slice(), (!1 === opts.jitMasking || pos < lvp || \"number\" == typeof opts.jitMasking && isFinite(opts.jitMasking) && opts.jitMasking > pos) && (handleStatic(),\n maskTemplate += getPlaceholder(pos, test))), pos++;\n } while ((maxLength === undefined || pos < maxLength) && (null !== test.fn || \"\" !== test.def) || lvp > pos);\n }\n colorMask.innerHTML = maskTemplate;\n }\n }\n maskset = maskset || this.maskset, opts = opts || this.opts;\n var undoValue, $el, maxLength, colorMask, valueBuffer, el = this.el, isRTL = this.isRTL, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, mouseEnter = !1, EventRuler = {\n on: function(input, eventName, eventHandler) {\n var ev = function(e) {\n if (this.inputmask === undefined && \"FORM\" !== this.nodeName) {\n var imOpts = $.data(this, \"_inputmask_opts\");\n imOpts ? new Inputmask(imOpts).mask(this) : EventRuler.off(this);\n } else {\n if (\"setvalue\" === e.type || \"FORM\" === this.nodeName || !(this.disabled || this.readOnly && !(\"keydown\" === e.type && e.ctrlKey && 67 === e.keyCode || !1 === opts.tabThrough && e.keyCode === Inputmask.keyCode.TAB))) {\n switch (e.type) {\n case \"input\":\n if (!0 === skipInputEvent) return skipInputEvent = !1, e.preventDefault();\n break;\n\n case \"keydown\":\n skipKeyPressEvent = !1, skipInputEvent = !1;\n break;\n\n case \"keypress\":\n if (!0 === skipKeyPressEvent) return e.preventDefault();\n skipKeyPressEvent = !0;\n break;\n\n case \"click\":\n if (iemobile || iphone) {\n var that = this, args = arguments;\n return setTimeout(function() {\n eventHandler.apply(that, args);\n }, 0), !1;\n }\n }\n var returnVal = eventHandler.apply(this, arguments);\n return !1 === returnVal && (e.preventDefault(), e.stopPropagation()), returnVal;\n }\n e.preventDefault();\n }\n };\n input.inputmask.events[eventName] = input.inputmask.events[eventName] || [], input.inputmask.events[eventName].push(ev),\n -1 !== $.inArray(eventName, [ \"submit\", \"reset\" ]) ? null != input.form && $(input.form).on(eventName, ev) : $(input).on(eventName, ev);\n },\n off: function(input, event) {\n if (input.inputmask && input.inputmask.events) {\n var events;\n event ? (events = [], events[event] = input.inputmask.events[event]) : events = input.inputmask.events,\n $.each(events, function(eventName, evArr) {\n for (;evArr.length > 0; ) {\n var ev = evArr.pop();\n -1 !== $.inArray(eventName, [ \"submit\", \"reset\" ]) ? null != input.form && $(input.form).off(eventName, ev) : $(input).off(eventName, ev);\n }\n delete input.inputmask.events[eventName];\n });\n }\n }\n }, EventHandlers = {\n keydownEvent: function(e) {\n var input = this, $input = $(input), k = e.keyCode, pos = caret(input);\n if (k === Inputmask.keyCode.BACKSPACE || k === Inputmask.keyCode.DELETE || iphone && k === Inputmask.keyCode.BACKSPACE_SAFARI || e.ctrlKey && k === Inputmask.keyCode.X && !function(eventName) {\n var el = document.createElement(\"input\"), evName = \"on\" + eventName, isSupported = evName in el;\n return isSupported || (el.setAttribute(evName, \"return;\"), isSupported = \"function\" == typeof el[evName]),\n el = null, isSupported;\n }(\"cut\")) e.preventDefault(), handleRemove(input, k, pos), writeBuffer(input, getBuffer(!0), getMaskSet().p, e, input.inputmask._valueGet() !== getBuffer().join(\"\")),\n input.inputmask._valueGet() === getBufferTemplate().join(\"\") ? $input.trigger(\"cleared\") : !0 === isComplete(getBuffer()) && $input.trigger(\"complete\"); else if (k === Inputmask.keyCode.END || k === Inputmask.keyCode.PAGE_DOWN) {\n e.preventDefault();\n var caretPos = seekNext(getLastValidPosition());\n opts.insertMode || caretPos !== getMaskSet().maskLength || e.shiftKey || caretPos--,\n caret(input, e.shiftKey ? pos.begin : caretPos, caretPos, !0);\n } else k === Inputmask.keyCode.HOME && !e.shiftKey || k === Inputmask.keyCode.PAGE_UP ? (e.preventDefault(),\n caret(input, 0, e.shiftKey ? pos.begin : 0, !0)) : (opts.undoOnEscape && k === Inputmask.keyCode.ESCAPE || 90 === k && e.ctrlKey) && !0 !== e.altKey ? (checkVal(input, !0, !1, undoValue.split(\"\")),\n $input.trigger(\"click\")) : k !== Inputmask.keyCode.INSERT || e.shiftKey || e.ctrlKey ? !0 === opts.tabThrough && k === Inputmask.keyCode.TAB ? (!0 === e.shiftKey ? (null === getTest(pos.begin).match.fn && (pos.begin = seekNext(pos.begin)),\n pos.end = seekPrevious(pos.begin, !0), pos.begin = seekPrevious(pos.end, !0)) : (pos.begin = seekNext(pos.begin, !0),\n pos.end = seekNext(pos.begin, !0), pos.end < getMaskSet().maskLength && pos.end--),\n pos.begin < getMaskSet().maskLength && (e.preventDefault(), caret(input, pos.begin, pos.end))) : e.shiftKey || !1 === opts.insertMode && (k === Inputmask.keyCode.RIGHT ? setTimeout(function() {\n var caretPos = caret(input);\n caret(input, caretPos.begin);\n }, 0) : k === Inputmask.keyCode.LEFT && setTimeout(function() {\n var caretPos = caret(input);\n caret(input, isRTL ? caretPos.begin + 1 : caretPos.begin - 1);\n }, 0)) : (opts.insertMode = !opts.insertMode, caret(input, opts.insertMode || pos.begin !== getMaskSet().maskLength ? pos.begin : pos.begin - 1));\n opts.onKeyDown.call(this, e, getBuffer(), caret(input).begin, opts), ignorable = -1 !== $.inArray(k, opts.ignorables);\n },\n keypressEvent: function(e, checkval, writeOut, strict, ndx) {\n var input = this, $input = $(input), k = e.which || e.charCode || e.keyCode;\n if (!(!0 === checkval || e.ctrlKey && e.altKey) && (e.ctrlKey || e.metaKey || ignorable)) return k === Inputmask.keyCode.ENTER && undoValue !== getBuffer().join(\"\") && (undoValue = getBuffer().join(\"\"),\n setTimeout(function() {\n $input.trigger(\"change\");\n }, 0)), !0;\n if (k) {\n 46 === k && !1 === e.shiftKey && \"\" !== opts.radixPoint && (k = opts.radixPoint.charCodeAt(0));\n var forwardPosition, pos = checkval ? {\n begin: ndx,\n end: ndx\n } : caret(input), c = String.fromCharCode(k);\n getMaskSet().writeOutBuffer = !0;\n var valResult = isValid(pos, c, strict);\n if (!1 !== valResult && (resetMaskSet(!0), forwardPosition = valResult.caret !== undefined ? valResult.caret : checkval ? valResult.pos + 1 : seekNext(valResult.pos),\n getMaskSet().p = forwardPosition), !1 !== writeOut && (setTimeout(function() {\n opts.onKeyValidation.call(input, k, valResult, opts);\n }, 0), getMaskSet().writeOutBuffer && !1 !== valResult)) {\n var buffer = getBuffer();\n writeBuffer(input, buffer, opts.numericInput && valResult.caret === undefined ? seekPrevious(forwardPosition) : forwardPosition, e, !0 !== checkval),\n !0 !== checkval && setTimeout(function() {\n !0 === isComplete(buffer) && $input.trigger(\"complete\");\n }, 0);\n }\n if (e.preventDefault(), checkval) return valResult.forwardPosition = forwardPosition,\n valResult;\n }\n },\n pasteEvent: function(e) {\n var tempValue, input = this, ev = e.originalEvent || e, $input = $(input), inputValue = input.inputmask._valueGet(!0), caretPos = caret(input);\n isRTL && (tempValue = caretPos.end, caretPos.end = caretPos.begin, caretPos.begin = tempValue);\n var valueBeforeCaret = inputValue.substr(0, caretPos.begin), valueAfterCaret = inputValue.substr(caretPos.end, inputValue.length);\n if (valueBeforeCaret === (isRTL ? getBufferTemplate().reverse() : getBufferTemplate()).slice(0, caretPos.begin).join(\"\") && (valueBeforeCaret = \"\"),\n valueAfterCaret === (isRTL ? getBufferTemplate().reverse() : getBufferTemplate()).slice(caretPos.end).join(\"\") && (valueAfterCaret = \"\"),\n isRTL && (tempValue = valueBeforeCaret, valueBeforeCaret = valueAfterCaret, valueAfterCaret = tempValue),\n window.clipboardData && window.clipboardData.getData) inputValue = valueBeforeCaret + window.clipboardData.getData(\"Text\") + valueAfterCaret; else {\n if (!ev.clipboardData || !ev.clipboardData.getData) return !0;\n inputValue = valueBeforeCaret + ev.clipboardData.getData(\"text/plain\") + valueAfterCaret;\n }\n var pasteValue = inputValue;\n if ($.isFunction(opts.onBeforePaste)) {\n if (!1 === (pasteValue = opts.onBeforePaste(inputValue, opts))) return e.preventDefault();\n pasteValue || (pasteValue = inputValue);\n }\n return checkVal(input, !1, !1, isRTL ? pasteValue.split(\"\").reverse() : pasteValue.toString().split(\"\")),\n writeBuffer(input, getBuffer(), seekNext(getLastValidPosition()), e, undoValue !== getBuffer().join(\"\")),\n !0 === isComplete(getBuffer()) && $input.trigger(\"complete\"), e.preventDefault();\n },\n inputFallBackEvent: function(e) {\n var input = this, inputValue = input.inputmask._valueGet();\n if (getBuffer().join(\"\") !== inputValue) {\n var caretPos = caret(input);\n if (\".\" === inputValue.charAt(caretPos.begin - 1) && \"\" !== opts.radixPoint && (inputValue = inputValue.split(\"\"),\n inputValue[caretPos.begin - 1] = opts.radixPoint.charAt(0), inputValue = inputValue.join(\"\")),\n inputValue.charAt(caretPos.begin - 1) === opts.radixPoint && inputValue.length > getBuffer().length) {\n var keypress = new $.Event(\"keypress\");\n return keypress.which = opts.radixPoint.charCodeAt(0), EventHandlers.keypressEvent.call(input, keypress, !0, !0, !1, caretPos.begin),\n !1;\n }\n if (inputValue = inputValue.replace(new RegExp(\"(\" + Inputmask.escapeRegex(getBufferTemplate().join(\"\")) + \")*\"), \"\"),\n iemobile) {\n var inputChar = inputValue.replace(getBuffer().join(\"\"), \"\");\n if (1 === inputChar.length) {\n var keypress = new $.Event(\"keypress\");\n return keypress.which = inputChar.charCodeAt(0), EventHandlers.keypressEvent.call(input, keypress, !0, !0, !1, getMaskSet().validPositions[caretPos.begin - 1] ? caretPos.begin : caretPos.begin - 1),\n !1;\n }\n }\n if (caretPos.begin > inputValue.length && (caret(input, inputValue.length), caretPos = caret(input)),\n getBuffer().length - inputValue.length != 1 || inputValue.charAt(caretPos.begin) === getBuffer()[caretPos.begin] || inputValue.charAt(caretPos.begin + 1) === getBuffer()[caretPos.begin] || isMask(caretPos.begin)) {\n var stickyParts = [], bufferTemplate = getMaskTemplate(!0, 1).join(\"\");\n for (stickyParts.push(inputValue.substr(0, caretPos.begin)), stickyParts.push(inputValue.substr(caretPos.begin)); null === inputValue.match(Inputmask.escapeRegex(bufferTemplate) + \"$\"); ) bufferTemplate = bufferTemplate.slice(1);\n inputValue = inputValue.replace(bufferTemplate, \"\"), $.isFunction(opts.onBeforeMask) && (inputValue = opts.onBeforeMask(inputValue, opts) || inputValue),\n checkVal(input, !0, !1, inputValue.split(\"\"), e);\n var currentPos = caret(input).begin, currentValue = input.inputmask._valueGet(), pos1 = currentValue.indexOf(stickyParts[0]);\n if (0 === pos1 && currentPos !== stickyParts[0].length) caret(input, stickyParts[0].length),\n android && setTimeout(function() {\n caret(input, stickyParts[0].length);\n }, 0); else {\n for (;null === currentValue.match(Inputmask.escapeRegex(stickyParts[1]) + \"$\"); ) stickyParts[1] = stickyParts[1].substr(1);\n var pos2 = currentValue.indexOf(stickyParts[1]);\n -1 !== pos2 && \"\" !== stickyParts[1] && currentPos > pos2 && pos2 > pos1 && (caret(input, pos2),\n android && setTimeout(function() {\n caret(input, pos2);\n }, 0));\n }\n !0 === isComplete(getBuffer()) && $(input).trigger(\"complete\");\n } else e.keyCode = Inputmask.keyCode.BACKSPACE, EventHandlers.keydownEvent.call(input, e);\n e.preventDefault();\n }\n },\n setValueEvent: function(e) {\n this.inputmask.refreshValue = !1;\n var input = this, value = input.inputmask._valueGet(!0);\n $.isFunction(opts.onBeforeMask) && (value = opts.onBeforeMask(value, opts) || value),\n value = value.split(\"\"), checkVal(input, !0, !1, isRTL ? value.reverse() : value),\n undoValue = getBuffer().join(\"\"), (opts.clearMaskOnLostFocus || opts.clearIncomplete) && input.inputmask._valueGet() === getBufferTemplate().join(\"\") && input.inputmask._valueSet(\"\");\n },\n focusEvent: function(e) {\n var input = this, nptValue = input.inputmask._valueGet();\n opts.showMaskOnFocus && (!opts.showMaskOnHover || opts.showMaskOnHover && \"\" === nptValue) && (input.inputmask._valueGet() !== getBuffer().join(\"\") ? writeBuffer(input, getBuffer(), seekNext(getLastValidPosition())) : !1 === mouseEnter && caret(input, seekNext(getLastValidPosition()))),\n !0 === opts.positionCaretOnTab && !1 === mouseEnter && (writeBuffer(input, getBuffer(), caret(input)),\n EventHandlers.clickEvent.apply(input, [ e, !0 ])), undoValue = getBuffer().join(\"\");\n },\n mouseleaveEvent: function(e) {\n var input = this;\n if (mouseEnter = !1, opts.clearMaskOnLostFocus && document.activeElement !== input) {\n var buffer = getBuffer().slice(), nptValue = input.inputmask._valueGet();\n nptValue !== input.getAttribute(\"placeholder\") && \"\" !== nptValue && (-1 === getLastValidPosition() && nptValue === getBufferTemplate().join(\"\") ? buffer = [] : clearOptionalTail(buffer),\n writeBuffer(input, buffer));\n }\n },\n clickEvent: function(e, tabbed) {\n function doRadixFocus(clickPos) {\n if (\"\" !== opts.radixPoint) {\n var vps = getMaskSet().validPositions;\n if (vps[clickPos] === undefined || vps[clickPos].input === getPlaceholder(clickPos)) {\n if (clickPos < seekNext(-1)) return !0;\n var radixPos = $.inArray(opts.radixPoint, getBuffer());\n if (-1 !== radixPos) {\n for (var vp in vps) if (radixPos < vp && vps[vp].input !== getPlaceholder(vp)) return !1;\n return !0;\n }\n }\n }\n return !1;\n }\n var input = this;\n setTimeout(function() {\n if (document.activeElement === input) {\n var selectedCaret = caret(input);\n if (tabbed && (isRTL ? selectedCaret.end = selectedCaret.begin : selectedCaret.begin = selectedCaret.end),\n selectedCaret.begin === selectedCaret.end) switch (opts.positionCaretOnClick) {\n case \"none\":\n break;\n\n case \"radixFocus\":\n if (doRadixFocus(selectedCaret.begin)) {\n var radixPos = getBuffer().join(\"\").indexOf(opts.radixPoint);\n caret(input, opts.numericInput ? seekNext(radixPos) : radixPos);\n break;\n }\n\n default:\n var clickPosition = selectedCaret.begin, lvclickPosition = getLastValidPosition(clickPosition, !0), lastPosition = seekNext(lvclickPosition);\n if (clickPosition < lastPosition) caret(input, isMask(clickPosition) || isMask(clickPosition - 1) ? clickPosition : seekNext(clickPosition)); else {\n var placeholder = getPlaceholder(lastPosition);\n (\"\" !== placeholder && getBuffer()[lastPosition] !== placeholder && !0 !== getTest(lastPosition).match.optionalQuantifier || !isMask(lastPosition) && getTest(lastPosition).match.def === placeholder) && (lastPosition = seekNext(lastPosition)),\n caret(input, lastPosition);\n }\n }\n }\n }, 0);\n },\n dblclickEvent: function(e) {\n var input = this;\n setTimeout(function() {\n caret(input, 0, seekNext(getLastValidPosition()));\n }, 0);\n },\n cutEvent: function(e) {\n var input = this, $input = $(input), pos = caret(input), ev = e.originalEvent || e, clipboardData = window.clipboardData || ev.clipboardData, clipData = isRTL ? getBuffer().slice(pos.end, pos.begin) : getBuffer().slice(pos.begin, pos.end);\n clipboardData.setData(\"text\", isRTL ? clipData.reverse().join(\"\") : clipData.join(\"\")),\n document.execCommand && document.execCommand(\"copy\"), handleRemove(input, Inputmask.keyCode.DELETE, pos),\n writeBuffer(input, getBuffer(), getMaskSet().p, e, undoValue !== getBuffer().join(\"\")),\n input.inputmask._valueGet() === getBufferTemplate().join(\"\") && $input.trigger(\"cleared\");\n },\n blurEvent: function(e) {\n var $input = $(this), input = this;\n if (input.inputmask) {\n var nptValue = input.inputmask._valueGet(), buffer = getBuffer().slice();\n undoValue !== buffer.join(\"\") && setTimeout(function() {\n $input.trigger(\"change\"), undoValue = buffer.join(\"\");\n }, 0), \"\" !== nptValue && (opts.clearMaskOnLostFocus && (-1 === getLastValidPosition() && nptValue === getBufferTemplate().join(\"\") ? buffer = [] : clearOptionalTail(buffer)),\n !1 === isComplete(buffer) && (setTimeout(function() {\n $input.trigger(\"incomplete\");\n }, 0), opts.clearIncomplete && (resetMaskSet(), buffer = opts.clearMaskOnLostFocus ? [] : getBufferTemplate().slice())),\n writeBuffer(input, buffer, undefined, e));\n }\n },\n mouseenterEvent: function(e) {\n var input = this;\n mouseEnter = !0, document.activeElement !== input && opts.showMaskOnHover && input.inputmask._valueGet() !== getBuffer().join(\"\") && writeBuffer(input, getBuffer());\n },\n submitEvent: function(e) {\n undoValue !== getBuffer().join(\"\") && $el.trigger(\"change\"), opts.clearMaskOnLostFocus && -1 === getLastValidPosition() && el.inputmask._valueGet && el.inputmask._valueGet() === getBufferTemplate().join(\"\") && el.inputmask._valueSet(\"\"),\n opts.removeMaskOnSubmit && (el.inputmask._valueSet(el.inputmask.unmaskedvalue(), !0),\n setTimeout(function() {\n writeBuffer(el, getBuffer());\n }, 0));\n },\n resetEvent: function(e) {\n el.inputmask.refreshValue = !0, setTimeout(function() {\n $el.trigger(\"setvalue\");\n }, 0);\n }\n };\n if (actionObj !== undefined) switch (actionObj.action) {\n case \"isComplete\":\n return el = actionObj.el, isComplete(getBuffer());\n\n case \"unmaskedvalue\":\n return el !== undefined && actionObj.value === undefined || (valueBuffer = actionObj.value,\n valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(valueBuffer, opts) || valueBuffer : valueBuffer).split(\"\"),\n checkVal(undefined, !1, !1, isRTL ? valueBuffer.reverse() : valueBuffer), $.isFunction(opts.onBeforeWrite) && opts.onBeforeWrite(undefined, getBuffer(), 0, opts)),\n unmaskedvalue(el);\n\n case \"mask\":\n !function(elem) {\n EventRuler.off(elem);\n var isSupported = function(input, opts) {\n var elementType = input.getAttribute(\"type\"), isSupported = \"INPUT\" === input.tagName && -1 !== $.inArray(elementType, opts.supportsInputType) || input.isContentEditable || \"TEXTAREA\" === input.tagName;\n if (!isSupported) if (\"INPUT\" === input.tagName) {\n var el = document.createElement(\"input\");\n el.setAttribute(\"type\", elementType), isSupported = \"text\" === el.type, el = null;\n } else isSupported = \"partial\";\n return !1 !== isSupported && function(npt) {\n function getter() {\n return this.inputmask ? this.inputmask.opts.autoUnmask ? this.inputmask.unmaskedvalue() : -1 !== getLastValidPosition() || !0 !== opts.nullable ? document.activeElement === this && opts.clearMaskOnLostFocus ? (isRTL ? clearOptionalTail(getBuffer().slice()).reverse() : clearOptionalTail(getBuffer().slice())).join(\"\") : valueGet.call(this) : \"\" : valueGet.call(this);\n }\n function setter(value) {\n valueSet.call(this, value), this.inputmask && $(this).trigger(\"setvalue\");\n }\n var valueGet, valueSet;\n if (!npt.inputmask.__valueGet) {\n if (!0 !== opts.noValuePatching) {\n if (Object.getOwnPropertyDescriptor) {\n \"function\" != typeof Object.getPrototypeOf && (Object.getPrototypeOf = \"object\" == typeof \"test\".__proto__ ? function(object) {\n return object.__proto__;\n } : function(object) {\n return object.constructor.prototype;\n });\n var valueProperty = Object.getPrototypeOf ? Object.getOwnPropertyDescriptor(Object.getPrototypeOf(npt), \"value\") : undefined;\n valueProperty && valueProperty.get && valueProperty.set ? (valueGet = valueProperty.get,\n valueSet = valueProperty.set, Object.defineProperty(npt, \"value\", {\n get: getter,\n set: setter,\n configurable: !0\n })) : \"INPUT\" !== npt.tagName && (valueGet = function() {\n return this.textContent;\n }, valueSet = function(value) {\n this.textContent = value;\n }, Object.defineProperty(npt, \"value\", {\n get: getter,\n set: setter,\n configurable: !0\n }));\n } else document.__lookupGetter__ && npt.__lookupGetter__(\"value\") && (valueGet = npt.__lookupGetter__(\"value\"),\n valueSet = npt.__lookupSetter__(\"value\"), npt.__defineGetter__(\"value\", getter),\n npt.__defineSetter__(\"value\", setter));\n npt.inputmask.__valueGet = valueGet, npt.inputmask.__valueSet = valueSet;\n }\n npt.inputmask._valueGet = function(overruleRTL) {\n return isRTL && !0 !== overruleRTL ? valueGet.call(this.el).split(\"\").reverse().join(\"\") : valueGet.call(this.el);\n }, npt.inputmask._valueSet = function(value, overruleRTL) {\n valueSet.call(this.el, null === value || value === undefined ? \"\" : !0 !== overruleRTL && isRTL ? value.split(\"\").reverse().join(\"\") : value);\n }, valueGet === undefined && (valueGet = function() {\n return this.value;\n }, valueSet = function(value) {\n this.value = value;\n }, function(type) {\n if ($.valHooks && ($.valHooks[type] === undefined || !0 !== $.valHooks[type].inputmaskpatch)) {\n var valhookGet = $.valHooks[type] && $.valHooks[type].get ? $.valHooks[type].get : function(elem) {\n return elem.value;\n }, valhookSet = $.valHooks[type] && $.valHooks[type].set ? $.valHooks[type].set : function(elem, value) {\n return elem.value = value, elem;\n };\n $.valHooks[type] = {\n get: function(elem) {\n if (elem.inputmask) {\n if (elem.inputmask.opts.autoUnmask) return elem.inputmask.unmaskedvalue();\n var result = valhookGet(elem);\n return -1 !== getLastValidPosition(undefined, undefined, elem.inputmask.maskset.validPositions) || !0 !== opts.nullable ? result : \"\";\n }\n return valhookGet(elem);\n },\n set: function(elem, value) {\n var result, $elem = $(elem);\n return result = valhookSet(elem, value), elem.inputmask && $elem.trigger(\"setvalue\"),\n result;\n },\n inputmaskpatch: !0\n };\n }\n }(npt.type), function(npt) {\n EventRuler.on(npt, \"mouseenter\", function(event) {\n var $input = $(this);\n this.inputmask._valueGet() !== getBuffer().join(\"\") && $input.trigger(\"setvalue\");\n });\n }(npt));\n }\n }(input), isSupported;\n }(elem, opts);\n if (!1 !== isSupported && (el = elem, $el = $(el), !0 === opts.colorMask && initializeColorMask(el),\n android && (el.hasOwnProperty(\"inputmode\") && (el.inputmode = opts.inputmode, el.setAttribute(\"inputmode\", opts.inputmode)),\n \"rtfm\" === opts.androidHack && (!0 !== opts.colorMask && initializeColorMask(el),\n el.type = \"password\")), !0 === isSupported && (EventRuler.on(el, \"submit\", EventHandlers.submitEvent),\n EventRuler.on(el, \"reset\", EventHandlers.resetEvent), EventRuler.on(el, \"mouseenter\", EventHandlers.mouseenterEvent),\n EventRuler.on(el, \"blur\", EventHandlers.blurEvent), EventRuler.on(el, \"focus\", EventHandlers.focusEvent),\n EventRuler.on(el, \"mouseleave\", EventHandlers.mouseleaveEvent), !0 !== opts.colorMask && EventRuler.on(el, \"click\", EventHandlers.clickEvent),\n EventRuler.on(el, \"dblclick\", EventHandlers.dblclickEvent), EventRuler.on(el, \"paste\", EventHandlers.pasteEvent),\n EventRuler.on(el, \"dragdrop\", EventHandlers.pasteEvent), EventRuler.on(el, \"drop\", EventHandlers.pasteEvent),\n EventRuler.on(el, \"cut\", EventHandlers.cutEvent), EventRuler.on(el, \"complete\", opts.oncomplete),\n EventRuler.on(el, \"incomplete\", opts.onincomplete), EventRuler.on(el, \"cleared\", opts.oncleared),\n android || !0 === opts.inputEventOnly || (EventRuler.on(el, \"keydown\", EventHandlers.keydownEvent),\n EventRuler.on(el, \"keypress\", EventHandlers.keypressEvent)), EventRuler.on(el, \"compositionstart\", $.noop),\n EventRuler.on(el, \"compositionupdate\", $.noop), EventRuler.on(el, \"compositionend\", $.noop),\n EventRuler.on(el, \"keyup\", $.noop), EventRuler.on(el, \"input\", EventHandlers.inputFallBackEvent),\n EventRuler.on(el, \"beforeinput\", $.noop)), EventRuler.on(el, \"setvalue\", EventHandlers.setValueEvent),\n undoValue = getBufferTemplate().join(\"\"), \"\" !== el.inputmask._valueGet(!0) || !1 === opts.clearMaskOnLostFocus || document.activeElement === el)) {\n var initialValue = $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(el.inputmask._valueGet(!0), opts) || el.inputmask._valueGet(!0) : el.inputmask._valueGet(!0);\n \"\" !== initialValue && checkVal(el, !0, !1, isRTL ? initialValue.split(\"\").reverse() : initialValue.split(\"\"));\n var buffer = getBuffer().slice();\n !1 === isComplete(buffer) && opts.clearIncomplete && resetMaskSet(), opts.clearMaskOnLostFocus && document.activeElement !== el && (-1 === getLastValidPosition() ? buffer = [] : clearOptionalTail(buffer)),\n writeBuffer(el, buffer), document.activeElement === el && caret(el, seekNext(getLastValidPosition()));\n }\n }(el);\n break;\n\n case \"format\":\n return valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(actionObj.value, opts) || actionObj.value : actionObj.value).split(\"\"),\n checkVal(undefined, !0, !1, isRTL ? valueBuffer.reverse() : valueBuffer), actionObj.metadata ? {\n value: isRTL ? getBuffer().slice().reverse().join(\"\") : getBuffer().join(\"\"),\n metadata: maskScope.call(this, {\n action: \"getmetadata\"\n }, maskset, opts)\n } : isRTL ? getBuffer().slice().reverse().join(\"\") : getBuffer().join(\"\");\n\n case \"isValid\":\n actionObj.value ? (valueBuffer = actionObj.value.split(\"\"), checkVal(undefined, !0, !0, isRTL ? valueBuffer.reverse() : valueBuffer)) : actionObj.value = getBuffer().join(\"\");\n for (var buffer = getBuffer(), rl = determineLastRequiredPosition(), lmib = buffer.length - 1; lmib > rl && !isMask(lmib); lmib--) ;\n return buffer.splice(rl, lmib + 1 - rl), isComplete(buffer) && actionObj.value === getBuffer().join(\"\");\n\n case \"getemptymask\":\n return getBufferTemplate().join(\"\");\n\n case \"remove\":\n if (el && el.inputmask) {\n $el = $(el), el.inputmask._valueSet(opts.autoUnmask ? unmaskedvalue(el) : el.inputmask._valueGet(!0)),\n EventRuler.off(el);\n Object.getOwnPropertyDescriptor && Object.getPrototypeOf ? Object.getOwnPropertyDescriptor(Object.getPrototypeOf(el), \"value\") && el.inputmask.__valueGet && Object.defineProperty(el, \"value\", {\n get: el.inputmask.__valueGet,\n set: el.inputmask.__valueSet,\n configurable: !0\n }) : document.__lookupGetter__ && el.__lookupGetter__(\"value\") && el.inputmask.__valueGet && (el.__defineGetter__(\"value\", el.inputmask.__valueGet),\n el.__defineSetter__(\"value\", el.inputmask.__valueSet)), el.inputmask = undefined;\n }\n return el;\n\n case \"getmetadata\":\n if ($.isArray(maskset.metadata)) {\n var maskTarget = getMaskTemplate(!0, 0, !1).join(\"\");\n return $.each(maskset.metadata, function(ndx, mtdt) {\n if (mtdt.mask === maskTarget) return maskTarget = mtdt, !1;\n }), maskTarget;\n }\n return maskset.metadata;\n }\n }\n var ua = navigator.userAgent, mobile = /mobile/i.test(ua), iemobile = /iemobile/i.test(ua), iphone = /iphone/i.test(ua) && !iemobile, android = /android/i.test(ua) && !iemobile;\n return Inputmask.prototype = {\n dataAttribute: \"data-inputmask\",\n defaults: {\n placeholder: \"_\",\n optionalmarker: {\n start: \"[\",\n end: \"]\"\n },\n quantifiermarker: {\n start: \"{\",\n end: \"}\"\n },\n groupmarker: {\n start: \"(\",\n end: \")\"\n },\n alternatormarker: \"|\",\n escapeChar: \"\\\\\",\n mask: null,\n regex: null,\n oncomplete: $.noop,\n onincomplete: $.noop,\n oncleared: $.noop,\n repeat: 0,\n greedy: !0,\n autoUnmask: !1,\n removeMaskOnSubmit: !1,\n clearMaskOnLostFocus: !0,\n insertMode: !0,\n clearIncomplete: !1,\n alias: null,\n onKeyDown: $.noop,\n onBeforeMask: null,\n onBeforePaste: function(pastedValue, opts) {\n return $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(pastedValue, opts) : pastedValue;\n },\n onBeforeWrite: null,\n onUnMask: null,\n showMaskOnFocus: !0,\n showMaskOnHover: !0,\n onKeyValidation: $.noop,\n skipOptionalPartCharacter: \" \",\n numericInput: !1,\n rightAlign: !1,\n undoOnEscape: !0,\n radixPoint: \"\",\n radixPointDefinitionSymbol: undefined,\n groupSeparator: \"\",\n keepStatic: null,\n positionCaretOnTab: !0,\n tabThrough: !1,\n supportsInputType: [ \"text\", \"tel\", \"password\" ],\n ignorables: [ 8, 9, 13, 19, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 93, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 0, 229 ],\n isComplete: null,\n canClearPosition: $.noop,\n preValidation: null,\n postValidation: null,\n staticDefinitionSymbol: undefined,\n jitMasking: !1,\n nullable: !0,\n inputEventOnly: !1,\n noValuePatching: !1,\n positionCaretOnClick: \"lvp\",\n casing: null,\n inputmode: \"verbatim\",\n colorMask: !1,\n androidHack: !1\n },\n definitions: {\n \"9\": {\n validator: \"[0-9]\",\n cardinality: 1,\n definitionSymbol: \"*\"\n },\n a: {\n validator: \"[A-Za-z\\u0410-\\u044f\\u0401\\u0451\\xc0-\\xff\\xb5]\",\n cardinality: 1,\n definitionSymbol: \"*\"\n },\n \"*\": {\n validator: function() {\n return !0;\n },\n cardinality: 1\n }\n },\n aliases: {},\n masksCache: {},\n mask: function(elems) {\n function importAttributeOptions(npt, opts, userOptions, dataAttribute) {\n function importOption(option, optionData) {\n null !== (optionData = optionData !== undefined ? optionData : npt.getAttribute(dataAttribute + \"-\" + option)) && (\"string\" == typeof optionData && (0 === option.indexOf(\"on\") ? optionData = window[optionData] : \"false\" === optionData ? optionData = !1 : \"true\" === optionData && (optionData = !0)),\n userOptions[option] = optionData);\n }\n (\"rtl\" === npt.dir || opts.rightAlign) && (npt.style.textAlign = \"right\"), (\"rtl\" === npt.dir || opts.numericInput) && (npt.dir = \"ltr\",\n npt.removeAttribute(\"dir\"), opts.isRTL = !0);\n var option, dataoptions, optionData, p, attrOptions = npt.getAttribute(dataAttribute);\n if (attrOptions && \"\" !== attrOptions && (attrOptions = attrOptions.replace(new RegExp(\"'\", \"g\"), '\"'),\n dataoptions = JSON.parse(\"{\" + attrOptions + \"}\")), dataoptions) {\n optionData = undefined;\n for (p in dataoptions) if (\"alias\" === p.toLowerCase()) {\n optionData = dataoptions[p];\n break;\n }\n }\n importOption(\"alias\", optionData), userOptions.alias && resolveAlias(userOptions.alias, userOptions, opts);\n for (option in opts) {\n if (dataoptions) {\n optionData = undefined;\n for (p in dataoptions) if (p.toLowerCase() === option.toLowerCase()) {\n optionData = dataoptions[p];\n break;\n }\n }\n importOption(option, optionData);\n }\n return $.extend(!0, opts, userOptions), opts;\n }\n var that = this;\n return \"string\" == typeof elems && (elems = document.getElementById(elems) || document.querySelectorAll(elems)),\n elems = elems.nodeName ? [ elems ] : elems, $.each(elems, function(ndx, el) {\n var scopedOpts = $.extend(!0, {}, that.opts);\n importAttributeOptions(el, scopedOpts, $.extend(!0, {}, that.userOptions), that.dataAttribute);\n var maskset = generateMaskSet(scopedOpts, that.noMasksCache);\n maskset !== undefined && (el.inputmask !== undefined && el.inputmask.remove(), el.inputmask = new Inputmask(undefined, undefined, !0),\n el.inputmask.opts = scopedOpts, el.inputmask.noMasksCache = that.noMasksCache, el.inputmask.userOptions = $.extend(!0, {}, that.userOptions),\n el.inputmask.isRTL = scopedOpts.isRTL, el.inputmask.el = el, el.inputmask.maskset = maskset,\n $.data(el, \"_inputmask_opts\", scopedOpts), maskScope.call(el.inputmask, {\n action: \"mask\"\n }));\n }), elems && elems[0] ? elems[0].inputmask || this : this;\n },\n option: function(options, noremask) {\n return \"string\" == typeof options ? this.opts[options] : \"object\" == typeof options ? ($.extend(this.userOptions, options),\n this.el && !0 !== noremask && this.mask(this.el), this) : void 0;\n },\n unmaskedvalue: function(value) {\n return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache),\n maskScope.call(this, {\n action: \"unmaskedvalue\",\n value: value\n });\n },\n remove: function() {\n return maskScope.call(this, {\n action: \"remove\"\n });\n },\n getemptymask: function() {\n return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache),\n maskScope.call(this, {\n action: \"getemptymask\"\n });\n },\n hasMaskedValue: function() {\n return !this.opts.autoUnmask;\n },\n isComplete: function() {\n return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache),\n maskScope.call(this, {\n action: \"isComplete\"\n });\n },\n getmetadata: function() {\n return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache),\n maskScope.call(this, {\n action: \"getmetadata\"\n });\n },\n isValid: function(value) {\n return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache),\n maskScope.call(this, {\n action: \"isValid\",\n value: value\n });\n },\n format: function(value, metadata) {\n return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache),\n maskScope.call(this, {\n action: \"format\",\n value: value,\n metadata: metadata\n });\n },\n analyseMask: function(mask, regexMask, opts) {\n function MaskToken(isGroup, isOptional, isQuantifier, isAlternator) {\n this.matches = [], this.openGroup = isGroup || !1, this.alternatorGroup = !1, this.isGroup = isGroup || !1,\n this.isOptional = isOptional || !1, this.isQuantifier = isQuantifier || !1, this.isAlternator = isAlternator || !1,\n this.quantifier = {\n min: 1,\n max: 1\n };\n }\n function insertTestDefinition(mtoken, element, position) {\n position = position !== undefined ? position : mtoken.matches.length;\n var prevMatch = mtoken.matches[position - 1];\n if (regexMask) 0 === element.indexOf(\"[\") || escaped ? mtoken.matches.splice(position++, 0, {\n fn: new RegExp(element, opts.casing ? \"i\" : \"\"),\n cardinality: 1,\n optionality: mtoken.isOptional,\n newBlockMarker: prevMatch === undefined || prevMatch.def !== element,\n casing: null,\n def: element,\n placeholder: undefined,\n nativeDef: element\n }) : $.each(element.split(\"\"), function(ndx, lmnt) {\n prevMatch = mtoken.matches[position - 1], mtoken.matches.splice(position++, 0, {\n fn: null,\n cardinality: 0,\n optionality: mtoken.isOptional,\n newBlockMarker: prevMatch === undefined || prevMatch.def !== lmnt && null !== prevMatch.fn,\n casing: null,\n def: opts.staticDefinitionSymbol || lmnt,\n placeholder: opts.staticDefinitionSymbol !== undefined ? lmnt : undefined,\n nativeDef: lmnt\n });\n }), escaped = !1; else {\n var maskdef = (opts.definitions ? opts.definitions[element] : undefined) || Inputmask.prototype.definitions[element];\n if (maskdef && !escaped) {\n for (var prevalidators = maskdef.prevalidator, prevalidatorsL = prevalidators ? prevalidators.length : 0, i = 1; i < maskdef.cardinality; i++) {\n var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator.validator, cardinality = prevalidator.cardinality;\n mtoken.matches.splice(position++, 0, {\n fn: validator ? \"string\" == typeof validator ? new RegExp(validator, opts.casing ? \"i\" : \"\") : new function() {\n this.test = validator;\n }() : new RegExp(\".\"),\n cardinality: cardinality || 1,\n optionality: mtoken.isOptional,\n newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),\n casing: maskdef.casing,\n def: maskdef.definitionSymbol || element,\n placeholder: maskdef.placeholder,\n nativeDef: element\n }), prevMatch = mtoken.matches[position - 1];\n }\n mtoken.matches.splice(position++, 0, {\n fn: maskdef.validator ? \"string\" == typeof maskdef.validator ? new RegExp(maskdef.validator, opts.casing ? \"i\" : \"\") : new function() {\n this.test = maskdef.validator;\n }() : new RegExp(\".\"),\n cardinality: maskdef.cardinality,\n optionality: mtoken.isOptional,\n newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),\n casing: maskdef.casing,\n def: maskdef.definitionSymbol || element,\n placeholder: maskdef.placeholder,\n nativeDef: element\n });\n } else mtoken.matches.splice(position++, 0, {\n fn: null,\n cardinality: 0,\n optionality: mtoken.isOptional,\n newBlockMarker: prevMatch === undefined || prevMatch.def !== element && null !== prevMatch.fn,\n casing: null,\n def: opts.staticDefinitionSymbol || element,\n placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,\n nativeDef: element\n }), escaped = !1;\n }\n }\n function verifyGroupMarker(maskToken) {\n maskToken && maskToken.matches && $.each(maskToken.matches, function(ndx, token) {\n var nextToken = maskToken.matches[ndx + 1];\n (nextToken === undefined || nextToken.matches === undefined || !1 === nextToken.isQuantifier) && token && token.isGroup && (token.isGroup = !1,\n regexMask || (insertTestDefinition(token, opts.groupmarker.start, 0), !0 !== token.openGroup && insertTestDefinition(token, opts.groupmarker.end))),\n verifyGroupMarker(token);\n });\n }\n function defaultCase() {\n if (openenings.length > 0) {\n if (currentOpeningToken = openenings[openenings.length - 1], insertTestDefinition(currentOpeningToken, m),\n currentOpeningToken.isAlternator) {\n alternator = openenings.pop();\n for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;\n openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1],\n currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);\n }\n } else insertTestDefinition(currentToken, m);\n }\n function reverseTokens(maskToken) {\n maskToken.matches = maskToken.matches.reverse();\n for (var match in maskToken.matches) if (maskToken.matches.hasOwnProperty(match)) {\n var intMatch = parseInt(match);\n if (maskToken.matches[match].isQuantifier && maskToken.matches[intMatch + 1] && maskToken.matches[intMatch + 1].isGroup) {\n var qt = maskToken.matches[match];\n maskToken.matches.splice(match, 1), maskToken.matches.splice(intMatch + 1, 0, qt);\n }\n maskToken.matches[match].matches !== undefined ? maskToken.matches[match] = reverseTokens(maskToken.matches[match]) : maskToken.matches[match] = function(st) {\n return st === opts.optionalmarker.start ? st = opts.optionalmarker.end : st === opts.optionalmarker.end ? st = opts.optionalmarker.start : st === opts.groupmarker.start ? st = opts.groupmarker.end : st === opts.groupmarker.end && (st = opts.groupmarker.start),\n st;\n }(maskToken.matches[match]);\n }\n return maskToken;\n }\n var match, m, openingToken, currentOpeningToken, alternator, lastMatch, groupToken, tokenizer = /(?:[?*+]|\\{[0-9\\+\\*]+(?:,[0-9\\+\\*]*)?\\})|[^.?*+^${[]()|\\\\]+|./g, regexTokenizer = /\\[\\^?]?(?:[^\\\\\\]]+|\\\\[\\S\\s]?)*]?|\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\\S\\s]?)|\\((?:\\?[:=!]?)?|(?:[?*+]|\\{[0-9]+(?:,[0-9]*)?\\})\\??|[^.?*+^${[()|\\\\]+|./g, escaped = !1, currentToken = new MaskToken(), openenings = [], maskTokens = [];\n for (regexMask && (opts.optionalmarker.start = undefined, opts.optionalmarker.end = undefined); match = regexMask ? regexTokenizer.exec(mask) : tokenizer.exec(mask); ) {\n if (m = match[0], regexMask) switch (m.charAt(0)) {\n case \"?\":\n m = \"{0,1}\";\n break;\n\n case \"+\":\n case \"*\":\n m = \"{\" + m + \"}\";\n }\n if (escaped) defaultCase(); else switch (m.charAt(0)) {\n case opts.escapeChar:\n escaped = !0, regexMask && defaultCase();\n break;\n\n case opts.optionalmarker.end:\n case opts.groupmarker.end:\n if (openingToken = openenings.pop(), openingToken.openGroup = !1, openingToken !== undefined) if (openenings.length > 0) {\n if (currentOpeningToken = openenings[openenings.length - 1], currentOpeningToken.matches.push(openingToken),\n currentOpeningToken.isAlternator) {\n alternator = openenings.pop();\n for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1,\n alternator.matches[mndx].alternatorGroup = !1;\n openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1],\n currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);\n }\n } else currentToken.matches.push(openingToken); else defaultCase();\n break;\n\n case opts.optionalmarker.start:\n openenings.push(new MaskToken(!1, !0));\n break;\n\n case opts.groupmarker.start:\n openenings.push(new MaskToken(!0));\n break;\n\n case opts.quantifiermarker.start:\n var quantifier = new MaskToken(!1, !1, !0);\n m = m.replace(/[{}]/g, \"\");\n var mq = m.split(\",\"), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]);\n if (\"*\" !== mq1 && \"+\" !== mq1 || (mq0 = \"*\" === mq1 ? 0 : 1), quantifier.quantifier = {\n min: mq0,\n max: mq1\n }, openenings.length > 0) {\n var matches = openenings[openenings.length - 1].matches;\n match = matches.pop(), match.isGroup || (groupToken = new MaskToken(!0), groupToken.matches.push(match),\n match = groupToken), matches.push(match), matches.push(quantifier);\n } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new MaskToken(!0),\n groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match),\n currentToken.matches.push(quantifier);\n break;\n\n case opts.alternatormarker:\n if (openenings.length > 0) {\n currentOpeningToken = openenings[openenings.length - 1];\n var subToken = currentOpeningToken.matches[currentOpeningToken.matches.length - 1];\n lastMatch = currentOpeningToken.openGroup && (subToken.matches === undefined || !1 === subToken.isGroup && !1 === subToken.isAlternator) ? openenings.pop() : currentOpeningToken.matches.pop();\n } else lastMatch = currentToken.matches.pop();\n if (lastMatch.isAlternator) openenings.push(lastMatch); else if (lastMatch.alternatorGroup ? (alternator = openenings.pop(),\n lastMatch.alternatorGroup = !1) : alternator = new MaskToken(!1, !1, !1, !0), alternator.matches.push(lastMatch),\n openenings.push(alternator), lastMatch.openGroup) {\n lastMatch.openGroup = !1;\n var alternatorGroup = new MaskToken(!0);\n alternatorGroup.alternatorGroup = !0, openenings.push(alternatorGroup);\n }\n break;\n\n default:\n defaultCase();\n }\n }\n for (;openenings.length > 0; ) openingToken = openenings.pop(), currentToken.matches.push(openingToken);\n return currentToken.matches.length > 0 && (verifyGroupMarker(currentToken), maskTokens.push(currentToken)),\n (opts.numericInput || opts.isRTL) && reverseTokens(maskTokens[0]), maskTokens;\n }\n }, Inputmask.extendDefaults = function(options) {\n $.extend(!0, Inputmask.prototype.defaults, options);\n }, Inputmask.extendDefinitions = function(definition) {\n $.extend(!0, Inputmask.prototype.definitions, definition);\n }, Inputmask.extendAliases = function(alias) {\n $.extend(!0, Inputmask.prototype.aliases, alias);\n }, Inputmask.format = function(value, options, metadata) {\n return Inputmask(options).format(value, metadata);\n }, Inputmask.unmask = function(value, options) {\n return Inputmask(options).unmaskedvalue(value);\n }, Inputmask.isValid = function(value, options) {\n return Inputmask(options).isValid(value);\n }, Inputmask.remove = function(elems) {\n $.each(elems, function(ndx, el) {\n el.inputmask && el.inputmask.remove();\n });\n }, Inputmask.escapeRegex = function(str) {\n var specials = [ \"/\", \".\", \"*\", \"+\", \"?\", \"|\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", \"\\\\\", \"$\", \"^\" ];\n return str.replace(new RegExp(\"(\\\\\" + specials.join(\"|\\\\\") + \")\", \"gim\"), \"\\\\$1\");\n }, Inputmask.keyCode = {\n ALT: 18,\n BACKSPACE: 8,\n BACKSPACE_SAFARI: 127,\n CAPS_LOCK: 20,\n COMMA: 188,\n COMMAND: 91,\n COMMAND_LEFT: 91,\n COMMAND_RIGHT: 93,\n CONTROL: 17,\n DELETE: 46,\n DOWN: 40,\n END: 35,\n ENTER: 13,\n ESCAPE: 27,\n HOME: 36,\n INSERT: 45,\n LEFT: 37,\n MENU: 93,\n NUMPAD_ADD: 107,\n NUMPAD_DECIMAL: 110,\n NUMPAD_DIVIDE: 111,\n NUMPAD_ENTER: 108,\n NUMPAD_MULTIPLY: 106,\n NUMPAD_SUBTRACT: 109,\n PAGE_DOWN: 34,\n PAGE_UP: 33,\n PERIOD: 190,\n RIGHT: 39,\n SHIFT: 16,\n SPACE: 32,\n TAB: 9,\n UP: 38,\n WINDOWS: 91,\n X: 88\n }, Inputmask;\n});","/*!\n* jquery.inputmask.js\n* https://github.com/RobinHerbots/Inputmask\n* Copyright (c) 2010 - 2017 Robin Herbots\n* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)\n* Version: 3.3.6-49\n*/\n\n!function(factory) {\n factory(jQuery, window.Inputmask);\n}(function($, Inputmask) {\n return void 0 === $.fn.inputmask && ($.fn.inputmask = function(fn, options) {\n var nptmask, input = this[0];\n if (void 0 === options && (options = {}), \"string\" == typeof fn) switch (fn) {\n case \"unmaskedvalue\":\n return input && input.inputmask ? input.inputmask.unmaskedvalue() : $(input).val();\n\n case \"remove\":\n return this.each(function() {\n this.inputmask && this.inputmask.remove();\n });\n\n case \"getemptymask\":\n return input && input.inputmask ? input.inputmask.getemptymask() : \"\";\n\n case \"hasMaskedValue\":\n return !(!input || !input.inputmask) && input.inputmask.hasMaskedValue();\n\n case \"isComplete\":\n return !input || !input.inputmask || input.inputmask.isComplete();\n\n case \"getmetadata\":\n return input && input.inputmask ? input.inputmask.getmetadata() : void 0;\n\n case \"setvalue\":\n $(input).val(options), input && void 0 === input.inputmask && $(input).triggerHandler(\"setvalue\");\n break;\n\n case \"option\":\n if (\"string\" != typeof options) return this.each(function() {\n if (void 0 !== this.inputmask) return this.inputmask.option(options);\n });\n if (input && void 0 !== input.inputmask) return input.inputmask.option(options);\n break;\n\n default:\n return options.alias = fn, nptmask = new Inputmask(options), this.each(function() {\n nptmask.mask(this);\n });\n } else {\n if (\"object\" == typeof fn) return nptmask = new Inputmask(fn), void 0 === fn.mask && void 0 === fn.alias ? this.each(function() {\n if (void 0 !== this.inputmask) return this.inputmask.option(fn);\n nptmask.mask(this);\n }) : this.each(function() {\n nptmask.mask(this);\n });\n if (void 0 === fn) return this.each(function() {\n nptmask = new Inputmask(options), nptmask.mask(this);\n });\n }\n }), $.fn.inputmask;\n});","/*!\n PowerTip v1.3.0 (2017-01-15)\n https://stevenbenner.github.io/jquery-powertip/\n Copyright (c) 2017 Steven Benner (http://stevenbenner.com/).\n Released under MIT license.\n https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt\n*/\n(function(root, factory) {\n\t// support loading the plugin via common patterns\n\tif (typeof define === 'function' && define.amd) {\n\t\t// load the plugin as an amd module\n\t\tdefine([ 'jquery' ], factory);\n\t} else if (typeof module === 'object' && module.exports) {\n\t\t// load the plugin as a commonjs module\n\t\tmodule.exports = factory(require('jquery'));\n\t} else {\n\t\t// load the plugin as a global\n\t\tfactory(root.jQuery);\n\t}\n}(this, function($) {\n\n\t// useful private variables\n\tvar $document = $(document),\n\t\t$window = $(window),\n\t\t$body = $('body');\n\n\t// constants\n\tvar DATA_DISPLAYCONTROLLER = 'displayController',\n\t\tDATA_HASACTIVEHOVER = 'hasActiveHover',\n\t\tDATA_FORCEDOPEN = 'forcedOpen',\n\t\tDATA_HASMOUSEMOVE = 'hasMouseMove',\n\t\tDATA_MOUSEONTOTIP = 'mouseOnToPopup',\n\t\tDATA_ORIGINALTITLE = 'originalTitle',\n\t\tDATA_POWERTIP = 'powertip',\n\t\tDATA_POWERTIPJQ = 'powertipjq',\n\t\tDATA_POWERTIPTARGET = 'powertiptarget',\n\t\tEVENT_NAMESPACE = '.powertip',\n\t\tRAD2DEG = 180 / Math.PI;\n\n\t/**\n\t * Session data\n\t * Private properties global to all powerTip instances\n\t */\n\tvar session = {\n\t\telements: null,\n\t\ttooltips: null,\n\t\tisTipOpen: false,\n\t\tisFixedTipOpen: false,\n\t\tisClosing: false,\n\t\ttipOpenImminent: false,\n\t\tactiveHover: null,\n\t\tcurrentX: 0,\n\t\tcurrentY: 0,\n\t\tpreviousX: 0,\n\t\tpreviousY: 0,\n\t\tdesyncTimeout: null,\n\t\tcloseDelayTimeout: null,\n\t\tmouseTrackingActive: false,\n\t\tdelayInProgress: false,\n\t\twindowWidth: 0,\n\t\twindowHeight: 0,\n\t\tscrollTop: 0,\n\t\tscrollLeft: 0\n\t};\n\n\t/**\n\t * Collision enumeration\n\t * @enum {number}\n\t */\n\tvar Collision = {\n\t\tnone: 0,\n\t\ttop: 1,\n\t\tbottom: 2,\n\t\tleft: 4,\n\t\tright: 8\n\t};\n\n\t/**\n\t * Display hover tooltips on the matched elements.\n\t * @param {(Object|string)=} opts The options object to use for the plugin, or\n\t * the name of a method to invoke on the first matched element.\n\t * @param {*=} [arg] Argument for an invoked method (optional).\n\t * @return {jQuery} jQuery object for the matched selectors.\n\t */\n\t$.fn.powerTip = function(opts, arg) {\n\t\tvar targetElements = this,\n\t\t\toptions,\n\t\t\ttipController;\n\n\t\t// don't do any work if there were no matched elements\n\t\tif (!targetElements.length) {\n\t\t\treturn targetElements;\n\t\t}\n\n\t\t// handle api method calls on the plugin, e.g. powerTip('hide')\n\t\tif ($.type(opts) === 'string' && $.powerTip[opts]) {\n\t\t\treturn $.powerTip[opts].call(targetElements, targetElements, arg);\n\t\t}\n\n\t\t// extend options and instantiate TooltipController\n\t\toptions = $.extend({}, $.fn.powerTip.defaults, opts);\n\t\ttipController = new TooltipController(options);\n\n\t\t// hook mouse and viewport dimension tracking\n\t\tinitTracking();\n\n\t\t// setup the elements\n\t\ttargetElements.each(function elementSetup() {\n\t\t\tvar $this = $(this),\n\t\t\t\tdataPowertip = $this.data(DATA_POWERTIP),\n\t\t\t\tdataElem = $this.data(DATA_POWERTIPJQ),\n\t\t\t\tdataTarget = $this.data(DATA_POWERTIPTARGET),\n\t\t\t\ttitle;\n\n\t\t\t// handle repeated powerTip calls on the same element by destroying the\n\t\t\t// original instance hooked to it and replacing it with this call\n\t\t\tif ($this.data(DATA_DISPLAYCONTROLLER)) {\n\t\t\t\t$.powerTip.destroy($this);\n\t\t\t}\n\n\t\t\t// attempt to use title attribute text if there is no data-powertip,\n\t\t\t// data-powertipjq or data-powertiptarget. If we do use the title\n\t\t\t// attribute, delete the attribute so the browser will not show it\n\t\t\ttitle = $this.attr('title');\n\t\t\tif (!dataPowertip && !dataTarget && !dataElem && title) {\n\t\t\t\t$this.data(DATA_POWERTIP, title);\n\t\t\t\t$this.data(DATA_ORIGINALTITLE, title);\n\t\t\t\t$this.removeAttr('title');\n\t\t\t}\n\n\t\t\t// create hover controllers for each element\n\t\t\t$this.data(\n\t\t\t\tDATA_DISPLAYCONTROLLER,\n\t\t\t\tnew DisplayController($this, options, tipController)\n\t\t\t);\n\t\t});\n\n\t\t// attach events to matched elements if the manual option is not enabled\n\t\tif (!options.manual) {\n\t\t\t// attach open events\n\t\t\t$.each(options.openEvents, function(idx, evt) {\n\t\t\t\tif ($.inArray(evt, options.closeEvents) > -1) {\n\t\t\t\t\t// event is in both openEvents and closeEvents, so toggle it\n\t\t\t\t\ttargetElements.on(evt + EVENT_NAMESPACE, function elementToggle(event) {\n\t\t\t\t\t\t$.powerTip.toggle(this, event);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\ttargetElements.on(evt + EVENT_NAMESPACE, function elementOpen(event) {\n\t\t\t\t\t\t$.powerTip.show(this, event);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// attach close events\n\t\t\t$.each(options.closeEvents, function(idx, evt) {\n\t\t\t\tif ($.inArray(evt, options.openEvents) < 0) {\n\t\t\t\t\ttargetElements.on(evt + EVENT_NAMESPACE, function elementClose(event) {\n\t\t\t\t\t\t// set immediate to true for any event without mouse info\n\t\t\t\t\t\t$.powerTip.hide(this, !isMouseEvent(event));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// attach escape key close event\n\t\t\ttargetElements.on('keydown' + EVENT_NAMESPACE, function elementKeyDown(event) {\n\t\t\t\t// always close tooltip when the escape key is pressed\n\t\t\t\tif (event.keyCode === 27) {\n\t\t\t\t\t$.powerTip.hide(this, true);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// remember elements that the plugin is attached to\n\t\tsession.elements = session.elements ? session.elements.add(targetElements) : targetElements;\n\n\t\treturn targetElements;\n\t};\n\n\t/**\n\t * Default options for the powerTip plugin.\n\t */\n\t$.fn.powerTip.defaults = {\n\t\tfadeInTime: 200,\n\t\tfadeOutTime: 100,\n\t\tfollowMouse: false,\n\t\tpopupId: 'powerTip',\n\t\tpopupClass: null,\n\t\tintentSensitivity: 7,\n\t\tintentPollInterval: 100,\n\t\tcloseDelay: 100,\n\t\tplacement: 'n',\n\t\tsmartPlacement: false,\n\t\toffset: 10,\n\t\tmouseOnToPopup: false,\n\t\tmanual: false,\n\t\topenEvents: [ 'mouseenter', 'focus' ],\n\t\tcloseEvents: [ 'mouseleave', 'blur' ]\n\t};\n\n\t/**\n\t * Default smart placement priority lists.\n\t * The first item in the array is the highest priority, the last is the lowest.\n\t * The last item is also the default, which will be used if all previous options\n\t * do not fit.\n\t */\n\t$.fn.powerTip.smartPlacementLists = {\n\t\tn: [ 'n', 'ne', 'nw', 's' ],\n\t\te: [ 'e', 'ne', 'se', 'w', 'nw', 'sw', 'n', 's', 'e' ],\n\t\ts: [ 's', 'se', 'sw', 'n' ],\n\t\tw: [ 'w', 'nw', 'sw', 'e', 'ne', 'se', 'n', 's', 'w' ],\n\t\tnw: [ 'nw', 'w', 'sw', 'n', 's', 'se', 'nw' ],\n\t\tne: [ 'ne', 'e', 'se', 'n', 's', 'sw', 'ne' ],\n\t\tsw: [ 'sw', 'w', 'nw', 's', 'n', 'ne', 'sw' ],\n\t\tse: [ 'se', 'e', 'ne', 's', 'n', 'nw', 'se' ],\n\t\t'nw-alt': [ 'nw-alt', 'n', 'ne-alt', 'sw-alt', 's', 'se-alt', 'w', 'e' ],\n\t\t'ne-alt': [ 'ne-alt', 'n', 'nw-alt', 'se-alt', 's', 'sw-alt', 'e', 'w' ],\n\t\t'sw-alt': [ 'sw-alt', 's', 'se-alt', 'nw-alt', 'n', 'ne-alt', 'w', 'e' ],\n\t\t'se-alt': [ 'se-alt', 's', 'sw-alt', 'ne-alt', 'n', 'nw-alt', 'e', 'w' ]\n\t};\n\n\t/**\n\t * Public API\n\t */\n\t$.powerTip = {\n\t\t/**\n\t\t * Attempts to show the tooltip for the specified element.\n\t\t * @param {jQuery|Element} element The element to open the tooltip for.\n\t\t * @param {jQuery.Event=} event jQuery event for hover intent and mouse\n\t\t * tracking (optional).\n\t\t * @return {jQuery|Element} The original jQuery object or DOM Element.\n\t\t */\n\t\tshow: function apiShowTip(element, event) {\n\t\t\t// if we were given a mouse event then run the hover intent testing,\n\t\t\t// otherwise, simply show the tooltip asap\n\t\t\tif (isMouseEvent(event)) {\n\t\t\t\ttrackMouse(event);\n\t\t\t\tsession.previousX = event.pageX;\n\t\t\t\tsession.previousY = event.pageY;\n\t\t\t\t$(element).data(DATA_DISPLAYCONTROLLER).show();\n\t\t\t} else {\n\t\t\t\t$(element).first().data(DATA_DISPLAYCONTROLLER).show(true, true);\n\t\t\t}\n\t\t\treturn element;\n\t\t},\n\n\t\t/**\n\t\t * Repositions the tooltip on the element.\n\t\t * @param {jQuery|Element} element The element the tooltip is shown for.\n\t\t * @return {jQuery|Element} The original jQuery object or DOM Element.\n\t\t */\n\t\treposition: function apiResetPosition(element) {\n\t\t\t$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();\n\t\t\treturn element;\n\t\t},\n\n\t\t/**\n\t\t * Attempts to close any open tooltips.\n\t\t * @param {(jQuery|Element)=} element The element with the tooltip that\n\t\t * should be closed (optional).\n\t\t * @param {boolean=} immediate Disable close delay (optional).\n\t\t * @return {jQuery|Element|undefined} The original jQuery object or DOM\n\t\t * Element, if one was specified.\n\t\t */\n\t\thide: function apiCloseTip(element, immediate) {\n\t\t\tvar displayController;\n\n\t\t\t// set immediate to true when no element is specified\n\t\t\timmediate = element ? immediate : true;\n\n\t\t\t// find the relevant display controller\n\t\t\tif (element) {\n\t\t\t\tdisplayController = $(element).first().data(DATA_DISPLAYCONTROLLER);\n\t\t\t} else if (session.activeHover) {\n\t\t\t\tdisplayController = session.activeHover.data(DATA_DISPLAYCONTROLLER);\n\t\t\t}\n\n\t\t\t// if found, hide the tip\n\t\t\tif (displayController) {\n\t\t\t\tdisplayController.hide(immediate);\n\t\t\t}\n\n\t\t\treturn element;\n\t\t},\n\n\t\t/**\n\t\t * Toggles the tooltip for the specified element. This will open a closed\n\t\t * tooltip, or close an open tooltip.\n\t\t * @param {jQuery|Element} element The element with the tooltip that\n\t\t * should be toggled.\n\t\t * @param {jQuery.Event=} event jQuery event for hover intent and mouse\n\t\t * tracking (optional).\n\t\t * @return {jQuery|Element} The original jQuery object or DOM Element.\n\t\t */\n\t\ttoggle: function apiToggle(element, event) {\n\t\t\tif (session.activeHover && session.activeHover.is(element)) {\n\t\t\t\t// tooltip for element is active, so close it\n\t\t\t\t$.powerTip.hide(element, !isMouseEvent(event));\n\t\t\t} else {\n\t\t\t\t// tooltip for element is not active, so open it\n\t\t\t\t$.powerTip.show(element, event);\n\t\t\t}\n\t\t\treturn element;\n\t\t},\n\n\t\t/**\n\t\t * Destroy and roll back any powerTip() instance on the specified elements.\n\t\t * If no elements are specified then all elements that the plugin is\n\t\t * currently attached to will be rolled back.\n\t\t * @param {(jQuery|Element)=} element The element with the powerTip instance.\n\t\t * @return {jQuery|Element|undefined} The original jQuery object or DOM\n\t\t * Element, if one was specified.\n\t\t */\n\t\tdestroy: function apiDestroy(element) {\n\t\t\tvar $element = element ? $(element) : session.elements;\n\n\t\t\t// if the plugin is not hooked to any elements then there is no point\n\t\t\t// trying to destroy anything, or dealing with the possible errors\n\t\t\tif (!session.elements || session.elements.length === 0) {\n\t\t\t\treturn element;\n\t\t\t}\n\n\t\t\t// unhook events and destroy plugin changes to each element\n\t\t\t$element.off(EVENT_NAMESPACE).each(function destroy() {\n\t\t\t\tvar $this = $(this),\n\t\t\t\t\tdataAttributes = [\n\t\t\t\t\t\tDATA_ORIGINALTITLE,\n\t\t\t\t\t\tDATA_DISPLAYCONTROLLER,\n\t\t\t\t\t\tDATA_HASACTIVEHOVER,\n\t\t\t\t\t\tDATA_FORCEDOPEN\n\t\t\t\t\t];\n\n\t\t\t\t// revert title attribute\n\t\t\t\tif ($this.data(DATA_ORIGINALTITLE)) {\n\t\t\t\t\t$this.attr('title', $this.data(DATA_ORIGINALTITLE));\n\t\t\t\t\tdataAttributes.push(DATA_POWERTIP);\n\t\t\t\t}\n\n\t\t\t\t// remove data attributes\n\t\t\t\t$this.removeData(dataAttributes);\n\t\t\t});\n\n\t\t\t// remove destroyed element from active elements collection\n\t\t\tsession.elements = session.elements.not($element);\n\n\t\t\t// if there are no active elements left then we will unhook all of the\n\t\t\t// events that we've bound code to and remove the tooltip elements\n\t\t\tif (session.elements.length === 0) {\n\t\t\t\t$window.off(EVENT_NAMESPACE);\n\t\t\t\t$document.off(EVENT_NAMESPACE);\n\t\t\t\tsession.mouseTrackingActive = false;\n\t\t\t\tsession.tooltips.remove();\n\t\t\t\tsession.tooltips = null;\n\t\t\t}\n\n\t\t\treturn element;\n\t\t}\n\t};\n\n\t// API aliasing\n\t$.powerTip.showTip = $.powerTip.show;\n\t$.powerTip.closeTip = $.powerTip.hide;\n\n\t/**\n\t * Creates a new CSSCoordinates object.\n\t * @private\n\t * @constructor\n\t */\n\tfunction CSSCoordinates() {\n\t\tvar me = this;\n\n\t\t// initialize object properties\n\t\tme.top = 'auto';\n\t\tme.left = 'auto';\n\t\tme.right = 'auto';\n\t\tme.bottom = 'auto';\n\n\t\t/**\n\t\t * Set a property to a value.\n\t\t * @private\n\t\t * @param {string} property The name of the property.\n\t\t * @param {number} value The value of the property.\n\t\t */\n\t\tme.set = function(property, value) {\n\t\t\tif ($.isNumeric(value)) {\n\t\t\t\tme[property] = Math.round(value);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Creates a new tooltip display controller.\n\t * @private\n\t * @constructor\n\t * @param {jQuery} element The element that this controller will handle.\n\t * @param {Object} options Options object containing settings.\n\t * @param {TooltipController} tipController The TooltipController object for\n\t * this instance.\n\t */\n\tfunction DisplayController(element, options, tipController) {\n\t\tvar hoverTimer = null,\n\t\t\tmyCloseDelay = null;\n\n\t\t/**\n\t\t * Begins the process of showing a tooltip.\n\t\t * @private\n\t\t * @param {boolean=} immediate Skip intent testing (optional).\n\t\t * @param {boolean=} forceOpen Ignore cursor position and force tooltip to\n\t\t * open (optional).\n\t\t */\n\t\tfunction openTooltip(immediate, forceOpen) {\n\t\t\tcancelTimer();\n\t\t\tif (!element.data(DATA_HASACTIVEHOVER)) {\n\t\t\t\tif (!immediate) {\n\t\t\t\t\tsession.tipOpenImminent = true;\n\t\t\t\t\thoverTimer = setTimeout(\n\t\t\t\t\t\tfunction intentDelay() {\n\t\t\t\t\t\t\thoverTimer = null;\n\t\t\t\t\t\t\tcheckForIntent();\n\t\t\t\t\t\t},\n\t\t\t\t\t\toptions.intentPollInterval\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tif (forceOpen) {\n\t\t\t\t\t\telement.data(DATA_FORCEDOPEN, true);\n\t\t\t\t\t}\n\t\t\t\t\tcloseAnyDelayed();\n\t\t\t\t\ttipController.showTip(element);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// cursor left and returned to this element, cancel close\n\t\t\t\tcancelClose();\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Begins the process of closing a tooltip.\n\t\t * @private\n\t\t * @param {boolean=} disableDelay Disable close delay (optional).\n\t\t */\n\t\tfunction closeTooltip(disableDelay) {\n\t\t\t// if this instance already has a close delay in progress then halt it\n\t\t\tif (myCloseDelay) {\n\t\t\t\tmyCloseDelay = session.closeDelayTimeout = clearTimeout(myCloseDelay);\n\t\t\t\tsession.delayInProgress = false;\n\t\t\t}\n\t\t\tcancelTimer();\n\t\t\tsession.tipOpenImminent = false;\n\t\t\tif (element.data(DATA_HASACTIVEHOVER)) {\n\t\t\t\telement.data(DATA_FORCEDOPEN, false);\n\t\t\t\tif (!disableDelay) {\n\t\t\t\t\tsession.delayInProgress = true;\n\t\t\t\t\tsession.closeDelayTimeout = setTimeout(\n\t\t\t\t\t\tfunction closeDelay() {\n\t\t\t\t\t\t\tsession.closeDelayTimeout = null;\n\t\t\t\t\t\t\ttipController.hideTip(element);\n\t\t\t\t\t\t\tsession.delayInProgress = false;\n\t\t\t\t\t\t\tmyCloseDelay = null;\n\t\t\t\t\t\t},\n\t\t\t\t\t\toptions.closeDelay\n\t\t\t\t\t);\n\t\t\t\t\t// save internal reference close delay id so we can check if the\n\t\t\t\t\t// active close delay belongs to this instance\n\t\t\t\t\tmyCloseDelay = session.closeDelayTimeout;\n\t\t\t\t} else {\n\t\t\t\t\ttipController.hideTip(element);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Checks mouse position to make sure that the user intended to hover on the\n\t\t * specified element before showing the tooltip.\n\t\t * @private\n\t\t */\n\t\tfunction checkForIntent() {\n\t\t\t// calculate mouse position difference\n\t\t\tvar xDifference = Math.abs(session.previousX - session.currentX),\n\t\t\t\tyDifference = Math.abs(session.previousY - session.currentY),\n\t\t\t\ttotalDifference = xDifference + yDifference;\n\n\t\t\t// check if difference has passed the sensitivity threshold\n\t\t\tif (totalDifference < options.intentSensitivity) {\n\t\t\t\tcancelClose();\n\t\t\t\tcloseAnyDelayed();\n\t\t\t\ttipController.showTip(element);\n\t\t\t} else {\n\t\t\t\t// try again\n\t\t\t\tsession.previousX = session.currentX;\n\t\t\t\tsession.previousY = session.currentY;\n\t\t\t\topenTooltip();\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Cancels active hover timer.\n\t\t * @private\n\t\t * @param {boolean=} stopClose Cancel any active close delay timer.\n\t\t */\n\t\tfunction cancelTimer(stopClose) {\n\t\t\thoverTimer = clearTimeout(hoverTimer);\n\t\t\t// cancel the current close delay if the active close delay is for this\n\t\t\t// element or the stopClose argument is true\n\t\t\tif (session.closeDelayTimeout && myCloseDelay === session.closeDelayTimeout || stopClose) {\n\t\t\t\tcancelClose();\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Cancels any active close delay timer.\n\t\t * @private\n\t\t */\n\t\tfunction cancelClose() {\n\t\t\tsession.closeDelayTimeout = clearTimeout(session.closeDelayTimeout);\n\t\t\tsession.delayInProgress = false;\n\t\t}\n\n\t\t/**\n\t\t * Asks any tooltips waiting on their close delay to close now.\n\t\t * @private\n\t\t */\n\t\tfunction closeAnyDelayed() {\n\t\t\t// if another element is waiting for its close delay then we should ask\n\t\t\t// it to close immediately so we can proceed without unexpected timeout\n\t\t\t// code being run during this tooltip's lifecycle\n\t\t\tif (session.delayInProgress && session.activeHover && !session.activeHover.is(element)) {\n\t\t\t\tsession.activeHover.data(DATA_DISPLAYCONTROLLER).hide(true);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Repositions the tooltip on this element.\n\t\t * @private\n\t\t */\n\t\tfunction repositionTooltip() {\n\t\t\ttipController.resetPosition(element);\n\t\t}\n\n\t\t// expose the methods\n\t\tthis.show = openTooltip;\n\t\tthis.hide = closeTooltip;\n\t\tthis.cancel = cancelTimer;\n\t\tthis.resetPosition = repositionTooltip;\n\t}\n\n\t/**\n\t * Creates a new Placement Calculator.\n\t * @private\n\t * @constructor\n\t */\n\tfunction PlacementCalculator() {\n\t\t/**\n\t\t * Compute the CSS position to display a tooltip at the specified placement\n\t\t * relative to the specified element.\n\t\t * @private\n\t\t * @param {jQuery} element The element that the tooltip should target.\n\t\t * @param {string} placement The placement for the tooltip.\n\t\t * @param {number} tipWidth Width of the tooltip element in pixels.\n\t\t * @param {number} tipHeight Height of the tooltip element in pixels.\n\t\t * @param {number} offset Distance to offset tooltips in pixels.\n\t\t * @return {CSSCoordinates} A CSSCoordinates object with the position.\n\t\t */\n\t\tfunction computePlacementCoords(element, placement, tipWidth, tipHeight, offset) {\n\t\t\tvar placementBase = placement.split('-')[0], // ignore 'alt' for corners\n\t\t\t\tcoords = new CSSCoordinates(),\n\t\t\t\tposition;\n\n\t\t\tif (isSvgElement(element)) {\n\t\t\t\tposition = getSvgPlacement(element, placementBase);\n\t\t\t} else {\n\t\t\t\tposition = getHtmlPlacement(element, placementBase);\n\t\t\t}\n\n\t\t\t// calculate the appropriate x and y position in the document\n\t\t\tswitch (placement) {\n\t\t\t\tcase 'n':\n\t\t\t\t\tcoords.set('left', position.left - (tipWidth / 2));\n\t\t\t\t\tcoords.set('bottom', session.windowHeight - position.top + offset);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'e':\n\t\t\t\t\tcoords.set('left', position.left + offset);\n\t\t\t\t\tcoords.set('top', position.top - (tipHeight / 2));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 's':\n\t\t\t\t\tcoords.set('left', position.left - (tipWidth / 2));\n\t\t\t\t\tcoords.set('top', position.top + offset);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'w':\n\t\t\t\t\tcoords.set('top', position.top - (tipHeight / 2));\n\t\t\t\t\tcoords.set('right', session.windowWidth - position.left + offset);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'nw':\n\t\t\t\t\tcoords.set('bottom', session.windowHeight - position.top + offset);\n\t\t\t\t\tcoords.set('right', session.windowWidth - position.left - 20);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'nw-alt':\n\t\t\t\t\tcoords.set('left', position.left);\n\t\t\t\t\tcoords.set('bottom', session.windowHeight - position.top + offset);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'ne':\n\t\t\t\t\tcoords.set('left', position.left - 20);\n\t\t\t\t\tcoords.set('bottom', session.windowHeight - position.top + offset);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'ne-alt':\n\t\t\t\t\tcoords.set('bottom', session.windowHeight - position.top + offset);\n\t\t\t\t\tcoords.set('right', session.windowWidth - position.left);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'sw':\n\t\t\t\t\tcoords.set('top', position.top + offset);\n\t\t\t\t\tcoords.set('right', session.windowWidth - position.left - 20);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'sw-alt':\n\t\t\t\t\tcoords.set('left', position.left);\n\t\t\t\t\tcoords.set('top', position.top + offset);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'se':\n\t\t\t\t\tcoords.set('left', position.left - 20);\n\t\t\t\t\tcoords.set('top', position.top + offset);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'se-alt':\n\t\t\t\t\tcoords.set('top', position.top + offset);\n\t\t\t\t\tcoords.set('right', session.windowWidth - position.left);\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn coords;\n\t\t}\n\n\t\t/**\n\t\t * Finds the tooltip attachment point in the document for a HTML DOM element\n\t\t * for the specified placement.\n\t\t * @private\n\t\t * @param {jQuery} element The element that the tooltip should target.\n\t\t * @param {string} placement The placement for the tooltip.\n\t\t * @return {Object} An object with the top,left position values.\n\t\t */\n\t\tfunction getHtmlPlacement(element, placement) {\n\t\t\tvar objectOffset = element.offset(),\n\t\t\t\tobjectWidth = element.outerWidth(),\n\t\t\t\tobjectHeight = element.outerHeight(),\n\t\t\t\tleft,\n\t\t\t\ttop;\n\n\t\t\t// calculate the appropriate x and y position in the document\n\t\t\tswitch (placement) {\n\t\t\t\tcase 'n':\n\t\t\t\t\tleft = objectOffset.left + objectWidth / 2;\n\t\t\t\t\ttop = objectOffset.top;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'e':\n\t\t\t\t\tleft = objectOffset.left + objectWidth;\n\t\t\t\t\ttop = objectOffset.top + objectHeight / 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 's':\n\t\t\t\t\tleft = objectOffset.left + objectWidth / 2;\n\t\t\t\t\ttop = objectOffset.top + objectHeight;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'w':\n\t\t\t\t\tleft = objectOffset.left;\n\t\t\t\t\ttop = objectOffset.top + objectHeight / 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'nw':\n\t\t\t\t\tleft = objectOffset.left;\n\t\t\t\t\ttop = objectOffset.top;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'ne':\n\t\t\t\t\tleft = objectOffset.left + objectWidth;\n\t\t\t\t\ttop = objectOffset.top;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'sw':\n\t\t\t\t\tleft = objectOffset.left;\n\t\t\t\t\ttop = objectOffset.top + objectHeight;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'se':\n\t\t\t\t\tleft = objectOffset.left + objectWidth;\n\t\t\t\t\ttop = objectOffset.top + objectHeight;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttop: top,\n\t\t\t\tleft: left\n\t\t\t};\n\t\t}\n\n\t\t/**\n\t\t * Finds the tooltip attachment point in the document for a SVG element for\n\t\t * the specified placement.\n\t\t * @private\n\t\t * @param {jQuery} element The element that the tooltip should target.\n\t\t * @param {string} placement The placement for the tooltip.\n\t\t * @return {Object} An object with the top,left position values.\n\t\t */\n\t\tfunction getSvgPlacement(element, placement) {\n\t\t\tvar svgElement = element.closest('svg')[0],\n\t\t\t\tdomElement = element[0],\n\t\t\t\tpoint = svgElement.createSVGPoint(),\n\t\t\t\tboundingBox = domElement.getBBox(),\n\t\t\t\tmatrix = domElement.getScreenCTM(),\n\t\t\t\thalfWidth = boundingBox.width / 2,\n\t\t\t\thalfHeight = boundingBox.height / 2,\n\t\t\t\tplacements = [],\n\t\t\t\tplacementKeys = [ 'nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w' ],\n\t\t\t\tcoords,\n\t\t\t\trotation,\n\t\t\t\tsteps,\n\t\t\t\tx;\n\n\t\t\tfunction pushPlacement() {\n\t\t\t\tplacements.push(point.matrixTransform(matrix));\n\t\t\t}\n\n\t\t\t// get bounding box corners and midpoints\n\t\t\tpoint.x = boundingBox.x;\n\t\t\tpoint.y = boundingBox.y;\n\t\t\tpushPlacement();\n\t\t\tpoint.x += halfWidth;\n\t\t\tpushPlacement();\n\t\t\tpoint.x += halfWidth;\n\t\t\tpushPlacement();\n\t\t\tpoint.y += halfHeight;\n\t\t\tpushPlacement();\n\t\t\tpoint.y += halfHeight;\n\t\t\tpushPlacement();\n\t\t\tpoint.x -= halfWidth;\n\t\t\tpushPlacement();\n\t\t\tpoint.x -= halfWidth;\n\t\t\tpushPlacement();\n\t\t\tpoint.y -= halfHeight;\n\t\t\tpushPlacement();\n\n\t\t\t// determine rotation\n\t\t\tif (placements[0].y !== placements[1].y || placements[0].x !== placements[7].x) {\n\t\t\t\trotation = Math.atan2(matrix.b, matrix.a) * RAD2DEG;\n\t\t\t\tsteps = Math.ceil(((rotation % 360) - 22.5) / 45);\n\t\t\t\tif (steps < 1) {\n\t\t\t\t\tsteps += 8;\n\t\t\t\t}\n\t\t\t\twhile (steps--) {\n\t\t\t\t\tplacementKeys.push(placementKeys.shift());\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// find placement\n\t\t\tfor (x = 0; x < placements.length; x++) {\n\t\t\t\tif (placementKeys[x] === placement) {\n\t\t\t\t\tcoords = placements[x];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttop: coords.y + session.scrollTop,\n\t\t\t\tleft: coords.x + session.scrollLeft\n\t\t\t};\n\t\t}\n\n\t\t// expose methods\n\t\tthis.compute = computePlacementCoords;\n\t}\n\n\t/**\n\t * Creates a new tooltip controller.\n\t * @private\n\t * @constructor\n\t * @param {Object} options Options object containing settings.\n\t */\n\tfunction TooltipController(options) {\n\t\tvar placementCalculator = new PlacementCalculator(),\n\t\t\ttipElement = $('#' + options.popupId);\n\n\t\t// build and append tooltip div if it does not already exist\n\t\tif (tipElement.length === 0) {\n\t\t\ttipElement = $('
    ', { id: options.popupId });\n\t\t\t// grab body element if it was not populated when the script loaded\n\t\t\t// note: this hack exists solely for jsfiddle support\n\t\t\tif ($body.length === 0) {\n\t\t\t\t$body = $('body');\n\t\t\t}\n\t\t\t$body.append(tipElement);\n\t\t\t// remember the tooltip elements that the plugin has created\n\t\t\tsession.tooltips = session.tooltips ? session.tooltips.add(tipElement) : tipElement;\n\t\t}\n\n\t\t// hook mousemove for cursor follow tooltips\n\t\tif (options.followMouse) {\n\t\t\t// only one positionTipOnCursor hook per tooltip element, please\n\t\t\tif (!tipElement.data(DATA_HASMOUSEMOVE)) {\n\t\t\t\t$document.on('mousemove' + EVENT_NAMESPACE, positionTipOnCursor);\n\t\t\t\t$window.on('scroll' + EVENT_NAMESPACE, positionTipOnCursor);\n\t\t\t\ttipElement.data(DATA_HASMOUSEMOVE, true);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Gives the specified element the active-hover state and queues up the\n\t\t * showTip function.\n\t\t * @private\n\t\t * @param {jQuery} element The element that the tooltip should target.\n\t\t */\n\t\tfunction beginShowTip(element) {\n\t\t\telement.data(DATA_HASACTIVEHOVER, true);\n\t\t\t// show tooltip, asap\n\t\t\ttipElement.queue(function queueTipInit(next) {\n\t\t\t\tshowTip(element);\n\t\t\t\tnext();\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Shows the tooltip, as soon as possible.\n\t\t * @private\n\t\t * @param {jQuery} element The element that the tooltip should target.\n\t\t */\n\t\tfunction showTip(element) {\n\t\t\tvar tipContent;\n\n\t\t\t// it is possible, especially with keyboard navigation, to move on to\n\t\t\t// another element with a tooltip during the queue to get to this point\n\t\t\t// in the code. if that happens then we need to not proceed or we may\n\t\t\t// have the fadeout callback for the last tooltip execute immediately\n\t\t\t// after this code runs, causing bugs.\n\t\t\tif (!element.data(DATA_HASACTIVEHOVER)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// if the tooltip is open and we got asked to open another one then the\n\t\t\t// old one is still in its fadeOut cycle, so wait and try again\n\t\t\tif (session.isTipOpen) {\n\t\t\t\tif (!session.isClosing) {\n\t\t\t\t\thideTip(session.activeHover);\n\t\t\t\t}\n\t\t\t\ttipElement.delay(100).queue(function queueTipAgain(next) {\n\t\t\t\t\tshowTip(element);\n\t\t\t\t\tnext();\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// trigger powerTipPreRender event\n\t\t\telement.trigger('powerTipPreRender');\n\n\t\t\t// set tooltip content\n\t\t\ttipContent = getTooltipContent(element);\n\t\t\tif (tipContent) {\n\t\t\t\ttipElement.empty().append(tipContent);\n\t\t\t} else {\n\t\t\t\t// we have no content to display, give up\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// trigger powerTipRender event\n\t\t\telement.trigger('powerTipRender');\n\n\t\t\tsession.activeHover = element;\n\t\t\tsession.isTipOpen = true;\n\n\t\t\ttipElement.data(DATA_MOUSEONTOTIP, options.mouseOnToPopup);\n\n\t\t\t// set tooltip position\n\t\t\tif (!options.followMouse) {\n\t\t\t\tpositionTipOnElement(element);\n\t\t\t\tsession.isFixedTipOpen = true;\n\t\t\t} else {\n\t\t\t\tpositionTipOnCursor();\n\t\t\t}\n\n\t\t\t// add custom class to tooltip element\n\t\t\ttipElement.addClass(options.popupClass);\n\n\t\t\t// close tooltip when clicking anywhere on the page, with the exception\n\t\t\t// of the tooltip's trigger element and any elements that are within a\n\t\t\t// tooltip that has 'mouseOnToPopup' option enabled\n\t\t\tif (!element.data(DATA_FORCEDOPEN)) {\n\t\t\t\t$document.on('click' + EVENT_NAMESPACE, function documentClick(event) {\n\t\t\t\t\tvar target = event.target;\n\t\t\t\t\tif (target !== element[0]) {\n\t\t\t\t\t\tif (options.mouseOnToPopup) {\n\t\t\t\t\t\t\tif (target !== tipElement[0] && !$.contains(tipElement[0], target)) {\n\t\t\t\t\t\t\t\t$.powerTip.hide();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$.powerTip.hide();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// if we want to be able to mouse on to the tooltip then we need to\n\t\t\t// attach hover events to the tooltip that will cancel a close request\n\t\t\t// on mouseenter and start a new close request on mouseleave\n\t\t\t// only hook these listeners if we're not in manual mode\n\t\t\tif (options.mouseOnToPopup && !options.manual) {\n\t\t\t\ttipElement.on('mouseenter' + EVENT_NAMESPACE, function tipMouseEnter() {\n\t\t\t\t\t// check activeHover in case the mouse cursor entered the\n\t\t\t\t\t// tooltip during the fadeOut and close cycle\n\t\t\t\t\tif (session.activeHover) {\n\t\t\t\t\t\tsession.activeHover.data(DATA_DISPLAYCONTROLLER).cancel();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\ttipElement.on('mouseleave' + EVENT_NAMESPACE, function tipMouseLeave() {\n\t\t\t\t\t// check activeHover in case the mouse cursor left the tooltip\n\t\t\t\t\t// during the fadeOut and close cycle\n\t\t\t\t\tif (session.activeHover) {\n\t\t\t\t\t\tsession.activeHover.data(DATA_DISPLAYCONTROLLER).hide();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// fadein\n\t\t\ttipElement.fadeIn(options.fadeInTime, function fadeInCallback() {\n\t\t\t\t// start desync polling\n\t\t\t\tif (!session.desyncTimeout) {\n\t\t\t\t\tsession.desyncTimeout = setInterval(closeDesyncedTip, 500);\n\t\t\t\t}\n\n\t\t\t\t// trigger powerTipOpen event\n\t\t\t\telement.trigger('powerTipOpen');\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Hides the tooltip.\n\t\t * @private\n\t\t * @param {jQuery} element The element that the tooltip should target.\n\t\t */\n\t\tfunction hideTip(element) {\n\t\t\t// reset session\n\t\t\tsession.isClosing = true;\n\t\t\tsession.isTipOpen = false;\n\n\t\t\t// stop desync polling\n\t\t\tsession.desyncTimeout = clearInterval(session.desyncTimeout);\n\n\t\t\t// reset element state\n\t\t\telement.data(DATA_HASACTIVEHOVER, false);\n\t\t\telement.data(DATA_FORCEDOPEN, false);\n\n\t\t\t// remove document click handler\n\t\t\t$document.off('click' + EVENT_NAMESPACE);\n\n\t\t\t// unbind the mouseOnToPopup events if they were set\n\t\t\ttipElement.off(EVENT_NAMESPACE);\n\n\t\t\t// fade out\n\t\t\ttipElement.fadeOut(options.fadeOutTime, function fadeOutCallback() {\n\t\t\t\tvar coords = new CSSCoordinates();\n\n\t\t\t\t// reset session and tooltip element\n\t\t\t\tsession.activeHover = null;\n\t\t\t\tsession.isClosing = false;\n\t\t\t\tsession.isFixedTipOpen = false;\n\t\t\t\ttipElement.removeClass();\n\n\t\t\t\t// support mouse-follow and fixed position tips at the same time by\n\t\t\t\t// moving the tooltip to the last cursor location after it is hidden\n\t\t\t\tcoords.set('top', session.currentY + options.offset);\n\t\t\t\tcoords.set('left', session.currentX + options.offset);\n\t\t\t\ttipElement.css(coords);\n\n\t\t\t\t// trigger powerTipClose event\n\t\t\t\telement.trigger('powerTipClose');\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Moves the tooltip to the users mouse cursor.\n\t\t * @private\n\t\t */\n\t\tfunction positionTipOnCursor() {\n\t\t\t// to support having fixed tooltips on the same page as cursor tooltips,\n\t\t\t// where both instances are referencing the same tooltip element, we\n\t\t\t// need to keep track of the mouse position constantly, but we should\n\t\t\t// only set the tip location if a fixed tip is not currently open, a tip\n\t\t\t// open is imminent or active, and the tooltip element in question does\n\t\t\t// have a mouse-follow using it.\n\t\t\tif (!session.isFixedTipOpen && (session.isTipOpen || (session.tipOpenImminent && tipElement.data(DATA_HASMOUSEMOVE)))) {\n\t\t\t\t// grab measurements\n\t\t\t\tvar tipWidth = tipElement.outerWidth(),\n\t\t\t\t\ttipHeight = tipElement.outerHeight(),\n\t\t\t\t\tcoords = new CSSCoordinates(),\n\t\t\t\t\tcollisions,\n\t\t\t\t\tcollisionCount;\n\n\t\t\t\t// grab collisions\n\t\t\t\tcoords.set('top', session.currentY + options.offset);\n\t\t\t\tcoords.set('left', session.currentX + options.offset);\n\t\t\t\tcollisions = getViewportCollisions(\n\t\t\t\t\tcoords,\n\t\t\t\t\ttipWidth,\n\t\t\t\t\ttipHeight\n\t\t\t\t);\n\n\t\t\t\t// handle tooltip view port collisions\n\t\t\t\tif (collisions !== Collision.none) {\n\t\t\t\t\tcollisionCount = countFlags(collisions);\n\t\t\t\t\tif (collisionCount === 1) {\n\t\t\t\t\t\t// if there is only one collision (bottom or right) then\n\t\t\t\t\t\t// simply constrain the tooltip to the view port\n\t\t\t\t\t\tif (collisions === Collision.right) {\n\t\t\t\t\t\t\tcoords.set('left', session.windowWidth - tipWidth);\n\t\t\t\t\t\t} else if (collisions === Collision.bottom) {\n\t\t\t\t\t\t\tcoords.set('top', session.scrollTop + session.windowHeight - tipHeight);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// if the tooltip has more than one collision then it is\n\t\t\t\t\t\t// trapped in the corner and should be flipped to get it out\n\t\t\t\t\t\t// of the users way\n\t\t\t\t\t\tcoords.set('left', session.currentX - tipWidth - options.offset);\n\t\t\t\t\t\tcoords.set('top', session.currentY - tipHeight - options.offset);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// position the tooltip\n\t\t\t\ttipElement.css(coords);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Sets the tooltip to the correct position relative to the specified target\n\t\t * element. Based on options settings.\n\t\t * @private\n\t\t * @param {jQuery} element The element that the tooltip should target.\n\t\t */\n\t\tfunction positionTipOnElement(element) {\n\t\t\tvar priorityList,\n\t\t\t\tfinalPlacement;\n\n\t\t\tif (options.smartPlacement) {\n\t\t\t\tpriorityList = $.fn.powerTip.smartPlacementLists[options.placement];\n\n\t\t\t\t// iterate over the priority list and use the first placement option\n\t\t\t\t// that does not collide with the view port. if they all collide\n\t\t\t\t// then the last placement in the list will be used.\n\t\t\t\t$.each(priorityList, function(idx, pos) {\n\t\t\t\t\t// place tooltip and find collisions\n\t\t\t\t\tvar collisions = getViewportCollisions(\n\t\t\t\t\t\tplaceTooltip(element, pos),\n\t\t\t\t\t\ttipElement.outerWidth(),\n\t\t\t\t\t\ttipElement.outerHeight()\n\t\t\t\t\t);\n\n\t\t\t\t\t// update the final placement variable\n\t\t\t\t\tfinalPlacement = pos;\n\n\t\t\t\t\t// break if there were no collisions\n\t\t\t\t\tif (collisions === Collision.none) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// if we're not going to use the smart placement feature then just\n\t\t\t\t// compute the coordinates and do it\n\t\t\t\tplaceTooltip(element, options.placement);\n\t\t\t\tfinalPlacement = options.placement;\n\t\t\t}\n\n\t\t\t// add placement as class for CSS arrows\n\t\t\ttipElement.removeClass('w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt');\n\t\t\ttipElement.addClass(finalPlacement);\n\t\t}\n\n\t\t/**\n\t\t * Sets the tooltip position to the appropriate values to show the tip at\n\t\t * the specified placement. This function will iterate and test the tooltip\n\t\t * to support elastic tooltips.\n\t\t * @private\n\t\t * @param {jQuery} element The element that the tooltip should target.\n\t\t * @param {string} placement The placement for the tooltip.\n\t\t * @return {CSSCoordinates} A CSSCoordinates object with the top, left, and\n\t\t * right position values.\n\t\t */\n\t\tfunction placeTooltip(element, placement) {\n\t\t\tvar iterationCount = 0,\n\t\t\t\ttipWidth,\n\t\t\t\ttipHeight,\n\t\t\t\tcoords = new CSSCoordinates();\n\n\t\t\t// set the tip to 0,0 to get the full expanded width\n\t\t\tcoords.set('top', 0);\n\t\t\tcoords.set('left', 0);\n\t\t\ttipElement.css(coords);\n\n\t\t\t// to support elastic tooltips we need to check for a change in the\n\t\t\t// rendered dimensions after the tooltip has been positioned\n\t\t\tdo {\n\t\t\t\t// grab the current tip dimensions\n\t\t\t\ttipWidth = tipElement.outerWidth();\n\t\t\t\ttipHeight = tipElement.outerHeight();\n\n\t\t\t\t// get placement coordinates\n\t\t\t\tcoords = placementCalculator.compute(\n\t\t\t\t\telement,\n\t\t\t\t\tplacement,\n\t\t\t\t\ttipWidth,\n\t\t\t\t\ttipHeight,\n\t\t\t\t\toptions.offset\n\t\t\t\t);\n\n\t\t\t\t// place the tooltip\n\t\t\t\ttipElement.css(coords);\n\t\t\t} while (\n\t\t\t\t// sanity check: limit to 5 iterations, and...\n\t\t\t\t++iterationCount <= 5 &&\n\t\t\t\t// try again if the dimensions changed after placement\n\t\t\t\t(tipWidth !== tipElement.outerWidth() || tipHeight !== tipElement.outerHeight())\n\t\t\t);\n\n\t\t\treturn coords;\n\t\t}\n\n\t\t/**\n\t\t * Checks for a tooltip desync and closes the tooltip if one occurs.\n\t\t * @private\n\t\t */\n\t\tfunction closeDesyncedTip() {\n\t\t\tvar isDesynced = false;\n\t\t\t// It is possible for the mouse cursor to leave an element without\n\t\t\t// firing the mouseleave or blur event. This most commonly happens when\n\t\t\t// the element is disabled under mouse cursor. If this happens it will\n\t\t\t// result in a desynced tooltip because the tooltip was never asked to\n\t\t\t// close. So we should periodically check for a desync situation and\n\t\t\t// close the tip if such a situation arises.\n\t\t\tif (session.isTipOpen && !session.isClosing && !session.delayInProgress && ($.inArray('mouseleave', options.closeEvents) > -1 || $.inArray('mouseout', options.closeEvents) > -1 || $.inArray('blur', options.closeEvents) > -1 || $.inArray('focusout', options.closeEvents) > -1)) {\n\t\t\t\t// user moused onto another tip or active hover is disabled\n\t\t\t\tif (session.activeHover.data(DATA_HASACTIVEHOVER) === false || session.activeHover.is(':disabled')) {\n\t\t\t\t\tisDesynced = true;\n\t\t\t\t} else {\n\t\t\t\t\t// hanging tip - have to test if mouse position is not over the\n\t\t\t\t\t// active hover and not over a tooltip set to let the user\n\t\t\t\t\t// interact with it.\n\t\t\t\t\t// for keyboard navigation: this only counts if the element does\n\t\t\t\t\t// not have focus.\n\t\t\t\t\t// for tooltips opened via the api: we need to check if it has\n\t\t\t\t\t// the forcedOpen flag.\n\t\t\t\t\tif (!isMouseOver(session.activeHover) && !session.activeHover.is(':focus') && !session.activeHover.data(DATA_FORCEDOPEN)) {\n\t\t\t\t\t\tif (tipElement.data(DATA_MOUSEONTOTIP)) {\n\t\t\t\t\t\t\tif (!isMouseOver(tipElement)) {\n\t\t\t\t\t\t\t\tisDesynced = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tisDesynced = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (isDesynced) {\n\t\t\t\t\t// close the desynced tip\n\t\t\t\t\thideTip(session.activeHover);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// expose methods\n\t\tthis.showTip = beginShowTip;\n\t\tthis.hideTip = hideTip;\n\t\tthis.resetPosition = positionTipOnElement;\n\t}\n\n\t/**\n\t * Determine whether a jQuery object is an SVG element\n\t * @private\n\t * @param {jQuery} element The element to check\n\t * @return {boolean} Whether this is an SVG element\n\t */\n\tfunction isSvgElement(element) {\n\t\treturn Boolean(window.SVGElement && element[0] instanceof SVGElement);\n\t}\n\n\t/**\n\t * Determines if the specified jQuery.Event object has mouse data.\n\t * @private\n\t * @param {jQuery.Event=} event The jQuery.Event object to test.\n\t * @return {boolean} True if there is mouse data, otherwise false.\n\t */\n\tfunction isMouseEvent(event) {\n\t\treturn Boolean(event && typeof event.pageX === 'number');\n\t}\n\n\t/**\n\t * Initializes the viewport dimension cache and hooks up the mouse position\n\t * tracking and viewport dimension tracking events.\n\t * Prevents attaching the events more than once.\n\t * @private\n\t */\n\tfunction initTracking() {\n\t\tif (!session.mouseTrackingActive) {\n\t\t\tsession.mouseTrackingActive = true;\n\n\t\t\t// grab the current viewport dimensions on load\n\t\t\tgetViewportDimensions();\n\t\t\t$(getViewportDimensions);\n\n\t\t\t// hook mouse move tracking\n\t\t\t$document.on('mousemove' + EVENT_NAMESPACE, trackMouse);\n\n\t\t\t// hook viewport dimensions tracking\n\t\t\t$window.on('resize' + EVENT_NAMESPACE, trackResize);\n\t\t\t$window.on('scroll' + EVENT_NAMESPACE, trackScroll);\n\t\t}\n\t}\n\n\t/**\n\t * Updates the viewport dimensions cache.\n\t * @private\n\t */\n\tfunction getViewportDimensions() {\n\t\tsession.scrollLeft = $window.scrollLeft();\n\t\tsession.scrollTop = $window.scrollTop();\n\t\tsession.windowWidth = $window.width();\n\t\tsession.windowHeight = $window.height();\n\t}\n\n\t/**\n\t * Updates the window size info in the viewport dimensions cache.\n\t * @private\n\t */\n\tfunction trackResize() {\n\t\tsession.windowWidth = $window.width();\n\t\tsession.windowHeight = $window.height();\n\t}\n\n\t/**\n\t * Updates the scroll offset info in the viewport dimensions cache.\n\t * @private\n\t */\n\tfunction trackScroll() {\n\t\tvar x = $window.scrollLeft(),\n\t\t\ty = $window.scrollTop();\n\t\tif (x !== session.scrollLeft) {\n\t\t\tsession.currentX += x - session.scrollLeft;\n\t\t\tsession.scrollLeft = x;\n\t\t}\n\t\tif (y !== session.scrollTop) {\n\t\t\tsession.currentY += y - session.scrollTop;\n\t\t\tsession.scrollTop = y;\n\t\t}\n\t}\n\n\t/**\n\t * Saves the current mouse coordinates to the session object.\n\t * @private\n\t * @param {jQuery.Event} event The mousemove event for the document.\n\t */\n\tfunction trackMouse(event) {\n\t\tsession.currentX = event.pageX;\n\t\tsession.currentY = event.pageY;\n\t}\n\n\t/**\n\t * Tests if the mouse is currently over the specified element.\n\t * @private\n\t * @param {jQuery} element The element to check for hover.\n\t * @return {boolean}\n\t */\n\tfunction isMouseOver(element) {\n\t\t// use getBoundingClientRect() because jQuery's width() and height()\n\t\t// methods do not work with SVG elements\n\t\t// compute width/height because those properties do not exist on the object\n\t\t// returned by getBoundingClientRect() in older versions of IE\n\t\tvar elementPosition = element.offset(),\n\t\t\telementBox = element[0].getBoundingClientRect(),\n\t\t\telementWidth = elementBox.right - elementBox.left,\n\t\t\telementHeight = elementBox.bottom - elementBox.top;\n\n\t\treturn session.currentX >= elementPosition.left &&\n\t\t\tsession.currentX <= elementPosition.left + elementWidth &&\n\t\t\tsession.currentY >= elementPosition.top &&\n\t\t\tsession.currentY <= elementPosition.top + elementHeight;\n\t}\n\n\t/**\n\t * Fetches the tooltip content from the specified element's data attributes.\n\t * @private\n\t * @param {jQuery} element The element to get the tooltip content for.\n\t * @return {(string|jQuery|undefined)} The text/HTML string, jQuery object, or\n\t * undefined if there was no tooltip content for the element.\n\t */\n\tfunction getTooltipContent(element) {\n\t\tvar tipText = element.data(DATA_POWERTIP),\n\t\t\ttipObject = element.data(DATA_POWERTIPJQ),\n\t\t\ttipTarget = element.data(DATA_POWERTIPTARGET),\n\t\t\ttargetElement,\n\t\t\tcontent;\n\n\t\tif (tipText) {\n\t\t\tif ($.isFunction(tipText)) {\n\t\t\t\ttipText = tipText.call(element[0]);\n\t\t\t}\n\t\t\tcontent = tipText;\n\t\t} else if (tipObject) {\n\t\t\tif ($.isFunction(tipObject)) {\n\t\t\t\ttipObject = tipObject.call(element[0]);\n\t\t\t}\n\t\t\tif (tipObject.length > 0) {\n\t\t\t\tcontent = tipObject.clone(true, true);\n\t\t\t}\n\t\t} else if (tipTarget) {\n\t\t\ttargetElement = $('#' + tipTarget);\n\t\t\tif (targetElement.length > 0) {\n\t\t\t\tcontent = targetElement.html();\n\t\t\t}\n\t\t}\n\n\t\treturn content;\n\t}\n\n\t/**\n\t * Finds any viewport collisions that an element (the tooltip) would have if it\n\t * were absolutely positioned at the specified coordinates.\n\t * @private\n\t * @param {CSSCoordinates} coords Coordinates for the element.\n\t * @param {number} elementWidth Width of the element in pixels.\n\t * @param {number} elementHeight Height of the element in pixels.\n\t * @return {number} Value with the collision flags.\n\t */\n\tfunction getViewportCollisions(coords, elementWidth, elementHeight) {\n\t\tvar viewportTop = session.scrollTop,\n\t\t\tviewportLeft = session.scrollLeft,\n\t\t\tviewportBottom = viewportTop + session.windowHeight,\n\t\t\tviewportRight = viewportLeft + session.windowWidth,\n\t\t\tcollisions = Collision.none;\n\n\t\tif (coords.top < viewportTop || Math.abs(coords.bottom - session.windowHeight) - elementHeight < viewportTop) {\n\t\t\tcollisions |= Collision.top;\n\t\t}\n\t\tif (coords.top + elementHeight > viewportBottom || Math.abs(coords.bottom - session.windowHeight) > viewportBottom) {\n\t\t\tcollisions |= Collision.bottom;\n\t\t}\n\t\tif (coords.left < viewportLeft || coords.right + elementWidth > viewportRight) {\n\t\t\tcollisions |= Collision.left;\n\t\t}\n\t\tif (coords.left + elementWidth > viewportRight || coords.right < viewportLeft) {\n\t\t\tcollisions |= Collision.right;\n\t\t}\n\n\t\treturn collisions;\n\t}\n\n\t/**\n\t * Counts the number of bits set on a flags value.\n\t * @param {number} value The flags value.\n\t * @return {number} The number of bits that have been set.\n\t */\n\tfunction countFlags(value) {\n\t\tvar count = 0;\n\t\twhile (value) {\n\t\t\tvalue &= value - 1;\n\t\t\tcount++;\n\t\t}\n\t\treturn count;\n\t}\n\n// return api for commonjs and amd environments\n\treturn $.powerTip;\n}));\n","/*! jQuery Timepicker Addon - v1.6.3 - 2016-04-20\n* http://trentrichardson.com/examples/timepicker\n* Copyright (c) 2016 Trent Richardson; Licensed MIT */\n(function (factory) {\n\t\tfactory(jQuery);\n}(function ($) {\n\n\t/*\n\t* Lets not redefine timepicker, Prevent \"Uncaught RangeError: Maximum call stack size exceeded\"\n\t*/\n\t$.ui.timepicker = $.ui.timepicker || {};\n\tif ($.ui.timepicker.version) {\n\t\treturn;\n\t}\n\n\t/*\n\t* Extend jQueryUI, get it started with our version number\n\t*/\n\t$.extend($.ui, {\n\t\ttimepicker: {\n\t\t\tversion: \"1.6.3\"\n\t\t}\n\t});\n\n\t/*\n\t* Timepicker manager.\n\t* Use the singleton instance of this class, $.timepicker, to interact with the time picker.\n\t* Settings for (groups of) time pickers are maintained in an instance object,\n\t* allowing multiple different settings on the same page.\n\t*/\n\tvar Timepicker = function () {\n\t\tthis.regional = []; // Available regional settings, indexed by language code\n\t\tthis.regional[''] = { // Default regional settings\n\t\t\tcurrentText: 'Now',\n\t\t\tcloseText: 'Done',\n\t\t\tamNames: ['AM', 'A'],\n\t\t\tpmNames: ['PM', 'P'],\n\t\t\ttimeFormat: 'HH:mm',\n\t\t\ttimeSuffix: '',\n\t\t\ttimeOnlyTitle: 'Choose Time',\n\t\t\ttimeText: 'Time',\n\t\t\thourText: 'Hour',\n\t\t\tminuteText: 'Minute',\n\t\t\tsecondText: 'Second',\n\t\t\tmillisecText: 'Millisecond',\n\t\t\tmicrosecText: 'Microsecond',\n\t\t\ttimezoneText: 'Time Zone',\n\t\t\tisRTL: false\n\t\t};\n\t\tthis._defaults = { // Global defaults for all the datetime picker instances\n\t\t\tshowButtonPanel: true,\n\t\t\ttimeOnly: false,\n\t\t\ttimeOnlyShowDate: false,\n\t\t\tshowHour: null,\n\t\t\tshowMinute: null,\n\t\t\tshowSecond: null,\n\t\t\tshowMillisec: null,\n\t\t\tshowMicrosec: null,\n\t\t\tshowTimezone: null,\n\t\t\tshowTime: true,\n\t\t\tstepHour: 1,\n\t\t\tstepMinute: 1,\n\t\t\tstepSecond: 1,\n\t\t\tstepMillisec: 1,\n\t\t\tstepMicrosec: 1,\n\t\t\thour: 0,\n\t\t\tminute: 0,\n\t\t\tsecond: 0,\n\t\t\tmillisec: 0,\n\t\t\tmicrosec: 0,\n\t\t\ttimezone: null,\n\t\t\thourMin: 0,\n\t\t\tminuteMin: 0,\n\t\t\tsecondMin: 0,\n\t\t\tmillisecMin: 0,\n\t\t\tmicrosecMin: 0,\n\t\t\thourMax: 23,\n\t\t\tminuteMax: 59,\n\t\t\tsecondMax: 59,\n\t\t\tmillisecMax: 999,\n\t\t\tmicrosecMax: 999,\n\t\t\tminDateTime: null,\n\t\t\tmaxDateTime: null,\n\t\t\tmaxTime: null,\n\t\t\tminTime: null,\n\t\t\tonSelect: null,\n\t\t\thourGrid: 0,\n\t\t\tminuteGrid: 0,\n\t\t\tsecondGrid: 0,\n\t\t\tmillisecGrid: 0,\n\t\t\tmicrosecGrid: 0,\n\t\t\talwaysSetTime: true,\n\t\t\tseparator: ' ',\n\t\t\taltFieldTimeOnly: true,\n\t\t\taltTimeFormat: null,\n\t\t\taltSeparator: null,\n\t\t\taltTimeSuffix: null,\n\t\t\taltRedirectFocus: true,\n\t\t\tpickerTimeFormat: null,\n\t\t\tpickerTimeSuffix: null,\n\t\t\tshowTimepicker: true,\n\t\t\ttimezoneList: null,\n\t\t\taddSliderAccess: false,\n\t\t\tsliderAccessArgs: null,\n\t\t\tcontrolType: 'slider',\n\t\t\toneLine: false,\n\t\t\tdefaultValue: null,\n\t\t\tparse: 'strict',\n\t\t\tafterInject: null\n\t\t};\n\t\t$.extend(this._defaults, this.regional['']);\n\t};\n\n\t$.extend(Timepicker.prototype, {\n\t\t$input: null,\n\t\t$altInput: null,\n\t\t$timeObj: null,\n\t\tinst: null,\n\t\thour_slider: null,\n\t\tminute_slider: null,\n\t\tsecond_slider: null,\n\t\tmillisec_slider: null,\n\t\tmicrosec_slider: null,\n\t\ttimezone_select: null,\n\t\tmaxTime: null,\n\t\tminTime: null,\n\t\thour: 0,\n\t\tminute: 0,\n\t\tsecond: 0,\n\t\tmillisec: 0,\n\t\tmicrosec: 0,\n\t\ttimezone: null,\n\t\thourMinOriginal: null,\n\t\tminuteMinOriginal: null,\n\t\tsecondMinOriginal: null,\n\t\tmillisecMinOriginal: null,\n\t\tmicrosecMinOriginal: null,\n\t\thourMaxOriginal: null,\n\t\tminuteMaxOriginal: null,\n\t\tsecondMaxOriginal: null,\n\t\tmillisecMaxOriginal: null,\n\t\tmicrosecMaxOriginal: null,\n\t\tampm: '',\n\t\tformattedDate: '',\n\t\tformattedTime: '',\n\t\tformattedDateTime: '',\n\t\ttimezoneList: null,\n\t\tunits: ['hour', 'minute', 'second', 'millisec', 'microsec'],\n\t\tsupport: {},\n\t\tcontrol: null,\n\n\t\t/*\n\t\t* Override the default settings for all instances of the time picker.\n\t\t* @param {Object} settings object - the new settings to use as defaults (anonymous object)\n\t\t* @return {Object} the manager object\n\t\t*/\n\t\tsetDefaults: function (settings) {\n\t\t\textendRemove(this._defaults, settings || {});\n\t\t\treturn this;\n\t\t},\n\n\t\t/*\n\t\t* Create a new Timepicker instance\n\t\t*/\n\t\t_newInst: function ($input, opts) {\n\t\t\tvar tp_inst = new Timepicker(),\n\t\t\t\tinlineSettings = {},\n\t\t\t\tfns = {},\n\t\t\t\toverrides, i;\n\n\t\t\tfor (var attrName in this._defaults) {\n\t\t\t\tif (this._defaults.hasOwnProperty(attrName)) {\n\t\t\t\t\tvar attrValue = $input.attr('time:' + attrName);\n\t\t\t\t\tif (attrValue) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tinlineSettings[attrName] = eval(attrValue);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tinlineSettings[attrName] = attrValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toverrides = {\n\t\t\t\tbeforeShow: function (input, dp_inst) {\n\t\t\t\t\tif ($.isFunction(tp_inst._defaults.evnts.beforeShow)) {\n\t\t\t\t\t\treturn tp_inst._defaults.evnts.beforeShow.call($input[0], input, dp_inst, tp_inst);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonChangeMonthYear: function (year, month, dp_inst) {\n\t\t\t\t\t// Update the time as well : this prevents the time from disappearing from the $input field.\n\t\t\t\t\t// tp_inst._updateDateTime(dp_inst);\n\t\t\t\t\tif ($.isFunction(tp_inst._defaults.evnts.onChangeMonthYear)) {\n\t\t\t\t\t\ttp_inst._defaults.evnts.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonClose: function (dateText, dp_inst) {\n\t\t\t\t\tif (tp_inst.timeDefined === true && $input.val() !== '') {\n\t\t\t\t\t\ttp_inst._updateDateTime(dp_inst);\n\t\t\t\t\t}\n\t\t\t\t\tif ($.isFunction(tp_inst._defaults.evnts.onClose)) {\n\t\t\t\t\t\ttp_inst._defaults.evnts.onClose.call($input[0], dateText, dp_inst, tp_inst);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tfor (i in overrides) {\n\t\t\t\tif (overrides.hasOwnProperty(i)) {\n\t\t\t\t\tfns[i] = opts[i] || this._defaults[i] || null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttp_inst._defaults = $.extend({}, this._defaults, inlineSettings, opts, overrides, {\n\t\t\t\tevnts: fns,\n\t\t\t\ttimepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker');\n\t\t\t});\n\t\t\ttp_inst.amNames = $.map(tp_inst._defaults.amNames, function (val) {\n\t\t\t\treturn val.toUpperCase();\n\t\t\t});\n\t\t\ttp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function (val) {\n\t\t\t\treturn val.toUpperCase();\n\t\t\t});\n\n\t\t\t// detect which units are supported\n\t\t\ttp_inst.support = detectSupport(\n\t\t\t\t\ttp_inst._defaults.timeFormat +\n\t\t\t\t\t(tp_inst._defaults.pickerTimeFormat ? tp_inst._defaults.pickerTimeFormat : '') +\n\t\t\t\t\t(tp_inst._defaults.altTimeFormat ? tp_inst._defaults.altTimeFormat : ''));\n\n\t\t\t// controlType is string - key to our this._controls\n\t\t\tif (typeof(tp_inst._defaults.controlType) === 'string') {\n\t\t\t\tif (tp_inst._defaults.controlType === 'slider' && typeof($.ui.slider) === 'undefined') {\n\t\t\t\t\ttp_inst._defaults.controlType = 'select';\n\t\t\t\t}\n\t\t\t\ttp_inst.control = tp_inst._controls[tp_inst._defaults.controlType];\n\t\t\t}\n\t\t\t// controlType is an object and must implement create, options, value methods\n\t\t\telse {\n\t\t\t\ttp_inst.control = tp_inst._defaults.controlType;\n\t\t\t}\n\n\t\t\t// prep the timezone options\n\t\t\tvar timezoneList = [-720, -660, -600, -570, -540, -480, -420, -360, -300, -270, -240, -210, -180, -120, -60,\n\t\t\t\t\t0, 60, 120, 180, 210, 240, 270, 300, 330, 345, 360, 390, 420, 480, 525, 540, 570, 600, 630, 660, 690, 720, 765, 780, 840];\n\t\t\tif (tp_inst._defaults.timezoneList !== null) {\n\t\t\t\ttimezoneList = tp_inst._defaults.timezoneList;\n\t\t\t}\n\t\t\tvar tzl = timezoneList.length, tzi = 0, tzv = null;\n\t\t\tif (tzl > 0 && typeof timezoneList[0] !== 'object') {\n\t\t\t\tfor (; tzi < tzl; tzi++) {\n\t\t\t\t\ttzv = timezoneList[tzi];\n\t\t\t\t\ttimezoneList[tzi] = { value: tzv, label: $.timepicker.timezoneOffsetString(tzv, tp_inst.support.iso8601) };\n\t\t\t\t}\n\t\t\t}\n\t\t\ttp_inst._defaults.timezoneList = timezoneList;\n\n\t\t\t// set the default units\n\t\t\ttp_inst.timezone = tp_inst._defaults.timezone !== null ? $.timepicker.timezoneOffsetNumber(tp_inst._defaults.timezone) :\n\t\t\t\t\t\t\t((new Date()).getTimezoneOffset() * -1);\n\t\t\ttp_inst.hour = tp_inst._defaults.hour < tp_inst._defaults.hourMin ? tp_inst._defaults.hourMin :\n\t\t\t\t\t\t\ttp_inst._defaults.hour > tp_inst._defaults.hourMax ? tp_inst._defaults.hourMax : tp_inst._defaults.hour;\n\t\t\ttp_inst.minute = tp_inst._defaults.minute < tp_inst._defaults.minuteMin ? tp_inst._defaults.minuteMin :\n\t\t\t\t\t\t\ttp_inst._defaults.minute > tp_inst._defaults.minuteMax ? tp_inst._defaults.minuteMax : tp_inst._defaults.minute;\n\t\t\ttp_inst.second = tp_inst._defaults.second < tp_inst._defaults.secondMin ? tp_inst._defaults.secondMin :\n\t\t\t\t\t\t\ttp_inst._defaults.second > tp_inst._defaults.secondMax ? tp_inst._defaults.secondMax : tp_inst._defaults.second;\n\t\t\ttp_inst.millisec = tp_inst._defaults.millisec < tp_inst._defaults.millisecMin ? tp_inst._defaults.millisecMin :\n\t\t\t\t\t\t\ttp_inst._defaults.millisec > tp_inst._defaults.millisecMax ? tp_inst._defaults.millisecMax : tp_inst._defaults.millisec;\n\t\t\ttp_inst.microsec = tp_inst._defaults.microsec < tp_inst._defaults.microsecMin ? tp_inst._defaults.microsecMin :\n\t\t\t\t\t\t\ttp_inst._defaults.microsec > tp_inst._defaults.microsecMax ? tp_inst._defaults.microsecMax : tp_inst._defaults.microsec;\n\t\t\ttp_inst.ampm = '';\n\t\t\ttp_inst.$input = $input;\n\n\t\t\tif (tp_inst._defaults.altField) {\n\t\t\t\ttp_inst.$altInput = $(tp_inst._defaults.altField);\n\t\t\t\tif (tp_inst._defaults.altRedirectFocus === true) {\n\t\t\t\t\ttp_inst.$altInput.css({\n\t\t\t\t\t\tcursor: 'pointer'\n\t\t\t\t\t}).focus(function () {\n\t\t\t\t\t\t$input.trigger(\"focus\");\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (tp_inst._defaults.minDate === 0 || tp_inst._defaults.minDateTime === 0) {\n\t\t\t\ttp_inst._defaults.minDate = new Date();\n\t\t\t}\n\t\t\tif (tp_inst._defaults.maxDate === 0 || tp_inst._defaults.maxDateTime === 0) {\n\t\t\t\ttp_inst._defaults.maxDate = new Date();\n\t\t\t}\n\n\t\t\t// datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime..\n\t\t\tif (tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) {\n\t\t\t\ttp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime());\n\t\t\t}\n\t\t\tif (tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) {\n\t\t\t\ttp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime());\n\t\t\t}\n\t\t\tif (tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) {\n\t\t\t\ttp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime());\n\t\t\t}\n\t\t\tif (tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) {\n\t\t\t\ttp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime());\n\t\t\t}\n\t\t\ttp_inst.$input.bind('focus', function () {\n\t\t\t\ttp_inst._onFocus();\n\t\t\t});\n\n\t\t\treturn tp_inst;\n\t\t},\n\n\t\t/*\n\t\t* add our sliders to the calendar\n\t\t*/\n\t\t_addTimePicker: function (dp_inst) {\n\t\t\tvar currDT = $.trim((this.$altInput && this._defaults.altFieldTimeOnly) ? this.$input.val() + ' ' + this.$altInput.val() : this.$input.val());\n\n\t\t\tthis.timeDefined = this._parseTime(currDT);\n\t\t\tthis._limitMinMaxDateTime(dp_inst, false);\n\t\t\tthis._injectTimePicker();\n\t\t\tthis._afterInject();\n\t\t},\n\n\t\t/*\n\t\t* parse the time string from input value or _setTime\n\t\t*/\n\t\t_parseTime: function (timeString, withDate) {\n\t\t\tif (!this.inst) {\n\t\t\t\tthis.inst = $.datepicker._getInst(this.$input[0]);\n\t\t\t}\n\n\t\t\tif (withDate || !this._defaults.timeOnly) {\n\t\t\t\tvar dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat');\n\t\t\t\ttry {\n\t\t\t\t\tvar parseRes = parseDateTimeInternal(dp_dateFormat, this._defaults.timeFormat, timeString, $.datepicker._getFormatConfig(this.inst), this._defaults);\n\t\t\t\t\tif (!parseRes.timeObj) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t$.extend(this, parseRes.timeObj);\n\t\t\t\t} catch (err) {\n\t\t\t\t\t$.timepicker.log(\"Error parsing the date/time string: \" + err +\n\t\t\t\t\t\t\t\t\t\"\\ndate/time string = \" + timeString +\n\t\t\t\t\t\t\t\t\t\"\\ntimeFormat = \" + this._defaults.timeFormat +\n\t\t\t\t\t\t\t\t\t\"\\ndateFormat = \" + dp_dateFormat);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\tvar timeObj = $.datepicker.parseTime(this._defaults.timeFormat, timeString, this._defaults);\n\t\t\t\tif (!timeObj) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t$.extend(this, timeObj);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\t/*\n\t\t* Handle callback option after injecting timepicker\n\t\t*/\n\t\t_afterInject: function() {\n\t\t\tvar o = this.inst.settings;\n\t\t\tif ($.isFunction(o.afterInject)) {\n\t\t\t\to.afterInject.call(this);\n\t\t\t}\n\t\t},\n\n\t\t/*\n\t\t* generate and inject html for timepicker into ui datepicker\n\t\t*/\n\t\t_injectTimePicker: function () {\n\t\t\tvar $dp = this.inst.dpDiv,\n\t\t\t\to = this.inst.settings,\n\t\t\t\ttp_inst = this,\n\t\t\t\tlitem = '',\n\t\t\t\tuitem = '',\n\t\t\t\tshow = null,\n\t\t\t\tmax = {},\n\t\t\t\tgridSize = {},\n\t\t\t\tsize = null,\n\t\t\t\ti = 0,\n\t\t\t\tl = 0;\n\n\t\t\t// Prevent displaying twice\n\t\t\tif ($dp.find(\"div.ui-timepicker-div\").length === 0 && o.showTimepicker) {\n\t\t\t\tvar noDisplay = ' ui_tpicker_unit_hide',\n\t\t\t\t\thtml = '
    ' + '
    ' + o.timeText + '
    ' +\n\t\t\t\t\t\t\t\t'
    ';\n\n\t\t\t\t// Create the markup\n\t\t\t\tfor (i = 0, l = this.units.length; i < l; i++) {\n\t\t\t\t\tlitem = this.units[i];\n\t\t\t\t\tuitem = litem.substr(0, 1).toUpperCase() + litem.substr(1);\n\t\t\t\t\tshow = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem];\n\n\t\t\t\t\t// Added by Peter Medeiros:\n\t\t\t\t\t// - Figure out what the hour/minute/second max should be based on the step values.\n\t\t\t\t\t// - Example: if stepMinute is 15, then minMax is 45.\n\t\t\t\t\tmax[litem] = parseInt((o[litem + 'Max'] - ((o[litem + 'Max'] - o[litem + 'Min']) % o['step' + uitem])), 10);\n\t\t\t\t\tgridSize[litem] = 0;\n\n\t\t\t\t\thtml += '
    ' + o[litem + 'Text'] + '
    ' +\n\t\t\t\t\t\t\t\t'
    ';\n\n\t\t\t\t\tif (show && o[litem + 'Grid'] > 0) {\n\t\t\t\t\t\thtml += '
    ';\n\n\t\t\t\t\t\tif (litem === 'hour') {\n\t\t\t\t\t\t\tfor (var h = o[litem + 'Min']; h <= max[litem]; h += parseInt(o[litem + 'Grid'], 10)) {\n\t\t\t\t\t\t\t\tgridSize[litem]++;\n\t\t\t\t\t\t\t\tvar tmph = $.datepicker.formatTime(this.support.ampm ? 'hht' : 'HH', {hour: h}, o);\n\t\t\t\t\t\t\t\thtml += '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tfor (var m = o[litem + 'Min']; m <= max[litem]; m += parseInt(o[litem + 'Grid'], 10)) {\n\t\t\t\t\t\t\t\tgridSize[litem]++;\n\t\t\t\t\t\t\t\thtml += '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thtml += '
    ' + tmph + '' + ((m < 10) ? '0' : '') + m + '
    ';\n\t\t\t\t\t}\n\t\t\t\t\thtml += '
    ';\n\t\t\t\t}\n\n\t\t\t\t// Timezone\n\t\t\t\tvar showTz = o.showTimezone !== null ? o.showTimezone : this.support.timezone;\n\t\t\t\thtml += '
    ' + o.timezoneText + '
    ';\n\t\t\t\thtml += '
    ';\n\n\t\t\t\t// Create the elements from string\n\t\t\t\thtml += '
    ';\n\t\t\t\tvar $tp = $(html);\n\n\t\t\t\t// if we only want time picker...\n\t\t\t\tif (o.timeOnly === true) {\n\t\t\t\t\t$tp.prepend('
    ' + '
    ' + o.timeOnlyTitle + '
    ' + '
    ');\n\t\t\t\t\t$dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide();\n\t\t\t\t}\n\n\t\t\t\t// add sliders, adjust grids, add events\n\t\t\t\tfor (i = 0, l = tp_inst.units.length; i < l; i++) {\n\t\t\t\t\tlitem = tp_inst.units[i];\n\t\t\t\t\tuitem = litem.substr(0, 1).toUpperCase() + litem.substr(1);\n\t\t\t\t\tshow = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem];\n\n\t\t\t\t\t// add the slider\n\t\t\t\t\ttp_inst[litem + '_slider'] = tp_inst.control.create(tp_inst, $tp.find('.ui_tpicker_' + litem + '_slider'), litem, tp_inst[litem], o[litem + 'Min'], max[litem], o['step' + uitem]);\n\n\t\t\t\t\t// adjust the grid and add click event\n\t\t\t\t\tif (show && o[litem + 'Grid'] > 0) {\n\t\t\t\t\t\tsize = 100 * gridSize[litem] * o[litem + 'Grid'] / (max[litem] - o[litem + 'Min']);\n\t\t\t\t\t\t$tp.find('.ui_tpicker_' + litem + ' table').css({\n\t\t\t\t\t\t\twidth: size + \"%\",\n\t\t\t\t\t\t\tmarginLeft: o.isRTL ? '0' : ((size / (-2 * gridSize[litem])) + \"%\"),\n\t\t\t\t\t\t\tmarginRight: o.isRTL ? ((size / (-2 * gridSize[litem])) + \"%\") : '0',\n\t\t\t\t\t\t\tborderCollapse: 'collapse'\n\t\t\t\t\t\t}).find(\"td\").click(function (e) {\n\t\t\t\t\t\t\t\tvar $t = $(this),\n\t\t\t\t\t\t\t\t\th = $t.html(),\n\t\t\t\t\t\t\t\t\tn = parseInt(h.replace(/[^0-9]/g), 10),\n\t\t\t\t\t\t\t\t\tap = h.replace(/[^apm]/ig),\n\t\t\t\t\t\t\t\t\tf = $t.data('for'); // loses scope, so we use data-for\n\n\t\t\t\t\t\t\t\tif (f === 'hour') {\n\t\t\t\t\t\t\t\t\tif (ap.indexOf('p') !== -1 && n < 12) {\n\t\t\t\t\t\t\t\t\t\tn += 12;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tif (ap.indexOf('a') !== -1 && n === 12) {\n\t\t\t\t\t\t\t\t\t\t\tn = 0;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttp_inst.control.value(tp_inst, tp_inst[f + '_slider'], litem, n);\n\n\t\t\t\t\t\t\t\ttp_inst._onTimeChange();\n\t\t\t\t\t\t\t\ttp_inst._onSelectHandler();\n\t\t\t\t\t\t\t}).css({\n\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\twidth: (100 / gridSize[litem]) + '%',\n\t\t\t\t\t\t\t\ttextAlign: 'center',\n\t\t\t\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t\t\t\t});\n\t\t\t\t\t} // end if grid > 0\n\t\t\t\t} // end for loop\n\n\t\t\t\t// Add timezone options\n\t\t\t\tthis.timezone_select = $tp.find('.ui_tpicker_timezone').append('').find(\"select\");\n\t\t\t\t$.fn.append.apply(this.timezone_select,\n\t\t\t\t$.map(o.timezoneList, function (val, idx) {\n\t\t\t\t\treturn $(\"